diff --git a/.github/workflows/run_integration_tests.yml b/.github/workflows/run_integration_tests.yml index 43eeda344d694..d628c813e36b9 100644 --- a/.github/workflows/run_integration_tests.yml +++ b/.github/workflows/run_integration_tests.yml @@ -48,9 +48,6 @@ jobs: # - name: Install dreamluau # run: | # bash tools/ci/install_dreamluau.sh - - name: Install auxmos - run: | - bash tools/ci/install_auxmos.sh - name: Configure version run: | echo "BYOND_MAJOR=${{ inputs.major }}" >> $GITHUB_ENV diff --git a/Dockerfile b/Dockerfile index 185132e507a8f..e82cab34b1222 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,15 +27,6 @@ RUN git init \ && git checkout FETCH_HEAD \ && cargo build --release --all-features --target i686-unknown-linux-gnu -# Build auxmos -FROM rust-build as auxmos -RUN git init \ - && git remote add origin https://github.com/BeeStation/auxmos \ - && /bin/bash -c "source dependencies.sh \ - && git fetch --depth 1 origin \$AUXMOS_VERSION" \ - && git checkout FETCH_HEAD \ - && cargo rustc --target=i686-unknown-linux-gnu --release --features=trit_fire_hook,plasma_fire_hook,generic_fire_hook - # Install nodejs which is required to deploy BeeStation FROM base as node COPY dependencies.sh . @@ -51,7 +42,6 @@ ENV TG_BOOTSTRAP_NODE_LINUX=1 WORKDIR /dm-build COPY . . # Required to satisfy our compile_options -COPY --from=auxmos /build/target/i686-unknown-linux-gnu/release/libauxmos.so /dm-build/auxtools/libauxmos.so RUN tools/build/build \ && tools/deploy.sh /deploy \ && apt-get autoremove curl -y \ diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm index b46f581539b68..cf4938f3690b1 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm @@ -73,7 +73,9 @@ /area/ruin/powered/pride) "Y" = ( /obj/machinery/door/airlock/diamond, -/turf/open/floor/mineral/silver, +/turf/open/floor/mineral/silver{ + blocks_air = 1 + }, /area/ruin/powered/pride) (1,1,1) = {" diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm index 2089bc287fb1e..d07c93e33bf85 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm @@ -8,17 +8,20 @@ "c" = ( /obj/item/paper/fluff/stations/lavaland/sloth/note, /turf/open/floor/sepia{ + blocks_air = 0; slowdown = 10 }, /area/ruin/unpowered) "d" = ( /turf/open/floor/sepia{ + blocks_air = 0; slowdown = 10 }, /area/ruin/unpowered) "e" = ( /obj/machinery/door/airlock/wood, /turf/open/floor/sepia{ + blocks_air = 0; slowdown = 10 }, /area/ruin/unpowered) @@ -26,6 +29,7 @@ /obj/structure/table/wood, /obj/item/food/grown/citrus/orange, /turf/open/floor/sepia{ + blocks_air = 0; slowdown = 10 }, /area/ruin/unpowered) @@ -33,6 +37,7 @@ /obj/structure/bed, /obj/item/bedsheet/brown, /turf/open/floor/sepia{ + blocks_air = 0; slowdown = 10 }, /area/ruin/unpowered) diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index f0a57888a160d..dd72739f1abcd 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -8,81 +8,225 @@ "ac" = ( /turf/closed/mineral/random/labormineral, /area/awaymission/moonoutpost19/main) -"ah" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 +"ad" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/area/awaymission/moonoutpost19/hive) +"ag" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/egg/burst, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"al" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"an" = ( -/obj/item/kirbyplants{ - desc = "A plastic potted plant."; - pixel_y = 3 +/area/awaymission/moonoutpost19/hive) +"ai" = ( +/obj/structure/alien/weeds, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched1" +/area/awaymission/moonoutpost19/hive) +"aj" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/arrivals) -"ao" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/area/awaymission/moonoutpost19/hive) +"ak" = ( +/obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"am" = ( +/obj/structure/alien/weeds/node, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"ap" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/effect/decal/cleanable/blood/gibs, +/obj/item/clothing/mask/facehugger/impregnated, +/obj/item/gun/ballistic/automatic/pistol, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"as" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/obj/structure/alien/resin/wall, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"at" = ( +/turf/closed/wall/r_wall, +/area/awaymission/moonoutpost19/syndicate) +"au" = ( +/obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien/sentinel, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"av" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"aw" = ( +/obj/structure/alien/weeds/node, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"az" = ( +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"aq" = ( -/obj/machinery/light/small{ +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"aA" = ( +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"aB" = ( +/obj/effect/turf_decal/tile/red{ dir = 4 }, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"aD" = ( +/obj/structure/alien/weeds/node, +/obj/structure/alien/resin/wall, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/arrivals) -"ar" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, +/area/awaymission/moonoutpost19/hive) +"aE" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/effect/decal/cleanable/blood/gibs, +/obj/item/clothing/mask/facehugger/impregnated, +/obj/item/clothing/under/rank/security/officer, +/obj/item/clothing/suit/armor/vest, +/obj/item/melee/baton/loaded, +/obj/item/clothing/head/helmet, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"aF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/syndicate) -"at" = ( -/turf/closed/wall/r_wall, +"aJ" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/egg/burst, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"aK" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/egg/burst, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"aM" = ( +/obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien/drone{ + plants_off = 1 + }, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"aN" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/syndicate) -"ax" = ( -/obj/structure/cable{ - icon_state = "1-8" +"aP" = ( +/obj/machinery/gateway/centeraway{ + calibrated = 0 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"aQ" = ( -/obj/structure/urinal{ - pixel_y = 29 +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"aR" = ( +/obj/machinery/light{ + dir = 4 }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"aS" = ( +/obj/item/stack/ore/iron{ + pixel_x = 7; + pixel_y = -6 + }, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"aT" = ( +/obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien/queen/large{ + desc = "A gigantic alien who is in charge of the hive and all of its loyal servants."; + name = "alien queen"; + pixel_x = -16; + plants_off = 1 + }, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) "aU" = ( /turf/closed/wall, /area/awaymission/moonoutpost19/syndicate) -"aW" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "damaged2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +"aV" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 }, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"aY" = ( +/obj/structure/table, +/obj/item/plate, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) +"aZ" = ( +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"ba" = ( +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"bc" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) "bd" = ( /obj/machinery/vending/cola, /turf/open/floor/iron/dark, @@ -94,956 +238,1057 @@ }, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/syndicate) -"bi" = ( -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" +"bg" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"bh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"bj" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/effect/decal/cleanable/blood/gibs, +/obj/effect/decal/cleanable/blood, +/obj/item/clothing/mask/facehugger/impregnated, +/obj/item/clothing/under/syndicate, +/obj/item/clothing/glasses/night, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) +/area/awaymission/moonoutpost19/hive) "bl" = ( /turf/closed/mineral/random/high_chance, /area/awaymission/moonoutpost19/hive) -"bo" = ( -/obj/structure/closet/l3closet, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 +"bq" = ( +/obj/structure/window/reinforced{ + dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"bI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/obj/structure/table, +/obj/item/radio/off{ + pixel_x = -4; + pixel_y = 4 }, -/area/awaymission/moonoutpost19/syndicate) -"bM" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/radio/off{ + pixel_x = 2 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"bN" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/awaymission/moonoutpost19/syndicate) -"cb" = ( -/obj/structure/cable{ - icon_state = "4-8" +"br" = ( +/obj/structure/window/reinforced{ + dir = 1 }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "201" +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 }, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" +/obj/item/pen, +/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal, +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"cA" = ( -/obj/structure/table, -/obj/item/scalpel{ - pixel_y = 12 +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"bs" = ( +/obj/machinery/door/window{ + dir = 1; + name = "Gateway Access"; + req_access_txt = "150" }, -/obj/item/circular_saw, -/obj/item/razor{ - pixel_y = 5 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/alien/weeds, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"cD" = ( -/obj/machinery/mineral/processing_unit_console{ - machinedir = 8 - }, -/turf/closed/wall, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/syndicate) -"cF" = ( -/obj/structure/filingcabinet, -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/kenneth, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ +"bt" = ( +/obj/structure/window/reinforced{ dir = 1 }, +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"cI" = ( -/turf/open/floor/iron{ - dir = 8; - icon_state = "damaged3"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/area/awaymission/moonoutpost19/syndicate) +"bu" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/syndicate) -"cS" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_2" +"bv" = ( +/obj/structure/sink{ + pixel_y = 28 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/machinery/light/small{ + dir = 8 }, -/area/awaymission/moonoutpost19/main) -"df" = ( -/obj/machinery/mineral/stacking_unit_console{ - machinedir = 8 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/syndicate) +"bw" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" }, -/turf/closed/wall, +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/syndicate) -"dA" = ( -/turf/closed/mineral, -/area/awaymission/moonoutpost19/main) -"dX" = ( -/obj/item/cigbutt, -/obj/effect/turf_decal/tile/bar/opposingcorners, +"bA" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/chair/stool, /turf/open/floor/iron, /area/awaymission/moonoutpost19/syndicate) -"dZ" = ( -/turf/closed/wall/r_wall/rust, -/area/awaymission/moonoutpost19/research) -"ea" = ( -/turf/closed/wall/r_wall, -/area/awaymission/moonoutpost19/research) -"ec" = ( -/obj/structure/sign/warning/biohazard, -/turf/closed/wall/r_wall, -/area/awaymission/moonoutpost19/research) -"ed" = ( -/obj/machinery/vending/snack, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/research) -"ei" = ( +"bB" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"bC" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"bD" = ( +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"bE" = ( +/obj/machinery/light{ + dir = 4 }, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"el" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"em" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"en" = ( -/obj/structure/alien/weeds, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"eo" = ( -/obj/machinery/light/broken{ +/obj/machinery/airalarm/directional/east{ + pixel_x = 23; + req_access = null; + req_access_txt = "150" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"bF" = ( +/obj/structure/toilet{ dir = 1 }, -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/obj/machinery/camera/directional/north{ - c_tag = "Xenobiology Containment North"; - network = list("mo19x") +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/syndicate) +"bO" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Break Room" }, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"ep" = ( -/obj/machinery/sparker{ - desc = "A wall-mounted ignition device. This one has been applied with an acid-proof coating."; - id = "awayxenobio"; - name = "Acid-Proof mounted igniter"; - pixel_y = 25 +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"bP" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"bQ" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"eq" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"er" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/obj/item/clothing/mask/facehugger/impregnated, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"et" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/research) -"ew" = ( -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/highsecurity{ + name = "Gateway"; + req_access_txt = "150" }, -/area/awaymission/moonoutpost19/arrivals) -"ex" = ( +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"bR" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/manifold{ - dir = 4 +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"eA" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall, -/area/awaymission/moonoutpost19/research) -"eB" = ( -/obj/structure/alien/weeds/node, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"eF" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"eG" = ( -/obj/structure/cable, -/obj/machinery/power/port_gen/pacman{ - name = "P.A.C.M.A.N.-type portable generator" +/obj/item/clothing/gloves/color/yellow, +/obj/item/multitool, +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/awaymission/moonoutpost19/syndicate) -"eH" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"eI" = ( -/turf/closed/wall, -/area/awaymission/moonoutpost19/research) -"eJ" = ( -/turf/closed/wall/rust, -/area/awaymission/moonoutpost19/research) -"eN" = ( +"bS" = ( /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/structure/chair/office/light{ - dir = 4 + icon_state = "0-8" }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"eQ" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"fk" = ( -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"fl" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-4" }, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"fp" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/item/clothing/mask/facehugger/impregnated, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"fB" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/computer/monitor/secret, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"bT" = ( +/obj/machinery/power/smes{ + input_level = 10000; + inputting = 0; + output_level = 15000 }, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"fC" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "0-8" }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"bU" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/airalarm/directional/north{ + pixel_y = 23; + req_access = null; + req_access_txt = "150" }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"fF" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof Pipe" +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/obj/structure/alien/weeds, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"fG" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof Pipe" +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"bV" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"fH" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof Pipe" +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"bW" = ( +/obj/structure/alien/weeds/node, +/mob/living/simple_animal/hostile/alien, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"fJ" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - desc = "Has a valve and pump attached to it. This one has been applied with an acid-proof coating."; - dir = 8; - name = "Acid-Proof Air Injector" +/area/awaymission/moonoutpost19/hive) +"bY" = ( +/obj/machinery/mineral/unloading_machine{ + dir = 1; + icon_state = "unloader-corner"; + input_dir = 4; + output_dir = 8 }, /obj/structure/alien/weeds, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"fK" = ( -/obj/machinery/light/broken{ - dir = 4 +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/structure/alien/weeds, -/obj/machinery/camera/directional/east{ - c_tag = "Xenobiology Containment East"; - network = list("mo19x") +/area/awaymission/moonoutpost19/syndicate) +"ci" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"fS" = ( -/obj/structure/rack, -/obj/structure/window/reinforced{ +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/machinery/light/small{ dir = 8 }, -/obj/item/circuitboard/computer/teleporter, +/obj/item/stock_parts/cell/high, +/obj/item/paper/fluff/awaymissions/moonoutpost19/engineering, /obj/effect/turf_decal/stripes/line{ - dir = 9 + dir = 8 }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"fT" = ( -/obj/machinery/door/firedoor/closed{ - opacity = 0 +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"ck" = ( +/obj/machinery/power/terminal{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"fU" = ( -/obj/structure/chair/fancy/comfy{ - color = "#666666"; - dir = 8 +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"cl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"cm" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/hacking_guide{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"cn" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"cp" = ( +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/syndicate) +"cr" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/public/glass{ + density = 0; + icon_state = "open"; + name = "Dormitories"; + set_obj_flags = "EMAGGED" }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"gc" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, /obj/item/stack/rods, /obj/item/shard{ icon_state = "small" }, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"gr" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"gu" = ( -/obj/structure/disposalpipe/segment{ - desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof disposal pipe" +/area/awaymission/moonoutpost19/syndicate) +"ct" = ( +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"gv" = ( -/obj/structure/disposalpipe/segment{ - desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; - dir = 10; - name = "Acid-Proof disposal pipe" +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/syndicate) +"cw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/engineering{ + name = "Power Maintenance"; + req_access_txt = "150" + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"cx" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"cy" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"cz" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/structure/alien/weeds, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"gB" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"cB" = ( +/obj/machinery/space_heater, +/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"gH" = ( -/obj/structure/table, -/obj/item/retractor, -/obj/item/hemostat, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"gI" = ( -/obj/structure/table, -/obj/item/surgical_drapes, -/obj/machinery/light/small/broken{ dir = 4 }, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"gJ" = ( -/obj/structure/filingcabinet/filingcabinet, -/obj/machinery/light/small/broken{ - dir = 8 - }, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_social, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_queen, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_adult, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_psych, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/facehugger, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"gM" = ( -/obj/structure/disposalpipe/segment{ - desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; - name = "Acid-Proof disposal pipe" +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"cD" = ( +/obj/machinery/mineral/processing_unit_console{ + machinedir = 8 }, +/turf/closed/wall, +/area/awaymission/moonoutpost19/syndicate) +"cG" = ( +/obj/structure/grille/broken, +/obj/item/stack/rods, +/obj/item/stack/rods, +/obj/item/shard, /obj/structure/alien/weeds, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"gO" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/obj/item/clothing/mask/facehugger/impregnated, -/obj/item/clothing/under/rank/security/officer, -/obj/item/clothing/suit/armor/vest, -/obj/item/melee/baton/loaded, -/obj/item/clothing/head/helmet, -/turf/open/floor/plating/asteroid{ +/turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/hive) -"gQ" = ( -/obj/machinery/washing_machine, -/obj/effect/turf_decal/tile/blue/opposingcorners{ +/area/awaymission/moonoutpost19/syndicate) +"cI" = ( +/obj/structure/disposaloutlet, +/obj/structure/disposalpipe/trunk{ dir = 1 }, -/turf/open/floor/iron/cafeteria{ +/turf/open/floor/plating{ + icon_plating = "asteroidplating"; + icon_state = "asteroidplating"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, -/area/awaymission/moonoutpost19/arrivals) -"gW" = ( -/obj/structure/filingcabinet/filingcabinet, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_hivemind, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_behavior, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_castes, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"gX" = ( -/obj/structure/alien/weeds, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"ha" = ( -/obj/structure/disposaloutlet{ - desc = "An outlet for the pneumatic disposal system. This one has been applied with an acid-proof coating."; - dir = 1; - name = "Acid-Proof disposal outlet" +/area/awaymission/moonoutpost19/main) +"cM" = ( +/obj/item/storage/box/lights/mixed, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/obj/structure/disposalpipe/trunk{ - desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; - dir = 1; - name = "Acid-Proof disposal pipe" +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"cN" = ( +/obj/structure/cable, +/obj/machinery/power/port_gen/pacman{ + name = "P.A.C.M.A.N.-type portable generator" }, -/obj/structure/alien/weeds, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"hb" = ( -/obj/machinery/light/broken, -/obj/structure/alien/weeds, -/obj/machinery/camera/directional/south{ - c_tag = "Xenobiology Containment South"; - network = list("mo19x") +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"cO" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/port_gen/pacman/super{ + name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator" }, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"hc" = ( -/obj/machinery/sparker{ - desc = "A wall-mounted ignition device. This one has been applied with an acid-proof coating."; - id = "awayxenobio"; - name = "Acid-Proof mounted igniter"; - pixel_y = -25 +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"cP" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"hh" = ( -/obj/machinery/light/small{ - dir = 4 +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/syndicate) +"cT" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock{ + density = 0; + icon_state = "open"; + id_tag = "awaydorm4"; + name = "Dorm 1"; + opacity = 0; + set_obj_flags = "EMAGGED" }, -/obj/structure/chair/wood/normal, -/obj/machinery/airalarm/unlocked{ - dir = 4; - pixel_x = 23; - req_access = null +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/carpet, -/area/awaymission/moonoutpost19/arrivals) -"hq" = ( -/obj/structure/closet/secure_closet{ - icon_state = "rd"; - name = "research director's locker"; - req_access_txt = "201" +/area/awaymission/moonoutpost19/syndicate) +"cU" = ( +/obj/machinery/door/airlock{ + id_tag = "awaydorm5"; + name = "Dorm 2" }, -/obj/item/storage/backpack/satchel/tox, -/obj/item/clothing/gloves/color/latex, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/turf/open/floor/wood, +/area/awaymission/moonoutpost19/syndicate) +"cZ" = ( +/obj/machinery/button/door{ + id = "awaydorm4"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = 25; + specialfunctions = 4 }, -/area/awaymission/moonoutpost19/research) -"hr" = ( -/obj/structure/table, -/obj/item/computer_hardware/hard_drive/role/signal/toxins, -/obj/item/computer_hardware/hard_drive/role/signal/toxins{ - pixel_x = -4; - pixel_y = 2 +/obj/structure/bed, +/obj/item/bedsheet/syndie, +/turf/open/floor/wood{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/machinery/firealarm{ - pixel_y = 24 +/area/awaymission/moonoutpost19/syndicate) +"da" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/area/awaymission/moonoutpost19/syndicate) +"db" = ( +/turf/open/floor/wood, +/area/awaymission/moonoutpost19/syndicate) +"dc" = ( +/obj/machinery/button/door{ + id = "awaydorm5"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = 25; + specialfunctions = 4 }, -/area/awaymission/moonoutpost19/research) -"hs" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/machinery/light/small/broken{ - dir = 1 +/obj/structure/dresser, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/awaymission/moonoutpost19/syndicate) +"dd" = ( +/obj/structure/alien/weeds/node, +/mob/living/simple_animal/hostile/alien/drone{ + plants_off = 1 }, -/obj/machinery/airalarm/unlocked{ - pixel_y = 23; +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"df" = ( +/obj/machinery/mineral/stacking_unit_console{ + machinedir = 8 + }, +/turf/closed/wall, +/area/awaymission/moonoutpost19/syndicate) +"dh" = ( +/obj/structure/chair/wood/normal, +/obj/machinery/airalarm/directional/west{ + pixel_x = -23; req_access = null; - dir = 1 + req_access_txt = "150" }, -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/gerald, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/research) -"ht" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/area/awaymission/moonoutpost19/syndicate) +"di" = ( +/obj/machinery/light/small{ + dir = 4 }, -/area/awaymission/moonoutpost19/research) -"hB" = ( -/turf/open/floor/iron/cafeteria{ - dir = 5 +/turf/open/floor/wood{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/research) -"hC" = ( +/area/awaymission/moonoutpost19/syndicate) +"dj" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/moonoutpost19/syndicate) +"dk" = ( +/obj/machinery/airalarm/directional/east{ + pixel_x = 23; + req_access = null; + req_access_txt = "150" + }, +/turf/open/floor/wood, +/area/awaymission/moonoutpost19/syndicate) +"dq" = ( +/obj/structure/table/wood, +/obj/item/pen, +/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal_2, +/obj/structure/sign/poster/contraband/c20r{ + pixel_y = -32 + }, +/turf/open/floor/wood{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/syndicate) +"dr" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ + req_access_txt = "150" + }, +/obj/item/ammo_box/magazine/m10mm{ + icon_state = "9x19p-8" + }, +/obj/item/ammo_box/magazine/m10mm{ + icon_state = "9x19p-8" + }, +/obj/item/suppressor, +/turf/open/floor/wood{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/syndicate) +"ds" = ( +/obj/structure/bed, +/obj/item/bedsheet/syndie, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/turf/open/floor/wood, +/area/awaymission/moonoutpost19/syndicate) +"dt" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ + locked = 0; + req_access_txt = "150" }, -/area/awaymission/moonoutpost19/research) -"hD" = ( -/obj/machinery/door/firedoor, +/obj/item/stack/spacecash/c50, +/turf/open/floor/wood, +/area/awaymission/moonoutpost19/syndicate) +"du" = ( /obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/command{ +/obj/machinery/door/airlock/external{ density = 0; icon_state = "open"; - name = "Research Director's Office"; opacity = 0; - req_access_txt = "201"; + req_access_txt = "150"; set_obj_flags = "EMAGGED" }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/research) -"hI" = ( -/turf/closed/wall/rust, -/area/awaymission/moonoutpost19/arrivals) -"hJ" = ( -/turf/closed/wall, -/area/awaymission/moonoutpost19/arrivals) -"hM" = ( -/obj/structure/chair, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/area/awaymission/moonoutpost19/syndicate) +"dv" = ( +/obj/item/stack/ore/iron, +/obj/item/stack/ore/iron{ + pixel_x = -7; + pixel_y = -4 }, -/area/awaymission/moonoutpost19/research) -"hX" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 1 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/structure/window/reinforced{ - dir = 8 +/area/awaymission/moonoutpost19/main) +"dx" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/item/folder/white, -/obj/item/stamp/research_director{ - pixel_x = 3; - pixel_y = -2 +/area/awaymission/moonoutpost19/syndicate) +"dz" = ( +/obj/item/stack/ore/iron{ + pixel_x = -3; + pixel_y = 9 }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/research) -"hY" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 +/area/awaymission/moonoutpost19/main) +"dA" = ( +/turf/closed/mineral, +/area/awaymission/moonoutpost19/main) +"dE" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_1" }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/research) -"hZ" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 1 +/area/awaymission/moonoutpost19/main) +"dF" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_2" }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for monitoring the research division and the labs within."; - name = "research monitor"; - network = list("mo19x","mo19r") +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/area/awaymission/moonoutpost19/main) +"dG" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_1" }, -/area/awaymission/moonoutpost19/research) -"ia" = ( -/obj/machinery/computer/aifixer, -/obj/structure/window/reinforced{ - dir = 1 +/obj/item/mining_scanner, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/area/awaymission/moonoutpost19/main) +"dH" = ( +/obj/item/flashlight/lantern{ + icon_state = "lantern-on" }, -/area/awaymission/moonoutpost19/research) -"ip" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 8 +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/machinery/button/door{ - id = "Awaybiohazard"; - name = "Biohazard Shutter Control"; - pixel_y = 8; - req_access_txt = "201" +/area/awaymission/moonoutpost19/main) +"dJ" = ( +/obj/item/storage/bag/ore, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/machinery/button/door{ - id = "AwayRD"; - name = "Privacy Shutter Control"; - pixel_y = -2; - req_access_txt = "201" +/area/awaymission/moonoutpost19/main) +"dK" = ( +/obj/item/pickaxe/drill, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/area/awaymission/moonoutpost19/main) +"dN" = ( +/obj/item/stack/ore/iron{ + pixel_x = -7; + pixel_y = -4 }, -/area/awaymission/moonoutpost19/research) -"iq" = ( -/obj/structure/chair/office/light{ - dir = 1; - pixel_y = 3 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/area/awaymission/moonoutpost19/main) +"dO" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/effect/decal/cleanable/blood/gibs, +/obj/item/tank/internals/oxygen, +/obj/item/clothing/suit/space/syndicate/orange, +/obj/item/clothing/mask/gas, +/obj/item/clothing/head/helmet/space/syndicate/orange, +/obj/item/clothing/mask/facehugger/impregnated, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/research) -"iC" = ( -/obj/structure/cable, -/obj/machinery/power/apc/highcap/fifteen_k{ - dir = 4; - locked = 0; - name = "Worn-out APC"; - pixel_x = 24; - req_access = null; - start_charge = 100 +/area/awaymission/moonoutpost19/hive) +"dP" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"iD" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"iH" = ( -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_y = -32 +/area/awaymission/moonoutpost19/main) +"dQ" = ( +/obj/structure/alien/weeds/node, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/machinery/light/small/broken, -/obj/machinery/camera/directional/south{ - c_tag = "Research Director's Office"; - network = list("mo19","mo19r") +/area/awaymission/moonoutpost19/main) +"dS" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood, +/mob/living/simple_animal/hostile/alien/drone{ + plants_off = 1 }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/hive) +"dT" = ( +/obj/structure/alien/weeds, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"dU" = ( +/obj/structure/closet/crate, +/obj/item/storage/bag/ore, +/obj/structure/alien/weeds, +/obj/item/mining_scanner, +/obj/item/shovel, +/obj/item/pickaxe, +/turf/open/floor/plating{ + broken = 1; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"dV" = ( +/obj/structure/alien/weeds/node, +/obj/structure/alien/resin/wall, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"dY" = ( +/obj/machinery/light/small, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/research) -"iI" = ( -/obj/machinery/newscaster{ - pixel_y = -30 +"dZ" = ( +/turf/closed/wall/r_wall/rust, +/area/awaymission/moonoutpost19/research) +"ea" = ( +/turf/closed/wall/r_wall, +/area/awaymission/moonoutpost19/research) +"eb" = ( +/obj/machinery/door/poddoor/preopen{ + desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; + id = "Awaybiohazard"; + name = "Acid-Proof Biohazard Containment" }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/machinery/door/poddoor{ + desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; + id = "Awaybiohazard"; + name = "Acid-Proof Biohazard Containment" }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"iJ" = ( -/obj/structure/table, -/obj/item/radio/off, -/obj/item/laser_pointer, -/turf/open/floor/iron/cafeteria{ - dir = 5 +"ec" = ( +/obj/structure/sign/warning/biohazard, +/turf/closed/wall/r_wall, +/area/awaymission/moonoutpost19/research) +"ed" = ( +/obj/machinery/vending/snack, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/research) +"ee" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"ef" = ( +/obj/structure/chair{ + dir = 1 }, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"iR" = ( -/obj/machinery/light/small{ +"eg" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ dir = 4 }, -/obj/machinery/airalarm/unlocked{ - dir = 4; - pixel_x = 23; - req_access = null - }, -/turf/open/floor/carpet, -/area/awaymission/moonoutpost19/arrivals) -"iT" = ( -/obj/machinery/computer/security/telescreen/entertainment, -/turf/closed/wall/rust, -/area/awaymission/moonoutpost19/arrivals) -"iU" = ( -/obj/machinery/vending/boozeomat, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/machinery/portable_atmospherics/canister, +/obj/structure/alien/weeds, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"eh" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4 }, -/area/awaymission/moonoutpost19/arrivals) -"iX" = ( -/turf/open/floor/iron/cafeteria{ - dir = 5 +/turf/open/floor/iron/white/side{ + dir = 4 }, -/area/awaymission/moonoutpost19/arrivals) -"iY" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/area/awaymission/moonoutpost19/research) +"ei" = ( +/obj/structure/cable{ + icon_state = "2-4" }, -/area/awaymission/moonoutpost19/arrivals) -"jf" = ( -/obj/machinery/vending/cola, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"jg" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"jj" = ( -/obj/machinery/door/airlock/external, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"jk" = ( +/obj/structure/alien/weeds, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"ej" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/obj/structure/alien/weeds, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/area/awaymission/moonoutpost19/syndicate) -"jn" = ( -/obj/effect/decal/cleanable/food/flour, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"ek" = ( +/obj/structure/cable{ + icon_state = "0-8" }, -/area/awaymission/moonoutpost19/arrivals) -"jo" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 +/obj/machinery/shieldwallgen{ + locked = 0; + req_access = null }, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/structure/cable{ + icon_state = "0-2" }, -/area/awaymission/moonoutpost19/arrivals) -"jP" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/barman_recipes{ - pixel_y = 5 +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"el" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"em" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"en" = ( +/obj/structure/alien/weeds, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"eo" = ( +/obj/machinery/light/broken{ + dir = 1 }, -/obj/item/reagent_containers/food/drinks/shaker, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/structure/alien/weeds, +/obj/structure/alien/egg/burst, +/obj/machinery/camera/directional/north{ + c_tag = "Xenobiology Containment North"; + network = list("mo19x") }, -/area/awaymission/moonoutpost19/arrivals) -"jQ" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets{ - pixel_x = 3; - pixel_y = 3 +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"ep" = ( +/obj/machinery/sparker{ + desc = "A wall-mounted ignition device. This one has been applied with an acid-proof coating."; + id = "awayxenobio"; + name = "Acid-Proof mounted igniter"; + pixel_y = 25 }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"eq" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"er" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/effect/decal/cleanable/blood/gibs, +/obj/item/clothing/mask/facehugger/impregnated, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"et" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/research) +"eu" = ( +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"ev" = ( +/obj/machinery/light/small/broken{ + dir = 4 }, -/area/awaymission/moonoutpost19/arrivals) -"jR" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"ex" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/area/awaymission/moonoutpost19/arrivals) -"kh" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 +/obj/machinery/atmospherics/pipe/manifold{ + dir = 4 }, -/turf/open/floor/iron{ +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"ey" = ( +/obj/structure/table/reinforced, +/obj/structure/alien/weeds, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching the contents of the xenobiology containment pen."; dir = 8; - icon_state = "floorscorched2" + name = "xenobiology monitor"; + network = list("mo19x") }, -/area/awaymission/moonoutpost19/arrivals) -"ko" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/area/awaymission/moonoutpost19/arrivals) -"kp" = ( -/obj/structure/table, -/obj/item/kitchen/rollingpin, -/obj/item/knife/kitchen, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"ez" = ( +/obj/structure/cable{ + icon_state = "0-2" }, -/area/awaymission/moonoutpost19/arrivals) -"kq" = ( -/obj/structure/table, -/obj/item/book/manual/chef_recipes{ - pixel_x = 2; - pixel_y = 6 +/obj/machinery/door/poddoor/preopen{ + desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; + id = "Awaylab"; + name = "Acid-Proof Containment Chamber" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"eA" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/awaymission/moonoutpost19/research) +"eB" = ( +/obj/structure/alien/weeds/node, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"eF" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"eH" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/egg/burst, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"eI" = ( +/turf/closed/wall, +/area/awaymission/moonoutpost19/research) +"eJ" = ( +/turf/closed/wall/rust, +/area/awaymission/moonoutpost19/research) +"eK" = ( +/turf/open/floor/iron/white/side, +/area/awaymission/moonoutpost19/research) +"eL" = ( +/obj/structure/alien/weeds, +/turf/open/floor/iron/white/side, +/area/awaymission/moonoutpost19/research) +"eM" = ( +/obj/machinery/light/small/broken{ + dir = 8 }, -/area/awaymission/moonoutpost19/arrivals) -"kr" = ( -/obj/effect/decal/cleanable/food/egg_smudge, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/machinery/camera/directional/west{ + c_tag = "Xenobiology"; + network = list("mo19","mo19r") }, -/area/awaymission/moonoutpost19/arrivals) -"ks" = ( -/obj/machinery/light{ - dir = 4 +/turf/open/floor/iron/white/side{ + dir = 6 }, -/obj/machinery/processor, -/obj/machinery/airalarm/unlocked{ - dir = 4; - pixel_x = 23; - req_access = null +/area/awaymission/moonoutpost19/research) +"eN" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/chair/office/light{ + dir = 4 }, -/area/awaymission/moonoutpost19/arrivals) -"kL" = ( -/obj/structure/noticeboard{ - pixel_y = 32 +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"eO" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "Awaylab"; + name = "Containment Chamber Blast Doors"; + pixel_x = 4; + pixel_y = -2; + req_access_txt = "201" }, -/obj/item/paper/fluff/awaymissions/moonoutpost19/food_specials, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched1" +/obj/machinery/button/ignition{ + id = "awayxenobio"; + pixel_x = 4; + pixel_y = 8 }, -/area/awaymission/moonoutpost19/arrivals) -"kQ" = ( -/obj/structure/closet/emcloset, -/obj/structure/window/reinforced{ +/obj/structure/alien/weeds, +/obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"eP" = ( +/obj/structure/closet/l3closet, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/syndicate) -"kX" = ( -/turf/open/floor/plating{ - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"kZ" = ( -/obj/structure/alien/weeds/node, -/obj/structure/alien/resin/wall, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"eQ" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"eR" = ( +/obj/machinery/light/small{ + dir = 8 }, -/area/awaymission/moonoutpost19/hive) -"lb" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 26 +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 9; + icon_state = "ltrails_1" }, -/obj/machinery/camera/directional/east{ - c_tag = "Kitchen"; - network = list("mo19") +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"lc" = ( -/turf/closed/wall/mineral/titanium/interior, -/area/awaymission/moonoutpost19/arrivals) -"ld" = ( -/turf/closed/wall/mineral/titanium, -/area/awaymission/moonoutpost19/arrivals) -"le" = ( +"eS" = ( +/obj/machinery/power/port_gen/pacman{ + name = "P.A.C.M.A.N.-type portable generator" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"eU" = ( /obj/machinery/space_heater, /obj/machinery/light/small{ dir = 1 @@ -1053,424 +1298,592 @@ }, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"lr" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating{ - broken = 1 +"eV" = ( +/obj/machinery/power/terminal{ + dir = 4 }, -/area/awaymission/moonoutpost19/arrivals) -"lt" = ( -/obj/machinery/button/door{ - id = "awaykitchen"; - name = "Kitchen Shutters Control"; - pixel_x = -25 +/obj/structure/cable{ + icon_state = "0-2" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/machinery/airalarm/unlocked{ + pixel_y = 23; + req_access = null; + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"eW" = ( +/obj/structure/cable{ + icon_state = "0-2" }, -/area/awaymission/moonoutpost19/arrivals) -"lz" = ( /obj/machinery/power/smes{ + charge = 1.5e+006; input_level = 10000; inputting = 0; output_level = 15000 }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"eX" = ( /obj/structure/cable{ - icon_state = "0-8" + icon_state = "2-4" }, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"lA" = ( -/obj/effect/spawner/structure/window/reinforced, +/area/awaymission/moonoutpost19/research) +"eY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/newspaper, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"lB" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"lD" = ( -/obj/structure/shuttle/engine/heater{ - dir = 4 +/area/awaymission/moonoutpost19/research) +"fa" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/window/reinforced{ - dir = 8 +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_1" }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fb" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/moonoutpost19/arrivals) -"lQ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Kitchen"; +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance{ req_access_txt = "201" }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"lR" = ( -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"lS" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"lT" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/suit/hooded/chaplain_hoodie, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"lW" = ( -/obj/structure/table, -/obj/item/storage/lockbox, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"lX" = ( -/obj/structure/table, -/obj/item/radio/off, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"lZ" = ( -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = -32 +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_1" }, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"ma" = ( -/obj/structure/chair{ - dir = 8 +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fd" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/light/small{ - dir = 1 +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 5; + icon_state = "ltrails_1" }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mb" = ( -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mc" = ( -/obj/structure/chair{ +/obj/effect/turf_decal/tile/purple{ dir = 8 }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"md" = ( -/obj/machinery/newscaster{ - pixel_y = 30 +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"fe" = ( +/obj/structure/sign/warning/securearea{ + pixel_x = 32 }, -/obj/machinery/light/small{ - dir = 1 +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"me" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"ml" = ( +/obj/structure/alien/weeds, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"ff" = ( /obj/structure/table, -/obj/item/storage/backpack/satchel/leather/withwallet, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"mp" = ( +/obj/machinery/reagentgrinder, +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"fg" = ( /obj/structure/table, -/obj/item/storage/box/donkpockets, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mq" = ( -/obj/structure/chair{ +/obj/item/stack/sheet/mineral/plasma, +/obj/machinery/light/small/broken{ dir = 1 }, -/obj/machinery/light/small{ +/obj/machinery/airalarm/unlocked{ + pixel_y = 23; + req_access = null; + dir = 1 + }, +/obj/structure/alien/weeds, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"fh" = ( +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/structure/table, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/storage/box/syringes, +/obj/structure/alien/weeds, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"fi" = ( +/obj/structure/closet/crate/freezer, +/obj/structure/alien/weeds, +/obj/item/clothing/mask/facehugger/impregnated, +/obj/item/xenos_claw, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"fj" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"mr" = ( -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"ms" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mt" = ( -/obj/structure/chair{ +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"fk" = ( +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"fl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"fm" = ( +/obj/structure/closet/l3closet/scientist, +/obj/structure/window/reinforced, +/obj/structure/alien/weeds, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"fn" = ( +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/preopen{ + desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; + id = "Awaylab"; + name = "Acid-Proof Containment Chamber" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fp" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/item/clothing/mask/facehugger/impregnated, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"fq" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fr" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fs" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fv" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 + }, +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + icon_state = "ltrails_2" + }, +/obj/structure/alien/weeds, +/obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/effect/landmark/awaystart, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mu" = ( -/obj/machinery/light/small{ +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"fw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/alien/weeds, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"fx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/research{ + density = 0; + icon_state = "open"; + name = "Xenobiology Lab"; + opacity = 0; + req_access_txt = "201"; + set_obj_flags = "EMAGGED" + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"fy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"fz" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"fA" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/window/reinforced{ - dir = 1 +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"fB" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"mB" = ( -/obj/effect/spawner/randomarcade, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"mC" = ( -/obj/machinery/vending/cigarette, -/obj/structure/sign/poster/contraband/smoke{ - pixel_y = -32 +/obj/structure/alien/weeds/node, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"fC" = ( +/obj/structure/cable{ + icon_state = "1-8" }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"mD" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 }, -/obj/structure/chair/fancy/comfy, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"mE" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/bottle/whiskey{ - pixel_x = -6; - pixel_y = 6 +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"fD" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; + dir = 4; + name = "Acid-Proof Pipe" }, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = 6; - pixel_y = 8 +/obj/item/stack/rods, +/obj/item/stack/cable_coil{ + amount = 5 }, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = 3 +/obj/item/shard{ + icon_state = "small" }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"mF" = ( -/obj/structure/chair/fancy/comfy, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"mG" = ( -/obj/machinery/computer/shuttle_flight{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mH" = ( -/obj/machinery/door/airlock/titanium{ - name = "Shuttle Cockpit" +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"fE" = ( +/obj/machinery/door/poddoor/preopen{ + desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; + id = "Awaylab"; + name = "Acid-Proof Containment Chamber" }, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"mI" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"mJ" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A beacon used by a teleporter."; - icon = 'icons/obj/device.dmi'; - icon_state = "beacon"; - name = "tracking beacon" +/obj/machinery/atmospherics/pipe/simple/general/visible{ + desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; + dir = 4; + name = "Acid-Proof Pipe" }, -/obj/effect/landmark/awaystart, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"mK" = ( -/obj/machinery/door/airlock/titanium{ - name = "Shuttle Airlock" +/obj/item/stack/rods, +/obj/item/stack/cable_coil{ + amount = 5 }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mV" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/pen, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mW" = ( -/obj/structure/chair, -/obj/machinery/light/small{ - dir = 4 +/obj/item/shard{ + icon_state = "medium" }, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"mX" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Research Storage"; - req_access_txt = "201" +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/iron/white, +/turf/open/floor/engine, /area/awaymission/moonoutpost19/research) -"mY" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"nf" = ( -/obj/structure/filingcabinet, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"ng" = ( -/obj/structure/chair{ - dir = 8 +"fF" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; + dir = 4; + name = "Acid-Proof Pipe" }, -/obj/machinery/light/small, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"nh" = ( -/obj/machinery/newscaster{ - pixel_y = -30 +/obj/structure/alien/weeds, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"fG" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; + dir = 4; + name = "Acid-Proof Pipe" }, -/obj/machinery/light/small, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"nw" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = 30 +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"fH" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; + dir = 4; + name = "Acid-Proof Pipe" }, +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"fI" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"nE" = ( -/obj/machinery/light/small/broken{ - dir = 4 +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"nN" = ( -/obj/machinery/door/airlock{ - name = "Kitchen Cold Room"; - req_access_txt = "201" +"fJ" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + desc = "Has a valve and pump attached to it. This one has been applied with an acid-proof coating."; + dir = 8; + name = "Acid-Proof Air Injector" }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/moonoutpost19/arrivals) -"on" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/obj/item/stack/rods, -/obj/item/shard, /obj/structure/alien/weeds, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"fK" = ( +/obj/machinery/light/broken{ + dir = 4 + }, +/obj/structure/alien/weeds, +/obj/machinery/camera/directional/east{ + c_tag = "Xenobiology Containment East"; + network = list("mo19x") + }, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"fL" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fM" = ( +/obj/item/cigbutt, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fN" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fO" = ( +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fP" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fQ" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fR" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/area/awaymission/moonoutpost19/syndicate) -"op" = ( /obj/structure/cable{ icon_state = "2-8" }, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fS" = ( +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating{ - burnt = 1 + icon_plating = "asteroidplating"; + icon_state = "asteroidplating"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/area/awaymission/moonoutpost19/syndicate) -"oq" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"os" = ( -/obj/machinery/shower{ +"fV" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"fW" = ( +/obj/structure/alien/weeds, +/obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/item/bikehorn/rubberducky, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"ox" = ( -/turf/open/floor/plating{ - broken = 1 +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"fX" = ( +/obj/structure/sign/warning/biohazard{ + pixel_x = 32 + }, +/obj/structure/cable{ + icon_state = "1-2" }, +/obj/structure/alien/weeds, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"oL" = ( -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron{ - pixel_x = -7; - pixel_y = -4 +"fY" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"fZ" = ( +/obj/machinery/door/firedoor, +/obj/structure/extinguisher_cabinet{ + pixel_y = -29 }, -/area/awaymission/moonoutpost19/main) -"oM" = ( -/obj/machinery/door/airlock{ - id_tag = "awaydorm1"; - name = "Dorm 1" +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"oN" = ( -/obj/structure/tank_dispenser/oxygen{ - oxygentanks = 9 - }, -/obj/machinery/light/small/broken{ +/area/awaymission/moonoutpost19/research) +"ga" = ( +/obj/structure/window/reinforced{ dir = 1 }, +/obj/structure/closet/l3closet/scientist, +/obj/structure/alien/weeds, /obj/effect/turf_decal/stripes/line{ - dir = 9 + dir = 8 }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"gb" = ( +/obj/structure/cable{ + icon_state = "0-2" }, -/area/awaymission/moonoutpost19/syndicate) -"oQ" = ( -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/obj/structure/grille, +/obj/machinery/door/poddoor/preopen{ + desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; + id = "Awaylab"; + name = "Acid-Proof Containment Chamber" }, -/area/awaymission/moonoutpost19/syndicate) -"oY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/item/stack/cable_coil/cut/red{ + amount = 1 }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"pa" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"pb" = ( -/obj/structure/window/reinforced{ - dir = 1 +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"gc" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood, +/obj/item/stack/rods, +/obj/item/shard{ + icon_state = "small" + }, +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"gf" = ( +/obj/structure/chair/stool, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"gh" = ( +/obj/effect/decal/cleanable/oil, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"gk" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Post"; + req_access_txt = "201" + }, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"gl" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + icon_state = "ltrails_1" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"gm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 28 }, +/obj/structure/alien/weeds, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"gn" = ( /obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 +/obj/item/scalpel{ + pixel_y = 12 }, -/obj/item/pen, -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal, +/obj/item/circular_saw, +/obj/item/razor{ + pixel_y = 5 + }, +/obj/structure/alien/weeds, /obj/effect/turf_decal/stripes/line{ - dir = 6 + dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"pd" = ( -/obj/structure/chair/office, -/turf/open/floor/iron, +/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"pf" = ( -/obj/effect/turf_decal/tile/purple{ +"go" = ( +/obj/structure/alien/weeds/node, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"pl" = ( -/obj/structure/toilet{ +"gp" = ( +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/syndicate) -"pn" = ( +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"gq" = ( /obj/structure/table, /obj/item/mmi, /obj/item/mmi, @@ -1481,1608 +1894,1485 @@ }, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"pt" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 +"gr" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 }, -/obj/item/clothing/gloves/color/yellow, -/obj/item/multitool, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"gs" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; + dir = 4; + name = "Acid-Proof disposal pipe" }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"pu" = ( -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"pw" = ( +/obj/structure/alien/weeds, /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 8 }, -/turf/open/floor/iron/white, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"px" = ( +"gt" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "0-2" }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"pz" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/structure/disposalpipe/segment{ + desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; + dir = 4; + name = "Acid-Proof disposal pipe" }, -/area/awaymission/moonoutpost19/arrivals) -"pD" = ( -/obj/item/storage/box/lights/mixed, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/machinery/door/poddoor/preopen{ + desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; + id = "Awaylab"; + name = "Acid-Proof Containment Chamber" }, +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"pG" = ( -/obj/machinery/door/airlock{ - name = "Unisex Showers" +/area/awaymission/moonoutpost19/research) +"gu" = ( +/obj/structure/disposalpipe/segment{ + desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; + dir = 4; + name = "Acid-Proof disposal pipe" }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"pJ" = ( /obj/structure/alien/weeds, -/turf/open/floor/iron/white/side, +/obj/structure/alien/resin/wall, +/turf/open/floor/engine, /area/awaymission/moonoutpost19/research) -"pK" = ( -/obj/item/radio/off, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/structure/sign/poster/official/safety_report{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 +"gv" = ( +/obj/structure/disposalpipe/segment{ + desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; + dir = 10; + name = "Acid-Proof disposal pipe" }, -/turf/open/floor/iron, +/obj/structure/alien/weeds, +/turf/open/floor/engine, /area/awaymission/moonoutpost19/research) -"pN" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, +"gw" = ( +/obj/structure/table, /obj/effect/decal/cleanable/dirt, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/item/radio/off, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"gy" = ( +/obj/machinery/light/small, +/obj/structure/closet/toolcloset, +/obj/item/clothing/gloves/color/yellow, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"qk" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, +"gz" = ( +/obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"qm" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - icon_state = "ltrails_1" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/area/awaymission/moonoutpost19/research) +"gA" = ( +/obj/machinery/computer/monitor/secret{ + dir = 1 }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"gB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"qz" = ( -/obj/structure/reagent_dispensers/fueltank, +"gC" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"gE" = ( +/obj/structure/grille/broken, +/obj/item/stack/rods, +/obj/item/stack/rods, +/obj/item/shard, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"qD" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -26 - }, +"gF" = ( /obj/effect/decal/cleanable/blood/tracks{ desc = "Your instincts say you shouldn't be following these."; - icon_state = "ltrails_2" + dir = 6; + icon_state = "ltrails_1" }, -/obj/structure/alien/weeds, /obj/effect/turf_decal/tile/purple{ dir = 8 }, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"qH" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating{ - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +"gG" = ( +/obj/structure/cable, +/obj/machinery/power/apc/highcap/fifteen_k{ + dir = 4; + locked = 0; + name = "Worn-out APC"; + pixel_x = 24; + req_access = null; + start_charge = 100 }, -/area/awaymission/moonoutpost19/syndicate) -"qK" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"qN" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/external{ - density = 0; - icon_state = "open"; - opacity = 0; - req_access_txt = "150"; - set_obj_flags = "EMAGGED" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating{ - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"qO" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/obj/item/shard, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_2" - }, -/turf/open/floor/plating{ - broken = 1; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"qU" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4 - }, -/turf/open/floor/iron/white/side{ +"gH" = ( +/obj/structure/table, +/obj/item/retractor, +/obj/item/hemostat, +/obj/structure/alien/weeds, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"gI" = ( +/obj/structure/table, +/obj/item/surgical_drapes, +/obj/machinery/light/small/broken{ dir = 4 }, +/obj/structure/alien/weeds, +/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"rb" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - icon_state = "ltrails_1" - }, -/obj/effect/turf_decal/tile/purple{ +"gJ" = ( +/obj/structure/filingcabinet/filingcabinet, +/obj/machinery/light/small/broken{ dir = 8 }, +/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_social, +/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_queen, +/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_adult, +/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_psych, +/obj/item/paper/fluff/awaymissions/moonoutpost19/research/facehugger, +/obj/structure/alien/weeds, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"rf" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +"gK" = ( +/obj/structure/table/reinforced, +/obj/structure/alien/weeds, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen, +/obj/item/radio/off, +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"rh" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"gL" = ( +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; + id = "Awaylab"; + name = "Acid-Proof Containment Chamber" }, -/obj/machinery/door/airlock/engineering{ - name = "Power Maintenance"; - req_access_txt = "150" +/obj/structure/cable{ + icon_state = "0-2" }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"rj" = ( -/obj/item/cigbutt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"ro" = ( -/obj/machinery/mineral/unloading_machine{ - dir = 1; - icon_state = "unloader-corner"; - input_dir = 4; - output_dir = 8 +/area/awaymission/moonoutpost19/research) +"gM" = ( +/obj/structure/disposalpipe/segment{ + desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; + name = "Acid-Proof disposal pipe" }, /obj/structure/alien/weeds, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/syndicate) -"rs" = ( -/obj/structure/window/reinforced{ +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"gP" = ( +/obj/structure/chair/office, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"gR" = ( +/obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"ru" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 +"gS" = ( +/obj/machinery/light/broken{ + dir = 4 }, -/turf/open/floor/iron/white/corner{ - dir = 1 +/obj/machinery/airalarm/unlocked{ + dir = 4; + pixel_x = 23; + req_access = null }, -/area/awaymission/moonoutpost19/arrivals) -"rv" = ( -/obj/structure/closet/emcloset, -/obj/structure/window, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"rw" = ( -/obj/structure/table/wood, -/obj/item/pen, -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal_2, -/obj/structure/sign/poster/contraband/c20r{ - pixel_y = -32 +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"gT" = ( +/obj/structure/table/optable, +/obj/structure/alien/weeds, +/turf/open/floor/iron/white/side{ + dir = 1 }, -/turf/open/floor/wood{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/research) +"gU" = ( +/obj/machinery/computer/operating{ + dir = 8 }, -/area/awaymission/moonoutpost19/syndicate) -"ry" = ( -/obj/structure/table, -/obj/item/stack/sheet/mineral/plasma, -/obj/machinery/light/small/broken{ +/obj/structure/alien/weeds, +/turf/open/floor/iron/white/side{ dir = 1 }, -/obj/machinery/airalarm/unlocked{ - pixel_y = 23; - req_access = null; +/area/awaymission/moonoutpost19/research) +"gV" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/suit/apron/surgical, +/obj/structure/alien/weeds, +/turf/open/floor/iron/white/side{ dir = 1 }, +/area/awaymission/moonoutpost19/research) +"gW" = ( +/obj/structure/filingcabinet/filingcabinet, +/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_hivemind, +/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_behavior, +/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_castes, +/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy, +/obj/structure/alien/weeds, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"gX" = ( +/obj/structure/alien/weeds, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"gY" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/alien/weeds, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"rE" = ( -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 +"gZ" = ( +/obj/machinery/shieldwallgen{ + locked = 0; + req_access = null }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"rF" = ( -/obj/machinery/firealarm{ - pixel_y = 24 +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"ha" = ( +/obj/structure/disposaloutlet{ + desc = "An outlet for the pneumatic disposal system. This one has been applied with an acid-proof coating."; + dir = 1; + name = "Acid-Proof disposal outlet" }, -/obj/structure/table, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 +/obj/structure/disposalpipe/trunk{ + desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; + dir = 1; + name = "Acid-Proof disposal pipe" }, -/obj/item/storage/box/syringes, /obj/structure/alien/weeds, -/turf/open/floor/iron, +/turf/open/floor/engine, /area/awaymission/moonoutpost19/research) -"rG" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"rI" = ( -/obj/machinery/door/airlock{ - name = "Unit 1" +"hb" = ( +/obj/machinery/light/broken, +/obj/structure/alien/weeds, +/obj/machinery/camera/directional/south{ + c_tag = "Xenobiology Containment South"; + network = list("mo19x") }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"rN" = ( -/obj/machinery/door/airlock{ - name = "Private Restroom" +/turf/open/floor/engine, +/area/awaymission/moonoutpost19/research) +"hc" = ( +/obj/machinery/sparker{ + desc = "A wall-mounted ignition device. This one has been applied with an acid-proof coating."; + id = "awayxenobio"; + name = "Acid-Proof mounted igniter"; + pixel_y = -25 }, -/turf/open/floor/iron/freezer, +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/turf/open/floor/engine, /area/awaymission/moonoutpost19/research) -"rQ" = ( -/obj/machinery/portable_atmospherics/canister/air, +"hd" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"rU" = ( -/obj/machinery/power/port_gen/pacman{ - name = "P.A.C.M.A.N.-type portable generator" - }, +"he" = ( /obj/structure/cable{ - icon_state = "0-2" + icon_state = "4-8" }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"sc" = ( -/obj/structure/sign/poster/contraband/syndicate_recruitment{ - pixel_y = 32 - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/obj/structure/alien/weeds, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +"hf" = ( +/obj/structure/cable{ + icon_state = "1-8" }, -/area/awaymission/moonoutpost19/syndicate) -"sn" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"hg" = ( /turf/open/floor/iron{ + dir = 8; + icon_state = "damaged5"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"sB" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"sK" = ( -/obj/structure/alien/weeds/node, +"hk" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/egg, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/main) -"sP" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "0-2" +/area/awaymission/moonoutpost19/hive) +"hm" = ( +/obj/machinery/vending/medical{ + req_access_txt = "201" }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/iron/white/side, +/area/awaymission/moonoutpost19/research) +"hn" = ( +/obj/structure/closet/crate/bin, +/obj/item/clothing/gloves/color/latex, +/obj/item/trash/chips, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/broken{ dir = 1 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"tb" = ( +/turf/open/floor/iron/white/side, +/area/awaymission/moonoutpost19/research) +"ho" = ( +/obj/structure/table, +/obj/item/storage/box/gloves, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/awaymission/moonoutpost19/research) +"hq" = ( /obj/structure/closet/secure_closet{ - icon_state = "science"; - locked = 0; - name = "scientist's locker"; + icon_state = "rd"; + name = "research director's locker"; req_access_txt = "201" }, -/obj/item/clothing/suit/toggle/labcoat, -/turf/open/floor/iron, +/obj/item/storage/backpack/satchel/tox, +/obj/item/clothing/gloves/color/latex, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, /area/awaymission/moonoutpost19/research) -"tg" = ( -/obj/structure/cable{ - icon_state = "4-8" +"hr" = ( +/obj/structure/table, +/obj/item/computer_hardware/hard_drive/role/signal/toxins, +/obj/item/computer_hardware/hard_drive/role/signal/toxins{ + pixel_x = -4; + pixel_y = 2 }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/obj/machinery/firealarm{ + pixel_y = 24 }, -/area/awaymission/moonoutpost19/arrivals) -"th" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"tj" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"tk" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/suit/space/syndicate/orange, -/obj/item/clothing/mask/gas, -/obj/item/clothing/head/helmet/space/syndicate/orange, -/obj/item/clothing/mask/facehugger/impregnated, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/area/awaymission/moonoutpost19/hive) -"tn" = ( -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/research) +"hs" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/machinery/light/small/broken{ + dir = 1 }, -/area/awaymission/moonoutpost19/main) -"tv" = ( -/obj/structure/table, -/obj/item/folder/red, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 +/obj/machinery/airalarm/unlocked{ + pixel_y = 23; + req_access = null; + dir = 1 + }, +/obj/item/paper/fluff/awaymissions/moonoutpost19/log/gerald, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"tx" = ( -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"tA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +"ht" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/area/awaymission/moonoutpost19/arrivals) -"tB" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/awaymission/moonoutpost19/research) +"hu" = ( +/obj/machinery/door/poddoor{ + id = "AwayRD"; + name = "Privacy Shutter" }, -/obj/item/newspaper, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"tE" = ( -/obj/structure/sign/warning/securearea{ - pixel_y = 32 +"hv" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 }, -/obj/machinery/shower{ - dir = 4; - name = "emergency shower" +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"hw" = ( +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"hx" = ( +/obj/structure/grille/broken, +/obj/item/stack/rods, +/obj/item/stack/rods, +/obj/item/shard{ + icon_state = "medium" }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"hy" = ( +/obj/item/stack/rods, +/obj/item/shard{ + icon_state = "small" }, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"tL" = ( -/obj/machinery/door/window{ - dir = 1; - name = "Gateway Access"; - req_access_txt = "150" +"hz" = ( +/obj/effect/decal/cleanable/robot_debris, +/obj/effect/decal/cleanable/oil, +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/item/healthanalyzer{ + pixel_x = 6; + pixel_y = -5 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/item/assembly/prox_sensor{ + pixel_x = -5; + pixel_y = -2 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"tN" = ( -/obj/machinery/light/small, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"tS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/obj/item/bodypart/l_arm/robot, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"hA" = ( +/obj/structure/table, +/obj/item/storage/firstaid/fire, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 28 + }, +/turf/open/floor/iron/white/side{ dir = 8 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/area/awaymission/moonoutpost19/research) +"hB" = ( +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/area/awaymission/moonoutpost19/syndicate) -"tW" = ( -/obj/structure/chair/fancy/comfy{ - color = "#666666" +/area/awaymission/moonoutpost19/research) +"hC" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/research) +"hD" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/command{ + density = 0; + icon_state = "open"; + name = "Research Director's Office"; + opacity = 0; + req_access_txt = "201"; + set_obj_flags = "EMAGGED" }, -/area/awaymission/moonoutpost19/arrivals) -"uf" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/machinery/light/small{ - dir = 1 +/area/awaymission/moonoutpost19/research) +"hE" = ( +/obj/structure/noticeboard{ + dir = 1; + pixel_y = -32 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"uj" = ( -/turf/open/floor/iron{ - dir = 8; - icon_state = "damaged1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/obj/machinery/light/small/broken, +/obj/item/paper/fluff/awaymissions/moonoutpost19/research/evacuation, +/obj/machinery/camera/directional/south{ + c_tag = "Research Division"; + network = list("mo19","mo19r") }, -/area/awaymission/moonoutpost19/syndicate) -"un" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/tile/purple{ + dir = 8 }, -/obj/item/cigbutt, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"hF" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"up" = ( -/obj/structure/window/reinforced{ - dir = 1 +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"hG" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Research Storage"; + req_access_txt = "201" }, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"hH" = ( /obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, +/obj/item/storage/firstaid/regular, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"uu" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/airalarm/unlocked{ + dir = 4; + pixel_x = 23; + req_access = null }, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating{ - broken = 1 +/turf/open/floor/iron/white/side{ + dir = 8 }, /area/awaymission/moonoutpost19/research) -"uv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/closed{ - opacity = 0 - }, -/turf/open/floor/iron, +"hI" = ( +/turf/closed/wall/rust, /area/awaymission/moonoutpost19/arrivals) -"uw" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +"hJ" = ( +/turf/closed/wall, /area/awaymission/moonoutpost19/arrivals) -"uA" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) -"uE" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/sentinel, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) -"uL" = ( -/obj/machinery/gateway, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"uU" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/preopen{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaylab"; - name = "Acid-Proof Containment Chamber" - }, -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, +"hL" = ( +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"uY" = ( -/obj/structure/cable{ - icon_state = "1-8" +"hM" = ( +/obj/structure/chair, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"uZ" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"vb" = ( -/obj/structure/sign/warning/securearea{ - pixel_x = 32 +"hN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; + id = "Awaybiohazard"; + name = "Acid-Proof Biohazard Containment" }, -/obj/structure/cable{ - icon_state = "2-8" +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"hO" = ( +/obj/structure/table, +/turf/open/floor/iron/white/side{ + dir = 8 }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"vx" = ( -/obj/structure/cable{ - icon_state = "0-2" +"hP" = ( +/obj/structure/toilet{ + dir = 4 }, -/obj/structure/disposalpipe/segment{ - desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof disposal pipe" +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 1 }, -/obj/machinery/door/poddoor/preopen{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaylab"; - name = "Acid-Proof Containment Chamber" +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"hQ" = ( +/obj/machinery/door/airlock{ + name = "Unit 2" }, -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"vB" = ( -/obj/machinery/gateway{ - dir = 10 +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"hR" = ( +/obj/structure/urinal{ + pixel_y = 29 }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"vC" = ( +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"hS" = ( /obj/structure/sink{ dir = 4; pixel_x = 11 }, +/obj/structure/urinal{ + pixel_y = 29 + }, /obj/structure/mirror{ - icon_state = "mirror_broke"; pixel_x = 28 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"vD" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"vE" = ( -/obj/structure/cable{ - icon_state = "4-8" +"hT" = ( +/obj/machinery/shower{ + pixel_y = 16 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"vF" = ( -/obj/machinery/light/small{ - dir = 1 +"hU" = ( +/obj/machinery/shower{ + pixel_y = 16 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"vI" = ( -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 4 +"hV" = ( +/obj/machinery/light/small, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"vJ" = ( -/obj/effect/turf_decal/stripes/corner{ +"hX" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ dir = 1 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/obj/structure/window/reinforced{ + dir = 8 }, -/area/awaymission/moonoutpost19/syndicate) -"vL" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"vW" = ( +/obj/item/folder/white, +/obj/item/stamp/research_director{ + pixel_x = 3; + pixel_y = -2 + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/awaymission/moonoutpost19/research) +"hY" = ( /obj/structure/table/reinforced, -/obj/structure/alien/weeds, /obj/item/paper_bin{ pixel_x = 1; pixel_y = 9 }, -/obj/item/pen, -/obj/item/radio/off, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"wb" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"wg" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 +"hZ" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"wh" = ( -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"wi" = ( -/obj/machinery/door/poddoor/preopen{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaybiohazard"; - name = "Acid-Proof Biohazard Containment" +/obj/machinery/computer/security/telescreen{ + desc = "Used for monitoring the research division and the labs within."; + name = "research monitor"; + network = list("mo19x","mo19r") }, -/obj/machinery/door/poddoor{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaybiohazard"; - name = "Acid-Proof Biohazard Containment" +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"wj" = ( -/obj/structure/sign/warning/biohazard{ - pixel_x = 32 +"ia" = ( +/obj/machinery/computer/aifixer, +/obj/structure/window/reinforced{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/awaymission/moonoutpost19/research) +"ib" = ( +/obj/structure/rack, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/circuitboard/computer/teleporter, +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"wl" = ( -/obj/machinery/airalarm/unlocked{ - pixel_y = 23; - req_access = null; - req_access_txt = "150"; +"ic" = ( +/obj/structure/rack, +/obj/item/paicard{ + pixel_x = 4 + }, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"id" = ( +/obj/structure/rack, +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/area/awaymission/moonoutpost19/syndicate) -"wn" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"ie" = ( +/obj/machinery/door/airlock/medical{ + name = "Research Division"; + req_access_txt = "201" }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"ww" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"if" = ( +/obj/structure/closet/l3closet, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/turf/open/floor/iron/white/side{ + dir = 1 }, -/turf/open/floor/iron/white/corner, -/area/awaymission/moonoutpost19/arrivals) -"wz" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"wA" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"wB" = ( -/obj/structure/window/reinforced{ +"ig" = ( +/obj/structure/closet/l3closet, +/obj/machinery/light/small/broken, +/turf/open/floor/iron/white/side{ dir = 1 }, +/area/awaymission/moonoutpost19/research) +"ih" = ( /obj/structure/table, -/obj/item/radio/off{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/radio/off{ - pixel_x = 2 +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/machinery/newscaster{ + pixel_y = -30 }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"wE" = ( -/obj/structure/alien/weeds/node, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/iron/white/side{ dir = 1 }, -/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"wI" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof Pipe" - }, -/obj/item/stack/rods, -/obj/item/stack/cable_coil{ - amount = 5 +"ii" = ( +/obj/structure/table, +/turf/open/floor/iron/white/corner{ + dir = 1 }, -/obj/item/shard{ - icon_state = "small" +/area/awaymission/moonoutpost19/research) +"ij" = ( +/obj/machinery/airalarm/unlocked{ + dir = 8; + pixel_x = -23; + req_access = null }, -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/light/small{ dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"wL" = ( -/obj/structure/chair/fancy/comfy{ - color = "#666666"; - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"wM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"wO" = ( -/obj/machinery/conveyor{ - id = "awaysyndie" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"ik" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/obj/structure/mirror{ + icon_state = "mirror_broke"; + pixel_x = 28 }, -/area/awaymission/moonoutpost19/syndicate) -"wQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"il" = ( +/obj/item/soap/nanotrasen, +/obj/machinery/light/small{ + dir = 8 }, +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"wV" = ( -/obj/item/cigbutt, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"wW" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating, +"im" = ( +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"xa" = ( -/obj/machinery/light/small, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"xm" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; - name = "\improper HOSTILE ATMOSPHERE AHEAD"; - pixel_y = 32 +"in" = ( +/obj/machinery/shower{ + dir = 8 }, +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"io" = ( +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"xp" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"ip" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 8 }, -/area/awaymission/moonoutpost19/hive) -"xv" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" +/obj/machinery/button/door{ + id = "Awaybiohazard"; + name = "Biohazard Shutter Control"; + pixel_y = 8; + req_access_txt = "201" }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/syndicate) -"xx" = ( -/obj/machinery/gateway/centeraway{ - calibrated = 0 +/obj/machinery/button/door{ + id = "AwayRD"; + name = "Privacy Shutter Control"; + pixel_y = -2; + req_access_txt = "201" }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"xz" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/research) +"iq" = ( +/obj/structure/chair/office/light{ + dir = 1; + pixel_y = 3 }, -/area/awaymission/moonoutpost19/main) -"xE" = ( -/obj/structure/cable{ - icon_state = "0-8" +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/awaymission/moonoutpost19/research) +"ir" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"is" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_1" }, -/obj/structure/cable{ - icon_state = "0-4" +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"it" = ( +/obj/item/storage/secure/safe{ + pixel_x = 32 }, -/obj/machinery/computer/monitor/secret, +/obj/effect/decal/cleanable/blood/splatter, +/obj/item/pen, +/obj/item/paper/crumpled/awaymissions/moonoutpost19/hastey_note, /obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"xJ" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable{ - icon_state = "4-8" + dir = 4 }, -/turf/open/floor/plating, +/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"xP" = ( -/obj/structure/cable{ - icon_state = "4-8" +"iu" = ( +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/machinery/shower{ + dir = 4; + name = "emergency shower" }, -/obj/structure/alien/weeds, /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 9 }, -/turf/open/floor/iron, +/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"xR" = ( -/obj/structure/chair/wood/normal{ - dir = 8 +"iv" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/turf/open/floor/carpet, -/area/awaymission/moonoutpost19/arrivals) -"xW" = ( +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"iw" = ( /obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/light/small{ dir = 1 }, /turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/research) -"ya" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 +/area/awaymission/moonoutpost19/arrivals) +"ix" = ( +/obj/machinery/door/airlock{ + name = "Unit 1" }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"iy" = ( +/obj/machinery/door/airlock{ + name = "Unisex Showers" }, -/area/awaymission/moonoutpost19/syndicate) -"ye" = ( +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"iz" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/arrivals) +"iA" = ( +/obj/machinery/shower{ dir = 8 }, -/turf/open/floor/iron, +/obj/item/bikehorn/rubberducky, +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"ym" = ( -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ +"iE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/research) +"iF" = ( +/obj/structure/sink{ + pixel_y = 28 + }, +/obj/machinery/light/small{ dir = 8 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/research) +"iG" = ( +/obj/machinery/door/airlock{ + name = "Private Restroom" }, -/area/awaymission/moonoutpost19/syndicate) -"yo" = ( -/obj/machinery/gateway{ - dir = 6 +/turf/open/floor/iron/freezer, +/area/awaymission/moonoutpost19/research) +"iH" = ( +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = -32 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"yr" = ( -/obj/item/shard{ - icon_state = "small" +/obj/machinery/light/small/broken, +/obj/machinery/camera/directional/south{ + c_tag = "Research Director's Office"; + network = list("mo19","mo19r") }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/area/awaymission/moonoutpost19/main) -"ys" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/obj/structure/alien/resin/wall, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/research) +"iI" = ( +/obj/machinery/newscaster{ + pixel_y = -30 }, -/area/awaymission/moonoutpost19/hive) -"yv" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - id = "awaykitchen"; - name = "Serving Hatch" +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/carpet, -/area/awaymission/moonoutpost19/arrivals) -"yH" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Diner" +/area/awaymission/moonoutpost19/research) +"iJ" = ( +/obj/structure/table, +/obj/item/radio/off, +/obj/item/laser_pointer, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"yL" = ( -/obj/machinery/mineral/stacking_machine{ - dir = 1; - input_dir = 1; - output_dir = 2 +/area/awaymission/moonoutpost19/research) +"iK" = ( +/obj/structure/window/reinforced{ + dir = 8 }, /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 10 }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"iL" = ( +/obj/machinery/light/small, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"iM" = ( +/obj/structure/table, +/obj/item/storage/secure/briefcase, +/obj/item/taperecorder{ + pixel_x = -3 }, -/area/awaymission/moonoutpost19/syndicate) -"yP" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"yR" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"iN" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 }, -/turf/open/floor/plating{ - broken = 1; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/area/awaymission/moonoutpost19/arrivals) -"yV" = ( -/obj/structure/closet/crate/bin, -/obj/machinery/light/small{ - dir = 8 +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"iO" = ( +/obj/structure/closet/emcloset, +/obj/machinery/light/small, +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/obj/item/trash/cheesie, -/obj/item/trash/can, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, +/turf/open/floor/iron/white, +/area/awaymission/moonoutpost19/research) +"iP" = ( +/obj/machinery/shower{ + dir = 1 + }, +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"yZ" = ( -/obj/structure/cable{ - icon_state = "1-2" +"iT" = ( +/obj/machinery/computer/security/telescreen/entertainment, +/turf/closed/wall/rust, +/area/awaymission/moonoutpost19/arrivals) +"iU" = ( +/obj/machinery/vending/boozeomat, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"zc" = ( -/obj/item/cigbutt, -/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"zd" = ( +"iV" = ( /obj/structure/table, -/obj/item/storage/firstaid/regular, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/unlocked{ - dir = 4; - pixel_x = 23; - req_access = null - }, -/turf/open/floor/iron/white/side{ - dir = 8 +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 }, -/area/awaymission/moonoutpost19/research) -"ze" = ( /turf/open/floor/iron{ dir = 8; - icon_state = "damaged5"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + icon_state = "floorscorched2" }, /area/awaymission/moonoutpost19/arrivals) -"zi" = ( -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"zj" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +"iW" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"zn" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof disposal pipe" +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched1" }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/area/awaymission/moonoutpost19/arrivals) +"iX" = ( +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"zo" = ( +/area/awaymission/moonoutpost19/arrivals) +"iY" = ( /obj/structure/table, -/obj/item/storage/fancy/cigarettes/dromedaryco, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/machinery/reagentgrinder, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"zt" = ( -/obj/machinery/door/airlock/medical{ - name = "Research Division"; - req_access_txt = "201" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +"iZ" = ( +/obj/structure/toilet{ dir = 1 }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/research) -"zv" = ( -/obj/structure/cable{ - icon_state = "1-4" +"ja" = ( +/obj/item/stack/rods, +/obj/item/shard, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/structure/cable{ - icon_state = "1-2" +/area/awaymission/moonoutpost19/main) +"jb" = ( +/obj/structure/chair/fancy/comfy{ + color = "#666666"; + dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"zB" = ( -/obj/machinery/light/small{ +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"jc" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/detective, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"jd" = ( +/obj/structure/chair/fancy/comfy{ + color = "#666666"; dir = 8 }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"zE" = ( +"je" = ( /turf/open/floor/iron{ dir = 8; - icon_state = "floorscorched2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + icon_state = "floorscorched2" }, /area/awaymission/moonoutpost19/arrivals) -"zF" = ( -/obj/item/pickaxe/drill, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"zI" = ( -/obj/item/flashlight/lantern{ - icon_state = "lantern-on" - }, -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"zM" = ( -/obj/machinery/door/airlock{ - id_tag = "awaydorm5"; - name = "Dorm 2" - }, -/turf/open/floor/wood, -/area/awaymission/moonoutpost19/syndicate) -"Af" = ( -/obj/machinery/gateway{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +"jf" = ( +/obj/machinery/vending/cola, /turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"Aj" = ( -/obj/structure/chair{ - dir = 8 +/area/awaymission/moonoutpost19/arrivals) +"jg" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/arrivals) +"jh" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, +/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"Am" = ( +"jl" = ( /obj/structure/chair/stool, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"An" = ( +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"jm" = ( +/obj/structure/table/reinforced, /obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaybiohazard"; - name = "Acid-Proof Biohazard Containment" +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 3 }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Ao" = ( -/turf/open/floor/iron, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/machinery/door/poddoor/shutters{ + id = "awaykitchen"; + name = "Serving Hatch" + }, +/turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"Av" = ( -/obj/machinery/light/small{ - dir = 1 +"jn" = ( +/obj/effect/decal/cleanable/food/flour, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/structure/window/reinforced{ - dir = 4 +/area/awaymission/moonoutpost19/arrivals) +"jo" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 }, /obj/structure/table, -/obj/structure/bedsheetbin, -/obj/item/clothing/neck/tie/black, -/obj/item/clothing/under/suit/black, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + dir = 5 }, /area/awaymission/moonoutpost19/arrivals) -"Aw" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"Ay" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 +"jp" = ( +/obj/structure/cable{ + icon_state = "1-2" }, +/obj/effect/decal/cleanable/oil, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"AA" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/queen/large{ - desc = "A gigantic alien who is in charge of the hive and all of its loyal servants."; - name = "alien queen"; - pixel_x = -16; - plants_off = 1 - }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) -"AB" = ( -/obj/machinery/airalarm/unlocked{ - dir = 4; - pixel_x = 23; - req_access = null +/area/awaymission/moonoutpost19/research) +"jq" = ( +/obj/item/kirbyplants{ + desc = "A plastic potted plant."; + pixel_y = 3 }, -/obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + dir = 8; + icon_state = "floorscorched1" }, /area/awaymission/moonoutpost19/arrivals) -"AE" = ( +"jr" = ( +/obj/structure/chair, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"js" = ( +/obj/structure/chair, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"jt" = ( /obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 +/obj/item/newspaper, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"ju" = ( +/obj/structure/chair, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"jv" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 }, /turf/open/floor/iron{ dir = 8; icon_state = "floorscorched1" }, /area/awaymission/moonoutpost19/arrivals) -"AF" = ( -/obj/structure/closet/crate{ - desc = "It's a storage unit for kitchen clothes and equipment."; - name = "Kitchen Crate" +"jw" = ( +/obj/machinery/vending/snack, +/obj/structure/sign/poster/contraband/eat{ + pixel_y = 32 }, -/obj/item/storage/box/mousetraps, -/obj/item/clothing/under/suit/waiter, -/turf/open/floor/iron/showroomfloor{ - initial_temperature = 273.15 +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched2" }, /area/awaymission/moonoutpost19/arrivals) -"AG" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; - name = "\improper HOSTILE ATMOSPHERE AHEAD"; - pixel_y = -32 +"jx" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/area/awaymission/moonoutpost19/arrivals) +"jB" = ( +/obj/structure/grille, +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, +/area/awaymission/moonoutpost19/arrivals) +"jC" = ( +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/syndicate) -"AH" = ( +/area/awaymission/moonoutpost19/arrivals) +"jD" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"jE" = ( /obj/effect/decal/cleanable/blood/tracks{ desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1" }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"AO" = ( -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" - }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"AP" = ( -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"AS" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/turf/open/floor/plating{ - broken = 1; +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"AT" = ( +"jF" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/loading_area, -/obj/structure/alien/weeds, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"AZ" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"jG" = ( +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"jH" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-2" + }, +/obj/machinery/power/apc/highcap/fifteen_k{ + dir = 1; + locked = 0; + name = "Worn-out APC"; + pixel_y = 23; + req_access = null; + start_charge = 100 }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"jI" = ( /obj/machinery/airalarm/unlocked{ pixel_y = 23; req_access = null; dir = 1 }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Bi" = ( -/obj/structure/sign/warning/securearea{ - pixel_y = 32 +"jJ" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 }, -/obj/effect/turf_decal/stripes/corner{ +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"jK" = ( +/obj/machinery/light/small{ dir = 1 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"Bj" = ( -/obj/machinery/button/door{ - id = "awaydorm1"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_x = -25; - specialfunctions = 4 - }, -/turf/open/floor/carpet, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Bq" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 +"jL" = ( +/obj/structure/noticeboard{ + pixel_y = 32 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/item/paper/fluff/awaymissions/moonoutpost19/food_specials, +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched1" }, -/area/awaymission/moonoutpost19/hive) -"Bx" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/structure/window/reinforced, +/area/awaymission/moonoutpost19/arrivals) +"jM" = ( +/obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"BB" = ( -/obj/structure/cable{ - icon_state = "1-2" +"jO" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters{ + id = "awaykitchen"; + name = "Serving Hatch" }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Cb" = ( -/obj/machinery/power/port_gen/pacman/super{ - name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator" +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"jP" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/barman_recipes{ + pixel_y = 5 }, -/obj/structure/cable{ - icon_state = "0-2" +/obj/item/reagent_containers/food/drinks/shaker, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/plating{ - broken = 1 +/area/awaymission/moonoutpost19/arrivals) +"jQ" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 3 }, -/area/awaymission/moonoutpost19/research) -"Cd" = ( -/turf/open/floor/plating{ - broken = 1 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, /area/awaymission/moonoutpost19/arrivals) -"Ce" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/public/glass{ - density = 0; - icon_state = "open"; - name = "Dormitories"; - set_obj_flags = "EMAGGED" - }, -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" +"jR" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/arrivals) +"jT" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/moonoutpost19/syndicate) -"Cg" = ( -/obj/effect/decal/cleanable/xenoblood, -/obj/effect/decal/remains/xeno{ - desc = "They look like the remains of something... alien. The front of skull appears to have been completely obliterated." +/obj/machinery/light/small{ + dir = 1 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Cj" = ( -/obj/machinery/button/door{ - id = "awaydorm4"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 - }, -/obj/structure/bed, -/obj/item/bedsheet/syndie, -/turf/open/floor/wood{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"jU" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/moonoutpost19/syndicate) -"Co" = ( -/turf/open/floor/carpet, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Ct" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 +"jV" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/item/pen, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Cu" = ( -/obj/machinery/light/small/broken{ - dir = 8 +/area/awaymission/moonoutpost19/arrivals) +"jX" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology"; - network = list("mo19","mo19r") +/obj/item/cigbutt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"jY" = ( +/obj/machinery/light/small{ + dir = 1 }, -/turf/open/floor/iron/white/side{ - dir = 6 +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/moonoutpost19/research) -"Cw" = ( -/obj/structure/chair/fancy/comfy{ - color = "#666666"; - dir = 8 +/obj/machinery/airalarm/unlocked{ + pixel_y = 23; + req_access = null; + dir = 1 }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Cx" = ( -/obj/machinery/door/firedoor/closed{ - opacity = 0 +"jZ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Cy" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"CB" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Break Room" +"ka" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"CC" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"CZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"Dc" = ( +"kb" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Df" = ( -/obj/machinery/light/small, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/machinery/door/firedoor/closed{ + opacity = 0 }, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Dg" = ( +"kj" = ( /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" + icon_state = "4-8" }, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Do" = ( -/obj/structure/grille, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor/closed{ + opacity = 0 }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Dq" = ( -/turf/open/floor/iron{ - dir = 8; - icon_state = "damaged4"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"Ds" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/wood{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"kk" = ( +/obj/machinery/light/small, +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/moonoutpost19/syndicate) -"Du" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"kl" = ( +/obj/structure/cable{ + icon_state = "1-8" }, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/space_cube{ - pixel_x = -32 +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"km" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Diner" }, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"DG" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/awaymission/moonoutpost19/arrivals) +"kn" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/reagent_containers/glass/rag{ + pixel_y = 5 + }, +/obj/machinery/door/poddoor/shutters{ + id = "awaykitchen"; + name = "Serving Hatch" }, +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"ko" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/area/awaymission/moonoutpost19/arrivals) +"kp" = ( +/obj/structure/table, +/obj/item/kitchen/rollingpin, +/obj/item/knife/kitchen, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/area/awaymission/moonoutpost19/syndicate) -"DI" = ( -/obj/structure/sign/departments/science{ - pixel_y = 32 +/area/awaymission/moonoutpost19/arrivals) +"kq" = ( +/obj/structure/table, +/obj/item/book/manual/chef_recipes{ + pixel_x = 2; + pixel_y = 6 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 1 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"DP" = ( -/obj/item/stack/ore/iron{ - pixel_x = -3; - pixel_y = 9 +"kr" = ( +/obj/effect/decal/cleanable/food/egg_smudge, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/arrivals) +"ks" = ( +/obj/machinery/light{ + dir = 4 }, -/area/awaymission/moonoutpost19/main) -"Ed" = ( +/obj/machinery/processor, +/obj/machinery/airalarm/unlocked{ + dir = 4; + pixel_x = 23; + req_access = null + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/awaymission/moonoutpost19/arrivals) +"kt" = ( /obj/structure/closet/crate/bin, /obj/item/trash/candy, /obj/item/trash/can, @@ -3091,235 +3381,167 @@ }, /turf/open/floor/iron/white/corner, /area/awaymission/moonoutpost19/arrivals) -"Ej" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating{ - burnt = 1 - }, -/area/awaymission/moonoutpost19/research) -"Em" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"En" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/obj/item/clothing/mask/facehugger/impregnated, -/obj/item/gun/ballistic/automatic/pistol, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) -"Et" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +"ku" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, +/turf/open/floor/iron/white/corner, /area/awaymission/moonoutpost19/arrivals) -"EE" = ( -/obj/structure/cable, -/obj/machinery/power/apc/highcap/fifteen_k{ - name = "Worn-out APC"; - pixel_y = -23; - req_access = null; - req_access_txt = "150"; - start_charge = 0 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ +"kv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/turf/open/floor/iron/white/corner, +/area/awaymission/moonoutpost19/arrivals) +"kw" = ( +/obj/machinery/light/small, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = -32 }, -/area/awaymission/moonoutpost19/syndicate) -"EF" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/machinery/camera/directional/south{ + c_tag = "Arrivals North"; + network = list("mo19") }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"EM" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, +/turf/open/floor/iron/white/corner, /area/awaymission/moonoutpost19/arrivals) -"EN" = ( -/obj/machinery/shower{ +"kx" = ( +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/white/corner, /area/awaymission/moonoutpost19/arrivals) -"EQ" = ( -/obj/item/soap/nanotrasen, -/obj/machinery/light/small{ +"ky" = ( +/turf/open/floor/iron/white/corner{ dir = 8 }, -/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"ER" = ( +"kz" = ( +/obj/machinery/light/small, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"EV" = ( -/obj/structure/table, -/obj/item/plate, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"EW" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/item/stack/rods, -/turf/open/floor/plating{ - broken = 1 - }, -/area/awaymission/moonoutpost19/research) -"Fc" = ( +"kA" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 +/obj/machinery/door/firedoor/closed{ + opacity = 0 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"Fe" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" - }, -/obj/item/clothing/under/suit/burgundy, -/turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"Fj" = ( -/obj/machinery/door/firedoor, -/obj/structure/extinguisher_cabinet{ - pixel_y = -29 +"kC" = ( +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/area/awaymission/moonoutpost19/arrivals) +"kH" = ( +/obj/machinery/door/firedoor/closed{ + opacity = 0 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Fm" = ( -/obj/machinery/door/poddoor{ - id = "AwayRD"; - name = "Privacy Shutter" +/area/awaymission/moonoutpost19/arrivals) +"kI" = ( +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"kJ" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Fv" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"kN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"Fy" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/iron/white/corner{ + dir = 1 }, +/area/awaymission/moonoutpost19/arrivals) +"kO" = ( /obj/machinery/firealarm{ dir = 4; - pixel_x = 28 + pixel_x = 24 }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"FA" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/button/door{ - id = "awaydorm3"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_x = -25; - specialfunctions = 4 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"kP" = ( +/obj/item/stack/rods, +/obj/structure/grille/broken, +/obj/item/stack/rods, +/obj/item/shard{ + icon_state = "medium" }, -/obj/effect/decal/remains/human{ - desc = "They look like human remains. The skeleton is laid out on its side and there seems to have been no sign of struggle." +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"FF" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"kR" = ( +/obj/machinery/door/firedoor/closed{ + opacity = 0 }, -/area/awaymission/moonoutpost19/hive) -"FG" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"FK" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" +"kS" = ( +/obj/machinery/door/firedoor/closed{ + opacity = 0 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"FL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"kT" = ( +/obj/machinery/button/door{ + id = "awaydorm1"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -25; + specialfunctions = 4 }, -/turf/open/floor/iron, +/turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"FO" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; - name = "\improper HOSTILE ATMOSPHERE AHEAD" +"kU" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ + locked = 0; + req_access_txt = "201" }, -/obj/effect/spawner/structure/window/reinforced, +/obj/item/clothing/under/suit/navy, +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"kV" = ( +/obj/machinery/door/airlock/maintenance, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"FU" = ( -/obj/structure/alien/weeds/node, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) -"FV" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 6; - icon_state = "ltrails_1" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +"lb" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 26 }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"Ge" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/camera/directional/east{ + c_tag = "Kitchen"; + network = list("mo19") }, -/turf/open/floor/plating{ - broken = 1 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/area/awaymission/moonoutpost19/research) -"Gi" = ( +/area/awaymission/moonoutpost19/arrivals) +"lc" = ( +/turf/closed/wall/mineral/titanium/interior, +/area/awaymission/moonoutpost19/arrivals) +"ld" = ( +/turf/closed/wall/mineral/titanium, +/area/awaymission/moonoutpost19/arrivals) +"lf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -3328,394 +3550,446 @@ dir = 1 }, /area/awaymission/moonoutpost19/arrivals) -"Gk" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Gm" = ( +"lg" = ( +/obj/item/cigbutt, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"lh" = ( +/obj/structure/chair{ + dir = 8 }, -/area/awaymission/moonoutpost19/syndicate) -"Gu" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "150" +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"li" = ( +/obj/item/stack/rods, +/obj/item/shard{ + icon_state = "small" }, -/obj/item/stack/spacecash/c50, -/turf/open/floor/wood, -/area/awaymission/moonoutpost19/syndicate) -"Gx" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_2" +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/plating{ - broken = 1; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/area/awaymission/moonoutpost19/main) +"lj" = ( +/obj/machinery/light/small{ + dir = 1 }, -/area/awaymission/moonoutpost19/arrivals) -"Gz" = ( -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"GA" = ( -/turf/open/floor/iron/showroomfloor{ - initial_temperature = 273.15 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) -"GE" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/research{ - density = 0; - icon_state = "open"; - name = "Xenobiology Lab"; - opacity = 0; - req_access_txt = "201"; - set_obj_flags = "EMAGGED" +"lm" = ( +/obj/machinery/door/airlock{ + id_tag = "awaydorm1"; + name = "Dorm 1" }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"GF" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, +/area/awaymission/moonoutpost19/arrivals) +"ln" = ( +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"lo" = ( /obj/machinery/light/small{ dir = 4 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"GI" = ( -/obj/structure/noticeboard{ - dir = 1; - pixel_y = -32 - }, -/obj/machinery/light/small/broken, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/evacuation, -/obj/machinery/camera/directional/south{ - c_tag = "Research Division"; - network = list("mo19","mo19r") +/obj/structure/chair/wood/normal, +/obj/machinery/airalarm/unlocked{ + dir = 4; + pixel_x = 23; + req_access = null }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"lt" = ( +/obj/machinery/button/door{ + id = "awaykitchen"; + name = "Kitchen Shutters Control"; + pixel_x = -25 }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"GO" = ( -/turf/open/floor/iron{ - dir = 8; - icon_state = "damaged2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/area/awaymission/moonoutpost19/syndicate) -"GP" = ( -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"GQ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/area/awaymission/moonoutpost19/arrivals) +"lu" = ( +/obj/machinery/door/airlock{ + name = "Kitchen Cold Room"; + req_access_txt = "201" }, -/turf/open/floor/iron/white/corner, +/turf/open/floor/iron/showroomfloor, /area/awaymission/moonoutpost19/arrivals) -"GR" = ( -/obj/machinery/button/door{ - id = "awaydorm5"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 +"ly" = ( +/obj/machinery/airalarm/directional/north{ + pixel_y = 23; + req_access = null; + req_access_txt = "150" }, -/obj/structure/dresser, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/syndicate) -"GX" = ( -/obj/machinery/shower{ - pixel_y = 16 +"lE" = ( +/obj/structure/shuttle/engine/propulsion/burst/right{ + dir = 4 }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"GY" = ( -/obj/structure/window/reinforced{ - dir = 1 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/structure/closet/l3closet/scientist, -/obj/structure/alien/weeds, +/area/awaymission/moonoutpost19/arrivals) +"lF" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Ha" = ( +/area/awaymission/moonoutpost19/arrivals) +"lG" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"lH" = ( /obj/structure/table, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = 32 +/obj/item/storage/fancy/cigarettes/dromedaryco, +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/obj/item/plate, -/obj/item/cigbutt, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"He" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/awaymission/moonoutpost19/arrivals) +"lK" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"lL" = ( +/obj/structure/table/wood, +/obj/item/lighter, +/obj/machinery/newscaster{ + pixel_x = 30 }, +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"lM" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"lN" = ( +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"lO" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"lQ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Kitchen"; + req_access_txt = "201" + }, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/arrivals) +"lR" = ( +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/arrivals) +"lS" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/arrivals) +"lT" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/suit/hooded/chaplain_hoodie, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/arrivals) +"lV" = ( +/obj/structure/table, +/obj/item/paper/fluff/awaymissions/moonoutpost19/log/ivan, +/turf/open/floor/plating{ + broken = 1 + }, /area/awaymission/moonoutpost19/research) -"Hg" = ( -/obj/item/kirbyplants{ - desc = "A plastic potted plant."; - pixel_y = 3 +"lW" = ( +/obj/structure/table, +/obj/item/storage/lockbox, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/moonoutpost19/arrivals) +"lX" = ( +/obj/structure/table, +/obj/item/radio/off, +/turf/open/floor/mineral/titanium/yellow, +/area/awaymission/moonoutpost19/arrivals) +"lZ" = ( +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = -32 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/turf/open/floor/mineral/titanium/yellow, +/area/awaymission/moonoutpost19/arrivals) +"ma" = ( +/obj/structure/chair{ dir = 8 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/obj/machinery/light/small{ + dir = 1 }, +/turf/open/floor/mineral/titanium/blue, /area/awaymission/moonoutpost19/arrivals) -"Hi" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"Hl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ +"mb" = ( +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/moonoutpost19/arrivals) +"mc" = ( +/obj/structure/chair{ dir = 8 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/moonoutpost19/arrivals) +"md" = ( +/obj/machinery/newscaster{ + pixel_y = 30 }, -/area/awaymission/moonoutpost19/syndicate) -"Hq" = ( /obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/moonoutpost19/arrivals) +"me" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/moonoutpost19/arrivals) +"mf" = ( +/obj/structure/shuttle/engine/propulsion/burst/left{ dir = 4 }, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/arrivals) +"mg" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/sign/poster/contraband/hacking_guide{ - pixel_x = 32 +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"mi" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/decal/cleanable/dirt, +/obj/structure/window{ + dir = 1 }, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"Ht" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"Hx" = ( +/area/awaymission/moonoutpost19/arrivals) +"ml" = ( /obj/structure/table, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/suit/apron/surgical, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white/side{ +/obj/item/storage/backpack/satchel/leather/withwallet, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/arrivals) +"mp" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/moonoutpost19/arrivals) +"mq" = ( +/obj/structure/chair{ dir = 1 }, -/area/awaymission/moonoutpost19/research) -"Hz" = ( -/obj/machinery/computer/monitor/secret{ +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/awaymission/moonoutpost19/arrivals) +"mr" = ( +/turf/open/floor/mineral/titanium/yellow, +/area/awaymission/moonoutpost19/arrivals) +"ms" = ( +/obj/effect/landmark/awaystart, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/moonoutpost19/arrivals) +"mt" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/awaystart, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/moonoutpost19/arrivals) +"mu" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/window/reinforced{ dir = 1 }, -/obj/structure/cable, +/turf/open/floor/mineral/titanium/yellow, +/area/awaymission/moonoutpost19/arrivals) +"mv" = ( +/obj/structure/sign/warning/vacuum{ + desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; + name = "\improper HOSTILE ATMOSPHERE AHEAD" + }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"HC" = ( -/obj/structure/alien/weeds/node, +/area/awaymission/moonoutpost19/arrivals) +"mw" = ( +/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"my" = ( +/obj/structure/table/wood, +/obj/machinery/button/door{ + id = "awaydorm2"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -25; + specialfunctions = 4 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"mz" = ( +/obj/structure/chair/wood/normal{ dir = 8 }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"mA" = ( +/obj/structure/closet/emcloset, +/obj/structure/window, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"mB" = ( +/obj/effect/spawner/randomarcade, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/arrivals) +"mC" = ( +/obj/machinery/vending/cigarette, +/obj/structure/sign/poster/contraband/smoke{ + pixel_y = -32 }, -/area/awaymission/moonoutpost19/syndicate) -"HE" = ( -/obj/structure/shuttle/engine/propulsion/burst/right{ - dir = 4 +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/arrivals) +"mD" = ( +/obj/machinery/light/small{ + dir = 8 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/structure/chair/fancy/comfy, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/arrivals) +"mE" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/bottle/whiskey{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 6; + pixel_y = 8 }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 3 + }, +/turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/arrivals) -"HI" = ( -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2" +"mF" = ( +/obj/structure/chair/fancy/comfy, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/arrivals) +"mG" = ( +/obj/machinery/computer/shuttle_flight{ + dir = 4 }, -/obj/machinery/door/poddoor/preopen{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaylab"; - name = "Acid-Proof Containment Chamber" +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/moonoutpost19/arrivals) +"mH" = ( +/obj/machinery/door/airlock/titanium{ + name = "Shuttle Cockpit" }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"HK" = ( -/obj/structure/closet/crate, -/obj/item/storage/box/lights/mixed, -/obj/item/poster/random_contraband, -/turf/open/floor/plating{ - broken = 1 +/turf/open/floor/mineral/titanium/yellow, +/area/awaymission/moonoutpost19/arrivals) +"mI" = ( +/obj/effect/landmark/awaystart, +/turf/open/floor/mineral/titanium/yellow, +/area/awaymission/moonoutpost19/arrivals) +"mJ" = ( +/obj/structure/sign/warning/vacuum{ + desc = "A beacon used by a teleporter."; + icon = 'icons/obj/device.dmi'; + icon_state = "beacon"; + name = "tracking beacon" }, -/area/awaymission/moonoutpost19/research) -"HN" = ( -/obj/machinery/airalarm/directional/east{ - pixel_x = 23; - req_access = null; - req_access_txt = "150" +/obj/effect/landmark/awaystart, +/turf/open/floor/mineral/titanium/yellow, +/area/awaymission/moonoutpost19/arrivals) +"mK" = ( +/obj/machinery/door/airlock/titanium{ + name = "Shuttle Airlock" }, -/turf/open/floor/wood, -/area/awaymission/moonoutpost19/syndicate) -"HO" = ( -/obj/structure/rack, -/obj/item/clothing/suit/space/syndicate/orange, -/obj/item/clothing/mask/gas, -/obj/item/pickaxe/drill, -/obj/item/clothing/head/helmet/space/syndicate/orange, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/moonoutpost19/arrivals) +"mL" = ( +/obj/machinery/door/airlock/external, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"mM" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 }, -/area/awaymission/moonoutpost19/syndicate) -"HU" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"mN" = ( +/obj/machinery/light/small{ + dir = 4 }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/obj/effect/decal/cleanable/dirt, +/obj/structure/noticeboard{ + dir = 8; + pixel_x = 32 }, -/area/awaymission/moonoutpost19/syndicate) -"Ia" = ( -/obj/structure/disposaloutlet, -/obj/structure/disposalpipe/trunk{ - dir = 1 +/obj/item/paper/fluff/awaymissions/moonoutpost19/welcome, +/obj/machinery/camera/directional/east{ + c_tag = "Arrivals South"; + network = list("mo19") }, -/turf/open/floor/plating{ - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/area/awaymission/moonoutpost19/main) -"Ic" = ( -/obj/effect/decal/cleanable/blood/splatter, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Ie" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/table, -/obj/machinery/cell_charger, +/area/awaymission/moonoutpost19/arrivals) +"mO" = ( /obj/machinery/light/small{ dir = 8 }, -/obj/item/stock_parts/cell/high, -/obj/item/paper/fluff/awaymissions/moonoutpost19/engineering, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"Ii" = ( -/turf/open/floor/iron/white/side, -/area/awaymission/moonoutpost19/research) -"Io" = ( -/obj/item/stack/ore/iron{ - pixel_x = 7; - pixel_y = -6 - }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"Ir" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/hive) -"Iu" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Iw" = ( -/obj/structure/window/reinforced, -/obj/structure/closet/secure_closet{ - icon_state = "science"; - name = "scientist's locker"; - req_access_txt = "201" +/area/awaymission/moonoutpost19/arrivals) +"mR" = ( +/obj/machinery/door/airlock{ + id_tag = "awaydorm2"; + name = "Dorm 2" }, -/obj/item/clothing/suit/toggle/labcoat, -/obj/item/tank/internals/air, -/obj/item/clothing/mask/gas, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Iy" = ( /obj/effect/decal/cleanable/blood/tracks{ desc = "Your instincts say you shouldn't be following these."; - icon_state = "ltrails_2" - }, -/obj/machinery/camera/directional/west{ - c_tag = "Dormitories"; - network = list("mo19") - }, -/turf/open/floor/iron{ dir = 8; - icon_state = "damaged1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + icon_state = "ltrails_1" }, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"IA" = ( -/turf/open/floor/wood, -/area/awaymission/moonoutpost19/syndicate) -"IF" = ( -/obj/structure/shuttle/engine/propulsion/burst/left{ - dir = 4 - }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"mS" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 5; + icon_state = "ltrails_1" }, +/turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"IN" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) -"IR" = ( -/obj/machinery/light/broken{ +"mT" = ( +/obj/machinery/light/small{ dir = 4 }, /obj/machinery/airalarm/unlocked{ @@ -3723,907 +3997,780 @@ pixel_x = 23; req_access = null }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"IW" = ( -/obj/structure/rack, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"IZ" = ( +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"mU" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"mV" = ( /obj/structure/table, -/obj/item/toy/cards/deck, -/turf/open/floor/iron{ - dir = 8; - icon_state = "damaged1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, +/obj/item/clipboard, +/obj/item/pen, +/turf/open/floor/mineral/titanium/blue, /area/awaymission/moonoutpost19/arrivals) -"Jd" = ( -/obj/structure/closet/l3closet, -/obj/machinery/light/small/broken, -/turf/open/floor/iron/white/side{ - dir = 1 +"mW" = ( +/obj/structure/chair, +/obj/machinery/light/small{ + dir = 4 }, -/area/awaymission/moonoutpost19/research) -"Je" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/turf/open/floor/plating, +/turf/open/floor/mineral/titanium/yellow, /area/awaymission/moonoutpost19/arrivals) -"Jg" = ( -/obj/structure/cable{ - icon_state = "0-2" +"mY" = ( +/obj/machinery/light/small{ + dir = 4 }, -/obj/machinery/power/smes{ - charge = 1.5e+006; - input_level = 10000; - inputting = 0; - output_level = 15000 +/obj/structure/window/reinforced, +/turf/open/floor/mineral/titanium/yellow, +/area/awaymission/moonoutpost19/arrivals) +"na" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"nb" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ + locked = 0; + req_access_txt = "201" }, +/obj/item/clothing/under/misc/assistantformal, +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"nc" = ( +/obj/machinery/space_heater, +/obj/effect/decal/cleanable/generic, +/obj/structure/window, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Ji" = ( +/area/awaymission/moonoutpost19/arrivals) +"nf" = ( +/obj/structure/filingcabinet, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/moonoutpost19/arrivals) +"ng" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/small, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/moonoutpost19/arrivals) +"nh" = ( /obj/machinery/newscaster{ - pixel_x = 30 + pixel_y = -30 }, -/turf/open/floor/carpet, +/obj/machinery/light/small, +/turf/open/floor/mineral/titanium/blue, /area/awaymission/moonoutpost19/arrivals) -"Jn" = ( +"nk" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"Jq" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"Ju" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, +/obj/item/trash/candy, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"JC" = ( -/obj/machinery/door/firedoor/closed{ - opacity = 0 +"nl" = ( +/obj/item/cigbutt, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"nm" = ( +/obj/structure/sign/warning/vacuum{ + desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; + name = "\improper HOSTILE ATMOSPHERE AHEAD"; + pixel_y = 32 }, -/obj/effect/turf_decal/tile/neutral{ +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"no" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"JE" = ( -/obj/structure/chair{ - dir = 1 +"np" = ( +/obj/machinery/light/small{ + dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"JM" = ( -/obj/structure/table, -/turf/open/floor/iron/white/corner{ - dir = 1 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/research) -"JO" = ( -/obj/machinery/light/small, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"JQ" = ( -/obj/item/stack/rods, +"ns" = ( /obj/structure/grille/broken, /obj/item/stack/rods, -/obj/item/shard{ - icon_state = "medium" - }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"JU" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/power/apc/highcap/fifteen_k{ - dir = 1; - locked = 0; - name = "Worn-out APC"; - pixel_y = 23; - req_access = null; - start_charge = 100 - }, -/turf/open/floor/iron, +"nt" = ( +/obj/structure/grille, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"JY" = ( -/obj/machinery/light{ - dir = 8 +"nv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/structure/chair/stool, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"JZ" = ( -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"Kb" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; +"nz" = ( +/obj/machinery/door/airlock/maintenance{ req_access_txt = "201" }, -/obj/item/clothing/under/suit/navy, -/turf/open/floor/carpet, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"Kd" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ +"nA" = ( +/obj/machinery/light/small{ dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"Ke" = ( -/obj/structure/chair/stool, -/turf/open/floor/plating{ - broken = 1 - }, -/area/awaymission/moonoutpost19/syndicate) -"Kf" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - req_access_txt = "150" - }, -/obj/item/ammo_box/magazine/m10mm{ - icon_state = "9x19p-8" +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"nB" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"nC" = ( +/obj/item/stack/rods, +/obj/item/shard{ + icon_state = "small" }, -/obj/item/ammo_box/magazine/m10mm{ - icon_state = "9x19p-8" +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 9; + icon_state = "ltrails_1" }, -/obj/item/suppressor, -/turf/open/floor/wood{ +/turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/area/awaymission/moonoutpost19/syndicate) -"Kg" = ( -/obj/machinery/gateway{ - dir = 4 +/area/awaymission/moonoutpost19/main) +"nH" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/machinery/button/door{ + id = "awaydorm3"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -25; + specialfunctions = 4 }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"Kr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 +/obj/effect/decal/remains/human{ + desc = "They look like human remains. The skeleton is laid out on its side and there seems to have been no sign of struggle." }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"Ks" = ( -/obj/structure/table/reinforced, -/obj/structure/alien/weeds, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the contents of the xenobiology containment pen."; - dir = 8; - name = "xenobiology monitor"; - network = list("mo19x") +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"nI" = ( +/obj/structure/dresser, +/obj/item/paper/fluff/awaymissions/moonoutpost19/goodbye_note, +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"nK" = ( +/obj/structure/sign/warning/vacuum{ + desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; + name = "\improper HOSTILE ATMOSPHERE AHEAD"; + pixel_x = -32 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"nL" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"nO" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock{ + id_tag = "awaydorm3"; + name = "Dorm 3" }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Kt" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating{ - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/area/awaymission/moonoutpost19/arrivals) +"nP" = ( +/obj/item/pen, +/obj/item/storage/pill_bottle{ + pixel_y = 6 }, +/turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"KK" = ( -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +"nQ" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"KL" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet, +"nR" = ( +/obj/structure/closet, +/obj/item/storage/box/lights/mixed, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"KM" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "damaged1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +"nT" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ + locked = 0; + req_access_txt = "201" }, +/obj/item/clothing/under/suit/burgundy, +/turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"KR" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/grille, -/obj/machinery/door/poddoor/preopen{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaylab"; - name = "Acid-Proof Containment Chamber" - }, -/obj/item/stack/cable_coil/cut/red{ - amount = 1 +"nU" = ( +/obj/machinery/newscaster{ + pixel_x = 30 }, +/turf/open/floor/carpet, +/area/awaymission/moonoutpost19/arrivals) +"nV" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"KT" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/awaymission/moonoutpost19/arrivals) +"oa" = ( +/obj/structure/chair/fancy/comfy{ + color = "#666666" }, -/obj/machinery/door/firedoor/closed{ - opacity = 0 +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"KY" = ( -/obj/structure/dresser, -/obj/item/paper/fluff/awaymissions/moonoutpost19/goodbye_note, -/turf/open/floor/carpet, -/area/awaymission/moonoutpost19/arrivals) -"La" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" +"od" = ( +/obj/item/shard{ + icon_state = "small" }, -/obj/item/mining_scanner, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"Lc" = ( -/obj/machinery/door/airlock{ - id_tag = "awaydorm2"; - name = "Dorm 2" +"oe" = ( +/obj/item/trash/candy, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" +/area/awaymission/moonoutpost19/main) +"oT" = ( +/obj/structure/closet/secure_closet{ + icon_state = "science"; + locked = 0; + name = "scientist's locker"; + req_access_txt = "201" }, +/obj/item/clothing/suit/toggle/labcoat, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Ld" = ( -/obj/structure/chair/wood/normal, -/obj/machinery/airalarm/directional/west{ - pixel_x = -23; - req_access = null; - req_access_txt = "150" +/area/awaymission/moonoutpost19/research) +"oU" = ( +/obj/structure/window/reinforced, +/obj/structure/closet/secure_closet{ + icon_state = "science"; + name = "scientist's locker"; + req_access_txt = "201" }, +/obj/item/clothing/suit/toggle/labcoat, +/obj/item/tank/internals/air, +/obj/item/clothing/mask/gas, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"oW" = ( +/obj/structure/tank_dispenser/oxygen{ + oxygentanks = 9 }, -/area/awaymission/moonoutpost19/syndicate) -"Lh" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/machinery/light/small/broken{ + dir = 1 }, -/area/awaymission/moonoutpost19/hive) -"Li" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"Lj" = ( -/obj/machinery/door/poddoor/preopen{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaylab"; - name = "Acid-Proof Containment Chamber" +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof Pipe" +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/item/stack/rods, -/obj/item/stack/cable_coil{ - amount = 5 +/area/awaymission/moonoutpost19/syndicate) +"pg" = ( +/obj/item/radio/off, +/obj/item/screwdriver{ + pixel_y = 10 }, -/obj/item/shard{ - icon_state = "medium" +/obj/structure/sign/poster/official/safety_report{ + pixel_y = 32 }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 }, -/turf/open/floor/engine, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"Ll" = ( -/obj/item/stack/ore/iron{ - pixel_x = -7; - pixel_y = -4 - }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"Ln" = ( +"pM" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/moonoutpost19/syndicate) -"Lp" = ( -/obj/machinery/vending/medical{ - req_access_txt = "201" - }, -/turf/open/floor/iron/white/side, -/area/awaymission/moonoutpost19/research) -"Lz" = ( +"pV" = ( /turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + dir = 8; + icon_state = "damaged3"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"LA" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +"ql" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 }, +/obj/item/pen, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"LG" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 5; - icon_state = "ltrails_1" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"LZ" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 +"qo" = ( +/obj/machinery/light/small, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"qs" = ( +/turf/open/floor/plating{ + icon_plating = "asteroidplating"; + icon_state = "asteroidplating"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/main) +"qv" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating{ + broken = 1 }, -/area/awaymission/moonoutpost19/hive) -"Mc" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "awaysyndie"; - name = "mining conveyor" +/area/awaymission/moonoutpost19/arrivals) +"qw" = ( +/turf/open/floor/plating{ + broken = 1 }, +/area/awaymission/moonoutpost19/arrivals) +"qB" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"Mg" = ( -/obj/structure/chair/fancy/comfy{ - color = "#666666"; +"qI" = ( +/obj/machinery/gateway{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"qW" = ( +/obj/machinery/airalarm/unlocked{ + dir = 4; + pixel_x = 23; + req_access = null }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"Mi" = ( -/obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) -"Ml" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; - name = "\improper HOSTILE ATMOSPHERE AHEAD"; - pixel_x = -32 + temperature = 251 }, -/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"Mo" = ( -/obj/machinery/airalarm/directional/east{ - pixel_x = 23; - req_access = null; - req_access_txt = "150" - }, -/obj/machinery/light/broken{ - dir = 4 +"qZ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, -/obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"Ms" = ( -/obj/structure/cable{ - icon_state = "2-4" +"rd" = ( +/obj/structure/filingcabinet, +/obj/item/paper/fluff/awaymissions/moonoutpost19/log/kenneth, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 }, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"Mx" = ( -/obj/structure/cable{ - icon_state = "1-2" +"rS" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Mz" = ( -/obj/structure/chair{ - dir = 1 +/area/awaymission/moonoutpost19/syndicate) +"rY" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"MA" = ( -/obj/structure/toilet{ - dir = 4 +"sb" = ( +/obj/machinery/button/door{ + id = "Awaybiohazard"; + name = "Biohazard Shutter Control"; + pixel_x = -25; + req_access_txt = "201" }, /obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"MJ" = ( -/obj/item/stack/rods, -/obj/item/shard, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"MK" = ( -/obj/machinery/light{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"MT" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security Post"; - req_access_txt = "201" +/obj/machinery/computer/security{ + desc = "Used to access the various cameras on the outpost."; + dir = 4; + network = list("mo19r","mo19") }, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"MV" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"MY" = ( -/obj/machinery/light/small{ - dir = 8 +"so" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 }, -/obj/structure/table, -/obj/item/storage/box, -/obj/machinery/airalarm/unlocked{ - dir = 8; - pixel_x = -23; - req_access = null +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/east{ + c_tag = "Bar"; + network = list("mo19") }, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Na" = ( -/obj/structure/table, -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/ivan, -/turf/open/floor/plating{ - broken = 1 - }, -/area/awaymission/moonoutpost19/research) -"Nb" = ( -/obj/structure/alien/weeds/node, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +"sQ" = ( +/obj/machinery/power/port_gen/pacman/super{ + name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator" }, -/area/awaymission/moonoutpost19/hive) -"Nc" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/radio/off, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Nl" = ( -/obj/effect/decal/cleanable/oil, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-2" }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Nm" = ( -/obj/structure/closet/crate/bin, -/obj/item/clothing/gloves/color/latex, -/obj/item/trash/chips, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken{ - dir = 1 +/turf/open/floor/plating{ + broken = 1 }, -/turf/open/floor/iron/white/side, /area/awaymission/moonoutpost19/research) -"Nn" = ( -/obj/structure/table, -/obj/item/newspaper, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"No" = ( -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - name = "old sink"; - pixel_y = 28 - }, -/turf/open/floor/iron/showroomfloor{ - initial_temperature = 273.15 +"sR" = ( +/obj/structure/shuttle/engine/heater{ + dir = 4 }, -/area/awaymission/moonoutpost19/arrivals) -"Nq" = ( -/obj/structure/table, -/obj/item/storage/box/gloves, -/turf/open/floor/iron/white/corner{ +/obj/structure/window/reinforced{ dir = 8 }, -/area/awaymission/moonoutpost19/research) -"Ns" = ( -/obj/machinery/light/small{ - dir = 1 - }, /turf/open/floor/plating{ - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"Nv" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/reagent_containers/glass/rag{ - pixel_y = 5 +"sS" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_1" }, -/obj/machinery/door/poddoor/shutters{ - id = "awaykitchen"; - name = "Serving Hatch" +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"Nw" = ( -/obj/machinery/light{ - dir = 4 +"sX" = ( +/obj/machinery/light/small{ + dir = 1 }, -/obj/machinery/airalarm/directional/east{ - pixel_x = 23; - req_access = null; - req_access_txt = "150" +/obj/structure/cable{ + icon_state = "4-8" }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"Nz" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron{ - amount = 12 +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, +/area/awaymission/moonoutpost19/arrivals) +"sY" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/bot{ - dir = 1 +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 }, /turf/open/floor/iron{ - dir = 1; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"NE" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 3 +"tf" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3 +/turf/open/floor/plating{ + burnt = 1 }, -/obj/machinery/door/poddoor/shutters{ - id = "awaykitchen"; - name = "Serving Hatch" +/area/awaymission/moonoutpost19/research) +"tz" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/iron{ + dir = 8; + icon_state = "damaged3"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"NG" = ( -/obj/structure/closet/secure_closet/freezer{ - locked = 0; - name = "refrigerator"; - req_access_txt = "201" +"tP" = ( +/obj/structure/chair/fancy/comfy{ + color = "#666666"; + dir = 8 }, -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/storage/fancy/egg_box, -/turf/open/floor/iron/showroomfloor{ - initial_temperature = 273.15 +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched2"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"NM" = ( +"tU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating{ + broken = 1 + }, +/area/awaymission/moonoutpost19/research) +"tW" = ( +/obj/structure/table, +/obj/item/toy/cards/deck, /turf/open/floor/iron{ dir = 8; - icon_state = "damaged2"; + icon_state = "damaged1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"NQ" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/obj/item/stack/rods, -/obj/item/shard, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"NT" = ( -/obj/machinery/airalarm/unlocked{ - pixel_y = 23; - req_access = null; - dir = 1 +"vh" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = 32 }, +/obj/item/plate, +/obj/item/cigbutt, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"NY" = ( -/obj/effect/decal/cleanable/xenoblood, -/obj/effect/decal/cleanable/xenoblood/xgibs, +/area/awaymission/moonoutpost19/syndicate) +"vM" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/item/trash/cheesie, +/obj/item/trash/can, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"NZ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating{ - broken = 1 +"vV" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 }, -/area/awaymission/moonoutpost19/research) -"Oa" = ( -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/generic, -/obj/structure/window, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"Od" = ( +"vY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"Og" = ( -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Om" = ( -/obj/structure/closet/l3closet, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/awaymission/moonoutpost19/research) -"Op" = ( -/obj/structure/closet/l3closet/scientist, -/obj/structure/window/reinforced, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, +"wp" = ( +/obj/item/cigbutt, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Or" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) -"Os" = ( -/obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/hive) -"OD" = ( -/obj/structure/sink{ - pixel_y = 28 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/syndicate) -"OF" = ( +/area/awaymission/moonoutpost19/arrivals) +"wP" = ( /obj/machinery/gateway{ - dir = 1 + dir = 10 }, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/syndicate) -"OJ" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" +"wS" = ( +/obj/structure/sign/warning/vacuum{ + desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; + name = "\improper HOSTILE ATMOSPHERE AHEAD"; + pixel_y = -32 }, -/obj/item/clothing/under/misc/assistantformal, -/turf/open/floor/carpet, -/area/awaymission/moonoutpost19/arrivals) -"OK" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/stripes/line{ - dir = 6 + dir = 10 }, /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"OL" = ( -/obj/structure/table/wood, -/obj/machinery/button/door{ - id = "awaydorm2"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_x = -25; - specialfunctions = 4 - }, -/obj/machinery/newscaster{ - pixel_y = 32 +"xg" = ( +/obj/item/cigbutt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"xG" = ( +/obj/structure/chair{ + dir = 8 }, -/turf/open/floor/carpet, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"OO" = ( -/obj/structure/chair, +"xH" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"OQ" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock{ - density = 0; - icon_state = "open"; - id_tag = "awaydorm4"; - name = "Dorm 1"; - opacity = 0; - set_obj_flags = "EMAGGED" +"xK" = ( +/obj/structure/closet/crate, +/obj/item/storage/box/lights/mixed, +/obj/item/poster/random_contraband, +/turf/open/floor/plating{ + broken = 1 }, +/area/awaymission/moonoutpost19/research) +"xO" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/syndicate) -"OR" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/external{ - density = 0; - icon_state = "open"; - opacity = 0; - req_access_txt = "150"; - set_obj_flags = "EMAGGED" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 }, -/area/awaymission/moonoutpost19/syndicate) -"OS" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"yb" = ( +/turf/open/floor/iron/showroomfloor{ + temperature = 273.15 }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "damaged3"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +/area/awaymission/moonoutpost19/arrivals) +"yh" = ( +/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/remains/xeno{ + desc = "They look like the remains of something... alien. The front of skull appears to have been completely obliterated." }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"OU" = ( -/turf/open/floor/iron/white/corner{ +"yy" = ( +/obj/structure/chair/stool, +/turf/open/floor/plating{ + broken = 1 + }, +/area/awaymission/moonoutpost19/syndicate) +"yC" = ( +/obj/machinery/light/small{ dir = 8 }, -/area/awaymission/moonoutpost19/arrivals) -"OW" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/space_cube{ + pixel_x = -32 }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"Pa" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"yT" = ( +/obj/structure/closet/emcloset, +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/item/multitool, -/obj/effect/turf_decal/tile/blue/half/contrasted{ +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, /turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"yU" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Pd" = ( +"zh" = ( /obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/area/awaymission/moonoutpost19/hive) -"Pf" = ( -/obj/machinery/light/small{ - dir = 4 +/area/awaymission/moonoutpost19/syndicate) +"zk" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating{ + broken = 1; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, +/area/awaymission/moonoutpost19/arrivals) +"zl" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/noticeboard{ - dir = 8; - pixel_x = 32 +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"zD" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 }, -/obj/item/paper/fluff/awaymissions/moonoutpost19/welcome, -/obj/machinery/camera/directional/east{ - c_tag = "Arrivals South"; - network = list("mo19") +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/turf_decal/stripes/line{ +/area/awaymission/moonoutpost19/syndicate) +"zP" = ( +/obj/machinery/light/small{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Pl" = ( -/obj/machinery/door/airlock{ - name = "Unit 2" +/obj/effect/decal/cleanable/generic, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"Pm" = ( -/obj/machinery/light/small, -/obj/structure/cable{ - icon_state = "4-8" +"zZ" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals) +"Ac" = ( +/turf/open/floor/iron{ + dir = 8; + icon_state = "damaged2"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/decal/cleanable/dirt, +/area/awaymission/moonoutpost19/syndicate) +"Al" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"AG" = ( +/obj/structure/closet/crate/bin, +/obj/item/plate, +/obj/item/food/badrecipe, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, /area/awaymission/moonoutpost19/arrivals) -"Pn" = ( +"Bs" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/item/stack/rods, +/turf/open/floor/plating{ + broken = 1 + }, +/area/awaymission/moonoutpost19/research) +"BZ" = ( +/obj/machinery/airalarm/directional/east{ + pixel_x = 23; + req_access = null; + req_access_txt = "150" + }, +/obj/machinery/light/broken{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"Ca" = ( /obj/machinery/mineral/processing_unit{ dir = 1 }, @@ -4632,297 +4779,278 @@ }, /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"Po" = ( -/obj/structure/closet/emcloset, -/obj/machinery/light/small, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"Ps" = ( -/obj/structure/table/wood, -/obj/item/lighter, -/obj/machinery/newscaster{ - pixel_x = 30 +"CF" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/security_space_law, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = -32 }, -/turf/open/floor/carpet, -/area/awaymission/moonoutpost19/arrivals) -"Pt" = ( -/obj/machinery/vending/snack, -/obj/structure/sign/poster/contraband/eat{ - pixel_y = 32 +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"CJ" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"CK" = ( /turf/open/floor/iron{ dir = 8; - icon_state = "floorscorched2" + icon_state = "damaged4"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/area/awaymission/moonoutpost19/arrivals) -"Pw" = ( +/area/awaymission/moonoutpost19/syndicate) +"CL" = ( /obj/structure/table, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/awaymission/moonoutpost19/research) -"PB" = ( -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" - }, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 9; - icon_state = "ltrails_1" +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/item/multitool, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 }, -/area/awaymission/moonoutpost19/main) -"PD" = ( -/obj/structure/grille, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"PG" = ( -/obj/structure/table/optable, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white/side{ +"Dm" = ( +/obj/machinery/light/small{ dir = 1 }, -/area/awaymission/moonoutpost19/research) -"PH" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, /obj/structure/table, -/obj/item/book/manual/wiki/security_space_law, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = -32 +/obj/structure/bedsheetbin, +/obj/item/clothing/neck/tie/black, +/obj/item/clothing/under/suit/black, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 +/turf/open/floor/iron/cafeteria{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"DU" = ( +/obj/structure/reagent_dispensers/peppertank{ + pixel_x = -30 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"PI" = ( -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/remains/human{ - desc = "They look like human remains. The skeleton is curled up in fetal position with the hands placed near the throat." +"DW" = ( +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/iron{ dir = 8; - icon_state = "damaged4"; + icon_state = "damaged1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"PK" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 6; - icon_state = "ltrails_1" +"Ed" = ( +/obj/structure/cable{ + icon_state = "4-8" }, /obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"PP" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaylab"; - name = "Acid-Proof Containment Chamber" +"Eg" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "0-2" +/turf/open/floor/iron/cafeteria{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"PQ" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 +/area/awaymission/moonoutpost19/arrivals) +"Ek" = ( +/obj/structure/chair{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/east{ - c_tag = "Bar"; - network = list("mo19") +/obj/machinery/newscaster{ + pixel_x = -30 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"PS" = ( -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"PU" = ( -/obj/structure/chair/stool, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"El" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/moonoutpost19/syndicate) -"PV" = ( -/obj/machinery/gateway{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"PX" = ( -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 +"Ey" = ( +/obj/structure/chair{ + dir = 1 }, -/area/awaymission/moonoutpost19/syndicate) -"PY" = ( -/obj/structure/table, -/obj/item/cigbutt, +/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"PZ" = ( +"EA" = ( /obj/structure/table, -/obj/item/book/manual/wiki/detective, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"EH" = ( +/obj/structure/chair, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Qc" = ( -/obj/structure/sink{ - pixel_y = 28 +"EJ" = ( +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched2"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/machinery/light/small{ - dir = 8 +/area/awaymission/moonoutpost19/arrivals) +"EU" = ( +/obj/structure/sign/departments/science{ + pixel_y = 32 }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/research) -"Qf" = ( -/obj/machinery/gateway{ - dir = 5 +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"Fy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/loading_area, +/obj/structure/alien/weeds, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/syndicate) -"Qr" = ( -/obj/machinery/computer/operating{ - dir = 8 +"FF" = ( +/obj/machinery/light/small/broken{ + dir = 4 }, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white/side{ - dir = 1 +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/area/awaymission/moonoutpost19/research) -"Qx" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, +/area/awaymission/moonoutpost19/syndicate) +"FN" = ( /obj/item/stack/rods, /obj/item/shard{ - icon_state = "medium" + icon_state = "small" }, -/turf/open/floor/plating, +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_1" + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"QK" = ( -/obj/effect/decal/cleanable/robot_debris, -/obj/effect/decal/cleanable/oil, -/obj/item/storage/firstaid/regular{ - empty = 1; - name = "First-Aid (empty)" +"FR" = ( +/obj/machinery/conveyor{ + id = "awaysyndie" }, -/obj/item/healthanalyzer{ - pixel_x = 6; - pixel_y = -5 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/item/assembly/prox_sensor{ - pixel_x = -5; - pixel_y = -2 +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/item/bodypart/l_arm/robot, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"QN" = ( -/obj/structure/table, -/obj/item/trash/raisins, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"QQ" = ( -/obj/machinery/light/small{ - dir = 1 +/area/awaymission/moonoutpost19/syndicate) +"GE" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 6; + icon_state = "ltrails_1" }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"QW" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating{ - broken = 1 - }, -/area/awaymission/moonoutpost19/research) -"QX" = ( -/obj/structure/closet/secure_closet{ +"GG" = ( +/obj/structure/closet/secure_closet/freezer{ locked = 0; - name = "kitchen Cabinet"; + name = "meat fridge"; req_access_txt = "201" }, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/sugar, -/obj/effect/decal/cleanable/dirt, +/obj/item/food/meat/slab/monkey, +/obj/item/food/meat/slab/monkey, +/obj/item/food/meat/slab/monkey, +/obj/item/food/meat/slab/monkey, /turf/open/floor/iron/showroomfloor{ - initial_temperature = 273.15 + temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) -"Rb" = ( +"GO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"Hc" = ( /obj/machinery/light/small{ dir = 8 }, -/turf/open/floor/wood, -/area/awaymission/moonoutpost19/syndicate) -"Rd" = ( -/obj/item/storage/bag/ore, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"Re" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/airalarm/directional/north{ - pixel_y = 23; - req_access = null; - req_access_txt = "150" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/structure/table, +/obj/item/storage/box, +/obj/machinery/airalarm/unlocked{ + dir = 8; + pixel_x = -23; + req_access = null }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"Rf" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Rj" = ( -/obj/structure/chair/stool, -/turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"Rm" = ( +"Hv" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-8" }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched1"; +/turf/open/floor/plating{ + burnt = 1 + }, +/area/awaymission/moonoutpost19/syndicate) +"HF" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_plating = "asteroidplating"; + icon_state = "asteroidplating"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"Rn" = ( +"HG" = ( /obj/structure/closet/secure_closet{ icon_state = "sec"; name = "security officer's locker"; @@ -4946,694 +5074,639 @@ }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"Ro" = ( -/obj/structure/disposalpipe/segment, +"HQ" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_2" + }, /turf/open/floor/plating{ - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; + broken = 1; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"HW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"In" = ( +/obj/machinery/gateway{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"Iz" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating{ + broken = 1 + }, +/area/awaymission/moonoutpost19/research) +"II" = ( +/obj/machinery/gateway{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"Jx" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/iron{ + amount = 12 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron{ + dir = 1; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"JH" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/syndi_cakes, +/obj/item/trash/sosjerky, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/syndicate) +"JL" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"JV" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, -/area/awaymission/moonoutpost19/main) -"Rr" = ( +/area/awaymission/moonoutpost19/syndicate) +"KC" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 }, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"Ru" = ( +"KJ" = ( +/obj/structure/rack, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Rv" = ( -/obj/machinery/light/small, -/obj/structure/closet/toolcloset, -/obj/item/clothing/gloves/color/yellow, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Rw" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" + dir = 6 }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched2"; +/turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, -/area/awaymission/moonoutpost19/arrivals) -"Rx" = ( +/area/awaymission/moonoutpost19/syndicate) +"KQ" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"RC" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/port_gen/pacman/super{ - name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator" +"LB" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating{ + icon_plating = "asteroidplating"; + icon_state = "asteroidplating"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"RH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/trash/candy, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"RU" = ( -/obj/effect/decal/cleanable/dirt, +/area/awaymission/moonoutpost19/main) +"LE" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Sb" = ( -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Sd" = ( -/obj/structure/rack, -/obj/item/paicard{ - pixel_x = 4 +/area/awaymission/moonoutpost19/syndicate) +"LK" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"Sl" = ( -/obj/structure/closet/crate/bin, -/obj/item/trash/syndi_cakes, -/obj/item/trash/sosjerky, +/area/awaymission/moonoutpost19/syndicate) +"LQ" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"Sm" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "201" - }, -/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"Sq" = ( +"LV" = ( /obj/structure/table, -/obj/item/storage/firstaid/fire, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 28 +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 }, -/turf/open/floor/iron/white/side{ +/obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 }, -/area/awaymission/moonoutpost19/research) -"St" = ( +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/arrivals) +"LX" = ( +/obj/structure/grille/broken, /obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" +/obj/item/shard, +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + dir = 8; + icon_state = "ltrails_2" }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"Sv" = ( -/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ broken = 1; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"Sz" = ( -/obj/machinery/shower{ - dir = 1 - }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"SL" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"SR" = ( -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/structure/alien/weeds, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"SX" = ( -/obj/structure/table, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/machinery/newscaster{ - pixel_y = -30 +"Mc" = ( +/obj/structure/sign/warning/securearea{ + pixel_y = 32 }, -/turf/open/floor/iron/white/side{ +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/area/awaymission/moonoutpost19/research) -"Te" = ( -/turf/open/floor/plating{ - broken = 1; +/turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"Th" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Tr" = ( -/obj/structure/closet/crate/bin, -/obj/item/plate, -/obj/item/food/badrecipe, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"Ts" = ( +"Mm" = ( /obj/machinery/door/airlock/medical{ name = "Research Division"; req_access_txt = "201" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"Tv" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Tx" = ( -/obj/item/cigbutt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Ty" = ( -/obj/machinery/light/small{ +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"TF" = ( -/obj/structure/closet/secure_closet/freezer{ - locked = 0; - name = "meat fridge"; - req_access_txt = "201" - }, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/turf/open/floor/iron/showroomfloor{ - initial_temperature = 273.15 - }, -/area/awaymission/moonoutpost19/arrivals) -"TG" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"TN" = ( -/obj/item/trash/candy, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"TT" = ( -/obj/structure/closet, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"TZ" = ( -/obj/structure/table, -/obj/item/storage/secure/briefcase, -/obj/item/taperecorder{ - pixel_x = -3 +"Ms" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "awaysyndie"; + name = "mining conveyor" }, /obj/effect/turf_decal/stripes/line{ - dir = 6 + dir = 8 }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"Uc" = ( -/obj/structure/reagent_dispensers/peppertank{ - pixel_x = -30 +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, +/area/awaymission/moonoutpost19/syndicate) +"MU" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 + dir = 8 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Uh" = ( -/obj/machinery/light/small/broken{ - dir = 4 +/area/awaymission/moonoutpost19/syndicate) +"MY" = ( +/turf/open/floor/iron{ + dir = 8; + icon_state = "damaged2"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Uj" = ( +/area/awaymission/moonoutpost19/arrivals) +"MZ" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"NP" = ( +/obj/machinery/mineral/stacking_machine{ + dir = 1; + input_dir = 1; + output_dir = 2 + }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Ut" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"Ol" = ( +/obj/structure/chair/fancy/comfy{ + color = "#666666"; + dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"UJ" = ( -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"UL" = ( -/obj/machinery/airalarm/directional/north{ - pixel_y = 23; - req_access = null; - req_access_txt = "150" +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"UN" = ( +/area/awaymission/moonoutpost19/arrivals) +"Oy" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "1-4" +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating{ + broken = 1 }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"UU" = ( +"Oz" = ( /obj/machinery/light/small{ dir = 8 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"UV" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"UY" = ( -/obj/machinery/button/door{ - id = "Awaybiohazard"; - name = "Biohazard Shutter Control"; - pixel_x = -25; - req_access_txt = "201" - }, -/obj/machinery/light/small{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/computer/security{ - desc = "Used to access the various cameras on the outpost."; - dir = 4; - network = list("mo19r","mo19") +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"OB" = ( +/obj/structure/cable, +/obj/machinery/power/apc/highcap/fifteen_k{ + name = "Worn-out APC"; + pixel_y = -23; + req_access = null; + req_access_txt = "150"; + start_charge = 0 }, /obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 + dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Vb" = ( -/obj/machinery/light/small, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/area/awaymission/moonoutpost19/research) -"Vd" = ( -/obj/structure/chair{ +/area/awaymission/moonoutpost19/syndicate) +"OO" = ( +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/newscaster{ - pixel_x = -30 +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/area/awaymission/moonoutpost19/arrivals) +"OT" = ( +/obj/machinery/gateway{ dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Vf" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"Ph" = ( +/obj/structure/sign/warning/biohazard{ + pixel_y = 32 + }, +/obj/structure/alien/weeds/node, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"Vg" = ( -/obj/machinery/power/terminal{ +"Pq" = ( +/obj/machinery/gateway{ dir = 4 }, -/obj/structure/cable{ - icon_state = "0-2" +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"Ps" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/external{ + density = 0; + icon_state = "open"; + opacity = 0; + req_access_txt = "150"; + set_obj_flags = "EMAGGED" }, -/obj/machinery/airalarm/unlocked{ - pixel_y = 23; - req_access = null; +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Vi" = ( -/obj/item/storage/secure/safe{ - pixel_x = 32 - }, -/obj/effect/decal/cleanable/blood/splatter, -/obj/item/pen, -/obj/item/paper/crumpled/awaymissions/moonoutpost19/hastey_note, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/turf/open/floor/plating{ + icon_plating = "asteroidplating"; + icon_state = "asteroidplating"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"Vk" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 5; - icon_state = "ltrails_1" +/area/awaymission/moonoutpost19/syndicate) +"PG" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"Vr" = ( -/obj/structure/closet/crate/freezer, -/obj/structure/alien/weeds, -/obj/item/clothing/mask/facehugger/impregnated, -/obj/item/xenos_claw, +"Qc" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Vt" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/glass{ - amount = 10 - }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/bot{ - dir = 1 - }, /turf/open/floor/iron{ - dir = 1; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"Vw" = ( -/obj/machinery/shieldwallgen{ - locked = 0; - req_access = null + temperature = 251 }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Vy" = ( -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/area/awaymission/moonoutpost19/arrivals) +"Qn" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"VC" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "Awaylab"; - name = "Containment Chamber Blast Doors"; - pixel_x = 4; - pixel_y = -2; - req_access_txt = "201" +/turf/open/floor/plating{ + broken = 1; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/machinery/button/ignition{ - id = "awayxenobio"; - pixel_x = 4; - pixel_y = 8 +/area/awaymission/moonoutpost19/arrivals) +"QP" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/turf/open/floor/plating{ + broken = 1 }, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"VE" = ( +"Rw" = ( /obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/shieldwallgen{ - locked = 0; - req_access = null + icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "0-2" +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"VM" = ( -/obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_y = -32 +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/turf_decal/tile/blue{ +/area/awaymission/moonoutpost19/syndicate) +"RD" = ( +/obj/structure/table, +/obj/item/folder/red, +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, -/turf/open/floor/iron/white/corner, -/area/awaymission/moonoutpost19/arrivals) -"VN" = ( +/turf/open/floor/iron, +/area/awaymission/moonoutpost19/research) +"RI" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 }, -/turf/open/floor/iron/dark, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/syndicate) -"VP" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 +"RN" = ( +/obj/item/kirbyplants{ + desc = "A plastic potted plant."; + pixel_y = 3 }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ +/obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"VR" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/obj/effect/decal/cleanable/blood, -/obj/item/clothing/mask/facehugger/impregnated, -/obj/item/clothing/under/syndicate, -/obj/item/clothing/glasses/night, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/area/awaymission/moonoutpost19/hive) -"Wb" = ( -/obj/machinery/light/small{ +/area/awaymission/moonoutpost19/arrivals) +"Se" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 8 }, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 9; - icon_state = "ltrails_1" +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"Sm" = ( +/obj/structure/grille/broken, +/obj/item/stack/rods, +/turf/open/floor/plating{ + broken = 1; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/area/awaymission/moonoutpost19/arrivals) +"So" = ( +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/remains/human{ + desc = "They look like human remains. The skeleton is curled up in fetal position with the hands placed near the throat." }, /turf/open/floor/iron{ + dir = 8; + icon_state = "damaged4"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"Wg" = ( +"Su" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"WC" = ( -/obj/structure/alien/weeds, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/area/awaymission/moonoutpost19/main) -"WI" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/area/awaymission/moonoutpost19/hive) -"WJ" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/awaymission/moonoutpost19/syndicate) +"SE" = ( +/obj/structure/closet/crate{ + desc = "It's a storage unit for kitchen clothes and equipment."; + name = "Kitchen Crate" }, -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/storage/box/mousetraps, +/obj/item/clothing/under/suit/waiter, +/turf/open/floor/iron/showroomfloor{ + temperature = 273.15 }, +/area/awaymission/moonoutpost19/arrivals) +"SJ" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/syndicate) -"WS" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/blue/half/contrasted{ +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched2"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/arrivals) +"Ta" = ( +/obj/structure/sign/poster/contraband/syndicate_recruitment{ + pixel_y = 32 + }, +/obj/effect/turf_decal/loading_area{ dir = 8 }, +/obj/structure/alien/weeds, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, +/area/awaymission/moonoutpost19/syndicate) +"Td" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"WX" = ( -/obj/machinery/space_heater, +/area/awaymission/moonoutpost19/research) +"Tz" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/plating, /area/awaymission/moonoutpost19/syndicate) -"WY" = ( -/obj/structure/cable{ - icon_state = "1-4" +"TM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"TZ" = ( +/obj/structure/closet/secure_closet/freezer{ + locked = 0; + name = "refrigerator"; + req_access_txt = "201" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"Xc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/item/reagent_containers/food/condiment/milk, +/obj/item/reagent_containers/food/condiment/milk, +/obj/item/reagent_containers/food/condiment/milk, +/obj/item/storage/fancy/egg_box, +/turf/open/floor/iron/showroomfloor{ + temperature = 273.15 }, -/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Xe" = ( -/obj/structure/sink{ +"Ue" = ( +/obj/machinery/firealarm{ dir = 4; - pixel_x = 11 - }, -/obj/structure/urinal{ - pixel_y = 29 + pixel_x = 24 }, -/obj/structure/mirror{ - pixel_x = 28 +/turf/open/floor/iron{ + dir = 8; + icon_state = "damaged2"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"Xg" = ( -/obj/structure/chair{ - dir = 8 - }, +"Ul" = ( +/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Xh" = ( -/obj/machinery/portable_atmospherics/canister/air, +"Uo" = ( +/obj/machinery/gateway{ + dir = 6 + }, /obj/effect/decal/cleanable/dirt, -/obj/structure/window{ - dir = 1 +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/moonoutpost19/syndicate) +"Uv" = ( +/obj/structure/sink/kitchen{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + name = "old sink"; + pixel_y = 28 }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"Xk" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/iron/showroomfloor{ + temperature = 273.15 }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/highsecurity{ - name = "Gateway"; - req_access_txt = "150" +/area/awaymission/moonoutpost19/arrivals) +"Ux" = ( +/turf/open/floor/plating{ + broken = 1 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"Xl" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/awaymission/moonoutpost19/research) +"UF" = ( +/obj/structure/alien/weeds/node, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/closed{ - opacity = 0 +/turf/open/floor/iron{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, +/area/awaymission/moonoutpost19/syndicate) +"UZ" = ( +/obj/structure/chair/stool, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Xo" = ( -/obj/structure/chair{ +/area/awaymission/moonoutpost19/syndicate) +"Vp" = ( +/obj/machinery/light/small{ dir = 1 }, -/obj/machinery/light/small{ - dir = 4 +/turf/open/floor/plating{ + icon_plating = "asteroidplating"; + icon_state = "asteroidplating"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Xx" = ( -/obj/structure/alien/weeds, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" +/area/awaymission/moonoutpost19/syndicate) +"VM" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + icon_state = "ltrails_2" }, -/area/awaymission/moonoutpost19/hive) -"Xy" = ( -/obj/machinery/airalarm/unlocked{ - dir = 8; - pixel_x = -23; - req_access = null +/obj/machinery/camera/directional/west{ + c_tag = "Dormitories"; + network = list("mo19") }, -/obj/machinery/light/small{ - dir = 8 +/turf/open/floor/iron{ + dir = 8; + icon_state = "damaged1"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) -"XA" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = 30 +"VY" = ( +/obj/effect/decal/cleanable/blood/tracks{ + desc = "Your instincts say you shouldn't be following these."; + icon_state = "ltrails_1" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, /turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched1" + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"XC" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"XT" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock{ - id_tag = "awaydorm3"; - name = "Dorm 3" +"Wf" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"XX" = ( +"Wi" = ( /obj/machinery/light/small{ dir = 4 }, @@ -5642,212 +5715,139 @@ }, /obj/item/gun/ballistic/shotgun/sc_pump, /turf/open/floor/iron/showroomfloor{ - initial_temperature = 273.15 - }, -/area/awaymission/moonoutpost19/arrivals) -"XY" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/carpet, -/area/awaymission/moonoutpost19/arrivals) -"Yc" = ( -/obj/structure/alien/weeds/node, -/obj/structure/alien/resin/wall, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) -"Yj" = ( -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) -"Yk" = ( -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched2" - }, +"WB" = ( +/obj/structure/table, +/obj/item/trash/raisins, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Ym" = ( -/obj/structure/cable{ - icon_state = "4-8" +"Xd" = ( +/obj/structure/chair{ + dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"Yp" = ( /obj/machinery/light/small{ dir = 4 }, -/obj/effect/decal/cleanable/generic, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Yq" = ( +"Xj" = ( +/obj/structure/rack, +/obj/item/clothing/suit/space/syndicate/orange, +/obj/item/clothing/mask/gas, +/obj/item/pickaxe/drill, +/obj/item/clothing/head/helmet/space/syndicate/orange, /obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"Yr" = ( -/obj/structure/sign/warning/biohazard{ - pixel_y = 32 + dir = 5 }, -/obj/structure/alien/weeds/node, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +/turf/open/floor/plating{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, +/area/awaymission/moonoutpost19/syndicate) +"Xk" = ( /turf/open/floor/iron{ + dir = 8; + icon_state = "damaged1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"Ys" = ( -/obj/machinery/firealarm{ +"Yh" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/glass{ + amount = 10 + }, +/obj/structure/alien/weeds, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron{ dir = 1; - pixel_y = -24 + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"Yz" = ( +/area/awaymission/moonoutpost19/syndicate) +"Ym" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"YA" = ( -/obj/item/pen, -/obj/item/storage/pill_bottle{ - pixel_y = 6 - }, -/turf/open/floor/carpet, -/area/awaymission/moonoutpost19/arrivals) -"YK" = ( -/obj/machinery/light/small, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_y = -32 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Arrivals North"; - network = list("mo19") - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white/corner, -/area/awaymission/moonoutpost19/arrivals) -"YM" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 + temperature = 251 }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/moonoutpost19/research) -"YT" = ( -/obj/structure/closet/crate, -/obj/item/storage/bag/ore, -/obj/structure/alien/weeds, -/obj/item/mining_scanner, -/obj/item/shovel, -/obj/item/pickaxe, +/area/awaymission/moonoutpost19/syndicate) +"Yq" = ( /turf/open/floor/plating{ broken = 1; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"YX" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, +"Yx" = ( +/obj/machinery/gateway, /obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/iron{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + icon_state = "0-2" }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/syndicate) -"YZ" = ( -/obj/structure/window/reinforced{ - dir = 1 +"YD" = ( +/obj/structure/closet/secure_closet{ + locked = 0; + name = "kitchen Cabinet"; + req_access_txt = "201" }, -/obj/structure/table, -/obj/item/storage/firstaid/regular, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/sugar, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/turf/open/floor/iron/showroomfloor{ + temperature = 273.15 + }, +/area/awaymission/moonoutpost19/arrivals) +"YH" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 4 }, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/syndicate) -"Zl" = ( +/area/awaymission/moonoutpost19/arrivals) +"YZ" = ( /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/iron, +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched1"; + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + temperature = 251 + }, /area/awaymission/moonoutpost19/arrivals) -"Zo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted{ +"Zv" = ( +/obj/machinery/airalarm/unlocked{ + pixel_y = 23; + req_access = null; + req_access_txt = "150"; dir = 1 }, /turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - initial_temperature = 251 + temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"Zp" = ( -/obj/structure/chair{ - dir = 1 - }, +"ZB" = ( +/obj/structure/table, +/obj/item/cigbutt, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"ZH" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/research) -"ZM" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, +"ZC" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/awaymission/moonoutpost19/arrivals) -"ZN" = ( -/obj/structure/bed, -/obj/item/bedsheet/syndie, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/awaymission/moonoutpost19/syndicate) -"ZQ" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) -"ZW" = ( -/obj/machinery/shower{ - pixel_y = 16 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/research) (1,1,1) = {" aa @@ -25216,10 +25216,10 @@ ac ac ac ac -Or -Or -Or -Or +ad +ad +ad +ad ac ac ac @@ -25471,14 +25471,14 @@ ac ac ac ac -Or -Or -Or -IN -FF -Or -Or -Or +ad +ad +ad +hk +ag +ad +ad +ad ac ac ac @@ -25728,15 +25728,15 @@ ac ac ac ac -Or -Xx -FF -FF -Xx -IN -Xx -Or -Or +ad +ai +ag +ag +ai +hk +ai +ad +ad ac ac ac @@ -25984,16 +25984,16 @@ ac ac ac ac -Or -Or -IN -Xx -Xx -IN -Bq -Xx -FF -Or +ad +ad +hk +ai +ai +hk +aM +ai +ag +ad ac ac ac @@ -26241,16 +26241,16 @@ ac ac ac ac -Or -Xx -Xx -kZ -uA -Xx -Xx -kZ -Xx -Or +ad +ai +ai +aD +aj +ai +ai +aD +ai +ad ac ac ac @@ -26498,16 +26498,16 @@ ac ac ac ac -Or -Xx -Xx -uA -Xx -AA -WI -VR -xp -Or +ad +ai +ai +aj +ai +aT +av +bj +bc +ad ac ac ac @@ -26755,16 +26755,16 @@ ac ac ac ac -Or -FF -uE -Xx -Xx -Xx -xp -WI -Xx -Or +ad +ag +au +ai +ai +ai +bc +av +ai +ad ac ac ac @@ -27012,16 +27012,16 @@ ac ac ac ac -Or -uA -WI -Xx -Xx -Nb -Xx -uE -FF -Or +ad +aj +av +ai +ai +am +ai +au +ag +ad ac ac ac @@ -27269,16 +27269,16 @@ ac ac ac ac -Or -En -FU -Xx -Xx -Xx -Xx -FF -Xx -Or +ad +ap +aw +ai +ai +ai +ai +ag +ai +ad ac ac ac @@ -27317,20 +27317,20 @@ dA dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -27526,16 +27526,16 @@ ac ac ac ac -Or -Xx -WI -Or -Xx -Xx -Xx -kZ -FF -Or +ad +ai +av +ad +ai +ai +ai +aD +ag +ad ac ac ac @@ -27570,28 +27570,28 @@ dA dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -27783,16 +27783,16 @@ ac ac ac ac -Or -Or -Xx -Xx -Xx -Xx -Xx -Xx -Xx -Or +ad +ad +ai +ai +ai +ai +ai +ai +ai +ad ac ac ac @@ -27805,10 +27805,10 @@ ac ac ac ac -Or -Or -Or -Or +ad +ad +ad +ad ac ac ac @@ -27825,32 +27825,32 @@ dA dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -28041,15 +28041,15 @@ ac ac ac ac -Or -FF -Xx -Xx -Xx -Xx -Xx -Xx -Or +ad +ag +ai +ai +ai +ai +ai +ai +ad ac ac ac @@ -28061,12 +28061,12 @@ ac ac ac ac -Or -Or -tk -uA -Or -Or +ad +ad +dO +aj +ad +ad ac ac ac @@ -28080,36 +28080,36 @@ dA dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -28298,15 +28298,15 @@ ac ac ac ac -Or -Or -Xx -Xx -Nb -Xx -Xx -Or -Or +ad +ad +ai +ai +am +ai +ai +ad +ad ac ac ac @@ -28317,13 +28317,13 @@ ac ac ac ac -Or -Or -FF -WI -LZ -Xx -Or +ad +ad +ag +av +dS +ai +ad ac ac ac @@ -28335,40 +28335,40 @@ dA dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -28556,13 +28556,13 @@ ac ac ac ac -Or -Or -Xx -Xx -Xx -Or -Or +ad +ad +ai +ai +ai +ad +ad ac ac ac @@ -28574,13 +28574,13 @@ ac ac ac ac -Or -uA -Xx -Nb -Xx -FF -Or +ad +aj +ai +am +ai +ag +ad ac ac ac @@ -28590,43 +28590,43 @@ dA dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -28814,11 +28814,11 @@ ac ac ac ac -Or -Or -Or -Or -Or +ad +ad +ad +ad +ad ac ac ac @@ -28829,15 +28829,15 @@ ac ac ac ac -Or -Or -Or -Xx -Xx -Xx -uA -Or -Or +ad +ad +ad +ai +ai +ai +aj +ad +ad ac ac ac @@ -28845,47 +28845,47 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -29071,10 +29071,10 @@ ac ac ac ac -Or -Nb -Nb -Or +ad +am +am +ad ac ac ac @@ -29085,15 +29085,15 @@ ac ac ac ac -Or -Or -Xx -Ir -Xx -FF -Or -Or -Or +ad +ad +ai +ak +ai +ag +ad +ad +ad ac ac ac @@ -29101,49 +29101,49 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -29328,27 +29328,27 @@ ac ac ac ac -Or -Xx -Xx -Or -Or +ad +ai +ai +ad +ad ac -Or -Or -Or -Or -Or -Or -Or -Or -Or -Xx -Xx -Or -Or -Or -Or +ad +ad +ad +ad +ad +ad +ad +ad +ad +ai +ai +ad +ad +ad +ad ac ac ac @@ -29357,51 +29357,51 @@ dA dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -29585,24 +29585,24 @@ ac ac ac ac -Or -Xx -Xx -Xx -Or -Or -Or -Xx -Xx -Xx -Xx -Xx -Xx -Or -Or -Xx -Or -Or +ad +ai +ai +ai +ad +ad +ad +ai +ai +ai +ai +ai +ai +ad +ad +ai +ad +ad ac ac ac @@ -29613,53 +29613,53 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -29842,23 +29842,23 @@ ac ac ac ac -Or -Or -Xx -Xx -Xx -Or -Xx -Xx -Xx -Xx -Xx -Xx -Nb -Xx -Xx -Xx -Or +ad +ad +ai +ai +ai +ad +ai +ai +ai +ai +ai +ai +am +ai +ai +ai +ad ac ac ac @@ -29869,55 +29869,55 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -30093,29 +30093,29 @@ ab ab ab ac -Or -Or -Or -Or +ad +ad +ad +ad ac ac ac -Or -Or -Xx -Nb -Xx -Xx -Xx -Or -Or -Or -Or -Xx -Xx -Xx -Or -Or +ad +ad +ai +am +ai +ai +ai +ad +ad +ad +ad +ai +ai +ai +ad +ad ac ac ac @@ -30126,56 +30126,56 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -30349,29 +30349,29 @@ ab ab ab ab -Or -Or -FF -uA -Or -Or -Or -Or -Or -Or -Xx -Xx -Xx -Xx -Or -Or +ad +ad +ag +aj +ad +ad +ad +ad +ad +ad +ai +ai +ai +ai +ad +ad bl bl -Or -Or -Xx -Xx -Or +ad +ad +ai +ai +ad ac ac ac @@ -30382,58 +30382,58 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -30606,29 +30606,29 @@ ab ab ab ab -Or -FF -Xx -Ir -Xx -Or -Or -Xx -Xx -Xx -Xx -Xx -Xx -Or -Or +ad +ag +ai +ak +ai +ad +ad +ai +ai +ai +ai +ai +ai +ad +ad bl bl bl -Or -Xx -Xx -Xx -Or +ad +ai +ai +ai +ad ac ac ac @@ -30638,59 +30638,59 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -30863,92 +30863,92 @@ ab ab ab ab -Or -FF -Xx -FF -Nb -Xx -Xx -Xx -Or -Or -Xx -Or -Or -Or +ad +ag +ai +ag +am +ai +ai +ai +ad +ad +ai +ad +ad +ad bl bl bl bl -Or -Xx -Xx -Or -Or -ac -ac -ac -ac -ac -ac -dA -dA -dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ad +ai +ai +ad +ad +ac +ac +ac +ac +ac +ac +dA +dA +dA +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba lc -lA -lA -lA +io +io +io lc -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -31120,70 +31120,70 @@ ab ab ab ab -Or -Or -Or -uA -uA -Or -Or -Or -Or -Or -Xx -Or +ad +ad +ad +aj +aj +ad +ad +ad +ad +ad +ai +ad bl bl bl bl bl bl -Or -Xx -Xx -Or -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ad +ai +ai +ad +ac +ac +ac +ac +ac +ac +dA +dA +dA +dA +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba lc lc mp @@ -31191,21 +31191,21 @@ mG mV lc lc -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -31379,68 +31379,68 @@ ab ab ac ac -Or -Or -Or -Or +ad +ad +ad +ad ac ac ac -Or -Bq -Or -Or +ad +aM +ad +ad bl bl bl bl bl -Or -Xx -Mi -Or -Or -Or -ac -ac -ac -dA -dA -dA -Hi -WC -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ad +ai +dd +ad +ad +ad +ac +ac +ac +dA +dA +dA +dP +dT +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ld lW mb @@ -31448,21 +31448,21 @@ mc mb nf ld -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -31643,50 +31643,50 @@ ac ac ac ac -Or -Xx -Xx -Or +ad +ai +ai +ad bl bl bl bl bl -Or -Xx -Xx -Xx -Xx -Or -Or -Or -ac -dA -dA -Hi -Hi -WC -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ad +ai +ai +ai +ai +ad +ad +ad +ac +dA +dA +dP +dP +dT +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba eI eJ eJ @@ -31696,8 +31696,8 @@ eI eI eJ eI -tn -tn +ba +ba ld lX mq @@ -31705,22 +31705,22 @@ mr mW lX ld -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -31898,42 +31898,42 @@ ac ac ac ac -Or -Or -Or -Xx -Xx -Or -Or +ad +ad +ad +ai +ai +ad +ad bl bl bl bl -Or -Or -Xx -Xx -Xx -Xx -Xx -Or -Or -Hi -Hi -Yc -WC -WC -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ad +ad +ai +ai +ai +ai +ai +ad +ad +dP +dP +dV +dT +dT +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba eI eI eI @@ -31941,20 +31941,20 @@ eJ eI eJ eJ -tn -tn -tn +ba +ba +ba eJ -HK -Ms -BB -He -BB -Mx -QW +xK +eX +fu +iE +fu +jp +Iz eI -tn -tn +ba +ba ld ld ld @@ -31962,22 +31962,22 @@ mH ld ld ld -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -32154,64 +32154,64 @@ ac ac ac ac -Or -Or -Pd -Xx -Xx -Nb -FF -Or +ad +ad +aJ +ai +ai +am +ag +ad bl bl bl -Or -Or -Xx -Xx -Or -Or -Xx -Xx -Xx -Or -sK -WC -WC -WC -WC -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ad +ad +ai +ai +ad +ad +ai +ai +ai +ad +dQ +dT +dT +dT +dT +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba eI -rU -ZH -Gk -Gk -Nc +eS +fq +fL +fL +gw eJ eI eJ eI eI -qz -Ej +hL +tf ea ea dZ dZ -bM +fb eJ -tn -tn +ba +ba ld lZ mr @@ -32219,22 +32219,22 @@ mr mr lZ ld -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -32411,64 +32411,64 @@ ac ac ac ac -Or -gO -Lh -Ir -Xx -FF -uA -Or +ad +aE +aK +ak +ai +ag +aj +ad bl bl bl -Or -Xx -Xx -Or -Or -Or -Or -Xx -Nb -Or -sK -WC -WC -WC -WC -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ad +ai +ai +ad +ad +ad +ad +ai +am +ad +dQ +dT +dT +dT +dT +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba eJ -Cb -WY -wV -Am -Na +sQ +fr +fM +gf +lV eI -Iu -BB -uu -NZ -BB -uY +hd +fu +Oy +QP +fu +hf dZ -Qc -xW +iF +iZ dZ -xJ +fQ eJ hI -tn +ba ld ma mc @@ -32476,23 +32476,23 @@ mr mc ng ld -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -32668,88 +32668,88 @@ ac ac ac ac -Or -uA -WI -Xx -uA -uA -Or -Or +ad +aj +av +ai +aj +aj +ad +ad bl bl bl -Or -Xx -Or -Or -ac -ac -Or -Or -Or -Or -Hi -Yc -WC -WC -WC -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ad +ai +ad +ad +ac +ac +ad +ad +ad +ad +dP +dV +dT +dT +dT +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba eJ -le -bM -wz -wz -Rv +eU +fb +fN +fN +gy eI -bM +fb ea ea dZ dZ ea ea -rN +iG dZ ea -uf -Ed +jT +kt hI -tn -lA +ba +io mb ms mI ms mb -lA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +io +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -32925,21 +32925,21 @@ ac ac ac ac -Or -Or -Or -Xx -Or -Or -Or +ad +ad +ad +ai +ad +ad +ad bl bl bl bl -Or -Xx -Or -Or +ad +ai +ad +ad ac ac ac @@ -32947,29 +32947,29 @@ ac ac dA dA -Hi -WC -WC -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +dP +dT +dT +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba eJ -Vg -ax -Sb -ox -rQ +eV +fs +fO +Ux +gz eI -bM +fb ea hq hB @@ -32978,11 +32978,11 @@ hB hB hC ea -an -Zl -GQ -lA -tn +jq +jU +ku +io +ba ld mc mt @@ -32990,23 +32990,23 @@ mJ mt mc ld -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -33184,19 +33184,19 @@ ac ac ac ac -Or -Xx -Or +ad +ai +ad bl bl bl bl bl bl -Or -Xx -Xx -Or +ad +ai +ai +ad ac ac ac @@ -33204,29 +33204,29 @@ ac ac dA dA -Hi -WC -WC -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +dP +dT +dT +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba eI -Jg -NZ -zv -Nl -Hz +eW +QP +fP +gh +gA eJ -pN +he ea hr hB @@ -33235,11 +33235,11 @@ hX ip hB dZ -wA -Zl -ww -lA -tn +jr +jU +kv +io +ba ld md ms @@ -33247,23 +33247,23 @@ mI ms nh ld -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -33441,49 +33441,49 @@ ac ac ac ac -Or -Xx -Or +ad +ai +ad bl bl bl bl bl bl -Or -Or -Nb -Or +ad +ad +am +ad ac ac ac ac dA dA -Hi -Hi -WC -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +dP +dP +dT +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba eJ eI eJ -xJ +fQ eJ eJ eI -bM +fb ea hs hB @@ -33492,35 +33492,35 @@ hY iq iH ea -pa -vE -GQ -lA -tn -lA +js +jV +ku +io +ba +io mc mc mr mc mc -lA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +io +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -33698,9 +33698,9 @@ ac ac ac ac -Or -Nb -Or +ad +am +ad bl bl bl @@ -33708,39 +33708,39 @@ bl bl bl bl -Or -Xx -Or +ad +ai +ad ac ac ac ac dA dA -Hi -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +dP +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba eI -Ms -BB -Dg -BB -BB -EW -uY +eX +fu +fR +fu +fu +Bs +hf dZ ht hC @@ -33749,9 +33749,9 @@ hZ hC iI ea -Nn -vE -YK +jt +jV +kw hI lc ld @@ -33762,22 +33762,22 @@ mb me ld lc -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -33955,9 +33955,9 @@ ac ac ac ac -Or -Xx -Or +ad +ai +ad bl bl bl @@ -33965,33 +33965,33 @@ bl bl bl bl -Or -Xx -Or +ad +ai +ad ac ac ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba eI -tB +eY ea ea ea @@ -33999,42 +33999,42 @@ dZ dZ ea ea -Fm +hu hD -Fm +hu ia hB iJ ea -OO -Zl -GQ -lA +ju +jU +ku +io ld -lD -lD +sR +sR mu mr mY -lD -lD +sR +sR ld -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -34212,87 +34212,87 @@ ac ac ac ac -Or -Xx -Or +ad +ai +ad bl bl bl bl bl bl -Or -Or -Xx -Or +ad +ad +ai +ad ac ac ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba eI -Ge +tU ea -cF -Uc -Vd -UY -PH -TG -pf -UJ -Fm -fS -Yq -rs +rd +DU +Ek +sb +CF +fV +hv +gR +hu +ib +ir +iK dZ -wA -vE -ww -lA +jr +jV +kv +io lc -HE -IF +lE +mf ld mK ld -HE -IF +lE +mf lc -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -34469,87 +34469,87 @@ ac ac ac ac -Or -Xx -Or +ad +ai +ad bl bl bl bl bl -Or -Or -Xx -Xx -Or +ad +ad +ai +ai +ad ac ac ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba eJ -Dc +fa dZ -Rn -Rf -Ic -pd -tv -TG -pf -UJ -Fm -Sd -AH -xa +HG +eu +gC +gP +RD +fV +hv +gR +hu +ic +is +iL ea -XA -vE -ww -lA -tn -tn -tn -lA -jj -lA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +jv +jV +kv +io +ba +ba +ba +io +mL +io +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -34725,88 +34725,88 @@ ac ac ac ac -Or -Or -Xx -Or -Or -Or -Or -Or -Or -Or -Xx -Xx -Or -Or +ad +ad +ai +ad +ad +ad +ad +ad +ad +ad +ai +ai +ad +ad ac ac ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dZ dZ ea ea -bM +fb ea -pK -AP -bi -YM -Ct -TG -pf -UJ -Fm -IW -Vi -TZ +pg +ZC +FN +Td +ql +fV +hv +gR +hu +id +it +iM ea -Pt -un -GQ +jw +jX +ku hI -tn -tn -tn -FO -th -lA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +mv +lM +io +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -34981,89 +34981,89 @@ ac ac ac ac -Or -Or -Xx -Xx -FF -Or -Or -Xx -Xx -Os -Xx -Xx -Or -Or -ac -ac -ac -ac -dA -dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ad +ad +ai +ai +ag +ad +ad +ai +ai +bW +ai +ai +ad +ad +ac +ac +ac +ac +dA +dA +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ea ed et ea -cb +fc ea -TG -MT -NQ -TG -TG -TG -pf -GI +fV +gk +gE +fV +fV +fV +hv +hE eI ea dZ dZ ea hJ -AZ -VM +jY +kx hI hI -lA -lA -lA -rf -lA -lA -lA +io +io +io +mM +io +io +io hI hI hI hI -Ns -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +fS +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -35238,19 +35238,19 @@ ac ac ac ac -Or -uA -Bq -Xx -Xx -Xx -Xx -Xx -Or -Or -Or -Or -Or +ad +aj +aM +ai +ai +ai +ai +ai +ad +ad +ad +ad +ad ac ac ac @@ -35258,69 +35258,69 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -wi -qK -Rf -Ii -LG -qD -Vy -rb -FV -UJ -UJ -UJ +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +eb +ee +eu +eK +fd +fv +fW +gl +gF +gR +gR +gR fk fk -An +hN ea -tE -ah +iu +iN eI -DI -ZM -OU -ru -Gi -Xc -Xc -Xc -Ao -Xc -Xc -ye -vL -UU -Ml -ao -kX -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +EU +jZ +ky +kN +lf +lF +lF +lF +jG +lF +lF +no +zZ +nA +nK +Wf +qs +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -35494,16 +35494,16 @@ ac ac ac ac -Or -Or -FF -Xx -Nb -Xx -FF -Or -Or -Or +ad +ad +ag +ai +am +ai +ag +ad +ad +ad ac ac ac @@ -35515,70 +35515,70 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -wi -JE -Uh -pJ -vb -UN -wj -Fy -iC -IR +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +eb +ef +ev +eL +fe +fw +fX +gm +gG +gS fk fk fk -ER -An -Ts +hF +hN +ie fk fk -zt -Rx -Zl -Wg -Ao -rj -al -FL -Ru -Pf -FL -FL -FL -vL -th -wh -ao -kX -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +Mm +xO +jU +jF +jG +lg +lG +mg +mw +mN +mg +mg +mg +zZ +lM +lN +Wf +qs +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -35751,14 +35751,14 @@ ac ac ac ac -Or -FF -Xx -Xx -uA -uA -Or -Or +ad +ag +ai +ai +aj +aj +ad +ad ac ac ac @@ -35772,70 +35772,70 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -Vb +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +dY ea ea dZ ea ea -GE +fx dZ ea dZ dZ -tb -Iw -tx -tx -An +oT +oU +hw +hw +hN ea -XC -Po +iv +iO eI -vI -LA -Wg -wg -Aj -zo -lA -lA +YH +ka +jF +kO +lh +lH +io +io hI -lA -lA -lA +io +io +io hI -FG -Je +nB +nL hI -Ns -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +fS +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -36008,13 +36008,13 @@ ac ac ac ac -ys -Or -Or -Or -Or -Or -Or +as +ad +ad +ad +ad +ad +ad ac ac ac @@ -36029,70 +36029,70 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ea -Th -Ut -Rf -cA +ff +fy +eu +gn gH dZ ea -TG -Qx -mX +fV +hx +hG eI dZ ea ea ea hI -ZM -JO +jZ +kz hJ hJ hJ -lA -tn -SL -tn -tn -tn +io +ba +mO +ba +ba +ba hI hI hI hI -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -36286,70 +36286,70 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ea -ry -Ut -Rf -wE +fg +fy +eu +go fk -PG +gT ea -Lp -St +hm +hy fk fk -Om +if dZ -tn -tn +ba +ba hJ -KT -uv +kb +kA hI -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -36543,70 +36543,70 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dZ -rF -Ym -qK -pw +fh +fz +ee +gp fk -Qr +gU dZ -Nm +hn fk fk fk -Jd +ig dZ -tn -tn -lA -tg -NM -pz -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +io +SJ +MY +jC +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -36800,70 +36800,70 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dZ dZ ea ea -Vr -Ym -qK -pn +fi +fz +ee +gq gI -Hx +gV ea -Ii -QK +eK +hz fk -ER -SX +hF +ih ea -tn -tn -lA -KM -ew -JQ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +io +DW +kC +kP +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -37057,70 +37057,70 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ea -SR -SR +eg +eg eI -Og -Uj -Fj +fj +fA +fZ eJ eI eJ ea -Nq -Sq -zd -Pw -JM +ho +hA +hH +hO +ii ea -tn -tn -lA -Et -PI -AS -AO -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +io +Ed +So +Sm +li +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -37314,24 +37314,24 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dZ -qU -qU -Cu +eh +eh +eM fk fB fk @@ -37345,39 +37345,39 @@ ea ea dZ ea -tn -Df +ba +hV hI -Ty -Yz +sX +Qc hI -QQ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +lj +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -37571,20 +37571,20 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dZ ei ex @@ -37596,45 +37596,45 @@ fk fk gX dZ -tn -tn -tn -tn -tn -tn -tn -tn -Sv -Rm -Yz -lA -tn -tn -tn -tn -tn -tn -tn -aq -tn -PB -MJ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +zk +YZ +Qc +io +ba +ba +ba +ba +ba +ba +ba +np +ba +nC +ja +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -37828,70 +37828,70 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ea -xP -Ks -VC -Op -wI -GY -zn -vW -gB +ej +ey +eO +fm +fD +ga +gs +gK +gY dZ -tn -tn -tn -tn -tn -tn -tn -MJ -Do -yR -ze -lA -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ja +jB +Qn +hg +io +ba +ba +ba +ba +ba +ba +ba hI -pz -qO -pz -pz -pz -pz -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +jC +LX +jC +jC +jC +jC +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -38086,69 +38086,69 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dZ -VE -uU -uU -HI -Lj -KR -vx -PP -Vw +ek +ez +ez +fn +fE +gb +gt +gL +gZ ea -tn -tn -tn -tn -tn -tn -tn -tn -pz -OS -tA -lA -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +jC +tz +nv +io +ba +ba +ba +ba +ba +ba +ba hI -gQ -Gx -Mg -IZ -Cw -pz -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +Eg +HQ +Ol +tW +tP +jC +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -38343,19 +38343,19 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ea ea eA @@ -38367,17 +38367,17 @@ gu eA ea ea -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba hJ hI hI -Xl -Cx +kj +kH hJ hJ hJ @@ -38387,25 +38387,25 @@ hI hI hJ hJ -Av -FK -Yz -NM -ew -pz -pz -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +Dm +sS +Qc +MY +kC +jC +jC +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -38585,34 +38585,34 @@ ac ac ac aU -OD -pl +bv +bF aU -wO -wO -Pn -wO -wO -yL -AT +FR +FR +Ca +FR +FR +NP +Fy aU ac ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ea el er @@ -38624,45 +38624,45 @@ gv gM ha ea -tn -tn -tn -tn -tn -Df +ba +ba +ba +ba +ba +hV hJ -wL -zB -Zl -Wg -JC -EF -Rr -Rr -Rr -Wb -qm -zE -Iy -tA -PK -Yz -Yz -Yz -tW -pz -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +jb +jD +jU +jF +kS +Oz +KC +KC +KC +eR +VY +EJ +VM +nv +GE +Qc +Qc +Qc +oa +jC +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -38842,34 +38842,34 @@ ac aU aU aU -xv +bw aU aU -ro -wb +bY +cn cD -wb -wb +cn +cn df -Od +vY aU aU aU aU dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ea em eB @@ -38881,45 +38881,45 @@ en eB eq ea -tn -tn -tn -tn -tn -tn -lA -PZ -Wg -vE -Ao -fT -wQ -rG -Yj -sn -Rw -ze -aW -Yj -AB -sn -Ju -rG -Yp -Hg -pz -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +io +jc +jF +jV +jG +kR +GO +OO +jx +gB +jE +hg +Ue +jx +qW +gB +PG +OO +zP +RN +jC +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -39098,35 +39098,35 @@ ac ac aU bd -Du -iD -Sl +yC +LE +JH aU -sc -CZ -Hl -Mc -HC -Hl -vJ +Ta +qB +Su +Ms +UF +Su +qZ aU -oN -AG +oW +wS aU -qH -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +Vp +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ea en en @@ -39138,45 +39138,45 @@ eq en eq ea -tn -tn -tn -tn -tn -tn -lA -fU -Wg -Zl +ba +ba +ba +ba +ba +ba +io +jd +jF +jU hI hI -oM +lm hJ hI hI -Lc +mR hJ hJ -JZ +kV hI hJ -XT +nO hJ hI hI hJ -QQ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +lj +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -39355,35 +39355,35 @@ ac ac aU be -dX -iD -Ht -CB -Jn -Lz -Jn -Dq -GO -Jn -Jn -OR -Gm -Te -qN -kX -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +xg +LE +El +bO +Ym +cp +Ym +CK +Ac +Ym +Ym +du +dx +Yq +Ps +qs +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ec eo eq @@ -39395,45 +39395,45 @@ eq en hb ec -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba hJ -Yk -Ao -Zl +je +jG +jU hJ -Bj -Co -KL +kT +ln +lK hJ -OL -Vk -XY +my +mS +na hJ -th +lM hJ -FA -YA -Fe +nH +nP +nT hI -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -39612,35 +39612,35 @@ ac ac aU aU -UL -PU -tj -ar -bI -oQ -wM -Mo -cI -wM -uj +ly +UZ +pM +bP +HW +rS +Tz +BZ +pV +Tz +Xk aU -HO -OK +Xj +KJ aU dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ea ep eq @@ -39652,45 +39652,45 @@ eq eQ hc ea -tn -tn +ba +ba hI hI hJ hJ hJ jf -Wg -Zl +jF +jU hI -Kb -hh -Ps +kU +lo +lL hJ -xR -iR -OJ +mz +mT +nb hJ -Cd +qw hI -KY -Co -Ji +nI +ln +nU hJ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -39869,35 +39869,35 @@ ac ac ac aU -GF -Ha -bN +EA +vh +Al aU -ar -Ce -on +bP +cr +cG aU -Nz -Vt -YT +Jx +Yh +dU aU aU aU aU dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ea eq eF @@ -39909,16 +39909,16 @@ eq en eq ea -tn -tn +ba +ba hI -ZQ +hP hJ -MA +iw hJ jg -Wg -Pm +jF +kk hI hJ hJ @@ -39928,26 +39928,26 @@ hJ hJ hJ hI -Cd +qw hI hJ hJ hJ hJ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -40130,9 +40130,9 @@ at at at at -Zo -ya -ym +fI +JV +JL aU aU aU @@ -40143,18 +40143,18 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ea er em @@ -40166,45 +40166,45 @@ en eB eq ea -tn -tn +ba +ba hJ -Pl +hQ hI -rI +ix hJ hI -JU -uw -KK -JZ -Cd -th -wh -wh -wh -Cy -RH -MV +jH +kl +kI +kV +qw +lM +lN +lN +lN +lO +nk +ns hJ -th -wh +lM +lN hI -kX -tn -tn -tn -kX -kX -kX -yr -tn -tn -tn -tn -tn -tn -tn +qs +ba +ba +ba +qs +qs +qs +od +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -40378,40 +40378,40 @@ ac ac ac at -rE -oY -MK -wn -Kr -wB -JY -Kd +fY +aF +aN +aV +Se +bq +bA +MU at -wl -Jn -tS +Zv +Ym +sY aU -Cj -Ld -rw +cZ +dh +dq aU ac ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ea el eH @@ -40423,45 +40423,45 @@ eH eq eq ea -tn -tn +ba +ba hI -aQ -Xy -pu -Li -OW -Wg -Ao -Ys +hR +ij +im +iz +jh +jF +jG +kJ hJ hJ -wh -Xh -rv -wW -Oa -zc -PD -Sm -wh -UV -Bx -Ro -Ro -Ro -Ro -Ro -Ia -kX -tn -tn -tn -tn -tn -tn -tn -tn +lN +mi +mA +mU +nc +nl +nt +nz +lN +nQ +nV +LB +LB +LB +LB +LB +cI +qs +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -40635,40 +40635,40 @@ ac ac ac at -PS -Af -PV -vB -wn -pb -Aw -Fc +az +II +qI +wP +aV +br +bB +RI at -Yr -Jn -sB -OQ -Vf -Ds -Kf +Ph +Ym +zD +cT +da +di +dr aU ac ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ea ea ea @@ -40680,45 +40680,45 @@ ea ea ea ea -tn -tn +ba +ba hI -Xe -vC -pu -pu +hS +ik +im +im hJ -NT -Ao -Wg -WS +jI +jG +jF +rY hJ -Cy +lO hI hJ hI hI -qk +vV hI hI -lr -TT +qv +nR hJ -kX -tn -tn -tn -kX -kX -kX -tn -TN -tn -tn -tn -tn -tn -tn +qs +ba +ba +ba +qs +qs +qs +ba +oe +ba +ba +ba +ba +ba +ba dA dA ac @@ -40892,18 +40892,18 @@ ac ac ac at -Gz -OF -xx -uL -yZ -tL -vD -vD -Xk -DG -YX -EE +aA +OT +aP +Yx +bg +bs +bC +bC +bQ +Rw +ct +OB aU aU aU @@ -40915,67 +40915,67 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hI hI hI -pG +iy hJ hI -nw -Ao -Ao -Pa +jJ +jG +jG +CL hI -th +lM hI -tn -tn +ba +ba hI -xm -Cd +nm +qw hI hJ hJ hJ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -41149,22 +41149,22 @@ ac ac ac at -Fv -Qf -Kg -yo -Em -YZ -Ln -kQ +aB +In +Pq +Uo +bh +bt +bD +yT at -Bi -jk -tS -zM -IA -Rb -ZN +Mc +MZ +sY +cU +db +dj +ds aU ac ac @@ -41172,67 +41172,67 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hI -GX -EQ -Li -Sz +hT +il +iz +iP hI -vF -Wg -Wg -VP +jK +jF +jF +LV hJ -Cd +qw hI -tn -tn +ba +ba hI -rf +mM hI hI -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -41406,22 +41406,22 @@ ac ac ac at -VN -Fv -Jq -GP -zi -up -Nw -bo +TM +aB +aR +aZ +CJ +bu +bE +eP at -nE -HU -PX +FF +LK +zh aU -GR -HN -Gu +dc +dk +dt aU ac ac @@ -41429,67 +41429,67 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hI -ZW -pu -pu -Sz +hU +im +im +iP hI -kL -Wg -Ao -CC +jL +jF +jG +KQ hJ -wh +lN hJ -tn -tn -kX -kX -Kt -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +qs +qs +HF +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -41673,7 +41673,7 @@ at at at at -rh +cw at at aU @@ -41686,66 +41686,66 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hI hI -EN -os +in +iA hI hI -EM -yH -yH -EM +jM +km +km +jM hJ -JZ +kV hJ hJ hJ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -41928,10 +41928,10 @@ ac ac ac at -pt -Ie -yP -pD +bR +ci +cx +cM at ac ac @@ -41942,67 +41942,67 @@ ac ac ac dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hI hJ hJ hJ -yV -Tv -Tv -Tv -lB -MY -Tv -oq +vM +LQ +LQ +LQ +EH +Hc +LQ +yU mB hJ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -42185,10 +42185,10 @@ ac ac ac at -xE -Ke -px -eG +bS +yy +cy +cN at ac ac @@ -42199,67 +42199,67 @@ ac ac ac ac -tn -dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -lA -EV -Zp -RU -Tv -Tv -Tv -Tx -Xg -RU -oq +ba +dA +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +io +aY +xH +zl +LQ +LQ +LQ +wp +xG +zl +yU mB hI -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -42442,10 +42442,10 @@ ac ac ac at -lz -sP -WJ -RC +bT +ck +cz +cO at ac ac @@ -42455,68 +42455,68 @@ ac ac ac ac -tn -tn -dA -dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -lA -PY -Mz -RU -Tv -Tv -NY -Tv -Tv -Tv -RU +ba +ba +dA +dA +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +io +ZB +Ey +zl +LQ +LQ +Ul +LQ +LQ +LQ +zl mC hI -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -42699,10 +42699,10 @@ ac ac ac at -Re -Ay -op -eG +bU +cl +Hv +cN at ac ac @@ -42712,68 +42712,68 @@ ac ac ac ac -tn +ba ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -lA -QN -Xo -Tv -Tx -Tv -Cg -Tv -PQ -Tv -tN +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +io +WB +Xd +LQ +wp +LQ +yh +LQ +so +LQ +qo hI hJ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -42956,10 +42956,10 @@ ac ac ac at -zj -Hq -WX -uZ +bV +cm +cB +cP at ac ac @@ -42968,69 +42968,69 @@ ac ac ac ac -tn -tn +ba +ba ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -Df +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +hV hJ hJ iT -Rj -Rj -Rj -Rj -Rj +jl +jl +jl +jl +jl hJ lQ hJ hJ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -43224,69 +43224,69 @@ ac ac ac ac -tn -tn +ba +ba ac ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hJ hJ -NE -yv -Nv -yv -yv +jm +jO +kn +jO +jO hJ lR lR hJ hJ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -43480,8 +43480,8 @@ ac ac ac ac -tn -tn +ba +ba ac ac ac @@ -43489,29 +43489,29 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hJ iU iX @@ -43523,27 +43523,27 @@ lt lR lS mD -lA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +io +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -43736,8 +43736,8 @@ ac ac ac ac -tn -tn +ba +ba ac ac ac @@ -43746,31 +43746,31 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hI -kh +iV jn jP kp @@ -43780,26 +43780,26 @@ iX lS lR mE -lA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +io +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -43993,7 +43993,7 @@ ac ac ac ac -tn +ba ac ac ac @@ -44004,30 +44004,30 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hI -AE +iW iX jQ kq @@ -44037,26 +44037,26 @@ iX lR lR mF -lA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +io +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -44249,8 +44249,8 @@ ac ac ac ac -tn -tn +ba +ba ac ac ac @@ -44261,28 +44261,28 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hJ iX iX @@ -44295,24 +44295,24 @@ lT ml hI hI -QQ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +lj +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -44501,14 +44501,14 @@ ac ac ac ac -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba ac ac ac @@ -44519,57 +44519,57 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hI iY jo jR ks -Tr +AG hJ -nN +lu hJ hJ hI -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -44761,11 +44761,11 @@ ac ac ac ac -tn -tn +ba +ba ac ac -tn +ba ac ac ac @@ -44777,54 +44777,54 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hJ hJ hI -lA +io hJ hJ hJ -GA -GA -QX +yb +yb +YD hJ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -45017,12 +45017,12 @@ ac ac ac ac -tn -tn +ba +ba ac ac ac -tn +ba ac ac ac @@ -45034,53 +45034,53 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hI -No -GA -TF +Uv +yb +GG hJ -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -45264,7 +45264,7 @@ ac ac ac ac -tn +ba ac ac ac @@ -45272,14 +45272,14 @@ ac ac ac ac -tn -tn -tn +ba +ba +ba ac ac ac ac -tn +ba ac ac ac @@ -45292,52 +45292,52 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hI -AF -XX -NG +SE +Wi +TZ hI -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA ac @@ -45520,23 +45520,23 @@ ac ac ac ac -Io -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +aS +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba ac ac ac ac -tn -tn +ba +ba ac ac ac @@ -45549,50 +45549,50 @@ ac ac dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba hJ hJ hJ hI hI -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -45783,7 +45783,7 @@ ac ac ac ac -tn +ba ac ac ac @@ -45792,8 +45792,8 @@ ac ac ac ac -tn -xz +ba +dE ac ac ac @@ -45807,47 +45807,47 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -46040,7 +46040,7 @@ ac ac ac ac -tn +ba ac ac ac @@ -46049,8 +46049,8 @@ ac ac ac ac -tn -cS +ba +dF ac ac ac @@ -46065,44 +46065,44 @@ dA dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -46297,7 +46297,7 @@ ac ac ac ac -tn +ba ac ac ac @@ -46306,9 +46306,9 @@ ac ac ac ac -tn -tn -tn +ba +ba +ba ac ac ac @@ -46323,41 +46323,41 @@ ac dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -46554,7 +46554,7 @@ ac ac ac ac -tn +ba ac ac ac @@ -46563,10 +46563,10 @@ ac ac ac ac -tn -tn -tn -Ll +ba +ba +ba +dN ac ac ac @@ -46581,38 +46581,38 @@ dA dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -46819,12 +46819,12 @@ ac ac ac ac -tn -tn -xz -tn -tn -tn +ba +ba +dE +ba +ba +ba ac ac ac @@ -46841,33 +46841,33 @@ dA dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -47076,12 +47076,12 @@ ac ac ac ac -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba ac ac ac @@ -47104,20 +47104,20 @@ dA dA dA dA -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn -tn +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba dA dA dA @@ -47333,12 +47333,12 @@ ac ac ac ac -oL -tn -La -tn -tn -tn +dv +ba +dG +ba +ba +ba ac ac ac @@ -47591,11 +47591,11 @@ ac ac ac ac -DP -zI -Rd -tn -tn +dz +dH +dJ +ba +ba ac ac ac @@ -47849,8 +47849,8 @@ ac ac ac ac -tn -zF +ba +dK ac ac ac diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 38d25031cb88a..8cbf56fddd03f 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -1345,14 +1345,14 @@ "gc" = ( /turf/open/floor/engine/cult{ initial_gas_mix = "n2=82;plasma=24;TEMP=120"; - initial_temperature = 120 + temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gd" = ( /obj/effect/spawner/lootdrop/crate_spawner, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=82;plasma=24;TEMP=120"; - initial_temperature = 120 + temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "ge" = ( @@ -1363,7 +1363,7 @@ /obj/effect/spawner/lootdrop/snowdin/dungeonheavy, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=82;plasma=24;TEMP=120"; - initial_temperature = 120 + temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gg" = ( @@ -1577,14 +1577,14 @@ /obj/effect/decal/remains/human, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=82;plasma=24;TEMP=120"; - initial_temperature = 120 + temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gV" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=82;plasma=24;TEMP=120"; - initial_temperature = 120 + temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gW" = ( @@ -1752,7 +1752,7 @@ /obj/structure/destructible/cult/pylon, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=82;plasma=24;TEMP=120"; - initial_temperature = 120 + temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "hG" = ( @@ -1894,7 +1894,7 @@ /obj/effect/spawner/lootdrop/snowdin/dungeonmid, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=82;plasma=24;TEMP=120"; - initial_temperature = 120 + temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "im" = ( @@ -1904,7 +1904,7 @@ }, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=82;plasma=24;TEMP=120"; - initial_temperature = 120 + temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "in" = ( @@ -1914,7 +1914,7 @@ }, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=82;plasma=24;TEMP=120"; - initial_temperature = 120 + temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "is" = ( @@ -2204,7 +2204,7 @@ }, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=82;plasma=24;TEMP=120"; - initial_temperature = 120 + temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "jQ" = ( @@ -2494,7 +2494,7 @@ /obj/effect/spawner/lootdrop/snowdin/dungeonlite, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=82;plasma=24;TEMP=120"; - initial_temperature = 120 + temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "lU" = ( @@ -3583,7 +3583,7 @@ /obj/structure/flora/rock/pile/icy, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=82;plasma=24;TEMP=120"; - initial_temperature = 120 + temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "qh" = ( @@ -8077,7 +8077,7 @@ /turf/open/floor/mineral/plastitanium{ initial_gas_mix = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1; - initial_temperature = 180 + temperature = 180 }, /area/awaymission/snowdin/cave) "EF" = ( @@ -8089,7 +8089,7 @@ /turf/open/floor/mineral/plastitanium{ initial_gas_mix = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1; - initial_temperature = 180 + temperature = 180 }, /area/awaymission/snowdin/cave) "EG" = ( @@ -8103,7 +8103,7 @@ /turf/open/floor/mineral/plastitanium{ initial_gas_mix = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1; - initial_temperature = 180 + temperature = 180 }, /area/awaymission/snowdin/cave) "EH" = ( diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index 98068803b20a0..c385c2dd4d8e4 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -5,6 +5,13 @@ "ab" = ( /turf/closed/indestructible/riveted, /area/awaymission/undergroundoutpost45/caves) +"ac" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron{ + dir = 8; + icon_state = "damaged2" + }, +/area/awaymission/undergroundoutpost45/central) "ad" = ( /turf/closed/mineral/random/labormineral, /area/awaymission/undergroundoutpost45/caves) @@ -17,70 +24,91 @@ "ag" = ( /turf/closed/wall/mineral/titanium, /area/awaymission/undergroundoutpost45/central) -"ah" = ( -/obj/structure/cable{ - icon_state = "1-4" +"aj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron{ + dir = 8; + icon_state = "damaged1" }, -/obj/structure/disposalpipe/segment{ - dir = 5 +/area/awaymission/undergroundoutpost45/central) +"an" = ( +/turf/closed/wall/r_wall/rust, +/area/awaymission/undergroundoutpost45/central) +"ao" = ( +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"ap" = ( +/obj/machinery/light/small/broken{ + dir = 4 + }, +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"ai" = ( -/obj/structure/flora/ausbushes/brflowers, -/turf/open/floor/grass, /area/awaymission/undergroundoutpost45/central) -"ak" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - broken = 1 +"aq" = ( +/obj/machinery/button/door{ + desc = "A remote control-switch for the elevator doors."; + id = "UO45_Elevator"; + name = "Elevator Doors"; + pixel_x = 6; + pixel_y = -24 }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"al" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/button/door{ + desc = "A remote control-switch to call the elevator to your level."; + id = "UO45_useless"; + name = "B1"; + pixel_x = -6; + pixel_y = -24 }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/button/door{ + desc = "A remote control-switch to call the elevator to your level."; + id = "UO45_useless"; + name = "B2"; + pixel_x = -6; + pixel_y = -34 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/turf/open/floor/iron{ + dir = 8; + icon_state = "damaged4" }, -/turf/open/floor/plating{ - burnt = 1 +/area/awaymission/undergroundoutpost45/central) +"ar" = ( +/turf/open/floor/iron{ + dir = 8; + icon_state = "damaged3" }, -/area/awaymission/undergroundoutpost45/research) -"am" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/bar/opposingcorners, +/area/awaymission/undergroundoutpost45/central) +"as" = ( +/obj/machinery/door/poddoor{ + id = "UO45_Elevator" + }, +/obj/effect/turf_decal/delivery, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"an" = ( -/turf/closed/wall/r_wall/rust, /area/awaymission/undergroundoutpost45/central) -"av" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, +"at" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"az" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/central) +"au" = ( +/obj/structure/closet/emcloset, +/obj/item/clothing/mask/breath, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"aw" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Bar"; + network = list("uo45") }, -/turf/open/floor/plating, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"aA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"aB" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, +"ax" = ( +/obj/effect/landmark/awaystart, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "aC" = ( /turf/closed/wall, @@ -88,146 +116,254 @@ "aD" = ( /turf/closed/wall/rust, /area/awaymission/undergroundoutpost45/central) -"aE" = ( +"aF" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"aL" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/crew_quarters) -"aT" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security Office"; - req_access_txt = "201" +"aG" = ( +/obj/machinery/button/door{ + desc = "A remote control-switch to call the elevator to your level."; + id = "UO45_useless"; + name = "Call Elevator"; + pixel_x = -6; + pixel_y = 24 + }, +/obj/machinery/button/door{ + desc = "A remote control-switch for the elevator doors."; + id = "UO45_Elevator"; + name = "Elevator Doors"; + pixel_x = 6; + pixel_y = 24 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"aV" = ( +/area/awaymission/undergroundoutpost45/central) +"aH" = ( +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = 32 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"aI" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"aJ" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"aK" = ( +/obj/structure/closet/emcloset, +/obj/item/clothing/mask/breath, +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = -32 + }, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"aM" = ( +/obj/machinery/vending/cola, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"aN" = ( +/obj/machinery/light{ dir = 8 }, -/area/awaymission/undergroundoutpost45/research) -"aW" = ( -/obj/machinery/gateway/centeraway{ - calibrated = 0 +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"aO" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"aP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"aQ" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"aX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ba" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = -23 +/area/awaymission/undergroundoutpost45/central) +"aR" = ( +/obj/machinery/light{ + dir = 4 }, -/obj/structure/closet/emcloset, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"bb" = ( -/obj/structure/toilet{ - dir = 1 +/area/awaymission/undergroundoutpost45/central) +"aS" = ( +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"aU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/secure_closet/personal/cabinet{ + locked = 0; + req_access_txt = "201" }, -/obj/machinery/light/small{ +/obj/item/clothing/under/misc/pj/blue, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/central) +"aZ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, +/obj/structure/closet/secure_closet/personal/cabinet{ + locked = 0; + req_access_txt = "201" + }, +/obj/item/clothing/under/suit/black/skirt, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/central) +"bi" = ( +/obj/structure/sink{ + pixel_y = 25 + }, /turf/open/floor/iron/freezer, /area/awaymission/undergroundoutpost45/central) -"bc" = ( -/obj/machinery/light/small{ - dir = 8 +"bj" = ( +/obj/structure/sink{ + pixel_y = 25 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/central) +"bk" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 }, -/area/awaymission/undergroundoutpost45/research) -"be" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security Office"; - req_access_txt = "201" +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"bp" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating{ + broken = 1 }, -/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"bg" = ( -/obj/structure/closet/crate, +"bq" = ( +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"br" = ( +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"bs" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/central) +"bt" = ( +/obj/machinery/light/small, +/obj/machinery/airalarm/all_access{ + dir = 1; + pixel_y = -23 }, -/obj/item/multitool, -/turf/open/floor/plating, +/turf/open/floor/iron/freezer, /area/awaymission/undergroundoutpost45/central) -"bl" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +"bu" = ( +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/central) +"bv" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/central) +"bx" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"bm" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/meter{ - name = "Mixed Air Tank Out" +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"by" = ( +/obj/machinery/door/airlock{ + name = "Unit 2" }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"bn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/central) +"bz" = ( /obj/machinery/door/airlock{ - id_tag = "awaydorm2"; - name = "Dorm 2" + name = "Unit 1" + }, +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/central) +"bA" = ( +/obj/machinery/light{ + dir = 8 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"bw" = ( -/obj/machinery/vending/hydronutrients, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, +"bB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"bC" = ( +"bG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 + dir = 9 }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"bD" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = -23 +/area/awaymission/undergroundoutpost45/central) +"bH" = ( +/obj/machinery/light{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"bE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/area/awaymission/undergroundoutpost45/central) +"bI" = ( +/obj/structure/toilet{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/central) +"bJ" = ( +/obj/structure/toilet{ dir = 1 }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/central) +"bK" = ( +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = -32 + }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"bF" = ( -/obj/structure/closet/l3closet, +"bL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"bM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"bN" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 1 +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = -32 }, -/area/awaymission/undergroundoutpost45/research) +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) "bO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -252,6 +388,17 @@ }, /turf/closed/wall, /area/awaymission/undergroundoutpost45/central) +"bS" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"bT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) "bU" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -264,1088 +411,1029 @@ }, /turf/closed/wall, /area/awaymission/undergroundoutpost45/central) -"ck" = ( -/obj/structure/chair/office/light{ - dir = 1; - pixel_y = 3 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/undergroundoutpost45/research) -"cl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 9 - }, +"bY" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"cn" = ( -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"co" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/rust, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"cp" = ( +"ca" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/central) -"cr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/central) -"cy" = ( -/obj/structure/table, -/obj/item/book/manual/hydroponics_pod_people, -/obj/item/paper/guides/jobs/hydroponics, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"cC" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/command{ - name = "Gateway Chamber"; - req_access_txt = "201" +"cb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"cF" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"cG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"cO" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating{ - burnt = 1 - }, -/area/awaymission/undergroundoutpost45/research) -"cR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +"cc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"cV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall/rust, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"dd" = ( -/obj/machinery/computer/monitor/secret{ - dir = 1; - name = "primary power monitoring console" - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"de" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"cd" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 }, -/turf/closed/wall, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"df" = ( +"cf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/closed/wall/rust, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"di" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"dj" = ( -/obj/effect/spawner/structure/window/reinforced, +"cg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/poddoor/preopen{ - id = "UO45_Engineering"; - name = "engineering Security Door" - }, +/obj/machinery/door/airlock/maintenance, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"dp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, /area/awaymission/undergroundoutpost45/central) -"dr" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +"ch" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/caves) -"ds" = ( -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"dt" = ( /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"du" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/research) -"dv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, /area/awaymission/undergroundoutpost45/central) -"dD" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/visible{ - dir = 4 - }, +"ci" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"dE" = ( -/obj/structure/sink{ - pixel_y = 25 - }, -/turf/open/floor/iron/freezer, /area/awaymission/undergroundoutpost45/central) -"dF" = ( -/obj/structure/chair/wood/normal{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"dH" = ( +"cj" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"dI" = ( -/obj/machinery/door/firedoor, +"cm" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"dJ" = ( -/obj/machinery/door/airlock/external, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"dK" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/item/stack/rods, +"co" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/rust, +/area/awaymission/undergroundoutpost45/central) +"cp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/central) +"cq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/crew_quarters) -"dL" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"dM" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/area/awaymission/undergroundoutpost45/central) +"cr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/rust, +/area/awaymission/undergroundoutpost45/central) +"cs" = ( +/obj/machinery/light/small{ + dir = 8 }, -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law, -/obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"dN" = ( -/obj/item/kirbyplants, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"dP" = ( +/area/awaymission/undergroundoutpost45/central) +"ct" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"cu" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"cv" = ( +/obj/structure/closet, +/obj/item/storage/box/lights/mixed, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"cw" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /obj/structure/table/wood, /obj/machinery/newscaster{ - pixel_y = -28 + pixel_x = -30 }, -/obj/item/pen, /turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"dT" = ( -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"dU" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ +"cx" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/airalarm/all_access{ + pixel_y = 23; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/central) +"cA" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/airalarm/all_access{ + pixel_y = 23; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/chair/wood/normal{ dir = 4 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/central) +"cB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/table/wood, +/obj/machinery/newscaster{ + pixel_x = 30 }, -/area/awaymission/undergroundoutpost45/caves) -"eg" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/central) +"cD" = ( +/obj/structure/closet/emcloset, +/obj/item/clothing/mask/breath, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"cE" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"cH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/obj/machinery/camera/directional/west{ - c_tag = "Engineering Hallway"; - network = list("uo45") +/obj/structure/chair/wood/normal{ + dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ei" = ( -/obj/structure/flora/ausbushes/ywflowers, -/turf/open/floor/grass, +/obj/machinery/button/door{ + id = "awaydorm2"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) -"ek" = ( +"cI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/external{ - name = "Mining External Airlock"; - req_access_txt = "201" +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/central) +"cJ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"em" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/bed, +/obj/item/bedsheet, /turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"er" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "N2 Outlet Pump" +/area/awaymission/undergroundoutpost45/central) +"cK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"es" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/central) +"cL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, -/turf/closed/wall, +/obj/machinery/button/door{ + id = "awaydorm1"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) -"et" = ( -/obj/structure/cable, -/obj/machinery/power/apc/highcap/fifteen_k{ - locked = 0; - name = "UO45 Mining APC"; - pixel_y = -23; - start_charge = 100 +"cM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 }, -/obj/machinery/light/small, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"cN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/closet/secure_closet/engineering_personal{ - icon_state = "mining"; - locked = 0; - name = "miner's equipment"; - req_access = null; - req_access_txt = "201" +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"cP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/item/storage/backpack/satchel/eng, -/obj/item/clothing/gloves/fingerless, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"ew" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"cQ" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, -/obj/machinery/computer/station_alert{ +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"cS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/portable_atmospherics/scrubber, +/obj/structure/window{ dir = 8 }, -/turf/open/floor/iron/checker, -/area/awaymission/undergroundoutpost45/engineering) -"ey" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"cT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/structure/disposalpipe/segment{ +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"cU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/obj/structure/reagent_dispensers/fueltank, +/obj/structure/window{ + dir = 4 }, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"ez" = ( -/obj/structure/chair/stool, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"eK" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment{ - dir = 4 +/area/awaymission/undergroundoutpost45/central) +"cV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, +/turf/closed/wall/rust, +/area/awaymission/undergroundoutpost45/central) +"cW" = ( +/obj/structure/grille, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/crew_quarters) -"eL" = ( +/area/awaymission/undergroundoutpost45/central) +"cX" = ( +/obj/item/stack/rods, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"cY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/grille, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"cZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock{ + id_tag = "awaydorm2"; + name = "Dorm 2" + }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"eN" = ( +"da" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"db" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock{ + id_tag = "awaydorm1"; + name = "Dorm 1" + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"dc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/structure/closet, +/obj/item/poster/random_contraband, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"de" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"eT" = ( +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/central) +"df" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/rust, +/area/awaymission/undergroundoutpost45/central) +"dg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/stack/rods, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"dh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"dk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"dl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"eU" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 +/area/awaymission/undergroundoutpost45/central) +"dm" = ( +/obj/machinery/firealarm{ + pixel_y = 24 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"eW" = ( -/obj/structure/table/reinforced, -/obj/item/storage/fancy/cigarettes{ - pixel_x = -2 - }, -/obj/item/lighter{ - pixel_x = 4 +/area/awaymission/undergroundoutpost45/central) +"dn" = ( +/obj/machinery/light{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"eY" = ( +/area/awaymission/undergroundoutpost45/central) +"do" = ( +/obj/item/kirbyplants, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"dp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/central) +"dv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/central) +"dw" = ( +/obj/machinery/light{ + dir = 8 + }, /obj/machinery/airalarm/all_access{ dir = 4; pixel_x = -23 }, -/obj/machinery/camera/directional/west{ - c_tag = "Gateway Chamber"; - network = list("uo45","uo45r") +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched1" + }, +/area/awaymission/undergroundoutpost45/central) +"dx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"fa" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 8 +/area/awaymission/undergroundoutpost45/central) +"dy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 }, -/obj/machinery/meter/atmos{ - id_tag = "UO45_waste_meter"; - name = "Waste Loop" +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"dz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"fc" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/stripes/line, +/area/awaymission/undergroundoutpost45/central) +"dA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"fh" = ( +/area/awaymission/undergroundoutpost45/central) +"dG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating{ + broken = 1 + }, +/area/awaymission/undergroundoutpost45/central) +"dK" = ( +/obj/effect/decal/cleanable/blood/splatter, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; + temperature = 363.9; name = "Cave Floor" }, /area/awaymission/undergroundoutpost45/caves) -"fj" = ( -/obj/structure/table/glass, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/micro_laser, +"dO" = ( +/obj/item/reagent_containers/food/condiment/milk, +/obj/item/reagent_containers/food/condiment/milk, +/obj/item/reagent_containers/food/condiment/milk, +/obj/item/storage/fancy/egg_box, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ +/obj/structure/closet/secure_closet/freezer{ + locked = 0; + name = "refrigerator"; + req_access_txt = "201" + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/awaymission/undergroundoutpost45/crew_quarters) +"dR" = ( +/obj/machinery/door/airlock/security{ + name = "Security Checkpoint"; + req_access_txt = "201" + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"dS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"dV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/area/awaymission/undergroundoutpost45/research) -"fk" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"dW" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/obj/machinery/light/small{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"dY" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 +/obj/machinery/door/airlock/public/glass{ + name = "Hydroponics"; + req_access_txt = "201" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"fl" = ( -/obj/machinery/gateway, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"fm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall/rust, /area/awaymission/undergroundoutpost45/central) -"fo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/r_wall, +"dZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"fs" = ( +"ea" = ( /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/undergroundoutpost45/research) -"fv" = ( -/obj/structure/table, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"eb" = ( +/obj/machinery/hydroponics/constructable, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"ec" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"fK" = ( -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/crew_quarters) -"fN" = ( -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/crew_quarters) -"fO" = ( -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/crew_quarters) -"fP" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Mining Maintenance"; +/area/awaymission/undergroundoutpost45/central) +"ed" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/command{ + name = "Gateway Chamber"; req_access_txt = "201" }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/mining) -"gc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) +"ee" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/turf/closed/wall/r_wall, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"gd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +"ef" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/closed/wall/r_wall, +/obj/machinery/door/airlock/maintenance{ + name = "Security Checkpoint Maintenance"; + req_access_txt = "201" + }, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"gg" = ( -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/extinguisher_cabinet{ - pixel_x = -25 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gp" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gv" = ( -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/gateway) -"gw" = ( -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/gateway) -"gx" = ( -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/research) -"gy" = ( -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/research) -"gz" = ( -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/research) -"gK" = ( -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/gateway) -"gL" = ( -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/gateway) -"gQ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/public/glass{ - name = "Central Access" - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gR" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/structure/toilet{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gS" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 +"eh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/sink{ - pixel_y = 25 - }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"gT" = ( -/obj/machinery/light/small{ +"ej" = ( +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/multitool, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"hc" = ( -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/research) -"hi" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/item/restraints/handcuffs, -/obj/item/assembly/flash/handheld, -/obj/item/reagent_containers/peppercloud_deployer, -/obj/structure/closet/secure_closet{ - icon_state = "sec"; - name = "security officer's locker"; - req_access_txt = "201" - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"hj" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"hk" = ( -/obj/structure/reagent_dispensers/watertank, +/area/awaymission/undergroundoutpost45/central) +"el" = ( +/obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"hl" = ( -/obj/machinery/light{ - dir = 4 - }, +"en" = ( +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"hm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Air to Distro" +"eo" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Hydroponics"; + req_access_txt = "201" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"ho" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -25 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/area/awaymission/undergroundoutpost45/central) +"ep" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hv" = ( -/obj/structure/bookcase/manuals/engineering, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"hy" = ( +/area/awaymission/undergroundoutpost45/central) +"eq" = ( +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/undergroundoutpost45/research) -"hI" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/meter{ - name = "Mixed Air Tank In" - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"hJ" = ( -/obj/machinery/computer/station_alert{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"hK" = ( -/obj/machinery/light/small{ +/area/awaymission/undergroundoutpost45/central) +"es" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/central) +"ev" = ( +/obj/item/clothing/under/misc/pj, +/obj/structure/closet/secure_closet/personal/cabinet{ + locked = 0; + req_access_txt = "201" }, -/turf/open/floor/iron, +/turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) -"hL" = ( -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/obj/structure/tank_dispenser{ - pixel_x = -1 +"ex" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 +/obj/item/pen, +/obj/machinery/door/window/southleft{ + base_state = "right"; + dir = 8; + icon_state = "right"; + name = "Security Checkpoint"; + req_access_txt = "201" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"hM" = ( -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/undergroundoutpost45/research) -"hN" = ( +/area/awaymission/undergroundoutpost45/central) +"eA" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/grass, +/area/awaymission/undergroundoutpost45/central) +"eB" = ( +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/grass, +/area/awaymission/undergroundoutpost45/central) +"eD" = ( +/obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"hO" = ( -/obj/machinery/light/small{ +"eF" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"hY" = ( -/obj/machinery/light{ - dir = 1 +"eG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"hZ" = ( /obj/machinery/door/airlock/external, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"il" = ( -/obj/structure/alien/weeds, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" - }, -/area/awaymission/undergroundoutpost45/caves) -"im" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/central) +"eH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/gateway) -"in" = ( -/obj/effect/decal/cleanable/blood/gibs/up, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/area/awaymission/undergroundoutpost45/central) +"eI" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"eM" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/folder/red, +/obj/machinery/door/window/southleft{ + dir = 8; + name = "Security Checkpoint"; + req_access_txt = "201" }, -/area/awaymission/undergroundoutpost45/caves) -"iF" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"eN" = ( +/obj/structure/alien/resin/membrane, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; + temperature = 363.9; name = "Cave Floor" }, /area/awaymission/undergroundoutpost45/caves) -"iH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-2" +"eO" = ( +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/grass, +/area/awaymission/undergroundoutpost45/central) +"eP" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"iI" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/structure/sign/departments/science{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/area/awaymission/undergroundoutpost45/central) +"eQ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/southleft{ + dir = 4; + name = "Hydroponics Desk"; + req_access_txt = "201" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"iV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/gateway) -"jc" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, +/area/awaymission/undergroundoutpost45/central) +"eR" = ( +/obj/structure/chair/stool, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"jv" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, +"eS" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, +/obj/item/reagent_containers/glass/bucket, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"jw" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 +"eV" = ( +/obj/structure/closet/emcloset, +/obj/item/clothing/mask/breath, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = -32 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"jz" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/tile/neutral{ +/area/awaymission/undergroundoutpost45/central) +"eZ" = ( +/obj/effect/turf_decal/tile/red{ dir = 1 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"jA" = ( -/obj/machinery/light/small{ +"fb" = ( +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"fd" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/southleft{ + base_state = "right"; + dir = 4; + icon_state = "right"; + name = "Hydroponics Desk"; + req_access_txt = "201" + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"fg" = ( +/obj/machinery/light/small/broken{ dir = 8 }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/turf/open/floor/plating{ + broken = 1 }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/area/awaymission/undergroundoutpost45/central) +"fm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall/rust, +/area/awaymission/undergroundoutpost45/central) +"fo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/central) +"fp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jD" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "UO45_Engineering"; - name = "engineering Security Door" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/delivery, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"jE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +/area/awaymission/undergroundoutpost45/central) +"fr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/turf/closed/wall/r_wall, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"ft" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/shovel/spade, +/obj/item/wrench, +/obj/item/screwdriver, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"fu" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/central) -"jH" = ( +"fw" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/iron, +/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/central) -"jT" = ( +"fx" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" }, /obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"jU" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"jV" = ( -/obj/structure/ore_box, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/obj/machinery/door/airlock/maintenance{ + name = "Hydroponics Maintenance"; + req_access_txt = "201" }, -/area/awaymission/undergroundoutpost45/caves) -"jW" = ( -/obj/machinery/light/small, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/structure/window/reinforced{ - dir = 4 +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"fy" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/tile/red{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/white/corner{ +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"fA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/area/awaymission/undergroundoutpost45/engineering) -"kj" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, +/obj/structure/chair/wood/normal, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/central) +"fB" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"kq" = ( -/obj/machinery/atmospherics/pipe/simple{ +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/central) +"fC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/research) -"kr" = ( -/obj/machinery/light/small, -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/mining) -"kt" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"ku" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/button/door{ + id = "awaydorm3"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = 25; + specialfunctions = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/central) +"fD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"kv" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 +/obj/machinery/door/airlock{ + id_tag = "awaydorm3"; + name = "Dorm 3" }, -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/bot, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"lh" = ( -/obj/structure/chair/fancy/comfy{ +/area/awaymission/undergroundoutpost45/central) +"fE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"fF" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"li" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"lj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"fG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"lk" = ( -/obj/structure/closet, -/obj/item/storage/belt/utility, -/turf/open/floor/plating{ - burnt = 1 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ll" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"fH" = ( +/obj/structure/disposalpipe/segment{ dir = 5 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"lm" = ( -/obj/machinery/light/small, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ln" = ( -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/engineering) -"lS" = ( -/obj/machinery/light/small{ - dir = 1 +/area/awaymission/undergroundoutpost45/central) +"fI" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/obj/item/clothing/gloves/color/latex, -/obj/structure/closet/emcloset, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"lT" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/eat{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/green{ dir = 4 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"lU" = ( +"fK" = ( +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/crew_quarters) +"fL" = ( +/obj/machinery/smartfridge, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"fM" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/eastleft{ + dir = 1; + name = "Hydroponics Desk"; + req_access_txt = "201" + }, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/crew_quarters) +"fN" = ( +/turf/closed/wall/rust, +/area/awaymission/undergroundoutpost45/crew_quarters) +"fO" = ( +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/crew_quarters) +"fQ" = ( /obj/structure/table/wood, -/turf/open/floor/carpet/grimy, -/area/awaymission/undergroundoutpost45/central) -"mJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/research) -"mR" = ( -/obj/machinery/light{ - dir = 4 +/obj/machinery/newscaster{ + pixel_y = -28 }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, +/turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) -"mS" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/clothing/glasses/hud/health, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/corner, -/area/awaymission/undergroundoutpost45/research) -"nc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 +"fR" = ( +/obj/machinery/light/small, +/obj/machinery/airalarm/all_access{ + dir = 1; + pixel_y = -23 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"nd" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, +/obj/structure/dresser, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/central) +"fS" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/central) +"fT" = ( +/obj/item/kirbyplants, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"nf" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 +"fU" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Central Hallway"; + network = list("uo45") }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"ni" = ( -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/engineering) -"no" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/central) +"fV" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -28 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"fW" = ( +/obj/machinery/vending/snack, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"fX" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"fY" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/sign/warning/deathsposal{ + desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; + name = "\improper DISPOSAL: LEADS TO EXTERIOR"; + pixel_y = -32 + }, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"fZ" = ( +/turf/open/floor/iron/showroomfloor, +/area/awaymission/undergroundoutpost45/crew_quarters) +"ga" = ( +/obj/structure/sink/kitchen{ + pixel_y = 28 + }, +/turf/open/floor/iron/showroomfloor, /area/awaymission/undergroundoutpost45/crew_quarters) -"nt" = ( +"gb" = ( /obj/structure/cable{ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"nw" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 +/area/awaymission/undergroundoutpost45/central) +"gc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 }, -/obj/structure/sign/warning/deathsposal{ - desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_x = -32 +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/central) +"gd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/central) +"ge" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"nx" = ( +/area/awaymission/undergroundoutpost45/central) +"gg" = ( +/turf/closed/wall/r_wall/rust, +/area/awaymission/undergroundoutpost45/crew_quarters) +"gh" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/undergroundoutpost45/crew_quarters) +"gi" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Kitchen Maintenance"; + req_access_txt = "201" + }, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/crew_quarters) +"gj" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "1-2" }, -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"nA" = ( +/area/awaymission/undergroundoutpost45/central) +"gl" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"nD" = ( +"gm" = ( /obj/structure/closet/crate{ desc = "It's a storage unit for kitchen clothes and equipment."; name = "Kitchen Crate" @@ -1355,3484 +1443,3015 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor, /area/awaymission/undergroundoutpost45/crew_quarters) -"nF" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/machinery/newscaster{ - pixel_x = -30 - }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) -"nM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/research) -"nT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +"gn" = ( +/obj/item/tank/internals/air, +/obj/item/clothing/mask/gas, /obj/effect/decal/cleanable/dirt, +/obj/structure/closet/emcloset, /turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/research) +"go" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/rods, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"nV" = ( +"gq" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-8" }, /obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 + dir = 10 }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"gr" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/crew_quarters) +"gs" = ( +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"gt" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"nW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +"gu" = ( +/obj/machinery/door/airlock{ + name = "Kitchen Cold Room"; + req_access_txt = "201" }, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/undergroundoutpost45/crew_quarters) +"gv" = ( /turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/gateway) +"gw" = ( +/turf/closed/wall/r_wall/rust, +/area/awaymission/undergroundoutpost45/gateway) +"gx" = ( +/turf/closed/wall/rust, /area/awaymission/undergroundoutpost45/research) -"nX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, +"gy" = ( +/turf/closed/wall, /area/awaymission/undergroundoutpost45/research) -"nY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall/rust, +"gz" = ( +/turf/closed/wall/r_wall, /area/awaymission/undergroundoutpost45/research) -"ob" = ( -/obj/structure/glowshroom/single, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 351.9; - name = "Cave Floor" - }, -/area/awaymission/undergroundoutpost45/caves) -"oc" = ( +"gA" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"od" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 +/area/awaymission/undergroundoutpost45/crew_quarters) +"gC" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/engineering) -"ok" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/computer/atmos_control/tank{ - input_tag = "UO45_air_in"; - name = "Mixed Air Supply Control"; - output_tag = "UO45_air_out"; - sensors = list("UO45_air_sensor" = "Tank") +/area/awaymission/undergroundoutpost45/crew_quarters) +"gD" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +/area/awaymission/undergroundoutpost45/crew_quarters) +"gE" = ( +/obj/structure/sink/kitchen{ + pixel_y = 28 }, -/turf/open/floor/iron/white/corner{ - dir = 1 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/area/awaymission/undergroundoutpost45/engineering) -"ow" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/awaymission/undergroundoutpost45/crew_quarters) +"gF" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 3 }, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 5 }, -/obj/machinery/light/small{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/area/awaymission/undergroundoutpost45/crew_quarters) +"gG" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"oC" = ( -/obj/item/kirbyplants, +"gH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"oF" = ( -/obj/structure/cable{ - icon_state = "4-8" +"gI" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"gJ" = ( +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"gK" = ( +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/gateway) +"gL" = ( +/turf/closed/wall/rust, +/area/awaymission/undergroundoutpost45/gateway) +"gM" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass{ + amount = 16; + pixel_x = 3; + pixel_y = 3 }, -/obj/machinery/airalarm/all_access{ - pixel_y = 23; - dir = 1 +/obj/item/stack/sheet/iron{ + amount = 23 }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/turf/open/floor/iron/white/side, +/area/awaymission/undergroundoutpost45/research) +"gN" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/iron/white/side, +/area/awaymission/undergroundoutpost45/research) +"gO" = ( +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/area/awaymission/undergroundoutpost45/crew_quarters) +"gP" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"oK" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 +"gU" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/gateway) +"gV" = ( +/obj/structure/table, +/obj/item/folder/white, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"gW" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 }, +/obj/item/pen, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"gX" = ( +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"oZ" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/engine/air, -/area/awaymission/undergroundoutpost45/engineering) -"pa" = ( -/obj/machinery/air_sensor{ - id_tag = "UO45_air_sensor" +"gY" = ( +/obj/machinery/airalarm/all_access{ + pixel_y = 23; + dir = 1 }, -/turf/open/floor/engine/air, -/area/awaymission/undergroundoutpost45/engineering) -"pc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/machinery/light/small{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 +/obj/machinery/camera/directional/north{ + c_tag = "Research Lab"; + network = list("uo45","uo45r") }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"ph" = ( +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"gZ" = ( +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"ha" = ( +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"hb" = ( /obj/machinery/light/small{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple{ - dir = 9 +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -3; + pixel_y = 3 }, -/obj/structure/chair/office/light, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/research) -"pi" = ( -/obj/structure/cable{ - icon_state = "2-4" +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; + pixel_y = 2 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/reagent_containers/dropper, +/turf/open/floor/iron/white/side{ + dir = 8 }, -/obj/structure/disposalpipe/junction/flip{ - dir = 2 +/area/awaymission/undergroundoutpost45/research) +"hc" = ( +/turf/closed/wall/r_wall/rust, +/area/awaymission/undergroundoutpost45/research) +"hf" = ( +/obj/machinery/light/small{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"pk" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 +"hg" = ( +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = 23 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"pl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 +"hi" = ( +/obj/machinery/light/small, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/obj/structure/closet/crate, -/obj/item/stack/sheet/mineral/plasma{ - amount = 6 +/area/awaymission/undergroundoutpost45/research) +"hj" = ( +/obj/structure/glowshroom/single, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched1" +/area/awaymission/undergroundoutpost45/caves) +"hp" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 }, -/area/awaymission/undergroundoutpost45/mining) -"pp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/crew_quarters) -"px" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/engineering) -"py" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 +/area/awaymission/undergroundoutpost45/crew_quarters) +"hq" = ( +/obj/structure/table, +/obj/item/stack/package_wrap, +/obj/item/reagent_containers/food/condiment/enzyme, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/engineering) -"pE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos{ - icon_state = "in"; - id_tag = "UO45_air_out"; - name = "air out" +/area/awaymission/undergroundoutpost45/crew_quarters) +"hr" = ( +/obj/structure/table, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/engine{ - initial_gas_mix = "n2=10580;o2=2644;TEMP=351.9"; - name = "air floor" +/area/awaymission/undergroundoutpost45/crew_quarters) +"hs" = ( +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = 23 }, -/area/awaymission/undergroundoutpost45/engineering) -"pF" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos{ - id = "UO45_air_in" +/obj/machinery/camera/directional/east{ + c_tag = "Kitchen"; + network = list("uo45") }, -/turf/open/floor/engine/air, -/area/awaymission/undergroundoutpost45/engineering) -"pH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/research) -"pK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/research) -"pL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/research) -"pN" = ( -/obj/item/stack/rods, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"pO" = ( -/obj/machinery/atmospherics/components/binary/valve, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"pP" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-8" +/area/awaymission/undergroundoutpost45/crew_quarters) +"ht" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/machinery/door/airlock/command/glass{ - name = "Chief Engineer"; - req_access_txt = "201" +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"pS" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pZ" = ( -/obj/structure/cable{ - icon_state = "1-2" +"hu" = ( +/obj/machinery/gateway/centeraway{ + calibrated = 0 }, -/obj/machinery/light/small{ - dir = 4 +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"hw" = ( +/obj/structure/chair{ + dir = 8 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"qf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"hx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/chair{ + dir = 8 }, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"hz" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/machinery/light/small{ + dir = 1 }, -/turf/open/floor/iron/white, +/obj/item/storage/box/lights/mixed, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/gateway) -"qg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/research) -"qh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 4; - external_pressure_bound = 120; - name = "server vent" - }, -/turf/open/floor/circuit/telecomms/server, -/area/awaymission/undergroundoutpost45/research) -"qi" = ( -/obj/machinery/atmospherics/pipe/simple{ - dir = 10 - }, -/turf/open/floor/iron/dark{ - initial_gas_mix = "n2=500,TEMP=80"; - name = "Server Walkway" - }, -/area/awaymission/undergroundoutpost45/research) -"qE" = ( -/obj/effect/spawner/structure/window/reinforced, +"hA" = ( +/obj/structure/closet/firecloset, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"qF" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/gateway) +"hB" = ( +/obj/machinery/rnd/destructive_analyzer, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"qI" = ( -/obj/machinery/computer/security{ - dir = 1; - network = list("uo45") +/area/awaymission/undergroundoutpost45/research) +"hC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"qK" = ( -/obj/machinery/door/airlock{ - name = "Unit 1" +/area/awaymission/undergroundoutpost45/research) +"hD" = ( +/obj/machinery/rnd/production/protolathe, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/crew_quarters) -"qP" = ( -/obj/machinery/light/small{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/research) +"hE" = ( +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/airalarm/server{ - dir = 4; - pixel_x = -22 - }, -/obj/machinery/rnd/server{ - req_access = null - }, -/turf/open/floor/circuit/telecomms/server, +/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"qQ" = ( -/obj/machinery/atmospherics/pipe/manifold{ +"hF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"hG" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/micro_laser, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/side{ dir = 8 }, -/turf/open/floor/iron/dark{ - initial_gas_mix = "n2=500,TEMP=80"; - name = "Server Walkway" - }, /area/awaymission/undergroundoutpost45/research) -"qX" = ( -/obj/machinery/gateway{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"ro" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/engineering) -"rr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/camera/directional/east{ - c_tag = "Arrivals"; - network = list("uo45") - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"rz" = ( -/obj/machinery/atmospherics/pipe/simple{ - dir = 9 - }, -/turf/open/floor/iron/dark{ - initial_gas_mix = "n2=500,TEMP=80"; - name = "Server Walkway" - }, +"hH" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) -"rK" = ( -/obj/machinery/vending/snack, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"rV" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +"hQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"rW" = ( -/obj/machinery/shower{ - dir = 1 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/item/bikehorn/rubberducky, -/turf/open/floor/iron/freezer, /area/awaymission/undergroundoutpost45/crew_quarters) -"sb" = ( +"hR" = ( /obj/structure/table, -/obj/item/kitchen/fork, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"sd" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"sf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/table/wood, -/obj/machinery/newscaster{ - pixel_x = 30 +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 3 }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) -"sp" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) -"sr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 8; - id_tag = "UO45_mix_in"; - name = "distro out" +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/engine/vacuum, -/area/awaymission/undergroundoutpost45/engineering) -"ss" = ( -/obj/machinery/light/small{ - dir = 4 +/area/awaymission/undergroundoutpost45/crew_quarters) +"hS" = ( +/obj/structure/table, +/obj/item/food/mint, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/engine/vacuum, -/area/awaymission/undergroundoutpost45/engineering) -"sJ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/area/awaymission/undergroundoutpost45/crew_quarters) +"hT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Engineering Reception" - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"sK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/turf/open/floor/iron/cafeteria{ dir = 5 }, -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"sO" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/door/airlock/engineering{ - name = "Engineering"; - req_access_txt = "201" - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"sQ" = ( -/obj/structure/closet, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"sS" = ( -/obj/structure/chair{ +/area/awaymission/undergroundoutpost45/crew_quarters) +"hU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"tc" = ( -/obj/machinery/conveyor{ - id = "UO45_mining" - }, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -32 +/obj/structure/table, +/obj/item/book/manual/chef_recipes, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/effect/turf_decal/stripes/line{ +/area/awaymission/undergroundoutpost45/crew_quarters) +"hV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/mining) -"te" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos{ - dir = 8; - id = "UO45_mix_in" - }, -/turf/open/floor/engine/vacuum, -/area/awaymission/undergroundoutpost45/engineering) -"tf" = ( -/obj/machinery/air_sensor{ - id_tag = "UO45_mix_sensor" - }, -/turf/open/floor/engine/vacuum, -/area/awaymission/undergroundoutpost45/engineering) -"ti" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/cigarettes{ - pixel_y = 2 - }, -/obj/item/lighter{ - pixel_x = 4; - pixel_y = 2 - }, -/turf/open/floor/carpet/grimy, -/area/awaymission/undergroundoutpost45/central) -"tl" = ( +/area/awaymission/undergroundoutpost45/crew_quarters) +"hW" = ( /obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"tn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/central) +"hX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"ib" = ( +/obj/structure/chair{ + dir = 8 }, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/research) -"to" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"ic" = ( +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = 23 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/research) -"tp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/research) -"tq" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 +/obj/structure/chair{ + dir = 8 }, -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/research) -"ty" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"id" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/gateway) +"ie" = ( +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/gateway) +"if" = ( +/obj/structure/closet/emcloset, +/obj/item/clothing/mask/breath, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/gateway) +"ig" = ( +/obj/machinery/computer/rdconsole/core{ + dir = 4; + req_access = null }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"tz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, +/area/awaymission/undergroundoutpost45/research) +"ih" = ( /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"tB" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, +/area/awaymission/undergroundoutpost45/research) +"ii" = ( +/obj/machinery/rnd/production/circuit_imprinter, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"tK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/rust, /area/awaymission/undergroundoutpost45/research) -"tM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, +"ij" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"tN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"ik" = ( +/obj/structure/table/glass, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin, +/turf/open/floor/iron/white/side{ + dir = 8 }, -/turf/closed/wall/rust, /area/awaymission/undergroundoutpost45/research) -"tQ" = ( -/obj/structure/table, -/obj/item/radio/off, -/obj/item/radio/off, -/turf/open/floor/iron{ +"ip" = ( +/obj/machinery/firealarm{ dir = 8; - icon_state = "floorscorched1" - }, -/area/awaymission/undergroundoutpost45/gateway) -"tT" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 + pixel_x = -24 }, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"tW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/research) -"uc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/engineering) -"ud" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/engineering) -"uf" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ +"iq" = ( +/obj/structure/table, +/obj/item/kitchen/rollingpin, +/turf/open/floor/iron/cafeteria{ dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/area/awaymission/undergroundoutpost45/crew_quarters) +"ir" = ( +/obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/iron, +/obj/machinery/processor, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, /area/awaymission/undergroundoutpost45/crew_quarters) -"ug" = ( -/obj/structure/chair{ +"is" = ( +/obj/machinery/light{ dir = 8 }, +/obj/structure/window/reinforced, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/gateway) -"un" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 8 +"it" = ( +/obj/structure/window/reinforced, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"iu" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/sign/warning/securearea{ - pixel_x = -32 +/obj/machinery/door/window{ + name = "Gateway Chamber"; + req_access_txt = "201" }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/gateway) -"up" = ( -/obj/machinery/gateway{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +"iv" = ( +/obj/structure/window/reinforced, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/gateway) -"uv" = ( -/turf/closed/mineral/random/labormineral, -/area/awaymission/undergroundoutpost45/research) -"ux" = ( +"iw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/research) -"uy" = ( -/obj/machinery/light/small, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = -23 +/obj/structure/chair{ + dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/nosmoking{ + pixel_x = 32 }, -/obj/structure/dresser, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) -"uE" = ( -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/engineering) -"uH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/engineering) -"uN" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"ix" = ( +/obj/machinery/door/airlock{ + name = "Emergency Supplies" }, -/obj/structure/sign/warning/deathsposal{ - desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/gateway) +"iy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/structure/table, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = 3 }, -/area/awaymission/undergroundoutpost45/research) -"uO" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/item/stock_parts/scanning_module{ + pixel_x = 2; + pixel_y = 3 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"uQ" = ( -/obj/structure/cable{ - icon_state = "0-8" +/obj/item/stock_parts/scanning_module, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -32 }, -/obj/machinery/power/apc/highcap/fifteen_k{ - locked = 0; - name = "UO45 Research Division APC"; - pixel_y = -23; - start_charge = 100 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"iz" = ( /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 6 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"uY" = ( -/obj/machinery/light/small, -/obj/structure/sink{ - dir = 8; - pixel_x = -11 - }, -/obj/structure/mirror{ - pixel_x = -28 +"iA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/research) -"uZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/engineering) -"vd" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos{ - dir = 1; - id = "UO45_n2_in" - }, -/turf/open/floor/engine/n2, -/area/awaymission/undergroundoutpost45/engineering) -"ve" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos{ - dir = 1; - id_tag = "UO45_n2_out"; - name = "nitrogen out" - }, -/turf/open/floor/engine/n2, -/area/awaymission/undergroundoutpost45/engineering) -"vf" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos{ - dir = 1; - id = "UO45_o2_in" - }, -/turf/open/floor/engine/o2, -/area/awaymission/undergroundoutpost45/engineering) -"vg" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos{ - dir = 1; - id_tag = "UO45_o2_out"; - name = "oxygen out" +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/engine/o2, -/area/awaymission/undergroundoutpost45/engineering) -"vo" = ( +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"iB" = ( /obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"vr" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"vy" = ( -/obj/structure/table, -/obj/item/storage/belt/utility, -/obj/item/clothing/head/utility/welding, -/obj/structure/sign/warning/biohazard{ - pixel_y = 32 - }, -/obj/item/assembly/prox_sensor, -/obj/item/assembly/prox_sensor, -/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"vD" = ( -/obj/machinery/air_sensor{ - id_tag = "UO45_n2_sensor" - }, -/obj/machinery/light/small, -/turf/open/floor/engine/n2, -/area/awaymission/undergroundoutpost45/engineering) -"vE" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/engine/n2, -/area/awaymission/undergroundoutpost45/engineering) -"vF" = ( -/obj/machinery/air_sensor{ - id_tag = "UO45_o2_sensor" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/machinery/light/small, -/turf/open/floor/engine/o2, -/area/awaymission/undergroundoutpost45/engineering) -"vG" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/engine/o2, -/area/awaymission/undergroundoutpost45/engineering) -"vI" = ( -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/mining) -"vJ" = ( -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/mining) -"vK" = ( -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/mining) -"vL" = ( -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/mining) -"vW" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"vX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"iC" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/engineering) -"we" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 + dir = 9 }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/mining) -"wm" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/gateway) -"wn" = ( -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/engineering) -"wo" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"wx" = ( -/obj/structure/chair{ +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"iD" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/awaymission/undergroundoutpost45/research) +"iE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"wy" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/southleft{ - dir = 4; - name = "Hydroponics Desk"; - req_access_txt = "201" +"iJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/awaymission/undergroundoutpost45/crew_quarters) +"iK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, +/area/awaymission/undergroundoutpost45/crew_quarters) +"iL" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/item/clothing/gloves/color/latex, +/obj/structure/closet/emcloset, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"wz" = ( -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 +/area/awaymission/undergroundoutpost45/research) +"iN" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/structure/sign/warning/biohazard{ + pixel_x = -32 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"wA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/gateway) +"iO" = ( +/obj/structure/table, +/obj/item/radio/off, +/obj/item/radio/off, +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched1" }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 +/area/awaymission/undergroundoutpost45/gateway) +"iP" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/closet/secure_closet/miner{ - req_access = null; - req_access_txt = "201" +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) +"iQ" = ( +/obj/structure/table, +/obj/machinery/recharger, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) +"iR" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 }, +/obj/structure/table, +/obj/item/paper/pamphlet/gateway, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"wG" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Kitchen"; - req_access_txt = "201" +/area/awaymission/undergroundoutpost45/gateway) +"iS" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/structure/disposalpipe/segment{ +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/gateway) +"iT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"wH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 1 +/obj/structure/chair{ + dir = 8 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"wI" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"iU" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/chair{ + dir = 8 }, -/obj/structure/disposalpipe/segment{ +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"iV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/gateway) +"iW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"wJ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"iX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"wR" = ( -/obj/machinery/vending/medical{ - req_access_txt = "201" +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"iY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 }, -/turf/open/floor/iron/white/side{ - dir = 6 +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 }, -/area/awaymission/undergroundoutpost45/research) -"wS" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/light/small{ + dir = 8 }, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"iZ" = ( /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"ja" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating{ - broken = 1 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"jd" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/research) -"wT" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/visible, -/obj/machinery/meter/atmos{ - id_tag = "UO45_distro_meter"; - name = "Distribution Loop" +/obj/structure/sign/warning/deathsposal{ + desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; + name = "\improper DISPOSAL: LEADS TO EXTERIOR"; + pixel_y = -32 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"wW" = ( -/obj/structure/cable, -/obj/machinery/power/smes{ - charge = 1.5e+006; - input_level = 10000; - inputting = 0; - output_level = 7000 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"wY" = ( -/obj/structure/reagent_dispensers/peppertank{ - pixel_x = -30 +/area/awaymission/undergroundoutpost45/crew_quarters) +"je" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/junction, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/awaymission/undergroundoutpost45/crew_quarters) +"jf" = ( +/obj/structure/closet/secure_closet{ + locked = 0; + name = "kitchen Cabinet"; + req_access_txt = "201" }, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/sugar, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"wZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/crew_quarters) +"jg" = ( +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = -23 }, +/obj/machinery/camera/directional/west{ + c_tag = "Gateway Chamber"; + network = list("uo45","uo45r") + }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"xc" = ( -/obj/structure/chair/fancy/comfy{ - dir = 8 +/area/awaymission/undergroundoutpost45/gateway) +"jh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/grimy, -/area/awaymission/undergroundoutpost45/central) -"xd" = ( -/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) +"ji" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) +"jj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/airlock/public/glass{ - name = "Dormitories" +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) +"jk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, +/obj/structure/chair/stool, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"xe" = ( -/obj/structure/cable{ - icon_state = "2-8" +/area/awaymission/undergroundoutpost45/gateway) +"jl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/structure/disposalpipe/segment{ - dir = 10 +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/gateway) +"jm" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"jn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"jo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"xf" = ( -/obj/machinery/door/airlock{ - name = "Unisex Showers" +/obj/machinery/door/airlock/research{ + name = "Gateway Observation"; + req_access_txt = "201" }, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/crew_quarters) -"xj" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"jp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 }, -/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"jq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"jr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/table, +/obj/item/folder/white, +/obj/item/disk/tech_disk, +/obj/item/disk/design_disk, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"js" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"jt" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/public/glass{ - name = "Diner" + name = "Central Access" }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"xk" = ( +"ju" = ( /obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/mining{ - name = "Processing Area"; - req_access_txt = "201" +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"xx" = ( -/obj/machinery/mineral/processing_unit_console{ - machinedir = 8 - }, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/mining) -"xM" = ( -/obj/machinery/mineral/stacking_unit_console{ - machinedir = 2 +/area/awaymission/undergroundoutpost45/crew_quarters) +"jB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /turf/closed/wall, -/area/awaymission/undergroundoutpost45/mining) -"xO" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/awaymission/undergroundoutpost45/crew_quarters) +"jC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +/turf/closed/wall/rust, +/area/awaymission/undergroundoutpost45/crew_quarters) +"jE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/central) +"jF" = ( +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"xR" = ( -/obj/structure/cable{ - icon_state = "1-4" +/area/awaymission/undergroundoutpost45/gateway) +"jG" = ( +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/structure/cable{ - icon_state = "1-8" +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) +"jI" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) +"jJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 }, -/turf/open/floor/mech_bay_recharge_floor, -/area/awaymission/undergroundoutpost45/mining) -"xS" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 8 +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"jK" = ( +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = 23 }, -/obj/structure/cable{ - icon_state = "0-8" +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 }, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"jM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/mining) -"yf" = ( -/obj/machinery/door/airlock/external{ - name = "Mining External Airlock"; +/area/awaymission/undergroundoutpost45/research) +"jN" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/research{ + name = "Research Lab"; req_access_txt = "201" }, -/obj/effect/turf_decal/sand, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"ys" = ( -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"yv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, +"jO" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"jQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"yy" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 +/area/awaymission/undergroundoutpost45/central) +"jR" = ( +/obj/structure/closet/emcloset, +/obj/item/clothing/mask/breath, +/obj/structure/sign/poster/official/safety_internals{ + pixel_y = 32 }, -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"yE" = ( -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ dir = 8; - icon_state = "damaged2" + icon_state = "floorscorched1" }, -/area/awaymission/undergroundoutpost45/central) -"yF" = ( -/obj/structure/table, -/obj/item/storage/box/gloves, -/turf/open/floor/iron/white/side{ - dir = 8 +/area/awaymission/undergroundoutpost45/crew_quarters) +"jY" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/undergroundoutpost45/research) -"yJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - broken = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/central) -"yL" = ( -/obj/structure/table/wood, -/obj/item/book/manual/ripley_build_and_repair, -/turf/open/floor/carpet/grimy, -/area/awaymission/undergroundoutpost45/central) -"yM" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "UO45_Engineering"; - name = "engineering Security Door" +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/crew_quarters) +"jZ" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"yN" = ( -/obj/structure/alien/weeds, -/obj/structure/glowshroom/single, -/obj/effect/decal/cleanable/blood/gibs/down, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/caves) -"yO" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"yQ" = ( -/obj/structure/table, -/obj/item/food/mint, -/turf/open/floor/iron/cafeteria{ - dir = 5 +"ka" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"yR" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"yS" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"kc" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"kd" = ( +/obj/item/storage/backpack/satchel/tox, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/suit/toggle/labcoat/science, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet{ + icon_state = "rd"; + name = "research director's locker"; + req_access_txt = "201" + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/awaymission/undergroundoutpost45/research) +"kf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/gateway) -"yT" = ( -/obj/structure/disposalpipe/segment{ +"kg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"kh" = ( +/obj/item/kirbyplants, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"ki" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"kk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple{ + dir = 1 }, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"kl" = ( +/obj/machinery/door/firedoor, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"yV" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"yW" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/southleft{ - base_state = "right"; - dir = 4; - icon_state = "right"; - name = "Hydroponics Desk"; +/obj/machinery/door/airlock/command{ + name = "Gateway EVA"; req_access_txt = "201" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"yX" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/machinery/power/port_gen/pacman/super{ - name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator" - }, -/obj/item/wrench, -/obj/structure/cable{ - icon_state = "0-8" +/area/awaymission/undergroundoutpost45/gateway) +"km" = ( +/obj/item/clothing/under/suit/navy, +/obj/structure/closet/secure_closet/personal/cabinet{ + locked = 0; + req_access_txt = "201" }, -/obj/structure/cable{ - icon_state = "0-4" +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"kn" = ( +/obj/machinery/light{ + dir = 8 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"yY" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"ko" = ( +/obj/machinery/airalarm/all_access{ + pixel_y = 23; + dir = 1 }, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"yZ" = ( +"kp" = ( /obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/machinery/door/airlock/public/glass{ - name = "Dormitories" + name = "Diner" }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"zb" = ( -/obj/structure/sink{ - pixel_y = 25 +"kr" = ( +/obj/structure/alien/resin/wall, +/obj/structure/alien/weeds, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, +/area/awaymission/undergroundoutpost45/caves) +"kw" = ( +/obj/structure/closet/l3closet, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/central) +"kx" = ( +/obj/structure/closet/crate, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 }, -/turf/open/floor/iron/white, -/area/space/nearstation) -"zd" = ( +/obj/item/multitool, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/central) -"zf" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 +"ky" = ( +/obj/structure/table, +/obj/item/storage/belt/utility, +/obj/item/clothing/head/utility/welding, +/obj/structure/sign/warning/biohazard{ + pixel_y = 32 }, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 4 }, /turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/engineering) -"zg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/area/awaymission/undergroundoutpost45/gateway) +"kz" = ( +/obj/structure/sign/warning/securearea{ + pixel_y = 32 }, -/area/awaymission/undergroundoutpost45/caves) -"zh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) +"kA" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/mining) -"zi" = ( -/turf/open/space, -/area/space/nearstation) -"zj" = ( -/obj/machinery/light{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) +"kB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = 32 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"zk" = ( +/area/awaymission/undergroundoutpost45/gateway) +"kC" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/obj/machinery/light/small{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"zl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/area/awaymission/undergroundoutpost45/gateway) +"kD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/obj/machinery/light/small{ dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"zm" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/structure/chair{ - dir = 8 +/obj/structure/sign/warning/securearea{ + pixel_x = -32 }, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/gateway) -"zn" = ( -/obj/structure/table, -/obj/item/stack/package_wrap, -/obj/item/reagent_containers/food/condiment/enzyme, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"zp" = ( -/obj/structure/disposaloutlet{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ +"kE" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"kF" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/obj/machinery/door/airlock/research{ + name = "Research Division Access"; + req_access_txt = "201" }, -/area/awaymission/undergroundoutpost45/caves) -"zr" = ( -/obj/structure/disposalpipe/segment{ +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"kG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"zu" = ( -/obj/structure/closet/l3closet, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/awaymission/undergroundoutpost45/research) -"zv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"zx" = ( -/obj/machinery/door/window/southright{ - name = "Bar Door"; - req_access_txt = "201" +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"zy" = ( -/obj/machinery/atmospherics/pipe/simple{ +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"kH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/airlock/command/glass{ - name = "Server Room"; - req_access_txt = "201" +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/research) -"zz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/gateway) -"zA" = ( -/obj/structure/cable{ - icon_state = "1-2" +"kI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - broken = 1 +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/research) -"zC" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"kJ" = ( +/obj/machinery/airalarm/all_access{ + pixel_y = 23; dir = 1 }, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/obj/machinery/light/small{ dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"zD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"zF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small{ - dir = 1 +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plating, +/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/gateway) -"zG" = ( -/obj/structure/cable{ - icon_state = "4-8" +"kK" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/purple, /turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"zH" = ( -/obj/effect/spawner/structure/window/reinforced, +/area/awaymission/undergroundoutpost45/gateway) +"kL" = ( +/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/poddoor/preopen{ - id = "UO45_Engineering"; - name = "engineering Security Door" +/obj/machinery/door/airlock/research{ + name = "Research Division Access"; + req_access_txt = "201" }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"zI" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"kM" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, -/area/awaymission/undergroundoutpost45/central) -"zJ" = ( -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, +/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"zK" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +"kN" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"kO" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"zL" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "UO45_rdprivacy"; - name = "Privacy Shutters" - }, -/turf/open/floor/plating, +/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"zM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"kP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plating, +/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"zN" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"zO" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/mining) -"zP" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/obj/structure/sign/poster/official/safety_internals{ - pixel_y = 32 - }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched1" - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"zQ" = ( -/obj/structure/tank_dispenser/oxygen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"zS" = ( +"kQ" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"zU" = ( -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/storage/fancy/egg_box, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/freezer{ - locked = 0; - name = "refrigerator"; - req_access_txt = "201" - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"zV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/machinery/button/door{ - desc = "A remote control-switch for the engineering security doors."; - id = "UO45_Engineering"; - name = "Engineering Lockdown"; - pixel_x = 24; - pixel_y = 6; - req_access_txt = "201" +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/item/clothing/suit/armor/vest, -/obj/item/clothing/head/helmet, -/obj/structure/closet/secure_closet{ - icon_state = "sec"; - name = "security officer's locker"; - req_access_txt = "201" +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"kR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"zW" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"zX" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"kS" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating{ - broken = 1 +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, +/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"zY" = ( +"kT" = ( /obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Kitchen"; - network = list("uo45") + pixel_y = 23; + dir = 1 }, -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 +/obj/machinery/light/small{ + dir = 1 }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Ab" = ( -/obj/machinery/shower{ +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Ac" = ( -/obj/structure/table, -/obj/item/computer_hardware/hard_drive/role/signal/toxins, -/obj/item/computer_hardware/hard_drive/role/signal/toxins{ - pixel_x = -4; - pixel_y = 2 +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"kU" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/undergroundoutpost45/research) -"Ad" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +/obj/effect/turf_decal/tile/purple{ dir = 4 }, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"kV" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"kW" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"Ae" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Af" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "awaydorm5"; - name = "Dorm 5" +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"kY" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "UO45_biohazard"; + name = "biohazard Containment Door" }, +/obj/effect/turf_decal/delivery, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Ag" = ( +/area/awaymission/undergroundoutpost45/research) +"kZ" = ( +/obj/structure/sink{ + pixel_y = 25 + }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/structure/sign/warning/nosmoking{ + pixel_x = -32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/space/nearstation) +"la" = ( +/obj/machinery/shower{ + pixel_y = 15 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"lb" = ( +/obj/structure/sink{ + pixel_y = 25 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"lc" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"Ah" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix to Distro" +/obj/structure/sign/departments/science{ + pixel_x = -32 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Ai" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 +/obj/effect/turf_decal/tile/purple{ + dir = 8 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Al" = ( -/obj/structure/disposalpipe/segment{ +/area/awaymission/undergroundoutpost45/crew_quarters) +"ld" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plating{ - broken = 1 - }, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Am" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/red/half/contrasted{ +"le" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"An" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/area/awaymission/undergroundoutpost45/crew_quarters) +"lf" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Ao" = ( -/obj/effect/decal/cleanable/blood/gibs/limb, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +"lg" = ( +/obj/machinery/light/small, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"ln" = ( +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/engineering) +"lo" = ( +/obj/machinery/light/small{ + dir = 8 }, -/area/awaymission/undergroundoutpost45/caves) -"Ar" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ +/obj/item/multitool, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -32 + }, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"lp" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"As" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/area/awaymission/undergroundoutpost45/gateway) +"lq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/structure/table, -/obj/item/paper/pamphlet/gateway, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/gateway) -"Au" = ( +"lr" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/airalarm/all_access{ + pixel_y = 23; + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plating{ - broken = 1 +/obj/machinery/camera/directional/north{ + c_tag = "Gateway Ready Room"; + network = list("uo45","uo45r") }, -/area/awaymission/undergroundoutpost45/research) -"Av" = ( +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/gateway) +"ls" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Aw" = ( -/obj/machinery/door/airlock{ - name = "Emergency Supplies" - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/gateway) -"Ax" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Ay" = ( -/obj/structure/alien/resin/wall, -/obj/structure/alien/weeds, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/area/awaymission/undergroundoutpost45/gateway) +"lt" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/undergroundoutpost45/caves) -"Az" = ( -/turf/open/floor/carpet/grimy, -/area/awaymission/undergroundoutpost45/central) -"AB" = ( -/obj/machinery/vending/cola, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"AC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 +/area/awaymission/undergroundoutpost45/gateway) +"lv" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"lw" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"AD" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"AE" = ( -/turf/open/floor/plating{ - burnt = 1 - }, -/area/awaymission/undergroundoutpost45/central) -"AK" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/crew_quarters) -"AM" = ( +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"lx" = ( /obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/airlock/public/glass{ - name = "Central Access" +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"AP" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"AQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"AT" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"AU" = ( -/obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/door/airlock/research{ + name = "Research Division Access"; + req_access_txt = "201" + }, /turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"AV" = ( -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/area/awaymission/undergroundoutpost45/gateway) +"ly" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/undergroundoutpost45/research) -"AW" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 3 +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"lz" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"lA" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Ba" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating{ - broken = 1 +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 }, -/area/awaymission/undergroundoutpost45/central) -"Bb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/obj/machinery/camera/directional/south{ + c_tag = "Research Division West"; + network = list("uo45","uo45r") }, -/area/awaymission/undergroundoutpost45/caves) -"Bc" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"lB" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/undergroundoutpost45/research) -"Bd" = ( -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"Bg" = ( -/obj/structure/chair/fancy/comfy, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Bh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Bj" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Bk" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"lC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/gateway) -"Bl" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Bm" = ( +"lD" = ( +/obj/machinery/door/firedoor, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/machinery/door/window{ - name = "Gateway Chamber"; +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/research{ + name = "Research Division Access"; req_access_txt = "201" }, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/gateway) -"Bp" = ( +"lE" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Bq" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Br" = ( -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 351.9; - name = "Cave Floor" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"lF" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/undergroundoutpost45/caves) -"Bs" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-8" }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"Bt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 }, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"Bu" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 +/area/awaymission/undergroundoutpost45/research) +"lG" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/sign/warning/deathsposal{ - desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 +/obj/machinery/light, +/obj/structure/disposalpipe/junction{ + dir = 8 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"Bx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"By" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Hydroponics"; - network = list("uo45") +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"lH" = ( +/obj/structure/cable{ + icon_state = "0-8" }, /obj/machinery/power/apc/highcap/fifteen_k{ locked = 0; - name = "Hydroponics APC"; + name = "UO45 Research Division APC"; pixel_y = -23; start_charge = 100 }, -/obj/structure/cable{ - icon_state = "0-4" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"lI" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Bz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 + dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"lJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"BC" = ( -/obj/machinery/light/small{ - dir = 8 +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"lK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"lL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"BD" = ( -/obj/structure/cable{ - icon_state = "4-8" +"lM" = ( +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"lN" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 +/obj/machinery/camera/directional/south{ + c_tag = "Research Division East"; + network = list("uo45","uo45r") }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"lO" = ( +/obj/machinery/door/airlock/research{ + name = "Research Division Access"; + req_access_txt = "201" }, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"lQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"BH" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 +/area/awaymission/undergroundoutpost45/crew_quarters) +"lR" = ( +/obj/structure/chair{ + dir = 8 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"BI" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-8" +/area/awaymission/undergroundoutpost45/crew_quarters) +"lV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Diner" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"BJ" = ( +/area/awaymission/undergroundoutpost45/crew_quarters) +"lW" = ( +/obj/machinery/door/firedoor, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Diner" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"BK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"BL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/chair{ - dir = 8 +"lX" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/plasma{ + amount = 26 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"BM" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"BN" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 + }, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"BS" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - dir = 8; - icon_state = "damaged1" +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/engineering) +"lY" = ( +/obj/machinery/light/small{ + dir = 1 }, -/area/awaymission/undergroundoutpost45/central) -"BT" = ( -/obj/structure/chair{ - dir = 8 +/obj/machinery/camera/directional/north{ + c_tag = "Engineering Secure Storage"; + network = list("uo45") }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/engineering) +"lZ" = ( +/obj/machinery/suit_storage_unit/engine, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"BU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "awaydorm7"; - name = "Dorm 7" +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/engineering) +"ma" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"BV" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = -7 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"mb" = ( /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"BW" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/awaymission/undergroundoutpost45/gateway) +"mc" = ( +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched1" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/area/awaymission/undergroundoutpost45/gateway) +"md" = ( +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"me" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/gateway) +"mf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/portable_atmospherics/scrubber, +/obj/structure/window{ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - burnt = 1 - }, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/research) -"BX" = ( +"mg" = ( /obj/structure/cable{ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"BY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/airlock/public/glass{ - name = "Dormitories" - }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"BZ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/area/awaymission/undergroundoutpost45/research) +"mh" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/command{ + name = "Research Director's Office"; + req_access_txt = "201" }, -/obj/structure/chair/wood/normal{ - dir = 1 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/machinery/button/door{ - id = "awaydorm2"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 +/area/awaymission/undergroundoutpost45/research) +"mi" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "UO45_rdprivacy"; + name = "Privacy Shutters" }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) -"Cb" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"mj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "UO45_rdprivacy"; + name = "Privacy Shutters" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Cc" = ( -/obj/machinery/power/terminal{ +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"mk" = ( +/obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/machinery/power/port_gen/pacman{ - name = "P.A.C.M.A.N.-type portable generator" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"Cd" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster{ - pixel_y = -28 +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"ml" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) -"Cf" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"mm" = ( +/obj/structure/closet/firecloset, +/obj/machinery/light/small, +/obj/structure/sign/warning/securearea{ + pixel_y = -32 }, -/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"mn" = ( +/obj/structure/closet/emcloset, /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/turf/open/floor/plating, +/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"Ch" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"Cj" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Diner" +"mo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/sign/warning/securearea{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Ck" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/tile/bar/opposingcorners, +"mp" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Cl" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/cafeteria{ - dir = 5 +"mq" = ( +/obj/structure/table, +/obj/item/newspaper, +/obj/machinery/newscaster{ + pixel_x = 30 }, -/area/awaymission/undergroundoutpost45/research) -"Cm" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"mr" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster{ + pixel_y = 32 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"ms" = ( +/obj/machinery/light/small{ + dir = 1 }, /obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = -23 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ + pixel_y = 23; dir = 1 }, -/turf/open/floor/iron, +/turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) -"Cn" = ( -/obj/machinery/button/door{ - desc = "A remote control-switch for the elevator doors."; - id = "UO45_Elevator"; - name = "Elevator Doors"; - pixel_x = 6; - pixel_y = -24 +"mt" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"mu" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster{ + pixel_x = -30 }, -/obj/machinery/button/door{ - desc = "A remote control-switch to call the elevator to your level."; - id = "UO45_useless"; - name = "B1"; - pixel_x = -6; - pixel_y = -24 +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"mv" = ( +/obj/machinery/light/small{ + dir = 1 }, -/obj/machinery/button/door{ - desc = "A remote control-switch to call the elevator to your level."; - id = "UO45_useless"; - name = "B2"; - pixel_x = -6; - pixel_y = -34 +/obj/machinery/airalarm/all_access{ + pixel_y = 23; + dir = 1 }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "damaged4" +/obj/structure/chair/wood/normal{ + dir = 8 }, -/area/awaymission/undergroundoutpost45/central) -"Cp" = ( -/obj/machinery/door/airlock{ - name = "Private Restroom" +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"mx" = ( +/obj/machinery/light/small{ + dir = 8 }, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/research) -"Cq" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Ct" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Cu" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +"my" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/area/awaymission/undergroundoutpost45/caves) -"Cv" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"mz" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/rods/fifty, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/engineering) +"mA" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"Cw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/area/awaymission/undergroundoutpost45/engineering) +"mB" = ( +/obj/structure/table, +/obj/item/hand_labeler, +/obj/item/flashlight, +/obj/item/flashlight, +/obj/item/flashlight, +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/machinery/portable_atmospherics/scrubber, -/obj/structure/window{ - dir = 8 +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"mC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Cy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"mD" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -28 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/structure/rack, +/obj/item/tank/jetpack/carbondioxide, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Cz" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"mE" = ( +/obj/structure/cable, +/obj/machinery/power/apc/highcap/fifteen_k{ + locked = 0; + name = "UO45 Gateway APC"; + pixel_y = -23; + start_charge = 100 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/light/small, +/obj/structure/rack, +/obj/item/clothing/shoes/magboots, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"CB" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"mF" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/structure/rack, +/obj/item/clothing/shoes/magboots, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"CC" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"mG" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/crew_quarters) -"CE" = ( -/obj/machinery/vending/hydroseeds{ - slogan_delay = 700 +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"mH" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"CF" = ( +/area/awaymission/undergroundoutpost45/gateway) +"mJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall/rust, +/area/awaymission/undergroundoutpost45/research) +"mK" = ( /obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/maintenance{ + name = "Research Maintenance"; + req_access_txt = "201" }, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"CG" = ( -/obj/machinery/suit_storage_unit/engine, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/area/awaymission/undergroundoutpost45/research) +"mL" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"CH" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-8" }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"mM" = ( /obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 + dir = 6 }, -/turf/open/floor/plating{ - broken = 1 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, /area/awaymission/undergroundoutpost45/research) -"CI" = ( -/obj/structure/closet/firecloset, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"CJ" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"CL" = ( -/obj/machinery/door/firedoor, -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/machinery/door/poddoor/preopen{ - id = "UO45_Engineering"; - name = "engineering Security Door" +"mN" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"CM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"CN" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"CO" = ( -/obj/item/storage/backpack/satchel/tox, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/suit/toggle/labcoat/science, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet{ - icon_state = "rd"; - name = "research director's locker"; - req_access_txt = "201" - }, /turf/open/floor/iron/cafeteria{ dir = 5 }, /area/awaymission/undergroundoutpost45/research) -"CP" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 +"mO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) -"CQ" = ( -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "201" +"mP" = ( +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"CR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - broken = 1 +"mQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/area/awaymission/undergroundoutpost45/central) -"CT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/area/awaymission/undergroundoutpost45/research) +"mU" = ( +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/machinery/door/airlock{ - id_tag = "awaydorm3"; - name = "Dorm 3" +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"mV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Dormitories" }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"CU" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" +/area/awaymission/undergroundoutpost45/crew_quarters) +"mW" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Dormitories" }, -/obj/structure/disposalpipe/segment{ - dir = 6 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"mX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/button/door{ + id = "awaydorm5"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/obj/structure/chair/wood/normal{ dir = 1 }, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"mY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"mZ" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"CV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Air to Distro" + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"na" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"nb" = ( +/obj/machinery/button/door{ + id = "awaydorm7"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 }, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"ng" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"nh" = ( +/obj/machinery/door/poddoor{ + id = "UO45_Secure Storage"; + name = "secure Storage" + }, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"CY" = ( +/area/awaymission/undergroundoutpost45/engineering) +"ni" = ( +/turf/closed/wall/r_wall/rust, +/area/awaymission/undergroundoutpost45/engineering) +"nj" = ( /obj/structure/cable{ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating{ - broken = 1 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"nk" = ( +/obj/structure/table, +/obj/item/computer_hardware/hard_drive/role/signal/toxins, +/obj/item/computer_hardware/hard_drive/role/signal/toxins{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/area/awaymission/undergroundoutpost45/central) -"CZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 +/area/awaymission/undergroundoutpost45/research) +"nl" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Da" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Db" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/awaymission/undergroundoutpost45/research) +"nm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/research) +"nn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/chair, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/effect/turf_decal/tile/yellow{ +/area/awaymission/undergroundoutpost45/research) +"np" = ( +/obj/structure/chair/office{ dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Dc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/area/awaymission/undergroundoutpost45/research) +"nr" = ( +/obj/machinery/light/small{ dir = 4 }, -/obj/machinery/door/airlock/mining/glass{ - name = "Mining EVA"; - req_access_txt = "201" +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"ns" = ( /obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"Df" = ( -/obj/machinery/light{ - dir = 4 + icon_state = "2-4" }, -/obj/machinery/processor, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Dg" = ( -/turf/open/floor/iron/showroomfloor, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Dh" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) -"Di" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"nu" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Dk" = ( /obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/eat{ - pixel_x = 32 + dir = 4 }, -/obj/effect/turf_decal/tile/green{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Dl" = ( +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"nv" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "4-8" }, /obj/structure/disposalpipe/segment{ - dir = 9 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 + dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/maintenance, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Dm" = ( -/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"Dn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Dq" = ( -/obj/structure/mirror{ - pixel_x = 28 - }, -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, +"ny" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/crew_quarters) -"Dr" = ( +"nz" = ( /obj/machinery/vending/cigarette, /obj/structure/sign/poster/contraband/smoke{ pixel_y = 32 }, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/crew_quarters) -"Ds" = ( -/obj/machinery/computer/security{ - dir = 4; - network = list("uo45") - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 +"nA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/crew_quarters) +"nB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock{ + id_tag = "awaydorm5"; + name = "Dorm 5" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"Dt" = ( -/obj/machinery/computer/security{ - dir = 1; - network = list("uo45") - }, -/obj/machinery/button/door{ - desc = "A remote control-switch for the security Privacy Shutters."; - id = "UO45_EngineeringOffice"; - name = "Privacy Shutters"; - pixel_x = -24; - pixel_y = 6; - req_access_txt = "201" - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 +/area/awaymission/undergroundoutpost45/crew_quarters) +"nC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock{ + id_tag = "awaydorm7"; + name = "Dorm 7" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Du" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 +/area/awaymission/undergroundoutpost45/crew_quarters) +"nE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"nG" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"Dv" = ( -/obj/item/clothing/under/misc/pj, -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" +/obj/machinery/door/airlock/public/glass{ + name = "Dormitories" }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Dy" = ( -/obj/item/tank/internals/air, -/obj/item/clothing/mask/gas, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"Dz" = ( -/obj/structure/cable{ - icon_state = "2-8" +/area/awaymission/undergroundoutpost45/crew_quarters) +"nH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"nI" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/disposalpipe/junction/yjunction{ - dir = 8 +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"DA" = ( -/obj/structure/chair, +"nJ" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/engineering) -"DB" = ( +"nK" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-4" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/iron, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/engineering) -"DC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"DD" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/turf/open/floor/carpet/grimy, -/area/awaymission/undergroundoutpost45/central) -"DE" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "UO45_biohazard"; - name = "biohazard Containment Door" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"DF" = ( -/obj/machinery/smartfridge, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"DG" = ( -/obj/machinery/light/small{ - dir = 1 +"nL" = ( +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/effect/turf_decal/stripes/corner{ + dir = 8 }, -/obj/item/kirbyplants, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"DI" = ( +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/engineering) +"nM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/research) +"nN" = ( /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"DK" = ( -/obj/structure/closet/l3closet, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"DL" = ( -/obj/structure/chair/fancy/comfy, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/area/awaymission/undergroundoutpost45/research) +"nO" = ( +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/light/small{ dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"DN" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/table, +/obj/item/radio/off, +/obj/item/laser_pointer, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/area/awaymission/undergroundoutpost45/research) +"nP" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/window/reinforced{ + dir = 8 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"DP" = ( -/obj/item/storage/secure/safe{ - pixel_x = 5; - pixel_y = -27 +/obj/item/folder/white, +/obj/item/stamp/research_director{ + pixel_x = 3; + pixel_y = -2 }, /turf/open/floor/iron/cafeteria{ dir = 5 }, /area/awaymission/undergroundoutpost45/research) -"DS" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 +"nQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/item/pen, +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/machinery/camera/directional/south{ - c_tag = "Research Division West"; - network = list("uo45","uo45r") +/area/awaymission/undergroundoutpost45/research) +"nR" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 1 }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"DU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/disposalpipe/segment{ - dir = 10 +/obj/machinery/computer/security/telescreen{ + desc = "Used for monitoring the research division and the labs within."; + name = "research monitor"; + network = list("uo45r") }, /turf/open/floor/iron/cafeteria{ dir = 5 }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"DW" = ( -/obj/machinery/gateway{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"DY" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 - }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Ea" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ +/area/awaymission/undergroundoutpost45/research) +"nS" = ( +/obj/machinery/light/small{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/computer/atmos_control/tank{ - dir = 1; - input_tag = "UO45_o2_in"; - name = "Oxygen Supply Control"; - output_tag = "UO45_o2_out"; - sensors = list("UO45_o2_sensor" = "Tank") - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Ec" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Ed" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/splatter, -/obj/effect/mob_spawn/human, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" - }, -/area/awaymission/undergroundoutpost45/caves) -"Ef" = ( -/obj/structure/flora/ausbushes/ppflowers, -/turf/open/floor/grass, -/area/awaymission/undergroundoutpost45/central) -"Eg" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Eh" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/barman_recipes, -/obj/item/reagent_containers/food/drinks/shaker, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Ei" = ( -/obj/machinery/vending/snack, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Ek" = ( -/obj/machinery/shower{ +/obj/structure/window/reinforced{ dir = 1 }, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Eo" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Ep" = ( -/obj/structure/closet/crate, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" - }, -/area/awaymission/undergroundoutpost45/caves) -"Eq" = ( -/obj/structure/cable, -/obj/machinery/power/smes{ - charge = 1.5e+006; - input_level = 30000; - inputting = 0; - output_level = 7000 - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"Er" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "0-4" +/obj/structure/table/reinforced, +/obj/item/taperecorder{ + pixel_x = -3 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"Es" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/item/paicard{ + pixel_x = 4 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Et" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Central Access" +/turf/open/floor/iron/cafeteria{ + dir = 5 }, +/area/awaymission/undergroundoutpost45/research) +"nU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Eu" = ( +/area/awaymission/undergroundoutpost45/research) +"nW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" - }, -/area/awaymission/undergroundoutpost45/caves) -"Ew" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/research) +"nX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Ex" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" - }, -/area/awaymission/undergroundoutpost45/caves) -"Ey" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, +/turf/closed/wall/r_wall, /area/awaymission/undergroundoutpost45/research) -"Ez" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"nY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 +/turf/closed/wall/r_wall/rust, +/area/awaymission/undergroundoutpost45/research) +"oa" = ( +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"EA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"EC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"EE" = ( -/obj/structure/closet/firecloset, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 +"oe" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"EF" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/item/screwdriver{ - pixel_y = 10 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/camera/directional/north{ + c_tag = "Dormitories"; + network = list("uo45") }, -/obj/item/radio/off, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"EG" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Air to External" +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"EH" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 9 - }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched2" +/area/awaymission/undergroundoutpost45/crew_quarters) +"of" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/undergroundoutpost45/engineering) -"EI" = ( /obj/structure/disposalpipe/segment{ - dir = 9 + dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/crew_quarters) -"EM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"EN" = ( +"og" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"EP" = ( -/obj/structure/chair/fancy/comfy, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"EQ" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 +"oi" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ER" = ( -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"ES" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/window/reinforced{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/structure/closet/secure_closet/engineering_personal{ - req_access = null; - req_access_txt = "201" +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"oj" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"EU" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/crew_quarters) -"EW" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/research{ - name = "Research Lab"; - req_access_txt = "201" - }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"EX" = ( -/obj/structure/table, -/obj/item/folder/white, -/obj/item/pen, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/research) -"EY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/public/glass{ - name = "Dormitories" +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Fa" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "awaydorm1"; - name = "Dorm 1" +"ol" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Fb" = ( -/obj/structure/chair/office/light{ - dir = 1; - pixel_y = 3 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Fc" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Unfiltered to Mix" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/structure/sign/warning/nosmoking{ - pixel_x = 32 +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Fi" = ( -/obj/structure/table/wood, -/obj/item/newspaper, -/turf/open/floor/carpet/grimy, -/area/awaymission/undergroundoutpost45/central) -"Fj" = ( +/area/awaymission/undergroundoutpost45/crew_quarters) +"om" = ( /obj/structure/cable{ icon_state = "4-8" }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Fk" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" +"on" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/item/clothing/under/misc/pj, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/mining) -"Fl" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Fo" = ( +"op" = ( +/obj/machinery/door/firedoor, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/airalarm/all_access{ - pixel_y = 23; - dir = 1 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 +/obj/machinery/door/airlock/public/glass{ + name = "Dormitories" }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Fp" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Fs" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +"oq" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plating{ - burnt = 1 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/central) -"Fu" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plating{ - burnt = 1 - }, -/area/awaymission/undergroundoutpost45/central) -"Fy" = ( -/obj/machinery/seed_extractor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"Fz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"FB" = ( -/obj/structure/table, -/obj/item/stack/package_wrap, -/obj/item/reagent_containers/glass/rag, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"FC" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"FD" = ( -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/crew_quarters) -"FE" = ( +"or" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"FF" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"FG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/area/awaymission/undergroundoutpost45/crew_quarters) +"os" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/engineering) +"ot" = ( +/obj/structure/cable, +/obj/machinery/power/smes{ + charge = 1.5e+006; + input_level = 10000; + inputting = 0; + output_level = 7000 + }, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"FI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/area/awaymission/undergroundoutpost45/engineering) +"ou" = ( +/obj/structure/cable, +/obj/machinery/power/smes{ + charge = 1.5e+006; + input_level = 30000; + inputting = 0; + output_level = 7000 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"FK" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/engineering) +"ov" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/engineering) +"ow" = ( +/obj/machinery/light/small{ dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"FL" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, +/area/awaymission/undergroundoutpost45/crew_quarters) +"ox" = ( +/obj/structure/filingcabinet/chestdrawer, /turf/open/floor/iron/cafeteria{ dir = 5 }, /area/awaymission/undergroundoutpost45/research) -"FO" = ( -/obj/machinery/firealarm{ +"oy" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/button/door{ + desc = "A remote control-switch which locks the research division down in the event of a biohazard leak or contamination."; + id = "UO45_biohazard"; + name = "Biohazard Door Control"; + pixel_y = 8; + req_access_txt = "201" + }, +/obj/machinery/button/door{ + desc = "A remote control-switch that controls the Privacy Shutters."; + id = "UO45_rdprivacy"; + name = "Privacy Shutter Control"; + pixel_y = -2; + req_access_txt = "201" + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/awaymission/undergroundoutpost45/research) +"oz" = ( +/obj/structure/chair/office/light{ dir = 1; - pixel_y = -24 + pixel_y = 3 }, -/obj/machinery/camera/directional/south{ - c_tag = "Research Division East"; - network = list("uo45","uo45r") +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/awaymission/undergroundoutpost45/research) +"oA" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/awaymission/undergroundoutpost45/research) +"oB" = ( +/obj/machinery/computer/aifixer{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/awaymission/undergroundoutpost45/research) +"oD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/research) +"oE" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Office"; + req_access_txt = "201" }, -/obj/effect/turf_decal/tile/purple, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"FP" = ( +"oG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/button/door{ - id = "awaydorm8"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"oH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/mining) -"FQ" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/structure/disposalpipe/junction, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"FS" = ( +"oI" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"oJ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"oL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"FT" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched1" +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 }, -/area/awaymission/undergroundoutpost45/mining) -"FU" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"FV" = ( -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"FW" = ( -/obj/structure/cable{ - icon_state = "2-8" +"oM" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"oO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/effect/turf_decal/stripes/corner{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/engineering) -"FX" = ( -/obj/machinery/light/small/broken{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"oP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched2" - }, -/area/awaymission/undergroundoutpost45/central) -"FY" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"oR" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating{ + broken = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"Gb" = ( -/obj/structure/table, -/obj/item/newspaper, -/obj/machinery/newscaster{ - pixel_x = 30 +/area/awaymission/undergroundoutpost45/research) +"oS" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Gc" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"Ge" = ( -/obj/machinery/light/small, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"oT" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = 23 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Gf" = ( -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Gl" = ( +"oU" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating{ - burnt = 1 +/obj/machinery/light/small{ + dir = 8 }, -/area/awaymission/undergroundoutpost45/central) -"Gm" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/engineering) +"oV" = ( +/obj/machinery/power/terminal{ dir = 1 }, -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) -"Gn" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/securearea{ - desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM"; - pixel_y = 32 +/obj/machinery/power/port_gen/pacman{ + name = "P.A.C.M.A.N.-type portable generator" + }, +/obj/structure/cable{ + icon_state = "0-4" }, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"Go" = ( +/area/awaymission/undergroundoutpost45/engineering) +"oW" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/machinery/power/port_gen/pacman/super{ + name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator" + }, +/obj/item/wrench, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/engineering) +"oX" = ( /obj/machinery/power/terminal{ dir = 1 }, @@ -4844,76 +4463,111 @@ }, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/engineering) -"Gp" = ( +"oY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/engineering) +"oZ" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/engine/air, +/area/awaymission/undergroundoutpost45/engineering) +"pa" = ( +/obj/machinery/air_sensor{ + id_tag = "UO45_air_sensor" + }, +/turf/open/floor/engine/air, +/area/awaymission/undergroundoutpost45/engineering) +"pb" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/table, -/obj/item/folder/white, -/obj/item/disk/tech_disk, -/obj/item/disk/design_disk, -/turf/open/floor/iron/white, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) -"Gq" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = -23 +"pd" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/sign/warning/deathsposal{ + desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; + name = "\improper DISPOSAL: LEADS TO EXTERIOR"; + pixel_y = -32 }, -/obj/machinery/light/small{ - dir = 8 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/structure/table, -/obj/item/radio/off, -/obj/item/laser_pointer, +/area/awaymission/undergroundoutpost45/research) +"pe" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria{ dir = 5 }, /area/awaymission/undergroundoutpost45/research) -"Gr" = ( -/turf/open/floor/plating{ - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9 +"pf" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, -/area/awaymission/undergroundoutpost45/caves) -"Gs" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"Gw" = ( -/obj/structure/sink{ - pixel_y = 25 +/turf/open/floor/iron/cafeteria{ + dir = 5 }, -/obj/effect/turf_decal/stripes/line{ +/area/awaymission/undergroundoutpost45/research) +"pg" = ( +/obj/item/storage/secure/safe{ + pixel_x = 5; + pixel_y = -27 + }, +/turf/open/floor/iron/cafeteria{ dir = 5 }, -/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"Gz" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"GC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/button/door{ - desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; - id = "UO45_biohazard"; - name = "Biohazard Door Control"; - pixel_y = -24; - req_access_txt = "201" +"pj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"pm" = ( +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"GE" = ( -/obj/machinery/biogenerator, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/crew_quarters) +"pn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating{ + broken = 1 + }, /area/awaymission/undergroundoutpost45/central) -"GG" = ( +"po" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock{ + id_tag = "awaydorm4"; + name = "Dorm 4" + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"pp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/rust, +/area/awaymission/undergroundoutpost45/crew_quarters) +"pq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock{ id_tag = "awaydorm6"; @@ -4921,1599 +4575,1287 @@ }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"GL" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" - }, -/area/awaymission/undergroundoutpost45/mining) -"GM" = ( -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 +"pr" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"GN" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -25 +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/crew_quarters) +"ps" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/crew_quarters) +"pt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"GR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/area/awaymission/undergroundoutpost45/crew_quarters) +"px" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, -/obj/machinery/door/airlock/external, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"GT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/turf/closed/wall/rust, +/area/awaymission/undergroundoutpost45/engineering) +"py" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched1" - }, -/area/awaymission/undergroundoutpost45/mining) -"GU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"GW" = ( +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/engineering) +"pz" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "1-4" }, -/obj/machinery/light/small{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/engineering) -"GZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 +"pA" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Ha" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Hb" = ( -/obj/machinery/airalarm/all_access{ - pixel_y = 23; +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Hd" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Mix to Filter" - }, -/turf/open/floor/iron, +/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/engineering) -"He" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"pB" = ( +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Hf" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/computer/atmos_control/tank{ - dir = 1; - input_tag = "UO45_n2_in"; - name = "Nitrogen Supply Control"; - output_tag = "UO45_n2_out"; - sensors = list("UO45_n2_sensor" = "Tank") +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Hg" = ( -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"Hh" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"Hi" = ( /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 1 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"Hk" = ( +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/engineering) +"pC" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/engineering) -"Hm" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/turf/open/floor/iron/cafeteria{ - dir = 5 +"pD" = ( +/obj/structure/cable{ + icon_state = "1-8" }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Hn" = ( -/obj/machinery/light/small{ +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/engineering) +"pE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos{ + icon_state = "in"; + id_tag = "UO45_air_out"; + name = "air out" }, -/area/awaymission/undergroundoutpost45/gateway) -"Ho" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 +/turf/open/floor/engine{ + initial_gas_mix = "n2=10580;o2=2644;TEMP=351.9"; + name = "air floor" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 +/area/awaymission/undergroundoutpost45/engineering) +"pF" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos{ + id = "UO45_air_in" }, -/turf/open/floor/iron/white/side{ - dir = 4 +/turf/open/floor/engine/air, +/area/awaymission/undergroundoutpost45/engineering) +"pG" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"pH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/research) +"pI" = ( +/obj/machinery/door/airlock/command{ + name = "Server Room"; + req_access_txt = "201" }, +/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/research) -"Hp" = ( +"pJ" = ( +/obj/machinery/door/airlock{ + name = "Private Restroom" + }, +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/research) +"pK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/research) +"pL" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/grille, -/turf/open/floor/plating{ - broken = 1 +/turf/closed/wall/rust, +/area/awaymission/undergroundoutpost45/research) +"pM" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Research Storage"; + req_access_txt = "201" }, -/area/awaymission/undergroundoutpost45/central) -"Hs" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"pQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/turf/open/floor/iron, +/obj/machinery/button/door{ + id = "awaydorm4"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -25; + specialfunctions = 4 + }, +/turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) -"Hu" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Hv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Hw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"pR" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, -/turf/open/floor/iron, +/turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) -"Hz" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"pS" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/crew_quarters) +"pT" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/mining) -"HB" = ( -/obj/machinery/light/small{ - dir = 4 +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"pU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/obj/machinery/button/door{ + id = "awaydorm6"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 }, +/turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) -"HC" = ( -/obj/structure/cable{ - icon_state = "2-8" +"pV" = ( +/obj/machinery/light/small{ + dir = 1 }, -/obj/structure/disposalpipe/segment{ - dir = 10 +/obj/structure/toilet{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"HE" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/crew_quarters) +"pW" = ( +/obj/machinery/door/airlock{ + name = "Unit 1" }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/crew_quarters) +"pX" = ( +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/crew_quarters) +"pY" = ( +/obj/structure/mirror{ + pixel_x = 28 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"HF" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Bar"; - network = list("uo45") +/obj/structure/sink{ + dir = 4; + pixel_x = 11 }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, /area/awaymission/undergroundoutpost45/crew_quarters) -"HG" = ( +"qb" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/engineering) +"qc" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/door/airlock/engineering/glass{ + name = "SMES Room"; + req_access_txt = "201" }, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/engineering) -"HK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/machinery/newscaster{ - pixel_x = -30 +"qd" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/meter{ + name = "Mixed Air Tank Out" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/engineering) +"qe" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/meter{ + name = "Mixed Air Tank In" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"HL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/engineering) +"qg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall/rust, +/area/awaymission/undergroundoutpost45/research) +"qh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 4; + external_pressure_bound = 120; + name = "server vent" }, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 +/turf/open/floor/circuit/telecomms/server, +/area/awaymission/undergroundoutpost45/research) +"qi" = ( +/obj/machinery/atmospherics/pipe/simple{ + dir = 10 }, -/obj/machinery/light/small{ - dir = 8 +/turf/open/floor/iron/dark{ + initial_gas_mix = "n2=500,TEMP=80"; + name = "Server Walkway" }, -/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"HN" = ( +"qj" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 1 +/obj/structure/sign/warning/securearea{ + desc = "A warning sign which reads 'SERVER ROOM'."; + name = "SERVER ROOM"; + pixel_y = 32 }, -/obj/machinery/meter, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"HP" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - broken = 1 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"HR" = ( +/area/awaymission/undergroundoutpost45/research) +"qk" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, +/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/research) -"HT" = ( -/obj/structure/window/reinforced, +"ql" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on, /turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"HV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/sign/warning/securearea{ - pixel_x = 32 +/area/awaymission/undergroundoutpost45/research) +"qm" = ( +/obj/machinery/light/small, +/obj/structure/sink{ + dir = 8; + pixel_x = -11 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 4 +/obj/structure/mirror{ + pixel_x = -28 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"HW" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/research) +"qn" = ( +/obj/structure/toilet{ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/freezer, /area/awaymission/undergroundoutpost45/research) -"HX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, +"qo" = ( +/obj/structure/table, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/clothing/glasses/hud/health, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"HY" = ( -/obj/machinery/door/firedoor, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"HZ" = ( -/obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_y = -32 +/turf/open/floor/iron/white/corner, +/area/awaymission/undergroundoutpost45/research) +"qp" = ( +/obj/structure/table, +/obj/machinery/airalarm/all_access{ + pixel_y = 23; + dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Ib" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/hand_labeler, +/obj/item/clothing/neck/stethoscope, +/turf/open/floor/iron/white/side, +/area/awaymission/undergroundoutpost45/research) +"qq" = ( +/obj/machinery/vending/medical{ + req_access_txt = "201" + }, +/turf/open/floor/iron/white/side{ + dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"Id" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 +"qr" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/side{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/area/awaymission/undergroundoutpost45/research) +"qs" = ( +/obj/structure/chair/wood/normal, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"qt" = ( +/obj/machinery/light/small{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Ie" = ( /obj/machinery/airalarm/all_access{ - pixel_y = 23; - dir = 1 + dir = 4; + pixel_x = 23 }, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"qu" = ( /obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 + dir = 8 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"Ig" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, +/obj/structure/dresser, +/turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) -"Ih" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"qv" = ( +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = 23 }, -/turf/open/floor/plating{ - burnt = 1 +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"qw" = ( +/obj/machinery/light/small{ + dir = 8 }, -/area/awaymission/undergroundoutpost45/central) -"Ii" = ( -/obj/structure/mirror{ - pixel_x = 28 +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = -23 }, +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/crew_quarters) +"qx" = ( /obj/structure/sink{ dir = 4; pixel_x = 11 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/freezer, /area/awaymission/undergroundoutpost45/crew_quarters) -"Ij" = ( -/obj/machinery/door/airlock{ - name = "Private Restroom" - }, -/turf/open/floor/iron/freezer, +"qy" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/crew_quarters) +"qC" = ( +/obj/machinery/vending/cola, +/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/engineering) -"Im" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/sign/warning/securearea{ - pixel_x = -32 +"qD" = ( +/obj/structure/chair, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/engineering) +"qG" = ( +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"In" = ( -/obj/structure/chair/fancy/comfy{ - dir = 8 +/area/awaymission/undergroundoutpost45/engineering) +"qH" = ( +/obj/structure/cable{ + icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ +/obj/machinery/atmospherics/pipe/simple/supply/visible{ dir = 4 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Io" = ( -/obj/machinery/door/poddoor{ - id = "UO45_Elevator" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Ip" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"Ir" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Is" = ( -/obj/machinery/light/small{ +"qJ" = ( +/obj/machinery/light{ dir = 1 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics"; + network = list("uo45") }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Iw" = ( /obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/item/radio/off, -/obj/item/screwdriver{ - pixel_y = 10 +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 5 }, -/obj/structure/sign/poster/official/safety_report{ - pixel_y = -32 +/obj/machinery/firealarm{ + pixel_y = 24 }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 +/obj/item/multitool, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Iz" = ( -/obj/machinery/computer/atmos_control/tank{ - dir = 8; - input_tag = "UO45_mix_in"; - name = "Gas Mix Tank Control"; - output_tag = "UO45_mix_in"; - sensors = list("UO45_mix_sensor" = "Tank") +/area/awaymission/undergroundoutpost45/engineering) +"qL" = ( +/obj/machinery/atmospherics/components/trinary/mixer/airmix{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 6 +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/turf/open/floor/iron/cafeteria, +/area/awaymission/undergroundoutpost45/engineering) +"qM" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"IA" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/securearea{ - desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM"; - pixel_y = -32 +"qN" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"qO" = ( +/obj/structure/cable{ + icon_state = "1-2" }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) -"IB" = ( -/obj/machinery/airalarm/all_access{ - pixel_y = 23; - dir = 1 - }, +"qP" = ( /obj/machinery/light/small{ - dir = 1 + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/machinery/airalarm/server{ + dir = 4; + pixel_x = -22 }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/machinery/rnd/server{ + req_access = null }, -/turf/open/floor/iron/white, +/turf/open/floor/circuit/telecomms/server, /area/awaymission/undergroundoutpost45/research) -"ID" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"qQ" = ( +/obj/machinery/atmospherics/pipe/manifold{ + dir = 8 + }, +/turf/open/floor/iron/dark{ + initial_gas_mix = "n2=500,TEMP=80"; + name = "Server Walkway" }, -/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"IE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 5 +"qR" = ( +/obj/machinery/atmospherics/pipe/simple{ + dir = 4 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"IH" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Foyer"; +/obj/machinery/door/airlock/command/glass{ + name = "Server Room"; req_access_txt = "201" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"II" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"IJ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/research) +"qS" = ( +/obj/machinery/atmospherics/pipe/simple{ dir = 4 }, -/obj/machinery/door/airlock{ - id_tag = "awaydorm8"; - name = "Mining Dorm 1" - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"IK" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"IL" = ( +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/research) +"qT" = ( /obj/machinery/light/small{ dir = 4 }, -/obj/structure/table/glass, -/obj/item/reagent_containers/glass/beaker/large{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 8; - pixel_y = 2 +/obj/machinery/atmospherics/pipe/simple{ + dir = 9 }, -/obj/item/reagent_containers/dropper, -/turf/open/floor/iron/white/side{ +/obj/structure/chair/office/light, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/research) +"qU" = ( +/obj/machinery/light/small{ dir = 8 }, -/area/awaymission/undergroundoutpost45/research) -"IM" = ( -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/gateway) -"IN" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) -"IP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/side{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 +/area/awaymission/undergroundoutpost45/research) +"qV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"IR" = ( -/obj/structure/table, -/obj/machinery/computer/security/telescreen{ - desc = "Used for monitoring the research division and the labs within."; - dir = 8; - name = "research monitor"; - network = list("uo45r") +"qW" = ( +/obj/machinery/light/small{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, +/turf/open/floor/iron/white/side{ + dir = 8 + }, /area/awaymission/undergroundoutpost45/research) -"IS" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"IT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +"qY" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster{ + pixel_y = -28 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"IU" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/gateway) -"IV" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/gibs/down, -/obj/effect/mob_spawn/human, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/obj/item/pen, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"qZ" = ( +/obj/structure/chair/wood/normal{ + dir = 8 }, -/area/awaymission/undergroundoutpost45/caves) -"IW" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/crew_quarters) +"ra" = ( +/obj/machinery/light/small{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/structure/toilet{ dir = 4 }, -/obj/machinery/door/airlock/maintenance{ - name = "Research Maintenance"; - req_access_txt = "201" - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"IX" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/crew_quarters) +"rb" = ( +/obj/machinery/door/airlock{ + name = "Unit 2" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/crew_quarters) +"rc" = ( +/obj/structure/mirror{ + pixel_x = 28 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/sink{ + dir = 4; + pixel_x = 11 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/crew_quarters) +"rd" = ( +/obj/structure/disposalpipe/segment, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"IY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/area/awaymission/undergroundoutpost45/crew_quarters) +"re" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"IZ" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/structure/sign/warning/deathsposal{ - desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"Ja" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) -"Jb" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"Jd" = ( +"rf" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "2-4" +/obj/machinery/light/small{ + dir = 4 }, -/obj/machinery/airalarm/all_access{ - pixel_y = 23; - dir = 1 +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"rg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/crew_quarters) +"rh" = ( +/obj/machinery/light/small{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 }, -/obj/machinery/camera/directional/north{ - c_tag = "Gateway Ready Room"; - network = list("uo45","uo45r") +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched1" }, +/area/awaymission/undergroundoutpost45/engineering) +"ri" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"Je" = ( +/area/awaymission/undergroundoutpost45/engineering) +"rj" = ( +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"rm" = ( +/turf/open/floor/plating{ + broken = 1 + }, +/area/awaymission/undergroundoutpost45/central) +"ro" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/engineering) +"rp" = ( +/obj/structure/cable{ + icon_state = "0-4" }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 +/obj/machinery/power/apc/highcap/fifteen_k{ + dir = 8; + name = "UO45 Engineering APC"; + pixel_x = -25; + req_access_txt = "201"; + start_charge = 100 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Jf" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 +/area/awaymission/undergroundoutpost45/engineering) +"rq" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/visible, +/obj/machinery/meter/atmos{ + id_tag = "UO45_distro_meter"; + name = "Distribution Loop" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Jg" = ( -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/structure/closet/secure_closet/freezer{ +/area/awaymission/undergroundoutpost45/engineering) +"rs" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ locked = 0; - name = "meat fridge"; req_access_txt = "201" }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Jh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/item/clothing/under/misc/pj, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/mining) +"rt" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"Jk" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/awaymission/undergroundoutpost45/engineering) +"ru" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Jl" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "Mix to Exterior" }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Jn" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 +"rv" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Jo" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +"rw" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"rx" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Jp" = ( -/obj/structure/window/reinforced, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"Jq" = ( -/obj/machinery/gateway{ - dir = 4 +"rz" = ( +/obj/machinery/atmospherics/pipe/simple{ + dir = 9 }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"Jx" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 +/turf/open/floor/iron/dark{ + initial_gas_mix = "n2=500,TEMP=80"; + name = "Server Walkway" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Jy" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/awaymission/undergroundoutpost45/research) +"rA" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/securearea{ + desc = "A warning sign which reads 'SERVER ROOM'."; + name = "SERVER ROOM"; + pixel_y = -32 }, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"rB" = ( +/obj/structure/table, +/obj/item/folder/white, +/obj/item/pen, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/research) +"rC" = ( +/obj/machinery/computer/rdservercontrol{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/research) +"rE" = ( /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 6 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 + dir = 6 }, -/obj/machinery/door/airlock/maintenance, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) -"Jz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +"rF" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"JB" = ( -/obj/machinery/light/small/broken{ - dir = 8 - }, -/turf/open/floor/plating{ - broken = 1 - }, -/area/awaymission/undergroundoutpost45/central) -"JC" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/obj/structure/sign/poster/official/safety_internals{ - pixel_x = -32 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"JE" = ( -/obj/structure/closet/secure_closet{ - icon_state = "hydro"; - locked = 0; - name = "botanist's locker"; +/obj/machinery/door/airlock/maintenance{ + name = "Research Maintenance"; req_access_txt = "201" }, -/obj/item/clothing/suit/apron, -/obj/item/storage/bag/plants/portaseeder, -/obj/item/clothing/mask/bandana, -/obj/item/cultivator, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"JF" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "UO45_rdprivacy"; - name = "Privacy Shutters" - }, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) -"JG" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/tile/blue{ +"rG" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/iron/white/side{ dir = 4 }, -/turf/open/floor/iron/white/corner{ - dir = 1 +/area/awaymission/undergroundoutpost45/research) +"rH" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 }, -/area/awaymission/undergroundoutpost45/engineering) -"JJ" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"JK" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"JL" = ( -/obj/machinery/light/small{ - dir = 4 +"rI" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, /obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"rJ" = ( +/obj/structure/table, +/obj/item/storage/box/gloves, /turf/open/floor/iron/white/side{ dir = 8 }, /area/awaymission/undergroundoutpost45/research) -"JM" = ( -/obj/structure/chair{ +"rL" = ( +/obj/machinery/door/airlock{ + name = "Unisex Showers" + }, +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/crew_quarters) +"rN" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, -/turf/open/floor/plating{ - broken = 1 +/obj/machinery/camera/directional/west{ + c_tag = "Engineering Hallway"; + network = list("uo45") }, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"JN" = ( +"rO" = ( /obj/structure/cable{ - icon_state = "0-4" + icon_state = "1-4" }, -/obj/machinery/computer/monitor/secret{ - name = "primary power monitoring console" +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -32 +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"JP" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, +/area/awaymission/undergroundoutpost45/crew_quarters) +"rP" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"JQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plating{ - broken = 1 +"rQ" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/undergroundoutpost45/central) -"JS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/effect/turf_decal/tile/yellow{ - dir = 8 + dir = 1 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"JT" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"JU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"rR" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"JV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "awaydorm4"; - name = "Dorm 4" +/obj/effect/turf_decal/tile/yellow{ + dir = 1 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"JZ" = ( -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"Kb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 +"rS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Kc" = ( -/obj/machinery/computer/mech_bay_power_console{ +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"rT" = ( /obj/structure/cable{ - icon_state = "0-4" + icon_state = "4-8" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"Kg" = ( -/obj/structure/closet/firecloset, -/obj/machinery/light/small, -/obj/structure/sign/warning/securearea{ - pixel_y = -32 +/obj/machinery/airalarm/all_access{ + pixel_y = 23; + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"Ki" = ( -/obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/airlock/public/glass{ - name = "Hydroponics"; - req_access_txt = "201" - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Kj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Kk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 + dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Kl" = ( -/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"rU" = ( /obj/structure/cable{ icon_state = "4-8" }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/airlock/command{ - name = "Gateway EVA"; - req_access_txt = "201" +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"Kn" = ( -/obj/structure/table, -/obj/item/reagent_containers/spray/plantbgone{ - pixel_x = 13; - pixel_y = 5 - }, -/obj/item/reagent_containers/spray/plantbgone{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/reagent_containers/spray/plantbgone{ - pixel_y = 3 - }, -/obj/item/watertank, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"Ko" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Ks" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/button/door{ - desc = "A remote control-switch which locks the research division down in the event of a biohazard leak or contamination."; - id = "UO45_biohazard"; - name = "Biohazard Door Control"; - pixel_y = 8; - req_access_txt = "201" - }, -/obj/machinery/button/door{ - desc = "A remote control-switch that controls the Privacy Shutters."; - id = "UO45_rdprivacy"; - name = "Privacy Shutter Control"; - pixel_y = -2; - req_access_txt = "201" - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/area/awaymission/undergroundoutpost45/crew_quarters) +"rX" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/undergroundoutpost45/research) -"Kt" = ( /obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 + dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"Kv" = ( -/obj/machinery/hydroponics/constructable, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"Kx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/grille, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Ky" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/noticeboard{ - dir = 1; - pixel_y = -27 +/obj/machinery/door/airlock/engineering/glass{ + name = "Engineering Reception" }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Kz" = ( -/obj/structure/alien/resin/membrane, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" - }, -/area/awaymission/undergroundoutpost45/caves) -"KB" = ( -/obj/machinery/light/small{ - dir = 8 +"rY" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/dresser, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"KC" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"KD" = ( +"rZ" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "4-8" }, /obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - broken = 1 - }, -/area/awaymission/undergroundoutpost45/research) -"KE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/circuit/telecomms/server, -/area/awaymission/undergroundoutpost45/research) -"KF" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/command{ - name = "Research Director's Office"; - req_access_txt = "201" - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/undergroundoutpost45/research) -"KG" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"KH" = ( +/area/awaymission/undergroundoutpost45/engineering) +"sa" = ( /obj/structure/cable{ - icon_state = "0-4" + icon_state = "2-8" }, -/obj/machinery/power/apc/highcap/fifteen_k{ - dir = 8; - name = "UO45 Engineering APC"; - pixel_x = -25; - req_access_txt = "201"; - start_charge = 100 +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"KK" = ( +"sc" = ( +/obj/structure/table/reinforced, /obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/airlock/engineering{ - name = "Engineering Foyer"; +/obj/machinery/door/poddoor/shutters/preopen{ + id = "UO45_EngineeringOffice"; + name = "Privacy Shutters" + }, +/obj/machinery/door/window/southleft{ + dir = 4; + name = "Engineering Reception"; req_access_txt = "201" }, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"KM" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/drinks/beer, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"KN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 +"se" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/visible, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"KP" = ( -/obj/structure/sink/kitchen{ - pixel_y = 28 +"sg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/undergroundoutpost45/crew_quarters) -"KR" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/door/poddoor/preopen{ + id = "UO45_Engineering"; + name = "engineering Security Door" }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/engineering) +"sh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ dir = 4 }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"KS" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" - }, -/area/awaymission/undergroundoutpost45/mining) -"KT" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"KU" = ( -/obj/machinery/light/small{ - dir = 1 +/area/awaymission/undergroundoutpost45/engineering) +"si" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 }, -/obj/structure/chair/wood/normal{ - dir = 8 +/obj/structure/closet/secure_closet/personal/cabinet{ + locked = 0; + req_access_txt = "201" }, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/mining) -"KV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, +"sj" = ( +/obj/structure/cable, +/obj/machinery/power/apc/highcap/fifteen_k{ + locked = 0; + name = "UO45 Mining APC"; + pixel_y = -23; + start_charge = 100 + }, +/obj/machinery/light/small, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/chair{ - dir = 8 +/obj/structure/closet/secure_closet/engineering_personal{ + icon_state = "mining"; + locked = 0; + name = "miner's equipment"; + req_access = null; + req_access_txt = "201" }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"KW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/item/storage/backpack/satchel/eng, +/obj/item/clothing/gloves/fingerless, +/obj/effect/turf_decal/tile/brown, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"KY" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"KZ" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 3 +"sk" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Mix to Distro" }, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Lb" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/awaymission/undergroundoutpost45/engineering) +"sl" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"Lc" = ( -/obj/structure/disposalpipe/segment{ +/area/awaymission/undergroundoutpost45/engineering) +"sm" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"sn" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/glass/bucket, -/obj/effect/turf_decal/tile/green/half/contrasted{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"so" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Ld" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/awaymission/undergroundoutpost45/engineering) +"sq" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 }, -/obj/machinery/light, -/obj/structure/disposalpipe/junction{ - dir = 8 +/obj/machinery/meter, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/engineering) +"sr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 8; + id_tag = "UO45_mix_in"; + name = "distro out" }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 +/turf/open/floor/engine/vacuum, +/area/awaymission/undergroundoutpost45/engineering) +"ss" = ( +/obj/machinery/light/small{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, +/turf/open/floor/engine/vacuum, +/area/awaymission/undergroundoutpost45/engineering) +"st" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) -"Le" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "UO45_mining"; - name = "mining conveyor" +"su" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"sv" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"Lf" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/sign/warning/deathsposal{ + desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; + name = "\improper DISPOSAL: LEADS TO EXTERIOR"; + pixel_y = -32 }, -/obj/structure/disposalpipe/segment{ +/turf/open/floor/iron/white/corner{ dir = 4 }, -/obj/machinery/light/small{ +/area/awaymission/undergroundoutpost45/research) +"sw" = ( +/obj/structure/closet/l3closet, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/iron/white/side{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/research) +"sx" = ( +/obj/structure/closet/l3closet, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/side{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 +/area/awaymission/undergroundoutpost45/research) +"sy" = ( +/obj/structure/table, +/obj/item/storage/firstaid/toxin{ + pixel_x = 2; + pixel_y = 6 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Lh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 +/obj/item/storage/firstaid/toxin{ + pixel_x = -2; + pixel_y = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"Lj" = ( -/obj/structure/cable{ - icon_state = "1-8" +/turf/open/floor/iron/white/side{ + dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Ll" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 +/area/awaymission/undergroundoutpost45/research) +"sz" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular{ + pixel_x = 2; + pixel_y = 6 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Lm" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/mineral/plasma{ - amount = 26 +/turf/open/floor/iron/white/corner{ + dir = 1 }, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 +/area/awaymission/undergroundoutpost45/research) +"sA" = ( +/obj/machinery/shower{ + dir = 4 }, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 +/obj/item/soap/nanotrasen, +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/crew_quarters) +"sB" = ( +/obj/machinery/light/small{ + dir = 1 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"Lo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"Lp" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/crew_quarters) +"sC" = ( +/obj/machinery/shower{ dir = 8 }, +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/crew_quarters) +"sD" = ( /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"Lq" = ( +/area/awaymission/undergroundoutpost45/crew_quarters) +"sE" = ( +/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Lr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +"sF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Lt" = ( -/obj/structure/cable{ - icon_state = "1-2" +"sG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Lu" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/drinks/drinkingglass, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Lv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - broken = 1 - }, -/area/awaymission/undergroundoutpost45/central) -"Lw" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Lx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"LC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"LD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/research{ - name = "Gateway Observation"; - req_access_txt = "201" - }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"LG" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ +"sH" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/components/binary/pump/on{ +/obj/machinery/firealarm{ dir = 1; - name = "Mix to Exterior" + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"LK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"LM" = ( -/obj/structure/cable, -/obj/machinery/power/apc/highcap/fifteen_k{ - locked = 0; - name = "UO45 Gateway APC"; - pixel_y = -23; - start_charge = 100 - }, -/obj/machinery/light/small, -/obj/structure/rack, -/obj/item/clothing/shoes/magboots, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"LN" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/engineering{ - name = "Engineering"; - req_access_txt = "201" +"sI" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"LO" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, /area/awaymission/undergroundoutpost45/crew_quarters) -"LP" = ( -/obj/item/clothing/under/suit/navy, -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" +"sL" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"LR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/chair, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/machinery/door/airlock/engineering/glass{ + name = "Engineering Reception" }, -/area/awaymission/undergroundoutpost45/research) -"LU" = ( -/obj/machinery/vending/cola, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Mc" = ( -/turf/open/floor/iron{ - dir = 8; - icon_state = "damaged3" - }, -/area/awaymission/undergroundoutpost45/central) -"Md" = ( -/obj/structure/chair{ +/area/awaymission/undergroundoutpost45/engineering) +"sM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Me" = ( /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"Mg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/area/awaymission/undergroundoutpost45/engineering) +"sN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Mh" = ( +/area/awaymission/undergroundoutpost45/engineering) +"sP" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -6533,597 +5875,668 @@ /obj/item/folder/red, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Mj" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"sR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "201" +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"sT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"Mk" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Kitchen Maintenance"; - req_access_txt = "201" +/obj/machinery/door/poddoor/preopen{ + id = "UO45_Engineering"; + name = "engineering Security Door" }, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Mm" = ( +/area/awaymission/undergroundoutpost45/engineering) +"sU" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Waste In" + }, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_y = -32 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"sV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Mo" = ( -/obj/structure/closet/crate, -/obj/item/storage/box/lights/mixed, -/obj/item/poster/random_contraband, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - burnt = 1 +/area/awaymission/undergroundoutpost45/engineering) +"sW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/research) -"Mp" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"sX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"sY" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Mix to Filter" }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Mq" = ( +"sZ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"ta" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"tb" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"td" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/meter, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/engineering) -"Mr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"te" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos{ + dir = 8; + id = "UO45_mix_in" + }, +/turf/open/floor/engine/vacuum, +/area/awaymission/undergroundoutpost45/engineering) +"tf" = ( +/obj/machinery/air_sensor{ + id_tag = "UO45_mix_sensor" + }, +/turf/open/floor/engine/vacuum, +/area/awaymission/undergroundoutpost45/engineering) +"tg" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/structure/closet, -/obj/item/poster/random_contraband, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Ms" = ( +/area/awaymission/undergroundoutpost45/research) +"th" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, /obj/structure/disposalpipe/segment{ - dir = 6 + dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Mt" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"tj" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/meter, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"Mu" = ( +/area/awaymission/undergroundoutpost45/research) +"tk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"tm" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) -"Mv" = ( +"tn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"My" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - burnt = 1 + dir = 4 }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Mz" = ( -/obj/machinery/door/airlock/command{ - name = "Server Room"; - req_access_txt = "201" +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/research) +"to" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/floor/iron/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, /area/awaymission/undergroundoutpost45/research) -"MA" = ( +"tp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/sign/warning/electricshock{ - pixel_y = -32 +/turf/closed/wall/r_wall/rust, +/area/awaymission/undergroundoutpost45/research) +"tq" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 }, -/obj/machinery/vending/engivend, -/obj/machinery/camera/directional/south{ - c_tag = "Engineering Foyer"; - network = list("uo45") +/turf/closed/wall/r_wall/rust, +/area/awaymission/undergroundoutpost45/research) +"tr" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"MD" = ( +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 + dir = 9 }, -/obj/machinery/vending/tool, -/obj/structure/sign/poster/official/build{ - pixel_y = -32 +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"ts" = ( +/obj/machinery/shower{ + dir = 4 }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched2" +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/crew_quarters) +"tt" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/engineering) -"MG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"tu" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"tv" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/awaymission/undergroundoutpost45/engineering) +"tw" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/awaymission/undergroundoutpost45/engineering) +"tx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + burnt = 1 }, +/area/awaymission/undergroundoutpost45/central) +"tA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"MH" = ( +"tC" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"MK" = ( -/obj/structure/cable{ - icon_state = "4-8" + dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"MN" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"tD" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/item/pen, -/obj/machinery/door/window/southleft{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Security Checkpoint"; - req_access_txt = "201" +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"MO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/engineering) +"tE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"tF" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 }, -/obj/machinery/door/airlock{ - id_tag = "awaydorm9"; - name = "Mining Dorm 2" +/obj/machinery/meter/atmos{ + id_tag = "UO45_waste_meter"; + name = "Waste Loop" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"MP" = ( -/obj/machinery/door/airlock/security{ - name = "Security Checkpoint"; - req_access_txt = "201" +/area/awaymission/undergroundoutpost45/engineering) +"tG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"MR" = ( -/obj/machinery/light/small{ - dir = 1 +/area/awaymission/undergroundoutpost45/engineering) +"tH" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "N2 Outlet Pump" }, -/obj/machinery/airalarm/all_access{ - pixel_y = 23; - dir = 1 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"tI" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "O2 Outlet Pump" }, -/obj/structure/chair/wood/normal{ - dir = 8 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"tJ" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "Unfiltered to Mix" }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"MV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/portable_atmospherics/scrubber, -/obj/structure/window{ - dir = 4 +/obj/structure/sign/warning/nosmoking{ + pixel_x = 32 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"tK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/rust, /area/awaymission/undergroundoutpost45/research) -"MW" = ( -/obj/structure/table, -/obj/item/storage/firstaid/toxin{ - pixel_x = 2; - pixel_y = 6 +"tL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/item/storage/firstaid/toxin{ - pixel_x = -2; - pixel_y = 4 +/obj/machinery/door/airlock/engineering{ + name = "Engineering Maintenance"; + req_access_txt = "201" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"tM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/research) +"tN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, +/turf/closed/wall/rust, /area/awaymission/undergroundoutpost45/research) -"MX" = ( +"tO" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-4" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"MY" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"MZ" = ( -/obj/machinery/light/small, -/obj/machinery/computer/atmos_alert{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/machinery/button/door{ - desc = "A remote control-switch for the engineering security doors."; - id = "UO45_Engineering"; - name = "Engineering Lockdown"; - pixel_x = -6; - pixel_y = -24; - req_access_txt = "201" +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"tP" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/button/door{ - desc = "A remote control-switch for secure storage."; - id = "UO45_Secure Storage"; - name = "Engineering Secure Storage"; - pixel_x = 6; - pixel_y = -24; - req_access_txt = "201" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Na" = ( -/turf/open/floor/plating{ - broken = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/central) -"Nb" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"tQ" = ( +/obj/machinery/light/small, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/obj/structure/sign/warning/deathsposal{ - desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 +/area/awaymission/undergroundoutpost45/gateway) +"tR" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/iron/white/corner{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/area/awaymission/undergroundoutpost45/research) -"Ne" = ( -/obj/item/storage/belt/security, -/obj/item/assembly/flash/handheld, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet{ - icon_state = "sec"; - name = "security officer's locker"; - req_access_txt = "201" +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"tU" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Ng" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Nh" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, +/area/awaymission/undergroundoutpost45/research) +"tV" = ( /obj/structure/cable{ - icon_state = "2-8" + icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 +/obj/structure/disposalpipe/segment{ + dir = 9 }, -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/engineering) -"Ni" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/item/stack/rods, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"tW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/research) +"tX" = ( +/obj/machinery/shower{ + dir = 1 + }, +/turf/open/floor/iron/freezer, /area/awaymission/undergroundoutpost45/crew_quarters) -"Nl" = ( -/obj/structure/chair{ - dir = 4 +"tY" = ( +/obj/machinery/shower{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, +/obj/item/bikehorn/rubberducky, +/turf/open/floor/iron/freezer, /area/awaymission/undergroundoutpost45/crew_quarters) -"Nm" = ( +"tZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Nn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, +"ua" = ( /obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"No" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 + icon_state = "1-2" }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/purple{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/brown{ dir = 4 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"Np" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/button/door{ - id = "awaydorm6"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 25; - specialfunctions = 4 - }, -/turf/open/floor/carpet, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Nq" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/research) -"Nr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/chair/wood/normal, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) -"Ns" = ( +"uc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/engineering) +"ud" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/engineering) +"ue" = ( +/obj/machinery/door/firedoor, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "2-4" +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/engineering{ + name = "Engineering Foyer"; + req_access_txt = "201" }, -/obj/structure/disposalpipe/segment{ - dir = 10 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"uh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating{ + broken = 1 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/area/awaymission/undergroundoutpost45/central) +"ui" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 }, +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Nu" = ( +"uj" = ( /obj/structure/cable{ - icon_state = "0-4" + icon_state = "1-2" }, -/obj/machinery/power/apc/highcap/fifteen_k{ +/obj/machinery/atmospherics/components/binary/pump/on{ dir = 1; - locked = 0; - name = "UO45 Bar APC"; - pixel_y = 23; - start_charge = 100 + name = "External to Filter" }, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Nv" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 +/area/awaymission/undergroundoutpost45/engineering) +"uk" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Air to External" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Nw" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/structure/rack, -/obj/item/clothing/shoes/magboots, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"Nx" = ( -/obj/machinery/light{ - dir = 4 +/area/awaymission/undergroundoutpost45/engineering) +"ul" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 }, /obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 + dir = 1; + pixel_y = -23 }, -/obj/effect/turf_decal/tile/green/half/contrasted, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"NB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/area/awaymission/undergroundoutpost45/engineering) +"uo" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"NC" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"ND" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/engineering) +"ur" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 9 }, -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "201" +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched2" }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"NE" = ( -/obj/structure/tank_dispenser/oxygen, -/obj/effect/decal/cleanable/dirt, +/area/awaymission/undergroundoutpost45/engineering) +"us" = ( +/obj/structure/closet/firecloset, /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 9 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"NF" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"ut" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 }, /obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/engineering) -"NI" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/gateway) -"NK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"NL" = ( -/obj/structure/sink/kitchen{ - pixel_y = 28 +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"uu" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 }, -/turf/open/floor/iron/cafeteria{ +/obj/structure/table/reinforced, +/obj/item/wrench, +/obj/effect/turf_decal/stripes/line{ dir = 5 }, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"uv" = ( +/turf/closed/mineral/random/labormineral, +/area/awaymission/undergroundoutpost45/research) +"uw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"ux" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/research) +"uz" = ( +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/crew_quarters) -"NN" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, +"uB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"NO" = ( +/area/awaymission/undergroundoutpost45/engineering) +"uC" = ( /obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 + icon_state = "1-2" }, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 + dir = 8 }, -/obj/item/stack/rods, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"NP" = ( +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"uD" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"uE" = ( +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/engineering) +"uF" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Office"; + req_access_txt = "201" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"uG" = ( /obj/structure/cable{ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/door/airlock/engineering/glass{ - name = "SMES Room"; +/obj/machinery/door/airlock/engineering{ + name = "Engineering"; req_access_txt = "201" }, -/turf/open/floor/iron/dark, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"uH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/closed/wall/r_wall, /area/awaymission/undergroundoutpost45/engineering) -"NR" = ( +"uI" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/gateway) -"NS" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 1 }, -/obj/machinery/portable_atmospherics/scrubber, +/obj/machinery/meter, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"NU" = ( -/obj/structure/chair{ +/area/awaymission/undergroundoutpost45/engineering) +"uJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/engineering) +"uK" = ( +/obj/machinery/light/small{ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"NV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"NW" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"uL" = ( +/obj/machinery/atmospherics/components/binary/valve, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"uM" = ( +/obj/machinery/atmospherics/components/binary/valve, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"NX" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"uP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"uR" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/crew_quarters) -"NZ" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +"uT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 1 }, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Oa" = ( +"uU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/computer/atmos_control{ dir = 4; @@ -7137,816 +6550,791 @@ dir = 1 }, /area/awaymission/undergroundoutpost45/engineering) -"Ob" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Oc" = ( +"uV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"uW" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/structure/disposalpipe/segment{ +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"uX" = ( +/obj/machinery/light{ dir = 1 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/airalarm/all_access{ + pixel_y = 23; dir = 1 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Od" = ( -/obj/machinery/gateway{ - dir = 6 +/area/awaymission/undergroundoutpost45/engineering) +"uY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"Oe" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 5 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = -23 +/area/awaymission/undergroundoutpost45/caves) +"uZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/turf/closed/wall, /area/awaymission/undergroundoutpost45/engineering) -"Of" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"va" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "UO45_Engineering"; + name = "engineering Security Door" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/table, -/obj/item/book/manual/chef_recipes, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"vb" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Oh" = ( -/obj/machinery/vending/cola, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"Oj" = ( -/obj/structure/disposalpipe/segment{ +/obj/machinery/door/poddoor/preopen{ + id = "UO45_Engineering"; + name = "engineering Security Door" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"vc" = ( +/obj/machinery/door/firedoor, +/obj/structure/sign/warning/securearea{ + pixel_y = 32 }, -/area/awaymission/undergroundoutpost45/research) -"Ol" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/machinery/door/poddoor/preopen{ + id = "UO45_Engineering"; + name = "engineering Security Door" }, -/obj/machinery/button/door{ - id = "awaydorm4"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_x = -25; - specialfunctions = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"vd" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos{ + dir = 1; + id = "UO45_n2_in" }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Om" = ( -/obj/structure/table, -/obj/item/folder/white, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"Oo" = ( -/obj/structure/cable{ - icon_state = "1-4" +/turf/open/floor/engine/n2, +/area/awaymission/undergroundoutpost45/engineering) +"ve" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos{ + dir = 1; + id_tag = "UO45_n2_out"; + name = "nitrogen out" }, -/obj/structure/disposalpipe/segment{ - dir = 5 +/turf/open/floor/engine/n2, +/area/awaymission/undergroundoutpost45/engineering) +"vf" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos{ + dir = 1; + id = "UO45_o2_in" }, -/turf/open/floor/plating{ - broken = 1 +/turf/open/floor/engine/o2, +/area/awaymission/undergroundoutpost45/engineering) +"vg" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos{ + dir = 1; + id_tag = "UO45_o2_out"; + name = "oxygen out" }, -/area/awaymission/undergroundoutpost45/central) -"Oq" = ( -/obj/machinery/firealarm{ - pixel_y = 24 +/turf/open/floor/engine/o2, +/area/awaymission/undergroundoutpost45/engineering) +"vh" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/turf/open/floor/iron/white, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) -"Or" = ( -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Os" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 +"vi" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 }, -/obj/machinery/light/small, -/obj/structure/mirror{ - pixel_x = 28 +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"vj" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 }, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/engineering) -"Ot" = ( -/obj/structure/chair{ - dir = 8 +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"vk" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/research) +"vm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/crew_quarters) -"Ow" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"vn" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/stack/rods, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/crew_quarters) +"vp" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/crew_quarters) +"vq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating{ broken = 1 }, /area/awaymission/undergroundoutpost45/central) -"Oz" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = -23 - }, +"vs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/filingcabinet, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small{ +/obj/machinery/computer/atmos_alert{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/turf/open/floor/iron/dark/corner{ dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"OA" = ( +/area/awaymission/undergroundoutpost45/engineering) +"vt" = ( /obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/junction/yjunction{ - dir = 2 + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"OB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - broken = 1 - }, -/area/awaymission/undergroundoutpost45/research) -"OF" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/area/awaymission/undergroundoutpost45/engineering) +"vu" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"OG" = ( /obj/structure/disposalpipe/segment{ - dir = 6 + dir = 4 }, -/obj/structure/reagent_dispensers/watertank, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green/half/contrasted{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"OH" = ( +/area/awaymission/undergroundoutpost45/engineering) +"vv" = ( /obj/structure/cable{ - icon_state = "2-8" + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" }, /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"OJ" = ( +/area/awaymission/undergroundoutpost45/engineering) +"vw" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"OK" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"OL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"OM" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/landmark/awaystart, -/obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"ON" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular, -/obj/structure/sign/warning/biohazard{ - pixel_x = -32 +/area/awaymission/undergroundoutpost45/engineering) +"vx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"OO" = ( +/area/awaymission/undergroundoutpost45/engineering) +"vz" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/engineering{ + name = "Engineering"; + req_access_txt = "201" + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"vA" = ( /obj/structure/cable{ icon_state = "4-8" }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"vB" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "1-8" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"vC" = ( +/obj/machinery/light/small{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"OP" = ( -/obj/machinery/door/poddoor{ - id = "UO45_Secure Storage"; - name = "secure Storage" +"vD" = ( +/obj/machinery/air_sensor{ + id_tag = "UO45_n2_sensor" }, -/turf/open/floor/plating, +/obj/machinery/light/small, +/turf/open/floor/engine/n2, /area/awaymission/undergroundoutpost45/engineering) -"OQ" = ( -/obj/structure/chair/fancy/comfy{ - dir = 1 +"vE" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/engine/n2, +/area/awaymission/undergroundoutpost45/engineering) +"vF" = ( +/obj/machinery/air_sensor{ + id_tag = "UO45_o2_sensor" }, -/turf/open/floor/carpet/grimy, -/area/awaymission/undergroundoutpost45/central) -"OR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +/obj/machinery/light/small, +/turf/open/floor/engine/o2, +/area/awaymission/undergroundoutpost45/engineering) +"vG" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/engine/o2, +/area/awaymission/undergroundoutpost45/engineering) +"vI" = ( +/turf/closed/wall/r_wall/rust, +/area/awaymission/undergroundoutpost45/mining) +"vJ" = ( +/turf/closed/wall/r_wall, +/area/awaymission/undergroundoutpost45/mining) +"vK" = ( +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/mining) +"vL" = ( +/turf/closed/wall/rust, +/area/awaymission/undergroundoutpost45/mining) +"vM" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Mining Maintenance"; + req_access_txt = "201" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/mining) -"OS" = ( -/obj/structure/alien/weeds, -/obj/structure/glowshroom/single, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +"vN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Foyer"; + req_access_txt = "201" }, -/area/awaymission/undergroundoutpost45/caves) -"OT" = ( +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"vO" = ( +/obj/machinery/door/firedoor, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Foyer"; + req_access_txt = "201" }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"OU" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 +/area/awaymission/undergroundoutpost45/mining) +"vP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 }, -/obj/item/pen, -/obj/machinery/newscaster{ - pixel_x = -30 +/obj/machinery/computer/station_alert{ + dir = 4 }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"OV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/turf/open/floor/iron/checker, +/area/awaymission/undergroundoutpost45/engineering) +"vQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/light{ - dir = 8 +/obj/structure/noticeboard{ + dir = 1; + pixel_y = -27 }, -/obj/machinery/camera/directional/west{ - c_tag = "Mining"; - network = list("uo45") +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"vR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"OW" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/rods/fifty, -/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/engineering) -"OY" = ( -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Pa" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Waste In" +"vS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"vT" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Pb" = ( -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/central) -"Pc" = ( +"vU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 + dir = 4 + }, +/obj/structure/sign/warning/electricshock{ + pixel_y = -32 + }, +/obj/machinery/vending/engivend, +/obj/machinery/camera/directional/south{ + c_tag = "Engineering Foyer"; + network = list("uo45") }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Pd" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Pe" = ( +/area/awaymission/undergroundoutpost45/engineering) +"vV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"Pf" = ( -/obj/structure/chair/wood/normal, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Pg" = ( -/obj/machinery/vending/cola, -/turf/open/floor/iron/dark, +/obj/machinery/vending/tool, +/obj/structure/sign/poster/official/build{ + pixel_y = -32 + }, +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched2" + }, /area/awaymission/undergroundoutpost45/engineering) -"Ph" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +"vX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/engineering) +"vY" = ( +/obj/structure/closet/emcloset, +/obj/item/clothing/mask/breath, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"Pi" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Pj" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Pk" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Pl" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/folder/red, -/obj/machinery/door/window/southleft{ - dir = 8; - name = "Security Checkpoint"; - req_access_txt = "201" - }, +/obj/effect/turf_decal/bot, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Pm" = ( -/obj/structure/closet/secure_closet{ - icon_state = "hydro"; - locked = 0; - name = "botanist's locker"; - req_access_txt = "201" - }, -/obj/item/storage/bag/plants/portaseeder, -/obj/item/plant_analyzer, -/obj/item/clothing/mask/bandana, -/obj/item/hatchet, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"Pp" = ( +/area/awaymission/undergroundoutpost45/engineering) +"vZ" = ( +/obj/structure/closet/firecloset, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Pq" = ( -/obj/machinery/shower{ - dir = 8 +"wa" = ( +/obj/structure/closet/firecloset, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 }, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Pr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"wb" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/mining) +"wc" = ( +/obj/machinery/light/small{ + dir = 1 }, -/obj/structure/window/reinforced{ +/obj/structure/chair/wood/normal{ dir = 8 }, -/obj/item/storage/backpack/satchel/eng, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/mask/gas, -/obj/item/clothing/glasses/meson, -/obj/structure/closet/secure_closet/engineering_personal{ - locked = 0; - req_access_txt = "201" +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/mining) +"wd" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/mining) +"we" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Ps" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/airlock/mining{ - name = "Processing Area"; - req_access_txt = "201" +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/mining) +"wf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched1" }, -/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"Pu" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 +"wg" = ( +/obj/machinery/light/small{ + dir = 1 }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Pw" = ( +/obj/item/kirbyplants, +/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Py" = ( -/obj/structure/cable{ - icon_state = "1-4" +/area/awaymission/undergroundoutpost45/mining) +"wh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"PB" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"PC" = ( +/area/awaymission/undergroundoutpost45/mining) +"wi" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/brown{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"PH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"PI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/computer/atmos_control{ - dir = 4; - name = "Tank Monitor"; - sensors = list("UO45_n2_sensor" = "Nitrogen", "UO45_o2_sensor" = "Oxygen", "UO45_mix_sensor" = "Gas Mix Tank") +/area/awaymission/undergroundoutpost45/mining) +"wk" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "0-4" }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/engineering) +"wl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" }, -/turf/open/floor/iron/dark/corner{ - dir = 1 +/obj/structure/cable{ + icon_state = "0-8" }, +/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/engineering) -"PJ" = ( -/obj/machinery/rnd/production/circuit_imprinter, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"PK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +"wn" = ( +/turf/closed/wall/rust, +/area/awaymission/undergroundoutpost45/engineering) +"wp" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/mining) +"wq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"PL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 +/obj/machinery/button/door{ + id = "awaydorm8"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"PM" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/mining) +"wr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, +/obj/machinery/door/airlock{ + id_tag = "awaydorm8"; + name = "Mining Dorm 1" + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"ws" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"PN" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "External to Filter" +/area/awaymission/undergroundoutpost45/mining) +"wt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"PO" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"PP" = ( -/obj/machinery/conveyor{ - id = "UO45_mining" - }, -/obj/effect/turf_decal/stripes/line{ +/area/awaymission/undergroundoutpost45/mining) +"wu" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"PR" = ( -/obj/machinery/door/firedoor, +"wv" = ( /obj/structure/cable{ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Foyer"; - req_access_txt = "201" - }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"PS" = ( -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"PU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - burnt = 1 - }, -/area/awaymission/undergroundoutpost45/central) -"PV" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"PW" = ( -/obj/machinery/light/small{ - dir = 1 +"ww" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/mining) +"wB" = ( +/obj/structure/toilet{ + pixel_y = 8 }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/engineering) +"wC" = ( /obj/machinery/airalarm/all_access{ - pixel_y = 23; - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) -"PZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 + dir = 4; + pixel_x = -23 }, -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"wD" = ( +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/open/floor/carpet, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"Qc" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +"wE" = ( +/obj/structure/cable{ + icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Qd" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 +/area/awaymission/undergroundoutpost45/mining) +"wF" = ( +/obj/structure/cable{ + icon_state = "1-8" }, -/turf/open/floor/plating{ - broken = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" }, -/area/awaymission/undergroundoutpost45/research) -"Qe" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"wI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 }, -/obj/structure/sign/warning/securearea{ - pixel_y = -32 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Qg" = ( +/area/awaymission/undergroundoutpost45/caves) +"wK" = ( /obj/machinery/door/airlock{ - name = "Unit 2" + name = "Private Restroom" }, /turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/central) -"Qh" = ( -/obj/item/kirbyplants, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Qi" = ( -/obj/structure/chair/office{ - dir = 4 +/area/awaymission/undergroundoutpost45/engineering) +"wL" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Qj" = ( -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/machinery/light/small, +/obj/structure/mirror{ + pixel_x = 28 }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Qk" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Research Storage"; - req_access_txt = "201" +/turf/open/floor/iron/freezer, +/area/awaymission/undergroundoutpost45/engineering) +"wM" = ( +/obj/structure/chair/wood/normal, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/mining) +"wN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"Qm" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 +/obj/machinery/button/door{ + id = "awaydorm9"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = 25; + specialfunctions = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Qn" = ( -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Qo" = ( -/obj/structure/table, -/obj/item/trash/chips, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_y = 32 +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/mining) +"wO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock{ + id_tag = "awaydorm9"; + name = "Mining Dorm 2" }, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Qr" = ( +/area/awaymission/undergroundoutpost45/mining) +"wP" = ( /obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/junction/flip{ - dir = 4 + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - broken = 1 - }, -/area/awaymission/undergroundoutpost45/research) -"Qs" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/iron/white/side, -/area/awaymission/undergroundoutpost45/research) -"Qt" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/public/glass{ - name = "Diner" - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Qu" = ( -/obj/machinery/vending/boozeomat, -/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Qv" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "O2 Outlet Pump" +/area/awaymission/undergroundoutpost45/mining) +"wQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Qw" = ( +/area/awaymission/undergroundoutpost45/mining) +"wU" = ( /obj/structure/chair/fancy/comfy{ - dir = 8 + dir = 1 }, /turf/open/floor/carpet/grimy, /area/awaymission/undergroundoutpost45/central) -"Qx" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +"wV" = ( +/obj/machinery/light/small, +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/carpet, +/area/awaymission/undergroundoutpost45/mining) +"wX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"Qy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"QA" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Central Access" +/obj/structure/closet/secure_closet/miner{ + req_access = null; + req_access_txt = "201" }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"QE" = ( -/obj/machinery/light/small, +/area/awaymission/undergroundoutpost45/mining) +"wZ" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood/gibs/down, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; + temperature = 363.9; name = "Cave Floor" }, -/area/awaymission/undergroundoutpost45/research) -"QF" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = -23 +/area/awaymission/undergroundoutpost45/caves) +"xb" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/light{ - dir = 8 +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating{ + burnt = 1 + }, +/area/awaymission/undergroundoutpost45/research) +"xg" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/mining{ + name = "Processing Area"; + req_access_txt = "201" }, -/obj/item/radio/off, -/obj/item/screwdriver{ - pixel_y = 10 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/mining{ + name = "Processing Area"; + req_access_txt = "201" }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"QI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/area/awaymission/undergroundoutpost45/mining) +"xl" = ( +/obj/machinery/conveyor{ + id = "UO45_mining" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"QM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/mining) +"xm" = ( /obj/machinery/mineral/unloading_machine{ dir = 1; icon_state = "unloader-corner"; @@ -7958,935 +7346,1164 @@ }, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/mining) -"QN" = ( -/obj/structure/table, -/turf/open/floor/iron/cafeteria{ - dir = 5 +"xn" = ( +/obj/effect/turf_decal/loading_area{ + dir = 8 }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"QP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = 23 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xq" = ( +/obj/machinery/conveyor{ + id = "UO45_mining" + }, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -32 + }, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/mining) +"xr" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/mining) +"xs" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "UO45_mining"; + name = "mining conveyor" + }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"QQ" = ( +/area/awaymission/undergroundoutpost45/mining) +"xt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light/small{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xu" = ( +/obj/machinery/suit_storage_unit/mining, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"QS" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/soda_cans/cola, -/turf/open/floor/carpet/grimy, -/area/awaymission/undergroundoutpost45/central) -"QT" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xv" = ( +/obj/structure/table, +/obj/item/pickaxe, +/obj/item/radio/off, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/engineering) -"QW" = ( -/obj/effect/spawner/structure/window, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xw" = ( +/obj/machinery/mineral/processing_unit{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"QX" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +/area/awaymission/undergroundoutpost45/mining) +"xx" = ( +/obj/machinery/mineral/processing_unit_console{ + machinedir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/turf/closed/wall/rust, +/area/awaymission/undergroundoutpost45/mining) +"xy" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Mining"; + network = list("uo45") + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xz" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"Rb" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"Rc" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"Rd" = ( +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xA" = ( +/obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/mining) +"xB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Rf" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 1 +/area/awaymission/undergroundoutpost45/mining) +"xC" = ( +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xD" = ( +/obj/machinery/light/small{ + dir = 4 }, -/obj/structure/window/reinforced{ - dir = 8 +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 }, -/obj/item/folder/white, -/obj/item/stamp/research_director{ - pixel_x = 3; - pixel_y = -2 +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched2" }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/area/awaymission/undergroundoutpost45/mining) +"xE" = ( +/obj/machinery/conveyor{ + id = "UO45_mining" }, -/area/awaymission/undergroundoutpost45/research) -"Rg" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass{ - amount = 16; - pixel_x = 3; - pixel_y = 3 +/obj/machinery/light/small{ + dir = 8 }, -/obj/item/stack/sheet/iron{ - amount = 23 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/iron/white/side, -/area/awaymission/undergroundoutpost45/research) -"Rh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/external, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"Rj" = ( -/obj/structure/table, -/obj/machinery/recharger, +/area/awaymission/undergroundoutpost45/mining) +"xF" = ( +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"Rm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Rn" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 +/area/awaymission/undergroundoutpost45/mining) +"xG" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"Rq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-4" }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"Rr" = ( -/obj/machinery/light/small, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/obj/machinery/door/airlock/mining/glass{ + name = "Mining EVA"; + req_access_txt = "201" }, -/area/awaymission/undergroundoutpost45/gateway) -"Ru" = ( /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 1 + icon_state = "4-8" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Rx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/junction, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/area/awaymission/undergroundoutpost45/mining) +"xJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Rz" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "4-8" + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-8" }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xL" = ( +/obj/structure/tank_dispenser/oxygen, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"RA" = ( -/obj/structure/chair/wood/normal, -/turf/open/floor/carpet, +"xM" = ( +/obj/machinery/mineral/stacking_unit_console{ + machinedir = 2 + }, +/turf/closed/wall, /area/awaymission/undergroundoutpost45/mining) -"RB" = ( -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"RD" = ( -/obj/machinery/light/small{ +"xN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xP" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/closet/crate, +/obj/item/stack/sheet/iron{ + amount = 26 + }, +/obj/item/stack/sheet/glass{ + amount = 19 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"RG" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/crew_quarters) -"RI" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/book/manual/wiki/security_space_law, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 +"xQ" = ( +/obj/machinery/computer/mech_bay_power_console{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-4" }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"RJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/chair{ - dir = 8 +/area/awaymission/undergroundoutpost45/mining) +"xR" = ( +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/nosmoking{ - pixel_x = 32 +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/mech_bay_recharge_floor, +/area/awaymission/undergroundoutpost45/mining) +"xS" = ( +/obj/machinery/mech_bay_recharge_port{ + dir = 8 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"RK" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-8" }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating{ - burnt = 1 +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/mining) +"xT" = ( +/obj/machinery/mineral/stacking_machine{ + dir = 1; + input_dir = 8; + output_dir = 4 }, -/area/awaymission/undergroundoutpost45/research) -"RL" = ( -/obj/machinery/light/small, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"RM" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/obj/item/flashlight, -/obj/item/flashlight, -/obj/item/flashlight, -/obj/effect/turf_decal/stripes/corner{ +/turf/open/floor/plating, +/area/awaymission/undergroundoutpost45/mining) +"xU" = ( +/obj/effect/turf_decal/loading_area{ dir = 4 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"RN" = ( -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 }, -/obj/structure/disposalpipe/segment, +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/plasma{ + amount = 6 + }, +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched1" + }, +/area/awaymission/undergroundoutpost45/mining) +"xX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/maintenance{ - name = "Research Maintenance"; +/obj/machinery/door/airlock/external{ + name = "Mining External Airlock"; req_access_txt = "201" }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"xY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"RO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "awaydorm9"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 - }, -/turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/mining) -"RQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible{ - dir = 4 +"xZ" = ( +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = -23 }, +/obj/structure/closet/emcloset, /obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"ya" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"RR" = ( -/obj/structure/cable{ - icon_state = "1-2" +/area/awaymission/undergroundoutpost45/mining) +"yb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 +/turf/open/floor/iron{ + dir = 8; + icon_state = "floorscorched1" }, +/area/awaymission/undergroundoutpost45/mining) +"yc" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"yd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/mining) -"RS" = ( +"ye" = ( /obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = -23 + dir = 4 }, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/crew_quarters) -"RT" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"yf" = ( +/obj/machinery/door/airlock/external{ + name = "Mining External Airlock"; + req_access_txt = "201" + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"yv" = ( +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" + }, +/area/awaymission/undergroundoutpost45/caves) +"yG" = ( +/obj/structure/closet/emcloset, +/obj/item/clothing/mask/breath, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/turf/open/floor/plating{ + broken = 1 + }, /area/awaymission/undergroundoutpost45/research) -"RU" = ( -/obj/machinery/light{ - dir = 1 +"yP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 }, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics"; - network = list("uo45") +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"za" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/structure/table, -/obj/item/clothing/gloves/color/yellow, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 5 +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"ze" = ( +/obj/structure/closet/secure_closet{ + icon_state = "hydro"; + locked = 0; + name = "botanist's locker"; + req_access_txt = "201" + }, +/obj/item/clothing/suit/apron, +/obj/item/storage/bag/plants/portaseeder, +/obj/item/clothing/mask/bandana, +/obj/item/cultivator, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"zf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/obj/machinery/firealarm{ - pixel_y = 24 +/area/awaymission/undergroundoutpost45/caves) +"zi" = ( +/turf/open/space, +/area/space/nearstation) +"zm" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/effect/mob_spawn/human, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/obj/item/multitool, -/obj/effect/turf_decal/tile/yellow{ +/area/awaymission/undergroundoutpost45/caves) +"zq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"RY" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/airalarm/all_access{ - pixel_y = 23; - dir = 1 +"zt" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/structure/chair/wood/normal{ +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) -"RZ" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for monitoring the research division and the labs within."; - name = "research monitor"; - network = list("uo45r") - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"zw" = ( +/obj/machinery/light/small{ + dir = 8 }, -/area/awaymission/undergroundoutpost45/research) -"Sb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, /area/awaymission/undergroundoutpost45/research) -"Sc" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, +"zB" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/barman_recipes, +/obj/item/reagent_containers/food/drinks/shaker, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Sf" = ( -/obj/structure/table/reinforced, -/obj/item/folder/yellow, +"zE" = ( /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Sl" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ - dir = 4 +"zR" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 }, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 + dir = 4 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"So" = ( -/obj/machinery/button/door{ - id = "awaydorm7"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Sr" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "4-8" +/area/awaymission/undergroundoutpost45/research) +"Aa" = ( +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/engineering) -"St" = ( -/obj/machinery/conveyor{ - id = "UO45_mining" +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Aj" = ( +/obj/structure/chair{ + dir = 4 }, -/obj/machinery/light/small{ +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Ap" = ( +/obj/structure/table, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/book/manual/wiki/security_space_law, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"At" = ( +/obj/structure/chair/fancy/comfy{ dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/mining) -"Su" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/landmark/awaystart, +/turf/open/floor/carpet/grimy, +/area/awaymission/undergroundoutpost45/central) +"AA" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 + dir = 8 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"Sv" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Sx" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"AG" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/item/stack/rods, -/turf/open/floor/plating, +/obj/structure/table, +/obj/item/book/manual/wiki/security_space_law, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"AL" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"AO" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/soda_cans/cola, +/turf/open/floor/carpet/grimy, /area/awaymission/undergroundoutpost45/central) -"SA" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/window/reinforced{ +"AR" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/obj/structure/table/reinforced, -/obj/item/taperecorder{ - pixel_x = -3 - }, -/obj/item/paicard{ - pixel_x = 4 +/obj/machinery/button/door{ + desc = "A remote control-switch for the engineering security doors."; + id = "UO45_Engineering"; + name = "Engineering Lockdown"; + pixel_x = 24; + pixel_y = 6; + req_access_txt = "201" }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/item/clothing/suit/armor/vest, +/obj/item/clothing/head/helmet, +/obj/structure/closet/secure_closet{ + icon_state = "sec"; + name = "security officer's locker"; + req_access_txt = "201" }, -/area/awaymission/undergroundoutpost45/research) -"SB" = ( -/obj/structure/chair{ +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"AX" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"SC" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/clothing/glasses/meson{ - pixel_y = 4 +/obj/item/screwdriver{ + pixel_y = 10 }, -/obj/item/stamp/chief_engineer, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/item/radio/off, +/obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"SD" = ( -/obj/machinery/mineral/processing_unit{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +"Bv" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"BA" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/mining) -"SE" = ( -/obj/structure/table/reinforced, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) +"BB" = ( +/obj/structure/table, /obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 + pixel_x = 1; + pixel_y = 9 }, /obj/item/pen, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"SF" = ( +/area/awaymission/undergroundoutpost45/research) +"BE" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/light/small{ - dir = 1 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"SG" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A beacon used by a teleporter."; - icon = 'icons/obj/device.dmi'; - icon_state = "beacon"; - name = "tracking beacon" +"BO" = ( +/obj/structure/chair{ + dir = 8 }, -/obj/effect/landmark/awaystart, -/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"SI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/crew_quarters) +"BP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"SJ" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched2" +"BR" = ( +/obj/machinery/computer/security{ + dir = 1; + network = list("uo45") }, -/area/awaymission/undergroundoutpost45/mining) -"SM" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"SN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/central) +"Ca" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, -/obj/machinery/button/door{ - id = "awaydorm3"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 +/turf/open/floor/plating{ + broken = 1 }, -/turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) -"SO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +"Ce" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/reagent_dispensers/fueltank, -/obj/structure/window{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plating, +/turf/open/floor/plating{ + burnt = 1 + }, +/area/awaymission/undergroundoutpost45/research) +"Cg" = ( +/obj/machinery/gateway{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"Ci" = ( +/turf/open/floor/carpet/grimy, /area/awaymission/undergroundoutpost45/central) -"SP" = ( -/obj/machinery/light/small{ - dir = 8 +"Co" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/computer/atmos_control/tank{ + input_tag = "UO45_air_in"; + name = "Mixed Air Supply Control"; + output_tag = "UO45_air_out"; + sensors = list("UO45_air_sensor" = "Tank") }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched1" +/turf/open/floor/iron/white/corner{ + dir = 1 }, /area/awaymission/undergroundoutpost45/engineering) -"SQ" = ( -/obj/structure/toilet{ - dir = 8 +"Cr" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Cs" = ( +/obj/structure/chair, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/research) -"SS" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"Cx" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 + dir = 4 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"SU" = ( -/obj/structure/table/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/matter_bin, -/turf/open/floor/iron/white/side{ - dir = 8 +"CA" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 }, -/area/awaymission/undergroundoutpost45/research) -"SV" = ( -/obj/machinery/gateway{ - dir = 10 +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"CK" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"SW" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"SZ" = ( -/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"CR" = ( +/obj/structure/alien/weeds, +/obj/effect/mob_spawn/human, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" + }, +/area/awaymission/undergroundoutpost45/caves) +"CS" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"De" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Dw" = ( /obj/structure/cable{ icon_state = "4-8" }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; +/turf/open/floor/plating{ + broken = 1 + }, +/area/awaymission/undergroundoutpost45/central) +"DF" = ( +/obj/structure/table, +/obj/item/plate, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"DJ" = ( +/obj/machinery/vending/boozeomat, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"DM" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Kitchen"; req_access_txt = "201" }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"Tb" = ( -/obj/machinery/button/door{ - desc = "A remote control-switch to call the elevator to your level."; - id = "UO45_useless"; - name = "Call Elevator"; - pixel_x = -6; - pixel_y = 24 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/button/door{ - desc = "A remote control-switch for the elevator doors."; - id = "UO45_Elevator"; - name = "Elevator Doors"; - pixel_x = 6; - pixel_y = 24 +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"DO" = ( +/obj/structure/cable{ + icon_state = "1-2" }, +/obj/structure/disposalpipe/junction, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Tc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/crew_quarters) +"DR" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + burnt = 1 + }, +/area/awaymission/undergroundoutpost45/research) +"DX" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen{ + desc = "Used for monitoring the research division and the labs within."; + dir = 8; + name = "research monitor"; + network = list("uo45r") }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"Td" = ( -/obj/structure/sink{ - pixel_y = 25 +/area/awaymission/undergroundoutpost45/research) +"Eb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/button/door{ + desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; + id = "UO45_biohazard"; + name = "Biohazard Door Control"; + pixel_y = -24; + req_access_txt = "201" }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/research) +"Ej" = ( +/obj/machinery/vending/hydroseeds{ + slogan_delay = 700 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/central) -"Te" = ( +"El" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Em" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/machinery/camera/directional/north{ - c_tag = "Dormitories"; - network = list("uo45") +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Eq" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, +/area/awaymission/undergroundoutpost45/caves) +"Ev" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Tg" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, +/area/awaymission/undergroundoutpost45/research) +"EB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "UO45_EngineeringOffice"; - name = "Privacy Shutters" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating{ + broken = 1 }, -/obj/machinery/door/window/southleft{ - dir = 4; - name = "Engineering Reception"; - req_access_txt = "201" +/area/awaymission/undergroundoutpost45/central) +"EG" = ( +/obj/machinery/light/small{ + dir = 8 }, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/obj/item/pen, +/area/awaymission/undergroundoutpost45/mining) +"EK" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Th" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/area/awaymission/undergroundoutpost45/crew_quarters) +"EL" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"Tj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"EM" = ( /obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/mob_spawn/human, +/obj/effect/decal/cleanable/blood/gibs/core, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; + temperature = 363.9; name = "Cave Floor" }, /area/awaymission/undergroundoutpost45/caves) -"Tm" = ( -/obj/structure/chair/stool, +"ET" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Tn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/area/awaymission/undergroundoutpost45/crew_quarters) +"EV" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ dir = 4 }, -/obj/structure/chair/office{ +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"EW" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/mob_spawn/human, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 +/area/awaymission/undergroundoutpost45/caves) +"Fe" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 }, +/obj/item/pen, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"To" = ( -/obj/structure/cable{ - icon_state = "4-8" +"Ff" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/grille, +/turf/open/floor/plating{ + broken = 1 + }, +/area/awaymission/undergroundoutpost45/central) +"Fm" = ( +/obj/structure/sign/warning/vacuum{ + desc = "A beacon used by a teleporter."; + icon = 'icons/obj/device.dmi'; + icon_state = "beacon"; + name = "tracking beacon" }, +/obj/effect/landmark/awaystart, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Fn" = ( +/obj/structure/table, +/obj/item/kitchen/fork, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Ft" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"Fw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Fx" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 4 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Tp" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/eastleft{ - dir = 1; - name = "Hydroponics Desk"; +/area/awaymission/undergroundoutpost45/engineering) +"FH" = ( +/obj/structure/closet/secure_closet{ + icon_state = "hydro"; + locked = 0; + name = "botanist's locker"; req_access_txt = "201" }, +/obj/item/storage/bag/plants/portaseeder, +/obj/item/plant_analyzer, +/obj/item/clothing/mask/bandana, +/obj/item/hatchet, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Tq" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"Tr" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/awaymission/undergroundoutpost45/research) -"Ts" = ( -/obj/structure/toilet{ - dir = 1 +/area/awaymission/undergroundoutpost45/central) +"FM" = ( +/obj/machinery/gateway{ + dir = 4 }, -/obj/machinery/light/small{ - dir = 8 +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"FN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"FR" = ( +/turf/open/floor/plating{ + burnt = 1 + }, /area/awaymission/undergroundoutpost45/central) -"Tt" = ( -/obj/structure/cable{ - icon_state = "1-2" +"FX" = ( +/obj/effect/decal/cleanable/blood/gibs/limb, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/obj/machinery/light/small{ - dir = 4 +/area/awaymission/undergroundoutpost45/caves) +"FZ" = ( +/obj/structure/table/reinforced, +/obj/item/storage/fancy/cigarettes{ + pixel_x = -2 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/item/lighter{ + pixel_x = 4 }, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Tu" = ( -/obj/structure/disposalpipe/junction/flip{ +"Ga" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"Gd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/green/half/contrasted{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Tv" = ( -/obj/structure/table, -/obj/item/pickaxe, -/obj/item/radio/off, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"Tx" = ( -/obj/item/kirbyplants, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ +/obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Tz" = ( -/obj/machinery/atmospherics/components/binary/valve, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"TA" = ( -/obj/machinery/light/small{ +/area/awaymission/undergroundoutpost45/crew_quarters) +"Gg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"TC" = ( -/obj/machinery/light/small{ - dir = 1 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"Gh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/item/restraints/handcuffs, +/obj/item/assembly/flash/handheld, +/obj/item/reagent_containers/peppercloud_deployer, +/obj/structure/closet/secure_closet{ + icon_state = "sec"; + name = "security officer's locker"; + req_access_txt = "201" }, -/obj/structure/toilet{ +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/research) +"Gi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"TD" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron{ - amount = 26 +"Gj" = ( +/obj/structure/table, +/obj/item/reagent_containers/spray/plantbgone{ + pixel_x = 13; + pixel_y = 5 }, -/obj/item/stack/sheet/glass{ - amount = 19 +/obj/item/reagent_containers/spray/plantbgone{ + pixel_x = 8; + pixel_y = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"TG" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 +/obj/item/reagent_containers/spray/plantbgone{ + pixel_y = 3 }, -/turf/open/floor/iron, +/obj/item/watertank, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/central) -"TH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +"Gt" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light/small{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/airalarm/all_access{ + dir = 1; + pixel_y = -23 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"TK" = ( -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched1" +/area/awaymission/undergroundoutpost45/crew_quarters) +"Gy" = ( +/obj/structure/chair{ + dir = 8 }, -/area/awaymission/undergroundoutpost45/gateway) -"TL" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"GB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"TN" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/mining) -"TO" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/mining) -"TR" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = 30 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 4 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"TU" = ( +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"GF" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -8899,531 +8516,651 @@ }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"TV" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/gibs/core, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +"GH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/caves) -"TW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"TX" = ( -/obj/machinery/light{ - dir = 8 +/turf/open/floor/plating{ + burnt = 1 }, -/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"Uc" = ( -/obj/structure/cable{ - icon_state = "4-8" +"GO" = ( +/obj/machinery/computer/security{ + dir = 1; + network = list("uo45") }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/button/door{ + desc = "A remote control-switch for the security Privacy Shutters."; + id = "UO45_EngineeringOffice"; + name = "Privacy Shutters"; + pixel_x = -24; + pixel_y = 6; + req_access_txt = "201" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"Ue" = ( -/obj/structure/table/reinforced, -/obj/item/lighter, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Uh" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Ui" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +"GS" = ( +/obj/item/storage/belt/security, +/obj/item/assembly/flash/handheld, /obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet{ + icon_state = "sec"; + name = "security officer's locker"; + req_access_txt = "201" + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Uj" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/area/awaymission/undergroundoutpost45/central) +"GV" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating{ + burnt = 1 }, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Hc" = ( +/obj/structure/table, +/obj/item/stack/package_wrap, +/obj/item/reagent_containers/glass/rag, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Uk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"Hj" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/clothing/glasses/meson{ + pixel_y = 4 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/item/stamp/chief_engineer, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"Hl" = ( +/obj/item/food/meat/slab/monkey, +/obj/item/food/meat/slab/monkey, +/obj/item/food/meat/slab/monkey, +/obj/item/food/meat/slab/monkey, +/obj/structure/closet/secure_closet/freezer{ + locked = 0; + name = "meat fridge"; + req_access_txt = "201" + }, +/turf/open/floor/iron/showroomfloor, /area/awaymission/undergroundoutpost45/crew_quarters) -"Ul" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, +"Hp" = ( +/obj/structure/glowshroom/single, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; + temperature = 351.9; name = "Cave Floor" }, /area/awaymission/undergroundoutpost45/caves) -"Um" = ( -/obj/structure/closet/crate/hydroponics, -/obj/item/shovel/spade, -/obj/item/wrench, -/obj/item/screwdriver, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"Up" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/airalarm/all_access{ - pixel_y = 23; - dir = 1 - }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Uq" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster{ - pixel_x = -30 +"Hq" = ( +/obj/machinery/gateway{ + dir = 10 }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Ut" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"Hr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Uu" = ( -/obj/machinery/computer/aifixer{ +/area/awaymission/undergroundoutpost45/central) +"Hy" = ( +/obj/structure/chair/fancy/comfy{ dir = 8 }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/grimy, +/area/awaymission/undergroundoutpost45/central) +"HD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/research) -"Uv" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/structure/window/reinforced{ + dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"Uz" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 10 +/obj/structure/closet/secure_closet/engineering_personal{ + req_access = null; + req_access_txt = "201" }, -/obj/structure/table/reinforced, -/obj/item/wrench, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"UA" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/gibs/down, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"HH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"HJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"HO" = ( +/obj/structure/bookcase/manuals/engineering, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"HS" = ( +/obj/structure/chair/fancy/comfy{ + dir = 8 + }, +/turf/open/floor/carpet/grimy, +/area/awaymission/undergroundoutpost45/central) +"Ic" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 }, -/area/awaymission/undergroundoutpost45/caves) -"UC" = ( -/obj/machinery/light/small{ +/obj/structure/sign/warning/deathsposal{ + desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; + name = "\improper DISPOSAL: LEADS TO EXTERIOR"; + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Il" = ( +/obj/structure/chair{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"UE" = ( -/obj/machinery/door/firedoor, +"Iu" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-8" }, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 10 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Iv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Ix" = ( +/obj/structure/chair/fancy/comfy{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 4 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"UG" = ( -/obj/machinery/door/airlock{ - name = "Kitchen Cold Room"; - req_access_txt = "201" +"Iy" = ( +/obj/machinery/light/small{ + dir = 8 }, -/turf/open/floor/iron/showroomfloor, +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = -23 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"UH" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ - dir = 4 +"IF" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Jj" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"UI" = ( +"Jm" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"UJ" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +/turf/open/floor/plating{ + burnt = 1 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/engineering) -"UK" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/machinery/button/door{ - id = "awaydorm5"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 +/area/awaymission/undergroundoutpost45/research) +"Jr" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3 }, -/obj/structure/chair/wood/normal{ - dir = 1 +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 3 }, -/turf/open/floor/carpet, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"UL" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 +"Js" = ( +/obj/structure/closet/emcloset, +/obj/item/clothing/mask/breath, +/turf/open/floor/plating{ + broken = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/central) -"UM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 +"Jt" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/sign/warning/deathsposal{ + desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; + name = "\improper DISPOSAL: LEADS TO EXTERIOR"; + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"Jw" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"JD" = ( /obj/structure/cable{ icon_state = "1-2" }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"UP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/area/awaymission/undergroundoutpost45/crew_quarters) +"JH" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"JY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-4" +/obj/structure/sign/warning/securearea{ + pixel_x = 32 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"UQ" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"UR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"US" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/brown{ - dir = 1 +"Kf" = ( +/obj/item/kirbyplants, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 }, /turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"Kl" = ( +/obj/machinery/light/small, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" + }, /area/awaymission/undergroundoutpost45/crew_quarters) -"UT" = ( -/obj/structure/cable{ - icon_state = "1-2" +"Kp" = ( +/obj/structure/table, +/obj/item/trash/chips, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = 32 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"UU" = ( -/obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_y = 32 +/area/awaymission/undergroundoutpost45/crew_quarters) +"Kr" = ( +/obj/machinery/computer/security{ + dir = 4; + network = list("uo45") + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"UV" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ +/area/awaymission/undergroundoutpost45/research) +"Kw" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"KA" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"KE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -30 +/turf/open/floor/circuit/telecomms/server, +/area/awaymission/undergroundoutpost45/research) +"KI" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"UW" = ( /obj/machinery/airalarm/all_access{ pixel_y = 23; dir = 1 }, -/obj/machinery/light{ - dir = 1 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/green/half/contrasted{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"UY" = ( +/area/awaymission/undergroundoutpost45/crew_quarters) +"KJ" = ( /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"UZ" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Va" = ( -/obj/machinery/door/airlock{ - name = "Unit 1" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/central) -"Vd" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/structure/chair, -/obj/structure/reagent_dispensers/peppertank{ - pixel_y = 30 +/turf/open/floor/plating{ + broken = 1 }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 +/area/awaymission/undergroundoutpost45/research) +"KO" = ( +/obj/structure/cable{ + icon_state = "1-8" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Vg" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/disposalpipe/segment{ + dir = 9 }, -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "201" +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + broken = 1 }, -/obj/effect/turf_decal/tile/purple{ +/area/awaymission/undergroundoutpost45/research) +"KQ" = ( +/obj/machinery/light{ dir = 4 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"Vi" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Vj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"Vk" = ( -/obj/machinery/light/small, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = -23 - }, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/central) -"Vl" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 +"KW" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/obj/machinery/firealarm{ - pixel_y = 24 +/area/awaymission/undergroundoutpost45/caves) +"La" = ( +/obj/structure/cable{ + icon_state = "4-8" }, +/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 + dir = 8 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"Vm" = ( +"Ld" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" + }, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Le" = ( /obj/machinery/light/small{ dir = 1 }, -/obj/structure/table, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = -8 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = -8 +/area/awaymission/undergroundoutpost45/mining) +"Lg" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/item/clothing/mask/breath{ - pixel_x = 4 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/item/clothing/mask/breath{ - pixel_x = 4 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 }, -/obj/machinery/newscaster{ - pixel_y = 32 +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Li" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/extinguisher_cabinet{ + pixel_y = -28 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Vp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/area/awaymission/undergroundoutpost45/crew_quarters) +"Lk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/airlock/engineering{ - name = "Engineering Maintenance"; - req_access_txt = "201" +/turf/open/floor/plating{ + burnt = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"Vq" = ( -/obj/structure/disposalpipe/segment{ +/area/awaymission/undergroundoutpost45/central) +"Ln" = ( +/obj/structure/chair{ dir = 4 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Ls" = ( +/obj/structure/table, +/obj/item/book/manual/hydroponics_pod_people, +/obj/item/paper/guides/jobs/hydroponics, +/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"Ly" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/drinks/drinkingglass, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Vr" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Lz" = ( +/obj/structure/chair/stool, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"LA" = ( +/obj/structure/chair{ + dir = 8 + }, /turf/open/floor/plating{ broken = 1 }, +/area/awaymission/undergroundoutpost45/crew_quarters) +"LD" = ( +/obj/structure/closet/crate, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" + }, +/area/awaymission/undergroundoutpost45/caves) +"LF" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet/grimy, /area/awaymission/undergroundoutpost45/central) -"Vs" = ( -/obj/machinery/rnd/destructive_analyzer, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"LH" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"Vv" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Vw" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Vx" = ( -/obj/effect/turf_decal/loading_area{ - dir = 8 +"LJ" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"Vy" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/area/awaymission/undergroundoutpost45/crew_quarters) +"LS" = ( +/obj/machinery/gateway, +/obj/structure/cable{ + icon_state = "0-2" }, -/obj/machinery/button/door{ - id = "awaydorm1"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"LW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/carpet, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"VA" = ( -/obj/machinery/light/small{ - dir = 1 +"LY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plating/asteroid{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; - name = "Cave Floor" +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"LZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Ma" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/research) -"VC" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Mb" = ( +/obj/structure/table/reinforced, +/obj/item/folder/yellow, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"VD" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 +"Mf" = ( +/obj/structure/filingcabinet, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 }, -/obj/structure/rack, -/obj/item/tank/jetpack/carbondioxide, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/research) +"MC" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"VE" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/carpet/grimy, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/sink{ + pixel_y = 25 + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"VF" = ( +"ME" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/extinguisher_cabinet{ + pixel_y = -28 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating{ - broken = 1 +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 }, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"VH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"MJ" = ( +/obj/structure/chair/office/light{ + dir = 1; + pixel_y = 3 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"VL" = ( +/area/awaymission/undergroundoutpost45/engineering) +"MM" = ( +/obj/machinery/door/firedoor, /obj/structure/cable{ icon_state = "4-8" }, @@ -9433,46 +9170,78 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"VM" = ( -/obj/machinery/light{ - dir = 8 +"MQ" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"MS" = ( +/obj/structure/chair/fancy/comfy, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"MT" = ( +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = -23 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/filingcabinet, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"VP" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 +/obj/machinery/light/small{ + dir = 8 }, -/obj/machinery/camera/directional/south{ - c_tag = "Central Hallway"; - network = list("uo45") +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"VQ" = ( -/obj/structure/disposalpipe/segment, +"MU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/glass/bucket, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Nc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"VS" = ( +"Nd" = ( /obj/structure/cable{ - icon_state = "1-8" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 5 +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating{ + burnt = 1 }, +/area/awaymission/undergroundoutpost45/research) +"Nj" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"VV" = ( +/area/awaymission/undergroundoutpost45/central) +"Nk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Nt" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -9482,242 +9251,312 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"VW" = ( +"NA" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 4 + }, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" + }, +/area/awaymission/undergroundoutpost45/caves) +"NC" = ( /obj/machinery/light/small{ dir = 1 }, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; + temperature = 363.9; name = "Cave Floor" }, /area/awaymission/undergroundoutpost45/central) -"VY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Hydroponics"; +"NG" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/door/airlock/command/glass{ + name = "Chief Engineer"; req_access_txt = "201" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"VZ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/area/awaymission/undergroundoutpost45/engineering) +"NH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/table, +/obj/item/storage/box, +/obj/item/storage/box, +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = 30 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"NQ" = ( +/obj/machinery/light/small{ dir = 1 }, -/obj/machinery/newscaster{ - pixel_y = -28 +/obj/structure/table, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = -8 }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = -8 + }, +/obj/item/clothing/mask/breath{ + pixel_x = 4 + }, +/obj/item/clothing/mask/breath{ + pixel_x = 4 + }, +/obj/machinery/newscaster{ + pixel_y = 32 }, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"NY" = ( +/obj/machinery/light/small, +/obj/machinery/computer/atmos_alert{ + dir = 1 + }, +/obj/machinery/button/door{ + desc = "A remote control-switch for the engineering security doors."; + id = "UO45_Engineering"; + name = "Engineering Lockdown"; + pixel_x = -6; + pixel_y = -24; + req_access_txt = "201" + }, +/obj/machinery/button/door{ + desc = "A remote control-switch for secure storage."; + id = "UO45_Secure Storage"; + name = "Engineering Secure Storage"; + pixel_x = 6; + pixel_y = -24; + req_access_txt = "201" + }, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Wa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +"Ox" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"OC" = ( +/obj/structure/chair/office{ dir = 4 }, -/turf/open/floor/plating{ - burnt = 1 - }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"Wc" = ( +"OE" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-4" }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"OX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Wd" = ( -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/mining) -"Wf" = ( -/obj/machinery/portable_atmospherics/scrubber, +/area/awaymission/undergroundoutpost45/crew_quarters) +"OZ" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Pj" = ( /turf/open/floor/plating{ - burnt = 1 + icon_plating = "asteroidplating"; + icon_state = "asteroidplating"; + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9 }, -/area/awaymission/undergroundoutpost45/gateway) -"Wg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 +/area/awaymission/undergroundoutpost45/caves) +"Pn" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Wh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Wi" = ( +"Pz" = ( +/obj/structure/chair/fancy/comfy, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green/half/contrasted{ +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 8 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"Wj" = ( -/obj/machinery/mineral/stacking_machine{ - dir = 1; - input_dir = 8; - output_dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ +/area/awaymission/undergroundoutpost45/crew_quarters) +"PA" = ( +/obj/structure/disposalpipe/segment{ dir = 5 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/mining) -"Wl" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"PO" = ( +/obj/structure/alien/weeds, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; + temperature = 363.9; name = "Cave Floor" }, /area/awaymission/undergroundoutpost45/caves) -"Wp" = ( +"PQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"Wq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/turf/open/floor/plating{ + broken = 1 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"Ws" = ( -/obj/structure/cable{ - icon_state = "2-4" +/area/awaymission/undergroundoutpost45/central) +"PX" = ( +/obj/machinery/computer/atmos_control/tank{ + dir = 8; + input_tag = "UO45_mix_in"; + name = "Gas Mix Tank Control"; + output_tag = "UO45_mix_in"; + sensors = list("UO45_mix_sensor" = "Tank") }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Wt" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible{ +/obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 6 }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Wv" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - burnt = 1 +"Qa" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood/gibs/down, +/obj/effect/mob_spawn/human, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, +/area/awaymission/undergroundoutpost45/caves) +"Qb" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted, +/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"Ww" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/turf/open/floor/iron/cafeteria{ - dir = 5 +"Qf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/area/awaymission/undergroundoutpost45/research) -"WA" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 }, -/turf/open/floor/carpet, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"Ql" = ( +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"WD" = ( -/obj/machinery/gateway{ - dir = 1 +"Qp" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/security_space_law, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/research) +"Qq" = ( +/obj/structure/cable{ + icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"WE" = ( -/obj/structure/glowshroom/single, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"Qv" = ( +/obj/effect/decal/cleanable/blood/gibs/up, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; + temperature = 363.9; name = "Cave Floor" }, /area/awaymission/undergroundoutpost45/caves) -"WG" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" +"Qz" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + broken = 1 }, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/central) -"WI" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"WJ" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ +/area/awaymission/undergroundoutpost45/crew_quarters) +"QB" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ dir = 4 }, -/obj/structure/sign/warning/deathsposal{ - desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 }, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"QC" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"WL" = ( -/obj/machinery/light/small{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 +/obj/machinery/light/small{ + dir = 1 }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"WO" = ( -/obj/machinery/shower{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/item/soap/nanotrasen, -/turf/open/floor/iron/freezer, -/area/awaymission/undergroundoutpost45/crew_quarters) -"WQ" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"WR" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/area/awaymission/undergroundoutpost45/crew_quarters) +"QG" = ( +/obj/structure/closet/crate, +/obj/item/storage/box/lights/mixed, +/obj/item/poster/random_contraband, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + burnt = 1 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/engineering) -"WS" = ( +/area/awaymission/undergroundoutpost45/research) +"QJ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 +/obj/structure/sign/warning/securearea{ + pixel_y = -32 }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"WT" = ( +"QL" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -9730,903 +9569,1064 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"WU" = ( +"QU" = ( /obj/structure/table/wood, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/crew_quarters) -"WX" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"WY" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, +/obj/item/newspaper, +/turf/open/floor/carpet/grimy, +/area/awaymission/undergroundoutpost45/central) +"QV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"WZ" = ( +/area/awaymission/undergroundoutpost45/central) +"QY" = ( /obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood/splatter, /obj/effect/mob_spawn/human, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; + temperature = 363.9; name = "Cave Floor" }, /area/awaymission/undergroundoutpost45/caves) -"Xc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"QZ" = ( +/obj/item/kirbyplants, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"Xe" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Xf" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/stripes/line{ +"Ri" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/computer/atmos_control{ + dir = 4; + name = "Tank Monitor"; + sensors = list("UO45_n2_sensor" = "Nitrogen", "UO45_o2_sensor" = "Oxygen", "UO45_mix_sensor" = "Gas Mix Tank") + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"Xg" = ( -/obj/machinery/light/small{ +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/awaymission/undergroundoutpost45/engineering) +"Rl" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Hydroponics"; + network = list("uo45") + }, +/obj/machinery/power/apc/highcap/fifteen_k{ + locked = 0; + name = "Hydroponics APC"; + pixel_y = -23; + start_charge = 100 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ dir = 8 }, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = -23 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Rp" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/drinks/beer, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Rs" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/carpet/grimy, +/area/awaymission/undergroundoutpost45/central) +"Rt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating{ + burnt = 1 }, +/area/awaymission/undergroundoutpost45/central) +"Rv" = ( +/obj/structure/table/reinforced, +/obj/item/lighter, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Xh" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +"Rw" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Ry" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating{ + broken = 1 + }, +/area/awaymission/undergroundoutpost45/crew_quarters) +"RP" = ( +/obj/machinery/vending/cola, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Xj" = ( -/obj/structure/disposalpipe/segment{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"RR" = ( +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" + }, +/area/awaymission/undergroundoutpost45/caves) +"RW" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"RX" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/computer/monitor/secret{ + name = "primary power monitoring console" + }, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"Sd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, +/obj/machinery/newscaster{ + pixel_y = -28 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"Xk" = ( -/obj/structure/closet/l3closet/scientist, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +"Sg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"Xl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/area/awaymission/undergroundoutpost45/crew_quarters) +"Sh" = ( +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/structure/tank_dispenser{ + pixel_x = -1 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 1 }, -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) -"Xn" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"Si" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Sm" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Xo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"Xp" = ( -/obj/structure/closet/secure_closet{ - locked = 0; - name = "kitchen Cabinet"; - req_access_txt = "201" +/area/awaymission/undergroundoutpost45/central) +"Sq" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 }, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/sugar, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Ss" = ( +/obj/structure/chair/fancy/comfy, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 }, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Xq" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, +"Sw" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 }, -/turf/open/floor/plating{ - broken = 1 - }, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"Xr" = ( -/obj/machinery/computer/rdservercontrol{ - dir = 1 +"Sz" = ( +/obj/machinery/gateway{ + dir = 8 }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/research) -"Xs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/obj/structure/table, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stock_parts/scanning_module{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/stock_parts/scanning_module, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -32 - }, -/obj/effect/turf_decal/stripes/line{ +/area/awaymission/undergroundoutpost45/gateway) +"SL" = ( +/obj/machinery/computer/station_alert{ dir = 1 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"Xt" = ( -/obj/machinery/light/small, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"Ta" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Te" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood/splatter, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; + temperature = 363.9; name = "Cave Floor" }, -/area/awaymission/undergroundoutpost45/engineering) -"Xu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 1 +/area/awaymission/undergroundoutpost45/caves) +"Tk" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 }, +/obj/machinery/computer/atmos_control/tank{ + dir = 1; + input_tag = "UO45_n2_in"; + name = "Nitrogen Supply Control"; + output_tag = "UO45_n2_out"; + sensors = list("UO45_n2_sensor" = "Tank") + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Xw" = ( +/area/awaymission/undergroundoutpost45/engineering) +"Tl" = ( /obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating, +/turf/open/floor/plating{ + burnt = 1 + }, /area/awaymission/undergroundoutpost45/gateway) -"Xy" = ( -/obj/machinery/computer/rdconsole/core{ - dir = 4; - req_access = null +"Ty" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating{ + burnt = 1 + }, +/area/awaymission/undergroundoutpost45/central) +"TB" = ( +/obj/structure/chair{ + dir = 4 }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"Xz" = ( -/obj/item/kirbyplants, +/area/awaymission/undergroundoutpost45/central) +"TF" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 5 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"XA" = ( -/obj/structure/chair/fancy/comfy{ +"TI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"TJ" = ( +/obj/machinery/vending/snack, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"TM" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, -/obj/effect/landmark/awaystart, -/turf/open/floor/carpet/grimy, -/area/awaymission/undergroundoutpost45/central) -"XD" = ( +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"TQ" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"XF" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/light/small{ dir = 4 }, -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/crew_quarters) -"XG" = ( -/obj/machinery/shower{ - pixel_y = 15 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = 23 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"XI" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"TU" = ( +/obj/structure/alien/weeds, +/obj/structure/glowshroom/single, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/obj/structure/disposalpipe/segment{ +/area/awaymission/undergroundoutpost45/caves) +"TY" = ( +/obj/machinery/light{ dir = 4 }, -/obj/machinery/door/airlock/maintenance{ - name = "Hydroponics Maintenance"; - req_access_txt = "201" +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = 23 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"XJ" = ( -/obj/effect/decal/cleanable/blood/splatter, -/obj/effect/mob_spawn/human, +"Ud" = ( +/obj/machinery/gateway{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"Uj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; + temperature = 363.9; name = "Cave Floor" }, /area/awaymission/undergroundoutpost45/caves) -"XL" = ( +"Uo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/table, -/obj/item/storage/firstaid/regular{ - pixel_x = 2; - pixel_y = 6 +/obj/machinery/recharger{ + pixel_y = 4 }, -/turf/open/floor/iron/white/corner{ +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, -/area/awaymission/undergroundoutpost45/research) -"XM" = ( -/obj/machinery/light/small, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Uw" = ( +/obj/machinery/seed_extractor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"Ux" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"XO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/computer/atmos_alert{ +"Uy" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 }, -/turf/open/floor/iron/dark/corner{ +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/mining) +"UB" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, -/area/awaymission/undergroundoutpost45/engineering) -"XP" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/turf/open/floor/plating{ + burnt = 1 + }, +/area/awaymission/undergroundoutpost45/central) +"UD" = ( +/obj/structure/filingcabinet, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 8 }, -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"UF" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/item/clothing/under/suit/black/skirt, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) -"XQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/mining) -"XR" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"XS" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 +/turf/open/floor/plating{ + broken = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/central) -"XU" = ( +/area/awaymission/undergroundoutpost45/research) +"UJ" = ( /obj/machinery/light/small{ - dir = 8 + dir = 1 }, /turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - initial_temperature = 363.9; + temperature = 363.9; name = "Cave Floor" }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"XV" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/area/awaymission/undergroundoutpost45/gateway) +"UN" = ( +/obj/machinery/light{ + dir = 1 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"XW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"XX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/firealarm{ + pixel_y = 24 }, -/obj/machinery/door/airlock/maintenance{ - name = "Security Checkpoint Maintenance"; - req_access_txt = "201" +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 }, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"XZ" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, +"UO" = ( +/obj/structure/disposalpipe/segment, /turf/open/floor/plating{ broken = 1 }, -/area/awaymission/undergroundoutpost45/central) -"Ya" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Yb" = ( -/obj/structure/table, -/obj/item/plate, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Yd" = ( +"UX" = ( /obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 + icon_state = "1-2" }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Yh" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + broken = 1 }, -/turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) -"Yi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/table, -/obj/item/storage/box, -/obj/item/storage/box, -/obj/structure/reagent_dispensers/peppertank{ - pixel_y = 30 - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 +"Vb" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"Yj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/crew_quarters) -"Ym" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/central) -"Yr" = ( +"Ve" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "1-2" }, /obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 + dir = 9 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Ys" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/plating, /area/awaymission/undergroundoutpost45/engineering) -"Yv" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ +"Vf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/chair/office{ + dir = 8 }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"Yy" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"YB" = ( -/obj/structure/cable{ - icon_state = "2-4" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"YC" = ( -/obj/structure/filingcabinet, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"YD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/undergroundoutpost45/research) -"YE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" - }, -/obj/item/clothing/under/misc/pj/blue, -/turf/open/floor/carpet, -/area/awaymission/undergroundoutpost45/central) -"YF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +"Vh" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"YG" = ( -/obj/machinery/airalarm/all_access{ - pixel_y = 23; - dir = 1 +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"Vn" = ( +/obj/structure/reagent_dispensers/peppertank{ + pixel_x = -30 }, -/obj/machinery/light/small{ +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, -/obj/machinery/camera/directional/north{ - c_tag = "Research Lab"; - network = list("uo45","uo45r") - }, -/turf/open/floor/iron/white, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/research) -"YI" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 +"Vo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Vt" = ( +/obj/machinery/light/small{ + dir = 8 }, -/obj/structure/sign/warning/deathsposal{ - desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"YK" = ( -/obj/machinery/rnd/production/protolathe, -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = -23 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"YP" = ( +/area/awaymission/undergroundoutpost45/crew_quarters) +"Vu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) -"YQ" = ( -/obj/structure/chair{ - dir = 4 +"Vz" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/structure/sign/warning/deathsposal{ + desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; + name = "\improper DISPOSAL: LEADS TO EXTERIOR"; + pixel_y = 32 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/central) -"YR" = ( +"VG" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/disposalpipe/junction/flip{ + dir = 2 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"YT" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"YV" = ( -/obj/structure/cable{ - icon_state = "4-8" +"VJ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, -/obj/structure/disposalpipe/segment{ +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"VK" = ( +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = -23 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 +/obj/machinery/light{ + dir = 8 }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"YW" = ( -/obj/machinery/light/small{ +/obj/item/radio/off, +/obj/item/screwdriver{ + pixel_y = 10 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering Secure Storage"; - network = list("uo45") +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/research) +"VN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"Za" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/central) -"Zc" = ( -/obj/machinery/door/airlock{ - name = "Unit 2" +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Zd" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ +"VO" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Zf" = ( -/obj/effect/spawner/structure/window/reinforced, +"VR" = ( /obj/structure/cable{ - icon_state = "0-4" + icon_state = "2-8" }, -/obj/structure/cable{ - icon_state = "0-8" +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/engineering) -"Zg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + broken = 1 + }, +/area/awaymission/undergroundoutpost45/central) +"VT" = ( +/obj/structure/ore_box, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" + }, +/area/awaymission/undergroundoutpost45/caves) +"VU" = ( +/obj/machinery/door/window/southright{ + name = "Bar Door"; + req_access_txt = "201" }, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Zi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, +"We" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Zj" = ( -/obj/structure/cable{ - icon_state = "4-8" +"Wk" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/structure/chair, +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = 30 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 }, /turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Wn" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/landmark/awaystart, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"Wz" = ( +/obj/machinery/gateway{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/gateway) -"Zm" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, +"WH" = ( +/obj/machinery/biogenerator, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"WK" = ( +/obj/structure/chair/fancy/comfy{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Zn" = ( -/obj/machinery/light/small{ - dir = 8 +"WN" = ( +/obj/machinery/computer/monitor/secret{ + dir = 1; + name = "primary power monitoring console" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"Xa" = ( +/obj/machinery/light/small{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 4 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, /area/awaymission/undergroundoutpost45/research) -"Zp" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 +"Xm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/chair{ +/obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/awaymission/undergroundoutpost45/gateway) -"Zq" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Zr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/item/storage/backpack/satchel/eng, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/mask/gas, +/obj/item/clothing/glasses/meson, +/obj/structure/closet/secure_closet/engineering_personal{ + locked = 0; + req_access_txt = "201" + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 }, -/obj/structure/chair/stool, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"Zt" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, +/area/awaymission/undergroundoutpost45/engineering) +"Xv" = ( +/obj/structure/table/wood, +/obj/item/book/manual/ripley_build_and_repair, +/turf/open/floor/carpet/grimy, +/area/awaymission/undergroundoutpost45/central) +"Xx" = ( +/obj/machinery/vending/cola, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"Zu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"Zv" = ( -/obj/machinery/light{ +"XF" = ( +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 351.9; + name = "Cave Floor" + }, +/area/awaymission/undergroundoutpost45/caves) +"XN" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ dir = 8 }, -/obj/machinery/door/firedoor, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"Zw" = ( -/obj/structure/table, -/obj/item/kitchen/rollingpin, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Zx" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ +"XO" = ( +/obj/machinery/light/small{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" }, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/research) -"Zy" = ( +/area/awaymission/undergroundoutpost45/central) +"Yo" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"ZC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"ZG" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Yq" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 4 }, /obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 + dir = 4 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"ZH" = ( -/obj/structure/disposalpipe/segment{ +"Yu" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/computer/atmos_control/tank{ + dir = 1; + input_tag = "UO45_o2_in"; + name = "Oxygen Supply Control"; + output_tag = "UO45_o2_out"; + sensors = list("UO45_o2_sensor" = "Tank") + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"Yz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = -23 +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/engineering) +"YA" = ( +/obj/effect/landmark/awaystart, +/turf/open/floor/carpet/grimy, +/area/awaymission/undergroundoutpost45/central) +"YH" = ( +/obj/machinery/vending/hydronutrients, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/central) +"YL" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/reagent_dispensers/watertank, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"YM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, +/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) -"ZM" = ( -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, +"YO" = ( +/obj/machinery/door/firedoor, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"YX" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) -"ZN" = ( -/obj/structure/table, +/area/awaymission/undergroundoutpost45/central) +"YY" = ( /obj/machinery/airalarm/all_access{ pixel_y = 23; dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/item/hand_labeler, -/obj/item/clothing/neck/stethoscope, -/turf/open/floor/iron/white/side, -/area/awaymission/undergroundoutpost45/research) -"ZO" = ( +/obj/machinery/light{ + dir = 1 + }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/green/half/contrasted, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) -"ZP" = ( -/obj/effect/turf_decal/loading_area{ - dir = 4 +"YZ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"ZQ" = ( -/obj/machinery/door/firedoor, +/area/awaymission/undergroundoutpost45/engineering) +"Ze" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-4" + }, +/obj/machinery/power/apc/highcap/fifteen_k{ + dir = 1; + locked = 0; + name = "UO45 Bar APC"; + pixel_y = 23; + start_charge = 100 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/crew_quarters) +"Zh" = ( +/obj/structure/cable{ + icon_state = "1-4" }, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/turf/open/floor/plating{ + broken = 1 }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Engineering Reception" +/area/awaymission/undergroundoutpost45/central) +"Zk" = ( +/obj/machinery/gateway{ + dir = 1 }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/undergroundoutpost45/gateway) +"Zl" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"ZR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/area/awaymission/undergroundoutpost45/central) +"Zo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/research) -"ZS" = ( +/area/awaymission/undergroundoutpost45/crew_quarters) +"Zy" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" + }, +/area/awaymission/undergroundoutpost45/caves) +"ZA" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/disposalpipe/segment{ +/obj/structure/disposalpipe/junction/flip{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ZT" = ( -/obj/machinery/light{ - dir = 8 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + broken = 1 }, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = -23 +/area/awaymission/undergroundoutpost45/research) +"ZB" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes{ + pixel_y = 2 }, -/turf/open/floor/iron{ - dir = 8; - icon_state = "floorscorched1" +/obj/item/lighter{ + pixel_x = 4; + pixel_y = 2 }, +/turf/open/floor/carpet/grimy, /area/awaymission/undergroundoutpost45/central) -"ZU" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"ZE" = ( +/obj/structure/closet, +/obj/item/storage/belt/utility, +/turf/open/floor/plating{ + burnt = 1 }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/area/awaymission/undergroundoutpost45/crew_quarters) +"ZF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/gateway) -"ZV" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + broken = 1 + }, +/area/awaymission/undergroundoutpost45/central) +"ZI" = ( /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 6 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/floor/iron/white, -/area/awaymission/undergroundoutpost45/research) -"ZW" = ( -/obj/machinery/suit_storage_unit/mining, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"ZX" = ( -/obj/machinery/atmospherics/components/trinary/mixer/airmix{ - dir = 1 +/area/awaymission/undergroundoutpost45/crew_quarters) +"ZJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/camera/directional/east{ + c_tag = "Arrivals"; + network = list("uo45") }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/undergroundoutpost45/central) +"ZK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/iron/cafeteria, -/area/awaymission/undergroundoutpost45/engineering) -"ZY" = ( -/obj/machinery/light{ - dir = 1 +/turf/open/floor/plating{ + broken = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/area/awaymission/undergroundoutpost45/research) +"ZL" = ( +/obj/structure/table, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/radio/off, +/obj/item/screwdriver{ + pixel_y = 10 }, -/obj/machinery/airalarm/all_access{ - pixel_y = 23; - dir = 1 +/obj/structure/sign/poster/official/safety_report{ + pixel_y = -32 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/engineering) -"ZZ" = ( -/obj/structure/closet/l3closet/scientist, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 }, /turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/gateway) +/area/awaymission/undergroundoutpost45/central) +"ZP" = ( +/obj/structure/alien/weeds, +/obj/structure/glowshroom/single, +/obj/effect/decal/cleanable/blood/gibs/down, +/turf/open/floor/plating/asteroid{ + initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + temperature = 363.9; + name = "Cave Floor" + }, +/area/awaymission/undergroundoutpost45/caves) (1,1,1) = {" aa @@ -18595,7 +18595,264 @@ aa aa aa "} -(32,1,1) = {" +(32,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(33,1,1) = {" aa aa aa @@ -18852,7 +19109,7 @@ aa aa aa "} -(33,1,1) = {" +(34,1,1) = {" aa aa aa @@ -19109,7 +19366,7 @@ aa aa aa "} -(34,1,1) = {" +(35,1,1) = {" aa aa aa @@ -19366,7 +19623,7 @@ aa aa aa "} -(35,1,1) = {" +(36,1,1) = {" aa aa aa @@ -19623,7 +19880,7 @@ aa aa aa "} -(36,1,1) = {" +(37,1,1) = {" aa aa aa @@ -19880,7 +20137,7 @@ aa aa aa "} -(37,1,1) = {" +(38,1,1) = {" aa aa aa @@ -20137,7 +20394,7 @@ aa aa aa "} -(38,1,1) = {" +(39,1,1) = {" aa aa aa @@ -20394,7 +20651,7 @@ aa aa aa "} -(39,1,1) = {" +(40,1,1) = {" aa aa aa @@ -20651,7 +20908,7 @@ aa aa aa "} -(40,1,1) = {" +(41,1,1) = {" aa aa aa @@ -20908,7 +21165,7 @@ aa aa aa "} -(41,1,1) = {" +(42,1,1) = {" aa aa aa @@ -21165,7 +21422,7 @@ aa aa aa "} -(42,1,1) = {" +(43,1,1) = {" aa aa aa @@ -21422,7 +21679,7 @@ aa aa aa "} -(43,1,1) = {" +(44,1,1) = {" aa aa aa @@ -21679,7 +21936,7 @@ aa aa aa "} -(44,1,1) = {" +(45,1,1) = {" aa aa aa @@ -21936,7 +22193,7 @@ aa aa aa "} -(45,1,1) = {" +(46,1,1) = {" aa aa aa @@ -22193,7 +22450,7 @@ aa aa aa "} -(46,1,1) = {" +(47,1,1) = {" aa aa aa @@ -22450,7 +22707,7 @@ aa aa aa "} -(47,1,1) = {" +(48,1,1) = {" aa aa aa @@ -22707,7 +22964,7 @@ aa aa aa "} -(48,1,1) = {" +(49,1,1) = {" aa aa aa @@ -22964,7 +23221,7 @@ aa aa aa "} -(49,1,1) = {" +(50,1,1) = {" aa aa aa @@ -23221,7 +23478,7 @@ aa aa aa "} -(50,1,1) = {" +(51,1,1) = {" aa aa aa @@ -23478,7 +23735,7 @@ aa aa aa "} -(51,1,1) = {" +(52,1,1) = {" aa aa aa @@ -23735,7 +23992,7 @@ aa aa aa "} -(52,1,1) = {" +(53,1,1) = {" aa aa aa @@ -23992,7 +24249,7 @@ aa aa aa "} -(53,1,1) = {" +(54,1,1) = {" aa aa aa @@ -24249,7 +24506,7 @@ aa aa aa "} -(54,1,1) = {" +(55,1,1) = {" aa aa aa @@ -24506,7 +24763,7 @@ aa aa aa "} -(55,1,1) = {" +(56,1,1) = {" aa aa aa @@ -24763,7 +25020,7 @@ aa aa aa "} -(56,1,1) = {" +(57,1,1) = {" aa aa aa @@ -25020,7 +25277,7 @@ aa aa aa "} -(57,1,1) = {" +(58,1,1) = {" aa aa aa @@ -25277,7 +25534,7 @@ aa aa aa "} -(58,1,1) = {" +(59,1,1) = {" aa aa aa @@ -25534,7 +25791,7 @@ aa aa aa "} -(59,1,1) = {" +(60,1,1) = {" aa aa aa @@ -25791,7 +26048,7 @@ aa aa aa "} -(60,1,1) = {" +(61,1,1) = {" aa aa aa @@ -26048,155 +26305,7 @@ aa aa aa "} -(61,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(62,1,1) = {" aa aa aa @@ -26262,6 +26371,154 @@ aa aa aa aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab aa aa aa @@ -26305,7 +26562,7 @@ aa aa aa "} -(62,1,1) = {" +(63,1,1) = {" aa aa aa @@ -26562,7 +26819,7 @@ aa aa aa "} -(63,1,1) = {" +(64,1,1) = {" aa aa aa @@ -26819,7 +27076,7 @@ aa aa aa "} -(64,1,1) = {" +(65,1,1) = {" aa aa aa @@ -27076,7 +27333,7 @@ aa aa aa "} -(65,1,1) = {" +(66,1,1) = {" aa aa aa @@ -27333,7 +27590,7 @@ aa aa aa "} -(66,1,1) = {" +(67,1,1) = {" aa aa aa @@ -27590,7 +27847,7 @@ aa aa aa "} -(67,1,1) = {" +(68,1,1) = {" aa aa aa @@ -27804,249 +28061,115 @@ ab ab ab ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(68,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(69,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab ab @@ -28054,6 +28177,140 @@ ab ab ab ab +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad ab ab ab @@ -28104,7 +28361,7 @@ aa aa aa "} -(69,1,1) = {" +(70,1,1) = {" aa aa aa @@ -28361,7 +28618,7 @@ aa aa aa "} -(70,1,1) = {" +(71,1,1) = {" aa aa aa @@ -28618,7 +28875,7 @@ aa aa aa "} -(71,1,1) = {" +(72,1,1) = {" aa aa aa @@ -28775,290 +29032,33 @@ ad ad ad ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(72,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Tj -TV +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +zm +EM ad ad ad @@ -29314,9 +29314,9 @@ ad ad ad ad -iF -dr -il +KW +Te +PO ad ad ad @@ -29571,10 +29571,10 @@ ad ad ad ad -OS -il -fh -Kz +TU +PO +yv +eN ad ad ad @@ -29763,14 +29763,14 @@ ad ad ad gv -Jb -Jb -JZ -JZ -FC -ON -eY -ZZ +gI +gI +gJ +gJ +is +iN +jg +jF gv gK gK @@ -29829,9 +29829,9 @@ ad ad ad ad -il -fh -Ao +PO +yv +FX ad ad ad @@ -30020,19 +30020,19 @@ ad ad ad gv -JZ -qX -DW -SV -HT -tQ -Lh -Xk +gJ +Ud +Sz +Hq +it +iO +jh +jG gw -vy -gT -Rn -RM +ky +lo +ma +mB gK ad ad @@ -30087,12 +30087,12 @@ ad ad ad ad -fh -fh -in +yv +yv +Qv ad -UA -Tj +wZ +zm ad ad ad @@ -30277,19 +30277,19 @@ ad ad ad gv -JZ -WD -aW -fl -Bm -Lb -BJ -Lb -cC -Lb -Py -SM -Xc +gJ +Zk +hu +LS +iu +iP +ji +iP +ed +iP +lp +jI +mC gL ad ad @@ -30345,11 +30345,11 @@ ad ad ad ad -XJ -fh -dr -TV -IV +EW +yv +Te +EM +Qa ad ad ad @@ -30534,19 +30534,19 @@ ad ad ad gw -JZ -up -Jq -Od -Jp -Rj -eN -SM +gJ +Wz +FM +Cg +iv +iQ +jj +jI gv -ZM -Zj -SM -VD +kz +lq +jI +mD gL ad ad @@ -30596,17 +30596,17 @@ ad ad ad ad -Tj -TV -Ul -Ay +zm +EM +Eq +kr ad ad ad -fh -il -fh -Kz +yv +PO +yv +eN ad ad ad @@ -30791,19 +30791,19 @@ ad ad ad gv -JZ -Jb -JZ -JZ -HT -As -Zr -SM +gJ +gI +gJ +gJ +it +iR +jk +jI gv gK -Jd -Lb -LM +lr +iP +mE gK ad ad @@ -30852,17 +30852,17 @@ ad ad ad ad -Tj -iF -il -WZ -Ul +zm +KW +PO +CR +Eq ad ad ad -WE -fh -Cu +hj +yv +dK ad ad ad @@ -31049,18 +31049,18 @@ ad ad gv gv -NI -NI -NI -NI -im -NR +gU +gU +gU +gU +iS +jl gv gv -NE -UI -ds -Nw +kA +ls +mb +mF gv ad ad @@ -31110,16 +31110,16 @@ ad ad ad ad -yN -fh -Cu -TV +ZP +yv +dK +EM ad ad -Kz -fh -fh -Kz +eN +yv +yv +eN ad ad ad @@ -31306,20 +31306,20 @@ ad ad ad gK -Om -NU -ug -ug -KV -SW +gV +hw +ib +ib +iT +jm gK -zN -OL -PM -ds -Xf +AL +kB +lt +mb +mG gw -fh +yv ad ad ad @@ -31368,21 +31368,21 @@ ad ad ad ad -fh -fh -fh -il +yv +yv +yv +PO ad -Ed -fh -fh +QY +yv +yv ad ad ad ad ad -Tj -il +zm +PO ad ad ad @@ -31563,21 +31563,21 @@ ad ad ad gL -Ip -BL -Zp -RJ -zm -Pe +gW +hx +ic +iw +iU +jn gL -zN -TH -UI -TK -PO +AL +kC +ls +mc +mH gw -fh -fh +yv +yv ad ad ad @@ -31626,20 +31626,20 @@ ad ad ad ad -in -il -il -il -il -fh -fh +Qv +PO +PO +PO +PO +yv +yv ad ad ad ad -WZ -TV -UA +CR +EM +wZ ad ad ad @@ -31825,16 +31825,16 @@ gL gL gK iV -LD +jo gL gL iV -Kl +kl gK gw gv -fh -WE +yv +hj ad ad ad @@ -31885,18 +31885,18 @@ ad ad ad ad -il -fh -fh -fh -fh -XJ -Kz -in -WE -Cu -fh -Ul +PO +yv +yv +yv +yv +EW +eN +Qv +hj +dK +yv +Eq ad ad ad @@ -32078,21 +32078,21 @@ ad ad ad gL -Wf -Xw +Tl +id gK -Bt -Mv -ZC -Zu -un -FE -yS -NI -fh -fh -fh -fh +iW +jp +jJ +kf +kD +lv +md +gU +yv +yv +yv +yv ad ad ad @@ -32142,18 +32142,18 @@ ad ad ad ad -Kz -fh -fh -fh -il -fh -fh -fh -fh -fh -Ul -Ay +eN +yv +yv +yv +PO +yv +yv +yv +yv +yv +Eq +kr ad ad ad @@ -32335,21 +32335,21 @@ ad ad ad gK -zF -IM -Aw -PH -QQ -Du -zz -kt -MK -NK -NI -fh -fh -fh -fh +hz +ie +ix +iX +jq +jK +kg +kE +lw +me +gU +yv +yv +yv +yv ad ad ad @@ -32399,15 +32399,15 @@ ad ad ad ad -WZ -Cu -fh -il -il -TV -fh -il -il +CR +dK +yv +PO +PO +EM +yv +PO +PO ad ad ad @@ -32592,21 +32592,21 @@ ad ad ad gL -wm -IU +hA +if gv gv gw gw gv -ND -Mj +kF +lx gw gv -Hn -fh -fh -fh +UJ +yv +yv +yv ad ad ad @@ -32656,15 +32656,15 @@ ad ad ad ad -UA -il -fh -il +wZ +PO +yv +PO ad ad -dr -Tj -iF +Te +zm +KW ad ad ad @@ -32852,18 +32852,18 @@ gL gv gv gv -WE -fh -fh +hj +yv +yv gv -qf -EN +kG +ly gw -fh -fh -fh -fh -WE +yv +yv +yv +yv +hj ad ad ad @@ -32914,8 +32914,8 @@ ad ad ad ad -il -fh +PO +yv ad ad ad @@ -33107,20 +33107,20 @@ ad ad ad ad -fh -fh -fh -fh -fh -NI -ZU -EN -NI -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +gU +kH +ly +gU +yv +yv +yv +yv +yv ad ad ad @@ -33161,8 +33161,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -33172,7 +33172,7 @@ ad ad ad ad -Kz +eN ad ad ad @@ -33363,22 +33363,22 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -NI -No -Zy -NI -fh -fh -fh -fh -fh -WE +yv +yv +yv +yv +yv +yv +gU +kI +lz +gU +yv +yv +yv +yv +yv +hj ad ad ad @@ -33419,8 +33419,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -33429,7 +33429,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -33620,23 +33620,23 @@ ad ad ad ad -WE -fh -WE -fh -fh -fh -NI -ZU -EN -NI -fh -fh -fh -fh -fh -fh -fh +hj +yv +hj +yv +yv +yv +gU +kH +ly +gU +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -33677,16 +33677,16 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -33878,22 +33878,22 @@ ad ad ad ad -fh -fh -fh -fh -Rr +yv +yv +yv +yv +tQ gw -Ie -DS +kJ +lA gw -Hn -fh -fh -fh -fh -fh -fh +UJ +yv +yv +yv +yv +yv +yv ad ad ad @@ -33935,14 +33935,14 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad ad ad -fh +yv ad ad ad @@ -34135,22 +34135,22 @@ ad ad ad ad -fh -fh -fh -fh -fh -NI -ZU -EN -NI -fh -fh -WE -fh -fh -WE -fh +yv +yv +yv +yv +yv +gU +kH +ly +gU +yv +yv +hj +yv +yv +hj +yv ad ad ad @@ -34192,14 +34192,14 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad ad ad -fh +yv ad ad ad @@ -34391,23 +34391,23 @@ ad ad ad ad -fh -WE -fh -fh -fh -fh -NI -Bk -Rq -NI -fh -fh -fh -fh -fh -fh -fh +yv +hj +yv +yv +yv +yv +gU +kK +lB +gU +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -34450,13 +34450,13 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad -fh -fh +yv +yv ad ad ad @@ -34648,22 +34648,22 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -NI -qf -EN -NI -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +gU +kG +ly +gU +yv +yv +yv +yv +yv +yv ad ad ad @@ -34708,11 +34708,11 @@ ad ad ad ad -fh -fh +yv +yv ad -fh -fh +yv +yv ad ad ad @@ -34906,20 +34906,20 @@ ad ad ad ad -fh -fh -fh -fh -WE +yv +yv +yv +yv +hj gw -ZU -FY +kH +lC gv -fh -WE -fh -fh -WE +yv +hj +yv +yv +hj ad ad ad @@ -34966,9 +34966,9 @@ ad ad ad ad -fh +yv ad -fh +yv ad ad ad @@ -35164,16 +35164,16 @@ ad ad ad ad -fh -WE -fh +yv +hj +yv gz gw -Vg -SZ +kL +lD gv hc -fh +yv ad gz hc @@ -35223,9 +35223,9 @@ ad ad ad ad -fh -fh -fh +yv +yv +yv ad ad ad @@ -35425,25 +35425,25 @@ gz hc gz gz -dN -Th -zG -MV +kh +kM +lE +mf mJ mJ nM nM -nx -RT -cO -Bs -zX -Bs -jw +pb +pG +Nd +qO +bp +qO +tg tK -Uv -BC -Dh +us +uK +vh gy ad ad @@ -35480,8 +35480,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -35675,32 +35675,32 @@ ad ad ad gx -ys -Vs -Xy -Xs -HL -Gp -aA -jU -Hh -CU -OJ -RN -nt -Rc -wS -KD +gX +hB +ig +iy +iY +jr +jM +ki +kN +lF +mg +mK +nj +nN +oR +KO pH qg pH qg qg -ey -Vp -Zx -Tz -CP +th +tL +ut +uL +vi gx ad ad @@ -35737,8 +35737,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -35932,16 +35932,16 @@ ad ad ad gy -YG -HR -Hg -QX -dL -OK -EW -oK -ID -Ld +gY +hC +ih +iz +iZ +js +jN +BA +kO +lG gy gz gz @@ -35953,11 +35953,11 @@ KE qP qh gz -al +Ce tM -Uz -pO -Cf +uu +uM +vj gx ad ad @@ -35994,7 +35994,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -36189,28 +36189,28 @@ ad ad gx gy -Oq -YK -PJ -JU -Dm -ys -QW -wH -NB -uQ +gZ +hD +ii +iA +ha +gX +jO +kk +kP +lH gy -CO -Ac -Gq -AV -uN +kd +nk +nO +ox +pd gy qi qQ rz gz -Au +KJ tN gy gy @@ -36251,7 +36251,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -36445,29 +36445,29 @@ ad ad ad gx -Rg -Dm -Hi -Hi -IP +gM +ha +hE +hE +iB gz gz gz gz -Ph -Yv +kQ +lI gy -FL -Cl -Cl -Cl -Oj +mM +nl +nl +nl +pe gy -Gn -zy -IA +qj +qR +rA gz -YR +nu tN uv ad @@ -36507,8 +36507,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -36702,29 +36702,29 @@ ad ad ad gy -Qs -ys -Lo -Vj -ZV +gN +gX +hF +ij +iC hc -fh -fh +yv +yv gz -PK -Tq -KF -fs -Ey -Rf -Ks -hM -Mz -du -kq -EX +kR +lJ +mh +mN +nm +nP +oy +mP +pI +qk +qS +rB hc -YR +nu tM gy ad @@ -36763,8 +36763,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -36960,29 +36960,29 @@ ad ad gz gz -IL -fj -SU -Tr +hb +hG +ik +iD hc -fh -fh -Yy -bl -Fz -zL -YD -LR -Ww -ck -hy +yv +yv +hH +kS +lK +mi +mO +nn +nQ +oz +pf gy -Nq -ph -Xr +ql +qT +rC hc -tl -NS +tj +tO gy ad ad @@ -37020,8 +37020,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -37030,8 +37030,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -37218,28 +37218,28 @@ ad ad gz hc -Yy -Yy +hH +hH hc gz -fh -fh -Yy -PK -Qy -JF -hM -hM -RZ -Bc -DP +yv +yv +hH +kR +lL +mj +mP +mP +nR +oA +pg gy gx gz gz gz -zM -DN +tk +tP gy ad ad @@ -37277,18 +37277,18 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad ad ad -fh -WE -fh -fh -fh +yv +hj +yv +yv +yv ad ad ad @@ -37473,30 +37473,30 @@ ad ad ad ad -fh -bc -fh -fh -fh -fh -fh -fh -Yy -PK -PS -JF -Sb -hM -SA -Uu -Bc -Cp -uY +yv +zw +yv +yv +yv +yv +yv +yv +hH +kR +lM +mj +mQ +mP +nS +oB +oA +pJ +qm hc -Mo -Rb -OB -DN +QG +st +ZK +tP gy ad ad @@ -37534,18 +37534,18 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad ad ad -fh -fh -fh -fh -WE +yv +yv +yv +yv +hj ad ad ad @@ -37729,18 +37729,18 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh -QE +yv +yv +yv +yv +yv +yv +yv +yv +hi gz -IB -FO +kT +lN gx gy gx @@ -37748,12 +37748,12 @@ gx gx gy gy -SQ +qn hc -Kt -Cv -Mu -Qr +rE +su +tm +ZA gx ad ad @@ -37791,18 +37791,18 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad ad -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv ad ad ad @@ -37986,31 +37986,31 @@ ad ad ad ad -fh -fh -fh -WE -fh -fh -fh -fh -fh -Yy -PK -PS -Yy -OU -Ds -QF -wY -nf +yv +yv +yv +hj +yv +yv +yv +yv +yv +hH +kR +lM +hH +BB +Kr +VK +Vn +Mf gy gy gz -IW +rF gz tn -DN +tP gx ad ad @@ -38049,17 +38049,17 @@ ad ad ad ad -fh +yv ad ad ad ad -WE -fh -fh -fh -fh -fh +hj +yv +yv +yv +yv +yv ad ad ad @@ -38243,31 +38243,31 @@ ad ad ad ad -WE -fh -fh -fh -fh -fh -fh -fh -fh -Yy -HW -PS -Yy -WY -WX -ZR -Xo -GC +hj +yv +yv +yv +yv +yv +yv +yv +yv +hH +kU +lM +hH +Qp +np +nU +oD +Eb pK -mS -Zn -Ho -Nb +qo +qU +rG +sv tn -DN +tP gz ad ad @@ -38306,17 +38306,17 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv ad ad ad @@ -38499,34 +38499,34 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh -WE -fh -Yy -Ag -PS -Yy -TL -IR -zJ -zJ -hi +yv +yv +yv +yv +yv +yv +yv +yv +hj +yv +hH +kV +lM +hH +zR +DX +Ev +Ev +Gh pL -ZN -YF -Qx -zu +qp +qV +rH +sw to -Uc +tR gz -fh +yv ad ad ad @@ -38564,15 +38564,15 @@ ad ad ad ad -fh +yv ad ad ad ad -fh -fh -fh -fh +yv +yv +yv +yv ad ad ad @@ -38756,36 +38756,36 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -WE -fh -fh +yv +yv +yv +yv +yv +yv +hj +yv +yv gz gz -TR -PS -Yy -Yy -Yy -Yy -be -Yy +kW +lM +hH +hH +hH +hH +oE +hH gx -wR -Dm -NB -bF +qq +ha +kP +sx tn -DN +tP hc -fh -fh -fh +yv +yv +yv ad ad ad @@ -38821,15 +38821,15 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad -WE -fh -fh -WE +hj +yv +yv +hj ad ad ad @@ -38998,13 +38998,13 @@ aD aC aC aC -li -Fp -Za -Fs -Ko -Ko -SS +cu +cD +cW +Rt +cq +cq +ee aC ad ad @@ -39014,36 +39014,36 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv gz -Dy -Ag -Dm -Yh -Yh -Yh -Yh -Yh -Yh -Qk -Dm -Dm -Ib -MW +gn +kV +ha +mk +mk +mk +mk +mk +mk +pM +ha +ha +rI +sy tn -CH +UF hc hc hc -VA -fh +Xa +yv ad ad ad @@ -39079,14 +39079,14 @@ ad ad ad ad -fh +yv ad ad ad ad -fh -fh -fh +yv +yv +yv ad ad ad @@ -39249,19 +39249,19 @@ ad ad ad aC -zd -zd -zd -Na -JT +bq +bq +bq +rm +bY aC -Na -JT -pN -CV +rm +bY +cX +cm ae ae -XX +ef ae an an @@ -39271,36 +39271,36 @@ aC aC ad ad -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv gz -lS -JJ -JJ -JJ -AU -TA -AU -AU -Ag -QW -aV -JL -yF -XL +iL +Qb +Qb +Qb +mU +nr +mU +mU +kV +jO +qr +qW +rJ +sz tp -BW +Jm gy -Qd -Yy -Gr -fh +yG +hH +Pj +yv ad ad ad @@ -39333,18 +39333,18 @@ ad ad ad ad -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv ad ad ad ad -fh -fh -fh +yv +yv +yv ad ad ad @@ -39506,41 +39506,41 @@ ad ad aC aC -RB +br aC aC aC -AE +FR aC -sQ -hk -Za -CR +cv +cE +cW +pn ae -Ne -XS -Oz -HK -RI +GS +El +MT +Uo +Ap fo -Nr -Cd +fA +fQ aC ad ad -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv ad gz gz -DE -DE -DE +kY +kY +kY gz hc hc @@ -39552,13 +39552,13 @@ gz gz gz tq -IX -Rh -Wv -hZ -Gr -fh -fh +tU +uw +DR +vk +Pj +yv +yv ad ad ad @@ -39589,19 +39589,19 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv ad ad -fh -fh -WE +yv +yv +hj ad ad ad @@ -39762,61 +39762,61 @@ ad ad ad aC -dE -yO -Qg -bb +bi +bs +by +bI bO -Rm +ca cp cp -Hp -Kx -FG +Ff +cY +cf dv -Vd -nT -Lx -Lx -Iw +Wk +eh +bL +bL +ZL fm -WA -uy +fB +fR aC ad ad -fh -fh -fh -fh -fh -fh -WE +yv +yv +yv +yv +yv +yv +hj ad ad gz gz -CQ +lO gz gz -jT -Rc -nt -zA -Rc -Rc -RK -zA -Rc -XD -NO +ns +nN +nj +UX +nN +nN +xb +UX +nN +tr +tV ux -MH -Yy -Gr -fh -fh -fh +uP +hH +Pj +yv +yv +yv ad ad ad @@ -39845,21 +39845,21 @@ ad ad ad ad -fh -fh -fh -WE +yv +yv +yv +hj ad ad ad ad -fh +yv ad ad ad -fh -fh -fh +yv +yv +yv ad ad ad @@ -40019,44 +40019,44 @@ ad ad ad aC -Td -Vk +bj +bt aC aC bP -Kk -Ko -Kj -Ba -Ko -lj +cb +cq +ct +uh +cq +dk an -NC -Qn -EC -Qi -qI +VJ +Bv +YX +OC +BR an -SN -sp +fC +fS aC ad -WE -fh -fh -fh -fh -fh -fh -fh -fh +hj +yv +yv +yv +yv +yv +yv +yv +yv ad gy -zb -Dm -FU +kZ +ha +ml gx -al +Ce nW mJ mJ @@ -40070,10 +40070,10 @@ tW hc hc hc -fh -fh -fh -fh +yv +yv +yv +yv ad ad ad @@ -40100,23 +40100,23 @@ ad ad ad ad -fh -fh -fh -fh +yv +yv +yv +yv ad ad ad ad ad ad -fh -fh +yv +yv ad ad ad -fh -fh +yv +yv ad ad ad @@ -40276,62 +40276,62 @@ aC ad ad aC -dE -Pb -Va -Ts +bi +bu +bz +bJ bQ -XW +cc aC aC aC ae -RB +br an -MP -qE -MN -Pl -qE +dR +aP +ex +eM +aP ae -CT +fD aC aC ad -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv ad gx -XG -Dm -Kg +la +ha +mm gy -YR +nu nX -fh -fh -WE -fh -fh -fh +yv +yv +hj +yv +yv +yv ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -40356,10 +40356,10 @@ ad ad ad ad -WE -fh -fh -WE +hj +yv +yv +hj ad ad ad @@ -40368,12 +40368,12 @@ ad ad ad ad -fh +yv ad ad ad -fh -fh +yv +yv ad ad ad @@ -40527,68 +40527,68 @@ ad ad ad aC -Gs -JC +au +aK aC -qE -qE +aP +aP aC aC -WG +bv aC aC bQ -aB +cd cr -nF -BZ +cw +cH ae -Eo -ZT -Or -Nv -CB -CB -wJ -TX -SI -Qh +aF +dw +aS +ej +IF +IF +eZ +bA +fE +fT aC ad ad -fh -fh -HB -fh -fh -fh -fh -WE +yv +yv +Cr +yv +yv +yv +yv +hj ad gy -Gw -Dm -yV +lb +ha +mn gy -YR +nu nY -fh -fh -fh -fh -fh -fh -WE -fh -fh -fh -fh -fh -fh -fh -fh -WE -fh +yv +yv +yv +yv +yv +yv +hj +yv +yv +yv +yv +yv +yv +yv +yv +hj +yv ad ad ad @@ -40625,12 +40625,12 @@ ad ad ad ad -fh +yv ad ad ad -fh -fh +yv +yv ad ad ad @@ -40784,67 +40784,67 @@ ae ae ae ae -Or -Or -Zv -cF -cF -cF -GN -Or -TX -Eo +aS +aS +aN +ax +ax +ax +bk +aS +bA +aF bP -CR +pn aC -PW -IN -bn -zv -Pc -Or -Or -Or -Or -Or -Or -SI -Or +cx +cI +cZ +dl +dx +aS +aS +aS +aS +aS +aS +fE +aS aC fO -Xe -Xe -Xe +gr +gr +gr gg -Xe -Xe -Xe +gr +gr +gr gg gg fK gy gy -CQ +lO gy gx -Jy +nv nY -Xe -Xe -Xe -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +gr +gr +gr +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -40882,17 +40882,17 @@ ad ad ad ad -fh -fh +yv +yv ad -fh -fh -fh +yv +yv +yv ad ad ad ad -fh +yv ad ad ad @@ -41041,67 +41041,67 @@ ag ag af an -Or -Or -BM -cF -SG -OM -Pi -rr -Cy -HZ +aS +aS +aO +ax +Fm +Wn +Nc +ZJ +bB +bK bR -FG +cf cp -YE -Gm +aU +cJ ae -Eo -DC -jc -Ec -sS -YQ -hN -IT -MY -Or -Et -FV -cn -FV -cn -hK -cn -cn -Sv -aX -gQ -Nm -VM -iI -PL -Im -EY -tT -Cm +aF +dy +dS +Nj +OZ +TB +LZ +fp +bS +aS +da +gA +gs +gA +gs +hf +gs +gs +iE +ja +jt +ng +kn +lc +OX +mo +mV +Lg +Vt +VN +QZ +gr +gr yv -Xz -Xe -Xe -fh -WE -fh -fh -fh -WE -fh -fh -fh -fh -fh -WE +hj +yv +yv +yv +hj +yv +yv +yv +yv +yv +hj ad ad ad @@ -41140,16 +41140,16 @@ ad ad ad ad -fh +yv ad -fh +yv ad -fh +yv ad ad ad -fh -fh +yv +yv ad ad ad @@ -41293,72 +41293,72 @@ ad ad ae ag -BS -JB -Cn +aj +fg +aq ag an -Eo -Or -qE -XA -XA -VE -OQ +aF +aS +aP +At +At +YA +wU aC -zk -Or +yP +aS bQ -Ha +cg ae ae ae ae -Or -Or -Cb -Hu -Hu -Hu -Hu -lT -nd -Lx -AM -LK -Hs -FV -cn -Ll -FV -FV -FV -FV -QA -cn -cn -Hw -Vi -LK -BY -OH -Yr -Hw -vr -EP -Xe -fh -fh -fh -fh -fh -fh -fh -fh -fh +aS +aS +AA +el +el +el +el +RW +fF +bL +ge +gl +gt +gA +gs +hg +gA +gA +gA +gA +ju +gs +gs +ld +lQ +gl +mW +Iu +oa +ld +pm +Pz +gr +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad -fh +yv ad ad ad @@ -41397,15 +41397,15 @@ ad ad ad ad -fh -fh -fh +yv +yv +yv ad -fh +yv ad ad -fh -fh +yv +yv ad ad ad @@ -41550,72 +41550,72 @@ ad ad ae ag -yE -Bd -JT -Io -Di -Or -Or -qE -Fi -lU -Az -DD +ac +ao +bY +as +at +aS +aS +aP +QU +LF +Ci +Rs aC -pc -Lx -MY -wZ -hO -Hv -Or -Et -Or -Or -Cb -Hu -Ef -ai -Hu -lT -SI -VP +Hr +bL +bS +ch +cs +aI +aS +da +aS +aS +AA +el +eA +eB +el +RW +fE +fU ae fK -Xe -Xe -Xe +gr +gr +gr fK -Xe -Xe -Xe +gr +gr +gr gg gg -zP -cn -Hw -FV -Ya +jR +gs +ld +gA +mp fN -Ob -VL -Hw -cn -DL -Xe -fh -fh -fh -fh -fh -fh -fh -fh -fh +ny +Gd +ld +gs +Ss +gr +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad -fh +yv ad ad ad @@ -41658,10 +41658,10 @@ ad ad ad ad -fh +yv ad ad -fh +yv ad ad ad @@ -41807,72 +41807,72 @@ ad ad ae ag -Na -Na -Mc -Io -Di -Or -Eo -qE -QS -yL -Az -ti +rm +rm +ar +as +at +aS +aF +aP +AO +Xv +Ci +ZB aC -QP -eL -Bx -Gz -Or -Or -Or -Et -Or -Or -Cb -Hu -ai -ei -Hu -lT -SI -WQ +Nk +bM +bT +ci +aS +aS +aS +da +aS +aS +AA +el +eB +eO +el +RW +fE +fV ae -fh -fh -fh -fh -XU -fh -fh -fh -WE +yv +yv +yv +yv +Ld +yv +yv +yv +hj gg gg -Hb -QI -wx -Gb +ko +le +lR +mq fN -Dr -Jf -Ni -gp -Bg -Xe -fh -fh -WE -fh -fh -fh -fh -fh -fh -fh -fh -fh +nz +BE +oG +LJ +MS +gr +yv +yv +hj +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -41915,10 +41915,10 @@ ad ad ad ad -fh +yv ad -fh -fh +yv +yv ad ad ad @@ -42064,72 +42064,72 @@ ad ad ae ag -Na -FX -aE +rm +ap +fu ag ae -Tb -Eo -qE -xc -Qw -Az -OQ +aG +aF +aP +Hy +HS +Ci +wU aC -Ez -Eo +Cx +aF bP -Ha +cg aC aC aC aC -Gf -Or -Pw -Hu -Hu -Hu -Hu -lT -SI -Eo -qE -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +dm +aS +Zl +el +el +el +el +RW +fE +aF +aP +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv fK -cn -Bq +gs +lf fO fO fO fO -UE -dI +MM +oH fO fN fK gg gg -fh -fh -fh -fh -WE -fh -fh -fh -fh -fh +yv +yv +yv +yv +hj +yv +yv +yv +yv +yv ad ad ad @@ -42172,9 +42172,9 @@ ad ad ad ad -fh +yv ad -fh +yv ad ad ad @@ -42326,67 +42326,67 @@ ag ag af an -UU -Or -Qc -FK -FK -Su -bE -bE -Bz -Mm +aH +aS +aQ +Jw +Jw +HJ +jQ +jQ +bG +bN bP -dH +cj cr -XP -Xl +aZ +cK aC -hY -AQ -IY -Mg -BT -BT -FK -jz -tz -rK -qE -fh -fh -fh -WE -fh -fh -WE -fh -fh -fh -Xe -FV -cn +dn +dz +dV +HH +Gy +Gy +Jw +fr +fG +fW +aP +yv +yv +yv +hj +yv +yv +hj +yv +yv +yv +gr +gA +gs fN -WU -UK +mr +mX nA -Te -Zt -JV -Ol -Pf -dP +oe +oI +po +pQ +qs +qY gg -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv ad ad -fh -fh -fh +yv +yv +yv ad ad ad @@ -42424,14 +42424,14 @@ ad ad ad ad -fh +yv ad ad ad ad -fh -fh -fh +yv +yv +yv ad ad ad @@ -42583,68 +42583,68 @@ ae ae ae ae -Hv -Or -mR -Or -Or -Or -Or -TG -hl -Or +aI +aS +aR +aS +aS +aS +aS +bx +bH +aS bQ -Ih +Lk aC -RY -IN -Fa -eL -BN -Ms -CN -CN -CN -CN -CN -NN -Gc -qE -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -Xe -cn -cn +cA +cI +db +bM +dA +dW +en +en +en +en +en +fH +fX +aP +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +gr +gs +gs fO -Up -em -Af -Bp -Zm +ms +mY +nB +of +oJ fO -Ja -WL -UZ +pR +qt +mt gg -fh -fh -fh -fh +yv +yv +yv +yv ad ad ad -fh -fh -fh -fh +yv +yv +yv +yv ad ad ad @@ -42680,14 +42680,14 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -42840,68 +42840,68 @@ ad ad ad aC -PB -Oh +aJ +aM aC -qE -qE -qE -qE +aP +aP +aP +aP aC aC aD bU -Ow +EB co -sf -Vy +cB +cL aC -oC -ER -ZO -ER -ER -BH -dT -Nx -Dk -Bu +do +Ql +LW +Ql +Ql +eP +fb +TY +fI +fY an -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv gg -cn -lm +gs +lg fO -UZ -LP +mt +km fO -SF -zl +og +Li pp pS fO fO gg ad -fh -fh -fh -fh +yv +yv +yv +yv ad -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv ad ad ad @@ -42943,8 +42943,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -43108,64 +43108,64 @@ ad ad ad bP -CV +cm aC aC aC aC aC -qE -Ki -VY -qE -wz -CM +aP +dY +eo +aP +Aa +QV ae ae an an -fh -fh -fh -WE +yv +yv +yv +hj gg -Xe -Xe -Xe +gr +gr +gr fK gg gg -Cj -Cj +kp +kp fN fN fO fN -oF -Je +KI +oL fN -II -KB -Uq +pT +qu +mu fO ad -fh -fh -fh -fh -WE -fh -fh -fh -fh -fh -fh -fh -fh -WE -fh -fh -fh +yv +yv +yv +yv +hj +yv +yv +yv +yv +yv +yv +yv +yv +hj +yv +yv +yv ad ad ad @@ -43200,8 +43200,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -43365,66 +43365,66 @@ ad ad ad bP -Lv -Kj -Ba -Kj -Mr +ZF +ct +uh +ct +dc aD -qE -uO -Or -qE -wy -yW +aP +dZ +aS +aP +eQ +fd ae ad ad -WE -fh -fh -fh +hj +yv +yv +yv gg gg -Qo -Yb -fv -Xg -EQ -Md -Ig -Ig +Kp +DF +We +Iy +Sq +Ln +KA +KA fN -Uq -Yj +mu +na nA -Zd -Zt -GG -Np -DY -dF +oi +oI +pq +pU +qv +qZ fN ad ad -WE -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -WE -fh -fh -fh +hj +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +hj +yv +yv +yv ad ad ad @@ -43452,12 +43452,12 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv ad ad ad @@ -43625,38 +43625,38 @@ bV co cp cp -nc -CV +cM +cm aD -OG -vo -Or -Or -Tm -Wi +YL +ea +aS +aS +eR +BP ae -fh -fh -fh -fh -fh -RL +yv +yv +yv +yv +yv +Kl gg -am -SB -Ot -SB -Ig -PV -sb -Ig -eT +JH +BO +Il +BO +KA +Ox +Fn +KA +Iv fO -MR -em -BU -Bp -IS +mv +mY +nC +of +oM fO fN fO @@ -43665,24 +43665,24 @@ fO fO fK gg -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -43711,10 +43711,10 @@ ad ad ad ad -fh -fh -fh -fh +yv +yv +yv +yv ad ad ad @@ -43882,49 +43882,49 @@ ad ad ad ae -Jz -Fu +cN +UB dp -TU -eL -FI -Or -Or -GM -qE -fh -fh -fh -fh -fh -fh -Xe -Ei -Ig -Ig -Ig -eT -Ig -SB -Ig -Ig +GF +bM +ep +aS +aS +Rw +aP +yv +yv +yv +yv +yv +yv +gr +TJ +KA +KA +KA +Iv +KA +BO +KA +KA fO -Dv -So +ev +nb fO -To -LC +oj +za fO -TC +pV fO -gR +ra fN -WO -Ab +sA +ts gg gg -fh -fh +yv +yv vI vI vI @@ -43932,15 +43932,15 @@ vI vJ vI vI -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -43971,7 +43971,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -44139,67 +44139,67 @@ ad ad ad ae -Jz +cN de aC -UW -Kv -Kv -Kv -Kv -GM -qE -fh -fh -WE -fh -fh -fh -Xe -LU -Ck -ez -ez -Ck -eT -BK -Ct -VV +YY +eb +eb +eb +eb +Rw +aP +yv +yv +hj +yv +yv +yv +gr +Xx +De +Lz +Lz +De +Iv +TI +ET +Nt fO fN fN fO -Lf -NV +QC +oO fN -qK +pW fO -Zc +rb fN -EU -OY -Ek +sB +pX +tX gg -fh -zp +yv +RR vJ -Wd -Fk +wb +rs vK -RA -Wd +wM +wb vI ad ad -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -44227,8 +44227,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -44396,70 +44396,70 @@ ad ad ad ae -Jz +cN de -bw -jv -Eo -Or -Or -TW -GM -qE -fh -fh -fh -fh -fh -fh -Xe -Zq -Ue -Zq -Lu -Zq -Zq -Ck -eT -Zi -Nl +YH +Sw +aF +aS +aS +eS +Rw +aP +yv +yv +yv +yv +yv +yv +gr +EK +Rv +EK +Ly +EK +EK +De +Iv +Si +Aj fN -AB -Fl -ZS -Zg -CC -OY -RS -OY -xf -OY -OY -rW +RP +Vb +ol +oP +pr +pX +qw +pX +rL +pX +pX +tY gg -Xe -eK +gr +vm vJ -KU -zh +wc +wp vL -zh -kr +wp +wV vJ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -44484,7 +44484,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -44493,7 +44493,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -44651,57 +44651,57 @@ ad ad ad ad -Br +XF an -Jz +cN de -CE -jH -Kv -Kv -Kv -Kv -Wi -qE -fh -fh -fh -fh -fh -fh -Xe -Pd -IE -Ig -Ig -Ig -KM -Ck -Ig -Zi -KZ +Ej +Sm +eb +eb +eb +eb +BP +aP +yv +yv +yv +yv +yv +yv +gr +Kw +TF +KA +KA +KA +Rp +De +KA +Si +Jr fO -lh -FV -wI -Zm +WK +gA +om +oJ fO -Dq -Jx -Ii +pY +qx +rc fO -Pq -Pq +sC +sC fN fN -JM -dK +LA +vn vK -XQ -FP +wd +wq vL -RO -PZ +wN +si vJ vJ vJ @@ -44710,13 +44710,13 @@ vI vI vJ vI -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -44740,8 +44740,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -44750,7 +44750,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -44907,41 +44907,41 @@ ad ad ad ad -Br -ob +XF +Hp ae -Jz +cN df -IZ -Tu -Or -Or -Or -Or -By +Vz +Yq +aS +aS +aS +aS +Rl an -VW -fh -fh -fh -WE -fh +NC +yv +yv +yv +hj +yv gg -FB -Uj -Ig -Ig -Ig -zx -Ig -Wh -Zi -SB +Hc +LY +KA +KA +KA +VU +KA +Ux +Si +BO fO -tB -Ut -Yd -XM +TM +nE +on +VO fO fN fN @@ -44950,31 +44950,31 @@ fO fN fN fN -lk -RG -Al +ZE +uR +Ry vL we -IJ +wr vL -MO +wO we vK -PP -tc -SD -St -PP -PP +xl +xq +xw +xE +xl +xl vJ -fh -fh -fh -fh -fh -fh -fh -jV +yv +yv +yv +yv +yv +yv +yv +VT ad ad ad @@ -44996,8 +44996,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -45006,9 +45006,9 @@ ad ad ad ad -fh -fh -fh +yv +yv +yv ad ad ad @@ -45163,75 +45163,75 @@ ad ad ad ad -ob -Br -Br +Hp +XF +XF an -Jz +cN de -Fy -jH -Kv -Kv -Kv -Kv -BD +Uw +Sm +eb +eb +eb +eb +ME an an -fh -fh -fh +yv +yv +yv ad ad fK -Qu -Uj -Eh -eT -zj -HF -Ig -Uk -Cz -YI +DJ +LY +zB +Iv +KQ +aw +KA +Fw +ZI +Ic fN -In -Lq -OA -YT -Vw -HP -aL -AK -My -AK -AK -aL -AK -ak -EI -fP -GT -Jh -bD -Tc -wA +Ix +Gi +CK +CA +ps +Qz +qy +rd +GV +rd +rd +qy +rd +UO +vp +vM +wf +ws +wC +wt +wX vK -QM -TN +xm +xr xx -TN +xr xM -Wj +xT vI vI vI vI -KS -fh -fh -fh -Ep +Le +yv +yv +yv +LD ad ad ad @@ -45252,8 +45252,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -45264,7 +45264,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -45420,20 +45420,20 @@ ad ad ad ad -Br -Br -Br +XF +XF +XF an -yJ +dG df -GE -Lc -Or -Or -Or -Or -MX -Um +WH +MU +aS +aS +aS +aS +La +ft fK fK gg @@ -45442,19 +45442,19 @@ gg fK fK fO -wG +DM fN -HY +YO fO fO -Nu -Uk -ZH +Ze +Fw +Gt fO fO fO -yZ -xd +nG +op fO fO fN @@ -45464,36 +45464,36 @@ fN fN fO fO -FD +uz fO fN vK -DG -Tc -YB -ku -et +wg +wt +wD +wP +sj vL -Vx -Le -OV -KW -cR -ZP -zO -ba -fc -zO -Gr -fh -fh -fh -fh -fh -fh -fh -fh -fh +xn +xs +xy +xF +xN +xU +ww +xZ +yc +ww +Pj +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -45509,7 +45509,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -45520,8 +45520,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -45677,84 +45677,84 @@ ad ad ad ad -Br -Br -Br -qE -HX +XF +XF +XF +aP +cP df aC -Vl -Kv -Kv -Kv -Kv -HE -aE -DF -Dg -jA -nD +UN +eb +eb +eb +eb +Em +fu +fL +fZ +gh +gm fN -yY -Qj -ho -LO -IK -Pu -WJ +gC +gO +hp +hQ +ip +iJ +jd fO -KY -no -yR -Qt -UC -Nm -EA -pk -NX -Kb -aX -aX -gk -eg -Nm -An -Xu -Xu -US -Dn -IH -VH -zK -BV -zK -di -xk -GU -GU -zK -XV -VH -Wp -ek -Wq -cG +YM +Zo +Ma +lV +mx +ng +nH +oq +oS +pt +ja +ja +re +rN +ng +tt +tZ +tZ +uT +Sg +vN +wh +wu +wE +wu +Gg +xg +xo +xo +wu +xG +wh +xV +xX +ya +yd yf -Gr -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +Pj +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -45763,22 +45763,22 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad ad -fh +yv ad ad ad @@ -45935,108 +45935,108 @@ ad ad ad ad -ob -Br -qE -rV -Sx +Hp +XF +aP +cQ +dg co -gS -CJ -Pk -VQ -CN -ZG -UL -Tp -Dg -Dg -Dg -UG -Sc -Qj -zn -AW -QN -DU -Rx -WT -pi -KR -FQ -xj -KT -KT -KG -Dz -ow -KT -KT -KT -pZ -uf -kj -qF -PC -PC -PC -Jk -PR -RR -UT -Rz -iH -Ad -Ps -UM -DI -Lp -UP -TD -pl -TO -FT -RD -zO -Gr -fh -fh -fh -fh -fh +MC +ec +eq +eD +en +XN +PA +fM +fZ +fZ +fZ +gu +gD +gO +hq +hR +hr +iK +je +QL +VG +JD +DO +lW +my +my +nI +or +oT +my +my +my +rf +rO +sD +tu +ua +ua +ua +EL +vO +wi +wv +wF +wQ +Uy +xh +xp +xt +xz +xH +xP +xW +xY +yb +ye +ww +Pj +yv +yv +yv +yv +yv ad ad ad -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad -fh -fh -WE +yv +yv +hj ad ad ad @@ -46192,109 +46192,109 @@ ad ad ad ad -Br -Br +XF +XF an -Wa -XW +GH +cc aC -wz -ER -ER -ER -oc -Pj -zr +Aa +Ql +Ql +Ql +Vo +CS +fw fN -KP -Dg -Jg +ga +fZ +Hl fO -NL -Qj -QN -yQ -Zw -Qj -Qj +gE +gO +hr +hS +iq +gO +gO jB -XF +jY fO fK gg gg -Xe -Xe -Xe +gr +gr +gr gg -Xe -Xe -Xe +gr +gr +gr fK -yT -zS +rP +sE gg -Xe -Xe -Xe +gr +gr +gr fK vI vI -zO -zO -zO +ww +ww +ww vI vI vJ -zO -Hz -Dc -zO +ww +xA +xI +ww vI vI vI vI vI -KS -fh -fh -fh -fh -fh +Le +yv +yv +yv +yv +yv ad ad ad ad -fh +yv ad -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad -fh +yv ad ad ad ad -fh -fh -fh -fh -fh -WE -fh -fh -fh -fh +yv +yv +yv +yv +yv +hj +yv +yv +yv +yv ad ad ad @@ -46449,75 +46449,75 @@ ad ad ad ad -Br -Br +XF +XF an -Cw -CR +cS +pn aC -Pm -JE -Ym -cy -Kn +FH +ze +MQ +Ls +Gj aC -XI +fx fO fO -Mk +gi fO fO -OF -Qj -Qj -AC -Qj -Qj -Sc +gF +gO +gO +hT +gO +gO +gD jB -CF -XZ +jZ +Js ae -fh -fh -fh -fh -fh -XU -fh -fh -fh -Xe -Db -Rd -Xe -fh -fh -fh -fh -fh -GL -fh -fh -fh -fh +yv +yv +yv +yv +yv +Ld +yv +yv +yv +gr +rQ +sF +gr +yv +yv +yv +yv +yv +EG +yv +yv +yv +yv ad vJ -ZW -OR -bC -Kc +xu +xB +xJ +xQ vI -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -46526,12 +46526,12 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv ad ad ad @@ -46544,14 +46544,14 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -46706,11 +46706,11 @@ ad ad ad ad -ob -Br +Hp +XF an -He -XW +cT +cc aC aC aC @@ -46718,63 +46718,63 @@ aC aC aC aC -JK -zd -AE -zd -UQ +fy +bq +FR +bq +go fN -Hm -NZ -zY -Of -Df -zU -Xp +gG +gP +hs +hU +ir +dO +jf jC -Id -DK +ka +kw an -fh -fh -fh -fh -fh -fh -fh -fh -fh -Xe -Oc -JS -Xe -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +gr +rR +sG +gr +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad vI -ZW -Me -Nn +xu +xC +xK xR vJ -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -46783,9 +46783,9 @@ ad ad ad ad -fh -fh -fh +yv +yv +yv ad ad ad @@ -46802,14 +46802,14 @@ ad ad ad ad -WE -fh -fh -fh -fh -fh -fh -fh +hj +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -46963,74 +46963,74 @@ ad ad ad ad -Br -Br +XF +XF ae -SO -CZ -Ko -PU -Ba -Kj -zW -Kj -Kj -Vr -CY -BX -ll -Oo +cU +dh +cq +tx +uh +ct +eF +ct +ct +VR +PQ +gb +gj +Zh fO fN fN fN -az +hV fO fN fO jC -Xq -bg +Dw +kx an -fh -fh -fh -fh -fh -fh -fh -fh -fh -Xe -YV -Rd -Xe -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +gr +rS +sF +gr +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv vI -Tv -SJ -zQ +xv +xD +xL xS vI -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -47041,9 +47041,9 @@ ad ad ad ad -fh -fh -fh +yv +yv +yv ad ad ad @@ -47060,12 +47060,12 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv ad ad ad @@ -47229,63 +47229,63 @@ co co cp es -GR +eG cp fm fm fm gc -CZ -HC -BX -Ng -CY -BX -Av -Ng -Gl -BX -VF -Dl +dh +gq +gb +gH +PQ +gb +hW +gH +Ty +gb +vq +kc an an -fh -fh -fh -fh -fh -fh -fh -fh -RL +yv +yv +yv +yv +yv +yv +yv +yv +Kl gg -Fo -Ge +rT +sH gg -Is -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +ow +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv vI vI vJ vI vJ vI -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -47299,9 +47299,9 @@ ad ad ad ad -fh -fh -fh +yv +yv +yv ad ad ad @@ -47319,9 +47319,9 @@ ad ad ad ad -fh -WE -fh +yv +hj +yv ad ad ad @@ -47485,12 +47485,12 @@ ad ad ad ae -JQ -Es -Bl +Ca +eH +eV an -fh -fh +yv +yv gd fm fm @@ -47498,50 +47498,50 @@ fm dv dv fm -AP +hX fm fm fm jE an ae -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -Xe -Db -Rd -Xe -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +gr +rQ +sF +gr +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -47557,8 +47557,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -47576,7 +47576,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -47742,63 +47742,63 @@ ad ad ad ae -qE -dJ -qE +aP +eI +aP an -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -zI -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -dU -Xe -Fj -Qm -Xe -dU -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +XO +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +NA +gr +rU +sI +gr +NA +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -47815,8 +47815,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -47833,7 +47833,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -47999,61 +47999,61 @@ ad ad ad ad -Gr -Gr -Gr -zI -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -Wl -Da -JP -Lr -Da -zg -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +Pj +Pj +Pj +XO +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +Zy +rg +Yo +Ta +rg +uY +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -48072,9 +48072,9 @@ ad ad ad ad -fh -fh -fh +yv +yv +yv ad ad ad @@ -48090,7 +48090,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -48257,54 +48257,54 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv ad -fh -fh -fh -fh -fh -Eu -Ex -zg +yv +yv +yv +yv +yv +wI +Uj +uY fK -nV -EM +GB +FN fK -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -48330,8 +48330,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -48341,13 +48341,13 @@ ad ad ad ad -fh +yv ad ad ad ad ad -fh +yv ad ad ad @@ -48518,46 +48518,46 @@ ad ad ad ad -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv ad ad -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad -fh -fh -fh -fh -Bb +yv +yv +yv +yv +zf ni ni ln -ZQ -sJ +rX +sL ln ni ni -Mq -Mq +qb +qb ni ni -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv ad ad ad @@ -48588,8 +48588,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -48597,8 +48597,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -48778,42 +48778,42 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad -fh -fh -fh -fh -Bb +yv +yv +yv +yv +zf ni -Pg -SP -DB -zD -JG +qC +rh +rY +sM +tv uc -PI -Oa -XO -ew +Ri +uU +vs +vP ni ln -Mq -Mq -Mq +qb +qb +qb ln ln ad @@ -48845,16 +48845,16 @@ ad ad ad ad -fh -fh -fh +yv +yv +yv ad ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -49037,41 +49037,41 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad -fh -fh -fh -fh -fh -Bb -Mq -DA -Bh -Ew -zD -jW +yv +yv +yv +yv +yv +zf +qb +qD +ri +rZ +sM +tw ud -UR -sK -dt -Ky +uB +uV +rj +vQ uE -nw -Vv -SC -eW -hJ +Jt +Ga +Hj +FZ +SL ni ad ad @@ -49103,14 +49103,14 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -49295,40 +49295,40 @@ ad ad ad ad -fh -fh -fh -fh +yv +yv +yv +yv ad ad -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -Bb -Mq -DA -dt -xe -Wc -sd -KK -xO -Lt -ah -Ae -Er -Xj -Cq -Sf -Fb -MZ +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +zf +qb +qD +rj +sa +sN +Jj +ue +uC +uW +vt +vR +wk +zq +Cs +Mb +MJ +NY ni ad ad @@ -49360,8 +49360,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -49552,40 +49552,40 @@ ad ad ad ad -fh -fh -fh +yv +yv +yv ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -Xt +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +ht ni ln -Tx -Pp -Jl -Qe +Kf +Yz +Pn +QJ ln -vW -zD -Xn -FS -Zf -Vq -wo -SE -Ws -dd +uD +sM +vu +vS +wl +Ft +zE +Fe +OE +WN ln ad ad @@ -49617,9 +49617,9 @@ ad ad ad ad -fh -fh -fh +yv +yv +yv ad ad ad @@ -49809,39 +49809,39 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -Bb -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +zf +yv ni ni -Tg -Mh +sc +sP ln ln uE -ZY -Ns -FF -pP -MG -Jo -fk -VZ +uX +vv +vT +NG +Ve +Qq +TQ +Sd ln ln ad @@ -49875,8 +49875,8 @@ ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -50067,38 +50067,38 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad -fh -fh -Bb -fh +yv +yv +zf +yv ni -hL -zC -Tn -Dt -YC -Mq -zD -NW -MA +Sh +YZ +Vf +GO +UD +qb +sM +vw +vU wn uE -Ij +wK uE -hv +HO ln ad ad @@ -50132,9 +50132,9 @@ ad ad ad ad -fh -fh -fh +yv +yv +yv ad ad ad @@ -50327,11 +50327,11 @@ ad ad ad ad -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv ad ad ad @@ -50339,21 +50339,21 @@ ad ad ad ad -Bb -fh +zf +yv ni -Vm -Xh -ty -YP -Am -aT -ty -OT -MD +NQ +se +sR +tA +Vu +uF +sR +vx +vV uE -QT -Os +wB +wL ln ln ni @@ -50384,15 +50384,15 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv ad -fh -fh +yv +yv ad ad ad @@ -50599,15 +50599,15 @@ ad px ad ln -Yi -Uh -dM -EF -zV -Mq -HV -Mp -GZ +NH +Vh +AG +AX +AR +qb +JY +LH +Qf ni ln ni @@ -50643,15 +50643,15 @@ ad ad ad ad -fh -fh -fh -fh +yv +yv +yv +yv ad ad -fh -fh -fh +yv +yv +yv ad ad ad @@ -50857,13 +50857,13 @@ py ln ln ro -dj -zH -zH +sg +sT +sT ln ln uZ -LN +vz vX ni ad @@ -50903,17 +50903,17 @@ ad ad ad ad -fh +yv ad ad ad ad -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv ad ad ad @@ -51107,21 +51107,21 @@ ln ln ln ln -Hk -NF -GW -UJ -Mq -JN -KH -RQ -Pa -WS -kv +nJ +os +oU +pz +qb +RX +rp +sh +sU +tC +ui ln -yM -UY -XR +va +vA +vY ln ad ad @@ -51160,7 +51160,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -51361,24 +51361,24 @@ ad ad ad ln -Lm -OW +lX +mz ln -Sr -wW -Cc -zf -Mq -OO -BI -dD -Ru -Ar -PN -sO -jD -Lj -CI +nK +ot +oV +pA +qb +zt +mL +qH +sV +tD +uj +uG +vb +vB +vZ ln ad ad @@ -51417,7 +51417,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -51618,24 +51618,24 @@ ad ad ad ln -YW -Ch -OP -Sr -Eq -yX -Nh -NP -VS -Wt -wT -KN -Ax -EG +lY +mA +nh +nK +ou +oW +pB +qc +qG +pj +rq +sW +tE +uk uH -CL -Ui -EE +vc +vC +wa ni ad ad @@ -51668,13 +51668,13 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -51875,20 +51875,20 @@ ad ad ad ln -CG -CG +lZ +lZ ni -Sr -wW -Go -WR -Mq -Pr -hm -Ah -Wg -fa -Oe +nK +ot +oX +pC +qb +Xm +mZ +sk +sX +tF +ul ln ln ln @@ -51931,7 +51931,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -52135,18 +52135,18 @@ ln ln ln ni -FW -HG -Tt -od -Mq -ES -VC -AD -Hd -cl -Sl -HN +nL +ov +oY +pD +qb +HD +rt +sl +sY +tG +EV +uI vd vD ln @@ -52188,7 +52188,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -52397,13 +52397,13 @@ ln ln ni ln -RU -LG -Lw -eU -er -Hf -hj +qJ +ru +sm +sZ +tH +Tk +uJ ve vE ln @@ -52445,7 +52445,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -52653,13 +52653,13 @@ ad ln oZ pE -bm -ok -AT -Jn -VC -dt -UV +qd +Co +rv +sn +rt +rj +uo ni ln ln @@ -52702,7 +52702,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -52910,14 +52910,14 @@ ad ln pa pF -hI -ZX -Ir -Ai -Bj -dt -UH -HN +qe +qL +rw +so +ta +rj +QB +uI vf vF ln @@ -52948,8 +52948,8 @@ ad ad ad ad -fh -WE +yv +hj ad ad ad @@ -52959,7 +52959,7 @@ ad ad ad ad -fh +yv ad ad ad @@ -53168,13 +53168,13 @@ ln ln ln ln -yy -Eg -Ai -av -Qv -Ea -hj +qM +rx +so +tb +tI +Yu +uJ vg vG ln @@ -53202,21 +53202,21 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv ad ad ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -53425,12 +53425,12 @@ ad ad ad ln -WI -WI -KC -Iz -Fc -EH +qN +qN +Fx +PX +tJ +ur ni ln ln @@ -53459,21 +53459,21 @@ ad ad ad ad -fh -WE -fh +yv +hj +yv ad ad ad -fh +yv ad ad ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -53684,8 +53684,8 @@ ad ln ln ln -Mt -Ys +sq +td ln ni ni @@ -53715,22 +53715,22 @@ ad ad ad ad -fh -fh -fh -fh -fh -WE -fh -fh -fh +yv +yv +yv +yv +yv +hj +yv +yv +yv ad ad ad ad ad -fh -fh +yv +yv ad ad ad @@ -53972,22 +53972,22 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -WE -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +hj +yv ad -fh -fh +yv +yv ad ad ad @@ -54229,22 +54229,22 @@ ad ad ad ad -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -54487,20 +54487,20 @@ ad ad ad ad -WE -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +hj +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -54744,19 +54744,19 @@ ad ad ad ad -fh -WE -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh -fh +yv +hj +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv +yv ad ad ad @@ -55008,11 +55008,11 @@ ad ad ad ad -fh -WE -fh -fh -fh +yv +hj +yv +yv +yv ad ad ad diff --git a/_maps/arenas/aiupload.dmm b/_maps/arenas/aiupload.dmm index 32be0208f4a19..2868231f6dac5 100644 --- a/_maps/arenas/aiupload.dmm +++ b/_maps/arenas/aiupload.dmm @@ -28,7 +28,7 @@ dir = 1 }, /obj/structure/window/reinforced{ - CanAtmosPass = 3; + can_atmos_pass = 3; dir = 4 }, /turf/open/floor/iron/techmaint, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 08c1ad212a92c..272848b690bca 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -41434,7 +41434,7 @@ }, /turf/open/floor/plating{ initial_gas_mix = "o2=0.01;n2=0.01;TEMP=2.7"; - initial_temperature = 2.7; + temperature = 2.7; luminosity = 2 }, /area/security/main) @@ -78455,7 +78455,11 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 1 }, -/turf/open/floor/iron, +/turf/open/floor/plating{ + initial_gas_mix = "o2=0.01;n2=0.01;TEMP=2.7"; + temperature = 2.7; + luminosity = 2 + }, /area/security/brig) "sXV" = ( /obj/structure/cable/yellow{ @@ -92207,7 +92211,7 @@ }, /turf/open/floor/plating{ initial_gas_mix = "o2=0.01;n2=0.01;TEMP=2.7"; - initial_temperature = 2.7; + temperature = 2.7; luminosity = 2 }, /area/security/main) @@ -93569,9 +93573,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/quartermaster/miningoffice) +/turf/open/floor/plating{ + initial_gas_mix = "o2=0.01;n2=0.01;TEMP=2.7"; + temperature = 2.7; + luminosity = 2 + }, +/area/security/brig) "xKK" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical{ diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index c7e290a13da9f..31d147b3ebb45 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -10498,7 +10498,7 @@ /area/centcom/control) "NT" = ( /obj/structure/window/paperframe{ - CanAtmosPass = 0 + can_atmos_pass = 0 }, /turf/open/floor/wood, /area/centcom/holding) diff --git a/beestation.dme b/beestation.dme index f6d5d032728b9..ded4d8a821eeb 100644 --- a/beestation.dme +++ b/beestation.dme @@ -43,7 +43,6 @@ #include "code\__DEFINES\assemblies.dm" #include "code\__DEFINES\assets.dm" #include "code\__DEFINES\async.dm" -#include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\atom_hud.dm" #include "code\__DEFINES\balloon_alert.dm" #include "code\__DEFINES\bans.dm" @@ -199,6 +198,11 @@ #include "code\__DEFINES\xenoartifact_materials.dm" #include "code\__DEFINES\xenobiology.dm" #include "code\__DEFINES\zmimic.dm" +#include "code\__DEFINES\atmospherics\atmos_core.dm" +#include "code\__DEFINES\atmospherics\atmos_helpers.dm" +#include "code\__DEFINES\atmospherics\atmos_mapping_helpers.dm" +#include "code\__DEFINES\atmospherics\atmos_mob_interaction.dm" +#include "code\__DEFINES\atmospherics\atmos_piping.dm" #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals.dm" @@ -334,6 +338,7 @@ #include "code\_globalvars\lists\admin.dm" #include "code\_globalvars\lists\ambience.dm" #include "code\_globalvars\lists\client.dm" +#include "code\_globalvars\lists\color.dm" #include "code\_globalvars\lists\flavor_misc.dm" #include "code\_globalvars\lists\jobs.dm" #include "code\_globalvars\lists\maintenance_loot.dm" @@ -415,7 +420,6 @@ #include "code\controllers\configuration\entries\resources.dm" #include "code\controllers\subsystem\achievements.dm" #include "code\controllers\subsystem\acid.dm" -#include "code\controllers\subsystem\adjacent_air.dm" #include "code\controllers\subsystem\air.dm" #include "code\controllers\subsystem\ambience.dm" #include "code\controllers\subsystem\area_contents.dm" @@ -842,6 +846,7 @@ #include "code\datums\elements\_element.dm" #include "code\datums\elements\art.dm" #include "code\datums\elements\atmos_requirements.dm" +#include "code\datums\elements\atmos_sensitive.dm" #include "code\datums\elements\basic_body_temp_sensitive.dm" #include "code\datums\elements\bed_tucking.dm" #include "code\datums\elements\bsa_blocker.dm" @@ -1833,6 +1838,7 @@ #include "code\modules\admin\verbs\deadsay.dm" #include "code\modules\admin\verbs\debug.dm" #include "code\modules\admin\verbs\diagnostics.dm" +#include "code\modules\admin\verbs\fix_air.dm" #include "code\modules\admin\verbs\forcecryo.dm" #include "code\modules\admin\verbs\fps.dm" #include "code\modules\admin\verbs\getlogs.dm" @@ -2215,13 +2221,12 @@ #include "code\modules\asset_cache\spritesheet\batched\universal_icon.dm" #include "code\modules\asset_cache\transports\asset_transport.dm" #include "code\modules\asset_cache\transports\webroot_transport.dm" -#include "code\modules\atmospherics\auxgm\breathing_classes.dm" -#include "code\modules\atmospherics\auxgm\gas_types.dm" #include "code\modules\atmospherics\environmental\LINDA_fire.dm" #include "code\modules\atmospherics\environmental\LINDA_system.dm" #include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm" -#include "code\modules\atmospherics\gasmixtures\auxgm.dm" +#include "code\modules\atmospherics\gasmixtures\breathing_classes.dm" #include "code\modules\atmospherics\gasmixtures\gas_mixture.dm" +#include "code\modules\atmospherics\gasmixtures\gas_types.dm" #include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm" #include "code\modules\atmospherics\gasmixtures\reactions.dm" #include "code\modules\atmospherics\machinery\airalarm.dm" diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm deleted file mode 100644 index c5caf46379798..0000000000000 --- a/code/__DEFINES/atmospherics.dm +++ /dev/null @@ -1,404 +0,0 @@ -//ATMOS -//stuff you should probably leave well alone! -/// kPa*L/(K*mol) -#define R_IDEAL_GAS_EQUATION 8.31 -/// kPa -#define ONE_ATMOSPHERE 101.325 -/// -270.3degC -#define TCMB 2.7 -/// -48.15degC -#define TCRYO 225 -/// 0degC -#define T0C 273.15 -/// 20degC -#define T20C 293.15 -/// -14C - Temperature used for kitchen cold room, medical freezer, etc. -#define COLD_ROOM_TEMP 259.15 - -///moles in a 2.5 m^3 cell at 101.325 Pa and 20 degC (103 or so) -#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) -///compared against for superconductivity -#define M_CELL_WITH_RATIO (MOLES_CELLSTANDARD * 0.005) -/// percentage of oxygen in a normal mixture of air -#define O2STANDARD 0.21 -/// same but for nitrogen -#define N2STANDARD 0.79 -/// O2 standard value (21%) -#define MOLES_O2STANDARD (MOLES_CELLSTANDARD*O2STANDARD) -/// N2 standard value (79%) -#define MOLES_N2STANDARD (MOLES_CELLSTANDARD*N2STANDARD) -/// liters in a cell -#define CELL_VOLUME 2500 - -#define BREATH_VOLUME 0.5 //! liters in a normal breath -#define BREATH_PERCENTAGE (BREATH_VOLUME/CELL_VOLUME) //! Amount of air to take a from a tile - -//EXCITED GROUPS -#define EXCITED_GROUP_BREAKDOWN_CYCLES 3 //! number of FULL air controller ticks before an excited group breaks down (averages gas contents across turfs) -#define EXCITED_GROUP_DISMANTLE_CYCLES 15 //! number of FULL air controller ticks before an excited group dismantles and removes its turfs from active -#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.1 //! Ratio of air that must move to/from a tile to reset group processing -#define MINIMUM_AIR_RATIO_TO_MOVE 0.05 //! Minimum ratio of air that must move to/from a tile -#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //! Minimum amount of air that has to move before a group processing can be suspended -#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_MOVE) //! Either this must be active or MINIMUM_TEMPERATURE_TO_MOVE -#define MINIMUM_TEMPERATURE_TO_MOVE (T20C+100) //! Either this must be active or MINIMUM_MOLES_DELTA_TO_MOVE -#define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 //! Minimum temperature difference before group processing is suspended -#define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 1 //! Minimum temperature difference before the gas temperatures are just set to be equal -#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION (T20C+10) -#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION (T20C+200) - -//HEAT TRANSFER COEFFICIENTS -//Must be between 0 and 1. Values closer to 1 equalize temperature faster -//Should not exceed 0.4 else strange heat flow occur -#define WALL_HEAT_TRANSFER_COEFFICIENT 0.0 -#define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4 -#define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 //a hack for now -#define HEAT_CAPACITY_VACUUM 7000 //a hack to help make vacuums "cold", sacrificing realism for gameplay - -//FIRE -#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD (150+T0C) -#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST (100+T0C) -#define FIRE_SPREAD_RADIOSITY_SCALE 0.85 -#define FIRE_GROWTH_RATE 40000 //For small fires -#define PLASMA_MINIMUM_BURN_TEMPERATURE (100+T0C) -#define PLASMA_UPPER_TEMPERATURE (1370+T0C) -#define PLASMA_OXYGEN_FULLBURN 10 - -//GASES -#define MIN_TOXIC_GAS_DAMAGE 1 -#define MAX_TOXIC_GAS_DAMAGE 10 -#define MOLES_GAS_VISIBLE 0.25 //! Moles in a standard cell after which gases are visible - -#define FACTOR_GAS_VISIBLE_MAX 20 //! moles_visible * FACTOR_GAS_VISIBLE_MAX = Moles after which gas is at maximum visibility -#define MOLES_GAS_VISIBLE_STEP 0.25 //! Mole step for alpha updates. This means alpha can update at 0.25, 0.5, 0.75 and so on - -//REACTIONS -//return values for reactions (bitflags) -#define NO_REACTION 0 -#define REACTING 1 -#define STOP_REACTIONS 2 - -// Pressure limits. -/// This determins at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant) -#define HAZARD_HIGH_PRESSURE 550 -/// This determins when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE) -#define WARNING_HIGH_PRESSURE 325 -/// This is when the gray low pressure icon is displayed. (it is 2.5 * HAZARD_LOW_PRESSURE) -#define WARNING_LOW_PRESSURE 50 -/// This is when the black ultra-low pressure icon is displayed. (This one is set as a constant) -#define HAZARD_LOW_PRESSURE 20 - -/// This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount. -#define TEMPERATURE_DAMAGE_COEFFICIENT 1.5 - -/// The natural temperature for a body -#define BODYTEMP_NORMAL 310.15 -/// This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive. -#define BODYTEMP_AUTORECOVERY_DIVISOR 14 -/// Minimum amount of kelvin moved toward 310K per tick. So long as abs(310.15 - bodytemp) is more than 50. -#define BODYTEMP_AUTORECOVERY_MINIMUM 6 -///Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is lower than their body temperature. Make it lower to lose bodytemp faster. -#define BODYTEMP_COLD_DIVISOR 15 -/// Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is higher than their body temperature. Make it lower to gain bodytemp faster. -#define BODYTEMP_HEAT_DIVISOR 15 -/// The maximum number of degrees that your body can cool in 1 tick, due to the environment, when in a cold area. -#define BODYTEMP_COOLING_MAX -30 -/// The maximum number of degrees that your body can heat up in 1 tick, due to the environment, when in a hot area. -#define BODYTEMP_HEATING_MAX 30 - -/// The body temperature limit the human body can take before it starts taking damage from heat. -/// This also affects how fast the body normalises it's temperature when hot. -/// 340k is about 66c, and rather high for a human. -#define BODYTEMP_HEAT_DAMAGE_LIMIT (BODYTEMP_NORMAL + 30) -/// The body temperature limit the human body can take before it starts taking damage from cold. -/// This also affects how fast the body normalises it's temperature when cold. -/// 270k is about -3c, that is below freezing and would hurt over time. -#define BODYTEMP_COLD_DAMAGE_LIMIT (BODYTEMP_NORMAL - 40) -/// The body temperature limit the human body can take before it will take wound damage. -#define BODYTEMP_HEAT_WOUND_LIMIT (BODYTEMP_NORMAL + 90) // 400.5 k - -// Body temperature warning icons -/// The temperature the red icon is displayed. -#define BODYTEMP_HEAT_WARNING_3 (BODYTEMP_HEAT_DAMAGE_LIMIT + 360) //+700k -/// The temperature the orange icon is displayed. -#define BODYTEMP_HEAT_WARNING_2 (BODYTEMP_HEAT_DAMAGE_LIMIT + 120) //460K -/// The temperature the yellow icon is displayed. -#define BODYTEMP_HEAT_WARNING_1 (BODYTEMP_HEAT_DAMAGE_LIMIT) //340K -/// The temperature the light green icon is displayed. -#define BODYTEMP_COLD_WARNING_1 (BODYTEMP_COLD_DAMAGE_LIMIT) //270k -/// The temperature the cyan icon is displayed. -#define BODYTEMP_COLD_WARNING_2 (BODYTEMP_COLD_DAMAGE_LIMIT - 70) //200k -/// The temperature the blue icon is displayed. -#define BODYTEMP_COLD_WARNING_3 (BODYTEMP_COLD_DAMAGE_LIMIT - 150) //120k - -/// what min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0. -#define SPACE_HELM_MIN_TEMP_PROTECT 2.0 -/// Thermal insulation works both ways /Malkevin -#define SPACE_HELM_MAX_TEMP_PROTECT 1500 -/// what min_cold_protection_temperature is set to for space-suit quality jumpsuits or suits. MUST NOT BE 0. -#define SPACE_SUIT_MIN_TEMP_PROTECT 2.0 -/// The min cold protection of a space suit without the heater active -#define SPACE_SUIT_MIN_TEMP_PROTECT_OFF 72 -#define SPACE_SUIT_MAX_TEMP_PROTECT 1500 - -#define FIRE_SUIT_MIN_TEMP_PROTECT 60 //! Cold protection for firesuits -#define FIRE_SUIT_MAX_TEMP_PROTECT 30000 //! what max_heat_protection_temperature is set to for firesuit quality suits. MUST NOT BE 0. -#define FIRE_HELM_MIN_TEMP_PROTECT 60 //! Cold protection for fire helmets -#define FIRE_HELM_MAX_TEMP_PROTECT 30000 //! for fire helmet quality items (red and white hardhats) - -#define FIRE_IMMUNITY_MAX_TEMP_PROTECT 35000 //! what max_heat_protection_temperature is set to for firesuit quality suits and helmets. MUST NOT BE 0. - -//Emergency skinsuits -#define EMERGENCY_HELM_MIN_TEMP_PROTECT 2.0 //The helmet is pressurized with air from the oxygen tank. If they don't take damage from that they won't take damage here -#define EMERGENCY_SUIT_MIN_TEMP_PROTECT 237 //This is the approximate average temperature of Mt. Everest in the winter - -#define HELMET_MIN_TEMP_PROTECT 160 //For normal helmets -#define HELMET_MAX_TEMP_PROTECT 600 //For normal helmets -#define ARMOR_MIN_TEMP_PROTECT 160 //For armor -#define ARMOR_MAX_TEMP_PROTECT 600 //For armor - -#define GLOVES_MIN_TEMP_PROTECT 2.0 //For some gloves (black and) -#define GLOVES_MAX_TEMP_PROTECT 1500 //For some gloves -#define SHOES_MIN_TEMP_PROTECT 2.0 //For gloves -#define SHOES_MAX_TEMP_PROTECT 1500 //For gloves - -#define PRESSURE_DAMAGE_COEFFICIENT 4 //! The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE -#define MAX_HIGH_PRESSURE_DAMAGE 4 -#define LOW_PRESSURE_DAMAGE 4 //! The amount of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). - -#define COLD_SLOWDOWN_FACTOR 20 //! Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this - -//PIPES -//Atmos pipe limits -/// (kPa) What pressure pumps and powered equipment max out at. -#define MAX_OUTPUT_PRESSURE 4500 -/// (L/s) Maximum speed powered equipment can work at. -#define MAX_TRANSFER_RATE 200 -/// How many percent of the contents that an overclocked volume pumps leak into the air -#define VOLUME_PUMP_LEAK_AMOUNT 0.1 - -//used for device_type vars -#define UNARY 1 -#define BINARY 2 -#define TRINARY 3 -#define QUATERNARY 4 - -//TANKS -#define TANK_MELT_TEMPERATURE 1000000 //! temperature in kelvins at which a tank will start to melt -#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) //! temperature in kelvins at which a tank starts leaking -#define TANK_RUPTURE_PRESSURE (35.*ONE_ATMOSPHERE) //! temperature in kelvins at which a tank spills all contents into atmosphere -#define TANK_FRAGMENT_PRESSURE (40.*ONE_ATMOSPHERE) //! temperature in kelvins at which a tank creates a boom 3x3 base explosion -#define TANK_FRAGMENT_SCALE (6.*ONE_ATMOSPHERE) //! +1 for each SCALE kPa aboe threshold -#define TANK_MAX_RELEASE_PRESSURE (ONE_ATMOSPHERE*3) -#define TANK_MIN_RELEASE_PRESSURE 0 -#define TANK_DEFAULT_RELEASE_PRESSURE 17 - -//CANATMOSPASS -#define ATMOS_PASS_YES 1 -#define ATMOS_PASS_NO 0 -#define ATMOS_PASS_PROC -1 //ask CanAtmosPass() -#define ATMOS_PASS_DENSITY -2 //just check density - -#define CANATMOSPASS(A, O) ( A.CanAtmosPass == ATMOS_PASS_PROC ? A.CanAtmosPass(O) : ( A.CanAtmosPass == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPass ) ) -#define CANVERTICALATMOSPASS(A, O) ( A.CanAtmosPassVertical == ATMOS_PASS_PROC ? A.CanAtmosPass(O, TRUE) : ( A.CanAtmosPassVertical == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPassVertical ) ) - -//OPEN TURF ATMOS -/// the default air mix that open turfs spawn -#define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" -#define OPENTURF_LOW_PRESSURE "o2=14;n2=30;TEMP=293.15" -/// -193,15°C telecommunications. also used for xenobiology slime killrooms -#define TCOMMS_ATMOS "n2=100;TEMP=80" -/// space -#define AIRLESS_ATMOS "TEMP=2.7" -/// -93.15°C snow and ice turfs -#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" -/// -14°C kitchen coldroom, just might lose your tail; higher amount of mol to reach about 101.3 kpA -#define KITCHEN_COLDROOM_ATMOS "o2=26;n2=97;TEMP=[COLD_ROOM_TEMP]" -/// used in the holodeck burn test program -#define BURNMIX_ATMOS "o2=100;plasma=200;TEMP=370" //used in the holodeck burn test program - -//ATMOSPHERICS DEPARTMENT GAS TANK TURFS -#define ATMOS_TANK_N2O "n2o=6000;TEMP=293.15" -#define ATMOS_TANK_CO2 "co2=50000;TEMP=293.15" -#define ATMOS_TANK_PLASMA "plasma=70000;TEMP=293.15" -#define ATMOS_TANK_O2 "o2=100000;TEMP=293.15" -#define ATMOS_TANK_N2 "n2=100000;TEMP=293.15" -#define ATMOS_TANK_AIRMIX "o2=2644;n2=10580;TEMP=293.15" - -//LAVALAND -#define MAXIMUM_LAVALAND_EQUIPMENT_EFFECT_PRESSURE 90 //! what pressure you have to be under to increase the effect of equipment meant for lavaland -#define LAVALAND_DEFAULT_ATMOS "o2=14;n2=5;co2=13;TEMP=300" - -//ATMOS MIX IDS -//Lavaland used to live here. That was a mistake. - -//ATMOSIA GAS MONITOR TAGS -#define ATMOS_GAS_MONITOR_INPUT_O2 "o2_in" -#define ATMOS_GAS_MONITOR_OUTPUT_O2 "o2_out" -#define ATMOS_GAS_MONITOR_SENSOR_O2 "o2_sensor" - -#define ATMOS_GAS_MONITOR_INPUT_PLASMA "plasma_in" -#define ATMOS_GAS_MONITOR_OUTPUT_PLASMA "plasma_out" -#define ATMOS_GAS_MONITOR_SENSOR_PLASMA "plasma_sensor" - -#define ATMOS_GAS_MONITOR_INPUT_AIR "air_in" -#define ATMOS_GAS_MONITOR_OUTPUT_AIR "air_out" -#define ATMOS_GAS_MONITOR_SENSOR_AIR "air_sensor" - -#define ATMOS_GAS_MONITOR_INPUT_MIX "mix_in" -#define ATMOS_GAS_MONITOR_OUTPUT_MIX "mix_out" -#define ATMOS_GAS_MONITOR_SENSOR_MIX "mix_sensor" - -#define ATMOS_GAS_MONITOR_INPUT_N2O "n2o_in" -#define ATMOS_GAS_MONITOR_OUTPUT_N2O "n2o_out" -#define ATMOS_GAS_MONITOR_SENSOR_N2O "n2o_sensor" - -#define ATMOS_GAS_MONITOR_INPUT_N2 "n2_in" -#define ATMOS_GAS_MONITOR_OUTPUT_N2 "n2_out" -#define ATMOS_GAS_MONITOR_SENSOR_N2 "n2_sensor" - -#define ATMOS_GAS_MONITOR_INPUT_CO2 "co2_in" -#define ATMOS_GAS_MONITOR_OUTPUT_CO2 "co2_out" -#define ATMOS_GAS_MONITOR_SENSOR_CO2 "co2_sensor" - -#define ATMOS_GAS_MONITOR_INPUT_INCINERATOR "incinerator_in" -#define ATMOS_GAS_MONITOR_OUTPUT_INCINERATOR "incinerator_out" -#define ATMOS_GAS_MONITOR_SENSOR_INCINERATOR "incinerator_sensor" - -#define ATMOS_GAS_MONITOR_INPUT_TOXINS_LAB "toxinslab_in" -#define ATMOS_GAS_MONITOR_OUTPUT_TOXINS_LAB "toxinslab_out" -#define ATMOS_GAS_MONITOR_SENSOR_TOXINS_LAB "toxinslab_sensor" - -#define ATMOS_GAS_MONITOR_LOOP_DISTRIBUTION "distro-loop_meter" -#define ATMOS_GAS_MONITOR_LOOP_ATMOS_WASTE "atmos-waste_loop_meter" - -#define ATMOS_GAS_MONITOR_WASTE_ENGINE "engine-waste_out" -#define ATMOS_GAS_MONITOR_WASTE_ATMOS "atmos-waste_out" - -#define ATMOS_GAS_MONITOR_INPUT_SM "sm_in" -#define ATMOS_GAS_MONITOR_OUTPUT_SM "sm_out" -#define ATMOS_GAS_MONITOR_SENSOR_SM "sm_sense" - -#define ATMOS_GAS_MONITOR_INPUT_SM_WASTE "sm_waste_in" -#define ATMOS_GAS_MONITOR_OUTPUT_SM_WASTE "sm_waste_out" -#define ATMOS_GAS_MONITOR_SENSOR_SM_WASTE "sm_waste_sense" - -#define ATMOS_GAS_MONITOR_INPUT_TOXINS_WASTE "toxins_waste_in" -#define ATMOS_GAS_MONITOR_OUTPUT_TOXINS_WASTE "toxins_waste_out" -#define ATMOS_GAS_MONITOR_SENSOR_TOXINS_WASTE "toxins_waste_sense" - -//AIRLOCK CONTROLLER TAGS - -//RnD toxins burn chamber -#define INCINERATOR_TOXMIX_IGNITER "toxmix_igniter" -#define INCINERATOR_TOXMIX_VENT "toxmix_vent" -#define INCINERATOR_TOXMIX_DP_VENTPUMP "toxmix_airlock_pump" -#define INCINERATOR_TOXMIX_AIRLOCK_SENSOR "toxmix_airlock_sensor" -#define INCINERATOR_TOXMIX_AIRLOCK_CONTROLLER "toxmix_airlock_controller" -#define INCINERATOR_TOXMIX_AIRLOCK_INTERIOR "toxmix_airlock_interior" -#define INCINERATOR_TOXMIX_AIRLOCK_EXTERIOR "toxmix_airlock_exterior" - -//Atmospherics/maintenance incinerator -#define INCINERATOR_ATMOS_IGNITER "atmos_incinerator_igniter" -#define INCINERATOR_ATMOS_MAINVENT "atmos_incinerator_mainvent" -#define INCINERATOR_ATMOS_AUXVENT "atmos_incinerator_auxvent" -#define INCINERATOR_ATMOS_DP_VENTPUMP "atmos_incinerator_airlock_pump" -#define INCINERATOR_ATMOS_AIRLOCK_SENSOR "atmos_incinerator_airlock_sensor" -#define INCINERATOR_ATMOS_AIRLOCK_CONTROLLER "atmos_incinerator_airlock_controller" -#define INCINERATOR_ATMOS_AIRLOCK_INTERIOR "atmos_incinerator_airlock_interior" -#define INCINERATOR_ATMOS_AIRLOCK_EXTERIOR "atmos_incinerator_airlock_exterior" - -//Syndicate lavaland base incinerator (lavaland_surface_syndicate_base1.dmm) -#define INCINERATOR_SYNDICATELAVA_IGNITER "syndicatelava_igniter" -#define INCINERATOR_SYNDICATELAVA_MAINVENT "syndicatelava_mainvent" -#define INCINERATOR_SYNDICATELAVA_AUXVENT "syndicatelava_auxvent" -#define INCINERATOR_SYNDICATELAVA_DP_VENTPUMP "syndicatelava_airlock_pump" -#define INCINERATOR_SYNDICATELAVA_AIRLOCK_SENSOR "syndicatelava_airlock_sensor" -#define INCINERATOR_SYNDICATELAVA_AIRLOCK_CONTROLLER "syndicatelava_airlock_controller" -#define INCINERATOR_SYNDICATELAVA_AIRLOCK_INTERIOR "syndicatelava_airlock_interior" -#define INCINERATOR_SYNDICATELAVA_AIRLOCK_EXTERIOR "syndicatelava_airlock_exterior" - -//MULTIPIPES -//IF YOU EVER CHANGE THESE CHANGE SPRITES TO MATCH. -#define PIPING_LAYER_MIN 1 -#define PIPING_LAYER_MAX 5 -#define PIPING_LAYER_DEFAULT 3 -#define PIPING_LAYER_P_X 5 -#define PIPING_LAYER_P_Y 5 -#define PIPING_LAYER_LCHANGE 0.05 - -#define PIPING_ALL_LAYER (1<<0) //! intended to connect with all layers, check for all instead of just one. -#define PIPING_ONE_PER_TURF (1<<1) //! can only be built if nothing else with this flag is on the tile already. -#define PIPING_DEFAULT_LAYER_ONLY (1<<2) //! can only exist at PIPING_LAYER_DEFAULT -#define PIPING_CARDINAL_AUTONORMALIZE (1<<3) //! north/south east/west doesn't matter, auto normalize on build. - -// Gas defines because i hate typepaths -#define GAS_O2 "o2" -#define GAS_N2 "n2" -#define GAS_CO2 "co2" -#define GAS_PLASMA "plasma" -#define GAS_H2O "water_vapor" -#define GAS_HYPERNOB "nob" -#define GAS_NITROUS "n2o" -#define GAS_NITRYL "no2" -#define GAS_TRITIUM "tritium" -#define GAS_BZ "bz" -#define GAS_STIMULUM "stim" -#define GAS_PLUOXIUM "pluox" - -#define GAS_FLAG_DANGEROUS (1<<0) -#define GAS_FLAG_BREATH_PROC (1<<1) - -//HELPERS -#define PIPING_LAYER_SHIFT(T, PipingLayer) \ - if(T.dir & (NORTH|SOUTH)) { \ - T.pixel_x = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X;\ - } \ - if(T.dir & (EAST|WEST)) { \ - T.pixel_y = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y;\ - } - -#define PIPING_FORWARD_SHIFT(T, PipingLayer, more_shift) \ - if(T.dir & (NORTH|SOUTH)) { \ - T.pixel_y += more_shift * (PipingLayer - PIPING_LAYER_DEFAULT);\ - } \ - if(T.dir & (EAST|WEST)) { \ - T.pixel_x += more_shift * (PipingLayer - PIPING_LAYER_DEFAULT);\ - } - -#define PIPING_LAYER_DOUBLE_SHIFT(T, PipingLayer) \ - T.pixel_x = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X;\ - T.pixel_y = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y; - -#ifdef TESTING -GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0)) -#define CALCULATE_ADJACENT_TURFS(T) if (SSadjacent_air.queue[T]) { GLOB.atmos_adjacent_savings[1] += 1 } else { GLOB.atmos_adjacent_savings[2] += 1; SSadjacent_air.queue[T] = 1 } -#else -#define CALCULATE_ADJACENT_TURFS(T) SSadjacent_air.queue[T] = 1 -#endif - -GLOBAL_LIST_INIT(pipe_paint_colors, sort_list(list( - "amethyst" = rgb(130,43,255), - "blue" = rgb(0,0,255), - "brown" = rgb(178,100,56), - "cyan" = rgb(0,255,249), - "dark" = rgb(69,69,69), - "green" = rgb(30,255,0), - "grey" = rgb(255,255,255), - "orange" = rgb(255,129,25), - "purple" = rgb(128,0,182), - "red" = rgb(255,0,0), - "violet" = rgb(64,0,128), - "yellow" = rgb(255,198,0) -))) - -//PIPENET UPDATE STATUS -#define PIPENET_UPDATE_STATUS_DORMANT 0 -#define PIPENET_UPDATE_STATUS_REACT_NEEDED 1 -#define PIPENET_UPDATE_STATUS_RECONCILE_NEEDED 2 - -// GAS MIXTURE STUFF (used to be in code/modules/atmospherics/gasmixtures/gas_mixture.dm) -#define MINIMUM_HEAT_CAPACITY 0.0003 -#define MINIMUM_MOLE_COUNT 0.01 -/*I feel the need to document what happens here. Basically this is used to catch most rounding errors, however it's previous value made it so that -once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */ -#define QUANTIZE(variable) (round(variable,0.0000001)) diff --git a/code/__DEFINES/atmospherics/atmos_core.dm b/code/__DEFINES/atmospherics/atmos_core.dm new file mode 100644 index 0000000000000..40d2a96456250 --- /dev/null +++ b/code/__DEFINES/atmospherics/atmos_core.dm @@ -0,0 +1,202 @@ +//LISTMOS +//indices of values in gas lists. +///Amount of total moles in said gas mixture +#define MOLES 1 +///Archived version of MOLES +#define ARCHIVE 2 +///All gas related variables +#define GAS_META 3 +///Gas specific heat per mole +#define META_GAS_SPECIFIC_HEAT 1 +///Name of the gas +#define META_GAS_NAME 2 +///Amount of moles required of the gas to be visible +#define META_GAS_MOLES_VISIBLE 3 +///Overlay path of the gas, also setup the alpha based on the amount +#define META_GAS_OVERLAY 4 +///Let the air alarm know if the gas is dangerous +#define META_GAS_DANGER 5 +///Id of the gas for quick access +#define META_GAS_ID 6 +///Power of the gas when used in the current iteration of fusion +#define META_GAS_FUSION_POWER 7 +///Defines the alert that should jump out if the quantity of a gas affects to a point it's too much or not enough +#define META_GAS_BREATH_ALERT_INFO 8 +///Defines the reagents applied on breathing the gas +#define META_GAS_BREATH_REAGENT 9 +///Defines the gas to which this gas is a result of breathing +#define META_GAS_BREATH_RESULTS 10 +///Reagents applied when the gas passes its dangerous threshold +#define META_GAS_BREATH_REAGENT_DANGEROUS 11 + + +//ATMOS +//stuff you should probably leave well alone! +/// kPa*L/(K*mol) +#define R_IDEAL_GAS_EQUATION 8.31 +/// kPa +#define ONE_ATMOSPHERE 101.325 +/// -270.3degC +#define TCMB 2.7 +/// -48.15degC +#define TCRYO 225 +/// 0degC +#define T0C 273.15 +/// 20degC +#define T20C 293.15 +/// -14C - Temperature used for kitchen cold room, medical freezer, etc. +#define COLD_ROOM_TEMP 259.15 + +/** + *I feel the need to document what happens here. Basically this is used + *catch rounding errors, and make gas go away in small portions. + *People have raised it to higher levels in the past, do not do this. Consider this number a soft limit + *If you're making gasmixtures that have unexpected behavior related to this value, you're doing something wrong. + * + *On an unrelated note this may cause a bug that creates negative gas, related to round(). When it has a second arg it will round up. + *So for instance round(0.5, 1) == 1. I've hardcoded a fix for this into share, by forcing the garbage collect. + *Any other attempts to fix it just killed atmos. I leave this to a greater man then I + */ +/// The minimum heat capacity of a gas +#define MINIMUM_HEAT_CAPACITY 0.0003 +/// Minimum mole count of a gas +#define MINIMUM_MOLE_COUNT 0.01 +/// Molar accuracy to round to +#define MOLAR_ACCURACY 1E-4 +/// Types of gases (based on gaslist_cache) +#define GAS_TYPE_COUNT GLOB.gaslist_cache.len +/// Maximum error caused by QUANTIZE when removing gas (roughly, in reality around 2 * MOLAR_ACCURACY less) +#define MAXIMUM_ERROR_GAS_REMOVAL (MOLAR_ACCURACY * GAS_TYPE_COUNT) + +/// Moles in a standard cell after which gases are visible +#define MOLES_GAS_VISIBLE 0.25 + +/// moles_visible * FACTOR_GAS_VISIBLE_MAX = Moles after which gas is at maximum visibility +#define FACTOR_GAS_VISIBLE_MAX 20 +/// Mole step for alpha updates. This means alpha can update at 0.25, 0.5, 0.75 and so on +#define MOLES_GAS_VISIBLE_STEP 0.25 +/// The total visible states +#define TOTAL_VISIBLE_STATES (FACTOR_GAS_VISIBLE_MAX * (1 / MOLES_GAS_VISIBLE_STEP)) + +//REACTIONS +//return values for reactions (bitflags) +///The gas mixture is not reacting +#define NO_REACTION 0 +///The gas mixture is reacting +#define REACTING 1 +///The gas mixture is able to stop all reactions +#define STOP_REACTIONS 2 + + +//EXCITED GROUPS +/** + * Some further context on breakdown. Unlike dismantle, the breakdown ticker doesn't reset itself when a tile is added + * This is because we cannot expect maps to have small spaces, so we need to even ourselves out often + * We do this to avoid equalizing a large space in one tick, with some significant amount of say heat diff + * This way large areas don't suddenly all become cold at once, it acts more like a wave + * + * Because of this and the behavior of share(), the breakdown cycles value can be tweaked directly to effect how fast we want gas to move + */ +/// number of FULL air controller ticks before an excited group breaks down (averages gas contents across turfs) +#define EXCITED_GROUP_BREAKDOWN_CYCLES 5 +/// number of FULL air controller ticks before an excited group dismantles and removes its turfs from active +#define EXCITED_GROUP_DISMANTLE_CYCLES (EXCITED_GROUP_BREAKDOWN_CYCLES * 2) + 1 //Reset after 2 breakdowns +/// Ratio of air that must move to/from a tile to reset group processing +#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.1 +/// Minimum ratio of air that must move to/from a tile +#define MINIMUM_AIR_RATIO_TO_MOVE 0.001 +/// Minimum amount of air that has to move before a group processing can be suspended (Round about 10) +#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) +/// Either this must be active (round about 0.1) //Might need to raise this a tad to better support space leaks. we'll see +#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_MOVE) +/// or this (or both, obviously) +#define MINIMUM_TEMPERATURE_TO_MOVE (T20C+100) +/// Minimum temperature difference before group processing is suspended +#define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 +/// Minimum temperature difference before the gas temperatures are just set to be equal +#define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5 +///Minimum temperature to continue superconduction once started +#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION (T20C+80) +///Minimum temperature to start doing superconduction calculations +#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION (T20C+400) + +//HEAT TRANSFER COEFFICIENTS +//Must be between 0 and 1. Values closer to 1 equalize temperature faster +//Should not exceed 0.4 else strange heat flow occur +#define WALL_HEAT_TRANSFER_COEFFICIENT 0.0 +#define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4 +/// a hack for now +#define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 +/// a hack to help make vacuums "cold", sacrificing realism for gameplay +#define HEAT_CAPACITY_VACUUM 7000 + +//FIRE +///Minimum temperature for fire to move to the next turf (150 °C or 433 K) +#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD (150+T0C) +///Minimum temperature for fire to exist on a turf (100 °C or 373 K) +#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST (100+T0C) +///Multiplier for the temperature shared to other turfs +#define FIRE_SPREAD_RADIOSITY_SCALE 0.85 +///Helper for small fires to grow +#define FIRE_GROWTH_RATE 40000 +///Minimum temperature to burn plasma +#define PLASMA_MINIMUM_BURN_TEMPERATURE (100+T0C) +///Upper temperature ceiling for plasmafire reaction calculations for fuel consumption +#define PLASMA_UPPER_TEMPERATURE (1370+T0C) +///Multiplier for plasmafire with O2 moles * PLASMA_OXYGEN_FULLBURN for the maximum fuel consumption +#define PLASMA_OXYGEN_FULLBURN 10 +///Minimum temperature to burn hydrogen +#define HYDROGEN_MINIMUM_BURN_TEMPERATURE (100+T0C) +///Upper temperature ceiling for h2fire reaction calculations for fuel consumption +#define HYDROGEN_UPPER_TEMPERATURE (1370+T0C) +///Multiplier for h2fire with O2 moles * HYDROGEN_OXYGEN_FULLBURN for the maximum fuel consumption +#define HYDROGEN_OXYGEN_FULLBURN 10 + +//COLD FIRE (this is used only for the freon-o2 reaction, there is no fire still) +///fire will spread if the temperature is -10 °C +#define COLD_FIRE_MAXIMUM_TEMPERATURE_TO_SPREAD 263 +///fire will start if the temperature is 0 °C +#define COLD_FIRE_MAXIMUM_TEMPERATURE_TO_EXIST 273 +#define COLD_FIRE_SPREAD_RADIOSITY_SCALE 0.95 //Not yet implemented +#define COLD_FIRE_GROWTH_RATE 40000 //Not yet implemented +///Maximum temperature to burn freon +#define FREON_MAXIMUM_BURN_TEMPERATURE 283 +///Minimum temperature allowed for the burn to go, we would have negative pressure otherwise +#define FREON_LOWER_TEMPERATURE 60 +///Multiplier for freonfire with O2 moles * FREON_OXYGEN_FULLBURN for the maximum fuel consumption +#define FREON_OXYGEN_FULLBURN 10 + +///moles in a 2.5 m^3 cell at 101.325 Pa and 20 degC (103 or so) +#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) +///compared against for superconductivity +#define M_CELL_WITH_RATIO (MOLES_CELLSTANDARD * 0.005) +/// percentage of oxygen in a normal mixture of air +#define O2STANDARD 0.21 +/// same but for nitrogen +#define N2STANDARD 0.79 +/// O2 standard value (21%) +#define MOLES_O2STANDARD (MOLES_CELLSTANDARD*O2STANDARD) +/// N2 standard value (79%) +#define MOLES_N2STANDARD (MOLES_CELLSTANDARD*N2STANDARD) +/// liters in a cell +#define CELL_VOLUME 2500 + +//CANATMOSPASS +#define ATMOS_PASS_YES 1 +#define ATMOS_PASS_NO 0 +/// ask can_atmos_pass() +#define ATMOS_PASS_PROC -1 +/// just check density +#define ATMOS_PASS_DENSITY -2 + +//Adjacent turf related defines, they dictate what to do with a turf once it's been recalculated +//Used as "state" in CALCULATE_ADJACENT_TURFS +///Normal non-active turf +#define NORMAL_TURF 1 +///Set the turf to be activated on the next calculation +#define MAKE_ACTIVE 2 +///Disable excited group +#define KILL_EXCITED 3 + +/// How many maximum iterations do we allow the Newton-Raphson approximation for gas pressure to do. +#define ATMOS_PRESSURE_APPROXIMATION_ITERATIONS 10 diff --git a/code/__DEFINES/atmospherics/atmos_helpers.dm b/code/__DEFINES/atmospherics/atmos_helpers.dm new file mode 100644 index 0000000000000..ba94118304a22 --- /dev/null +++ b/code/__DEFINES/atmospherics/atmos_helpers.dm @@ -0,0 +1,101 @@ +//DO NOT USE THESE FOR ACCESSING ATMOS DATA, THEY MUTATE THINGS WHEN CALLED. I WILL BEAT YOU WITH A STICK. See the actual proc for more details +///Check if an atom (A) and a turf (O) allow gas passage based on the atom's can_atmos_pass var, do not use. +///(V) is if the share is vertical or not. True or False +#define CANATMOSPASS(A, O, V) ( A.can_atmos_pass == ATMOS_PASS_PROC ? A.can_atmos_pass(O, V) : ( A.can_atmos_pass == ATMOS_PASS_DENSITY ? !A.density : A.can_atmos_pass ) ) + +//Helpers +///Moves the icon of the device based on the piping layer and on the direction +#define PIPING_LAYER_SHIFT(T, PipingLayer) \ + if(T.dir & (NORTH|SOUTH)) { \ + T.pixel_x = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X;\ + } \ + if(T.dir & (EAST|WEST)) { \ + T.pixel_y = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y;\ + } + +///Moves the icon of the device based on the piping layer and on the direction, the shift amount is dictated by more_shift +#define PIPING_FORWARD_SHIFT(T, PipingLayer, more_shift) \ + if(T.dir & (NORTH|SOUTH)) { \ + T.pixel_y += more_shift * (PipingLayer - PIPING_LAYER_DEFAULT);\ + } \ + if(T.dir & (EAST|WEST)) { \ + T.pixel_x += more_shift * (PipingLayer - PIPING_LAYER_DEFAULT);\ + } + +///Moves the icon of the device based on the piping layer on both x and y +#define PIPING_LAYER_DOUBLE_SHIFT(T, PipingLayer) \ + T.pixel_x = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X;\ + T.pixel_y = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y; + +///Calculate the thermal energy of the selected gas (J) +#define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity()) + +///Directly adds a gas to a gas mixture without checking for its presence beforehand, use only if is certain the absence of said gas +#define ADD_GAS(gas_id, out_list)\ + var/list/tmp_gaslist = GLOB.gaslist_cache[gas_id]; out_list[gas_id] = tmp_gaslist.Copy(); + +///Adds a gas to a gas mixture but checks if is already present, faster than the same proc +#define ASSERT_GAS(gas_id, gas_mixture) ASSERT_GAS_IN_LIST(gas_id, gas_mixture.gases) + +///Adds a gas to a gas LIST but checks if is already present, accepts a list instead of a datum, so faster if the list is locally cached +#define ASSERT_GAS_IN_LIST(gas_id, gases) if (!gases[gas_id]) { ADD_GAS(gas_id, gases) }; + +//prefer this to gas_mixture/total_moles in performance critical areas +///Calculate the total moles of the gas mixture, faster than the proc, good for performance critical areas +#define TOTAL_MOLES(cached_gases, out_var)\ + out_var = 0;\ + for(var/total_moles_id in cached_gases){\ + out_var += cached_gases[total_moles_id][MOLES];\ + } + +GLOBAL_LIST_INIT(nonoverlaying_gases, typecache_of_gases_with_no_overlays()) +///Returns a list of overlays of every gas in the mixture +#define GAS_OVERLAYS(gases, out_var)\ + out_var = list();\ + for(var/_ID in gases){\ + if(GLOB.nonoverlaying_gases[_ID]) continue;\ + var/_GAS = gases[_ID];\ + var/_GAS_META = _GAS[GAS_META];\ + if(_GAS[MOLES] <= _GAS_META[META_GAS_MOLES_VISIBLE]) continue;\ + var/_GAS_OVERLAY = _GAS_META[META_GAS_OVERLAY];\ + out_var += _GAS_OVERLAY[min(TOTAL_VISIBLE_STATES, CEILING(_GAS[MOLES] / MOLES_GAS_VISIBLE_STEP, 1))];\ + } + +#ifdef TESTING +GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0)) +#define CALCULATE_ADJACENT_TURFS(T, state) if (SSair.adjacent_rebuild[T]) { GLOB.atmos_adjacent_savings[1] += 1 } else { GLOB.atmos_adjacent_savings[2] += 1; SSair.adjacent_rebuild[T] = state} +#else +#define CALCULATE_ADJACENT_TURFS(T, state) SSair.adjacent_rebuild[T] = state +#endif + +//If you're doing spreading things related to atmos, DO NOT USE CANATMOSPASS, IT IS NOT CHEAP. use this instead, the info is cached after all. it's tweaked just a bit to allow for circular checks +#define TURFS_CAN_SHARE(T1, T2) (LAZYACCESS(T2.atmos_adjacent_turfs, T1) || LAZYLEN(T1.atmos_adjacent_turfs & T2.atmos_adjacent_turfs)) +//Use this to see if a turf is fully blocked or not, think windows or firelocks. Fails with 1x1 non full tile windows, but it's not worth the cost. +#define TURF_SHARES(T) (LAZYLEN(T.atmos_adjacent_turfs)) +/// Rounding +#define QUANTIZE(variable) (round((variable), (MOLAR_ACCURACY))) + +// Macros to access moles. Used instead of listmos only when nullchecking is necessary. + +///Gets the moles of a specific gas in a gas mixture. +#define GET_MOLES(gas, gas_mixture) (gas_mixture.gases[gas] ? gas_mixture.gases[gas][MOLES] : 0) + +///Adds moles to a specific gas in a gas mixture. +#define ADD_MOLES(gas, gas_mixture, moles)\ + ASSERT_GAS(gas, gas_mixture);\ + gas_mixture.gases[gas][MOLES] += moles; + +///Removes moles while making sure it doesn't go under 0. +#define REMOVE_MOLES(gas, gas_mixture, moles)\ + ASSERT_GAS(gas, gas_mixture);\ + gas_mixture.gases[gas][MOLES] -= max(moles, 0); + +/// Basically REMOVE_MOLES but with the thing sign flipped. Use this when sign is unknown +#define ADJUST_MOLES(gas, gas_mixture, moles)\ + ASSERT_GAS(gas, gas_mixture);\ + gas_mixture.gases[gas][MOLES] += max(moles, 0); + +///Sets the moles of a specific gas in a gas mixture, asserts the gas is present. +#define SET_MOLES(gas, gas_mixture, moles)\ + ASSERT_GAS(gas, gas_mixture);\ + gas_mixture.gases[gas][MOLES] = moles; diff --git a/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm b/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm new file mode 100644 index 0000000000000..abb8305bbc152 --- /dev/null +++ b/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm @@ -0,0 +1,189 @@ +//OPEN TURF ATMOS +/// the default air mix that open turfs spawn +#define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" +#define OPENTURF_LOW_PRESSURE "o2=14;n2=30;TEMP=293.15" +/// -193,15°C telecommunications. also used for xenobiology slime killrooms +#define TCOMMS_ATMOS "n2=100;TEMP=80" +/// space +#define AIRLESS_ATMOS "TEMP=2.7" +/// -93.15°C snow and ice turfs +#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" +/// -14°C kitchen coldroom, just might loss your tail; higher amount of mol to reach about 101.3 kpA +#define KITCHEN_COLDROOM_ATMOS "o2=26;n2=97;TEMP=[COLD_ROOM_TEMP]" +/// used in the holodeck burn test program +#define BURNMIX_ATMOS "o2=2500;plasma=5000;TEMP=370" + +//ATMOSPHERICS DEPARTMENT GAS TANK TURFS +#define ATMOS_TANK_N2O "n2o=6000;TEMP=293.15" +#define ATMOS_TANK_CO2 "co2=50000;TEMP=293.15" +#define ATMOS_TANK_PLASMA "plasma=70000;TEMP=293.15" +#define ATMOS_TANK_O2 "o2=100000;TEMP=293.15" +#define ATMOS_TANK_N2 "n2=100000;TEMP=293.15" +#define ATMOS_TANK_BZ "bz=100000;TEMP=293.15" +#define ATMOS_TANK_HYPERNOBLIUM "nob=100000;TEMP=293.15" +#define ATMOS_TANK_NO2 "no2=100000;TEMP=293.15" +#define ATMOS_TANK_PLUOXIUM "pluox=100000;TEMP=293.15" +#define ATMOS_TANK_STIMULUM "stim=100000;TEMP=293.15" +#define ATMOS_TANK_TRITIUM "tritium=100000;TEMP=293.15" +#define ATMOS_TANK_H2O "water_vapor=100000;TEMP=293.15" +#define ATMOS_TANK_AIRMIX "o2=2644;n2=10580;TEMP=293.15" + +//LAVALAND +/// what pressure you have to be under to increase the effect of equipment meant for lavaland +#define MAXIMUM_LAVALAND_EQUIPMENT_EFFECT_PRESSURE 90 + +//ATMOS MIX IDS +#define LAVALAND_DEFAULT_ATMOS "o2=14;n2=5;co2=13;TEMP=300" + + +//ATMOSIA GAS MONITOR TAGS +#define ATMOS_GAS_MONITOR_INPUT_O2 "o2_in" +#define ATMOS_GAS_MONITOR_OUTPUT_O2 "o2_out" +#define ATMOS_GAS_MONITOR_SENSOR_O2 "o2_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_PLASMA "plasma_in" +#define ATMOS_GAS_MONITOR_OUTPUT_PLASMA "plasma_out" +#define ATMOS_GAS_MONITOR_SENSOR_PLASMA "plasma_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_AIR "air_in" +#define ATMOS_GAS_MONITOR_OUTPUT_AIR "air_out" +#define ATMOS_GAS_MONITOR_SENSOR_AIR "air_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_MIX "mix_in" +#define ATMOS_GAS_MONITOR_OUTPUT_MIX "mix_out" +#define ATMOS_GAS_MONITOR_SENSOR_MIX "mix_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_N2O "n2o_in" +#define ATMOS_GAS_MONITOR_OUTPUT_N2O "n2o_out" +#define ATMOS_GAS_MONITOR_SENSOR_N2O "n2o_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_N2 "n2_in" +#define ATMOS_GAS_MONITOR_OUTPUT_N2 "n2_out" +#define ATMOS_GAS_MONITOR_SENSOR_N2 "n2_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_CO2 "co2_in" +#define ATMOS_GAS_MONITOR_OUTPUT_CO2 "co2_out" +#define ATMOS_GAS_MONITOR_SENSOR_CO2 "co2_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_BZ "bz_in" +#define ATMOS_GAS_MONITOR_OUTPUT_BZ "bz_out" +#define ATMOS_GAS_MONITOR_SENSOR_BZ "bz_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_FREON "freon_in" +#define ATMOS_GAS_MONITOR_OUTPUT_FREON "freon_out" +#define ATMOS_GAS_MONITOR_SENSOR_FREON "freon_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_HALON "halon_in" +#define ATMOS_GAS_MONITOR_OUTPUT_HALON "halon_out" +#define ATMOS_GAS_MONITOR_SENSOR_HALON "halon_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_HEALIUM "healium_in" +#define ATMOS_GAS_MONITOR_OUTPUT_HEALIUM "healium_out" +#define ATMOS_GAS_MONITOR_SENSOR_HEALIUM "healium_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_H2 "h2_in" +#define ATMOS_GAS_MONITOR_OUTPUT_H2 "h2_out" +#define ATMOS_GAS_MONITOR_SENSOR_H2 "h2_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_HYPERNOBLIUM "hypernoblium_in" +#define ATMOS_GAS_MONITOR_OUTPUT_HYPERNOBLIUM "hypernoblium_out" +#define ATMOS_GAS_MONITOR_SENSOR_HYPERNOBLIUM "hypernoblium_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_MIASMA "miasma_in" +#define ATMOS_GAS_MONITOR_OUTPUT_MIASMA "miasma_out" +#define ATMOS_GAS_MONITOR_SENSOR_MIASMA "miasma_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_NO2 "no2_in" +#define ATMOS_GAS_MONITOR_OUTPUT_NO2 "no2_out" +#define ATMOS_GAS_MONITOR_SENSOR_NO2 "no2_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_PLUOXIUM "pluoxium_in" +#define ATMOS_GAS_MONITOR_OUTPUT_PLUOXIUM "pluoxium_out" +#define ATMOS_GAS_MONITOR_SENSOR_PLUOXIUM "pluoxium_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_PROTO_NITRATE "proto-nitrate_in" +#define ATMOS_GAS_MONITOR_OUTPUT_PROTO_NITRATE "proto-nitrate_out" +#define ATMOS_GAS_MONITOR_SENSOR_PROTO_NITRATE "proto-nitrate_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_STIMULUM "stimulum_in" +#define ATMOS_GAS_MONITOR_OUTPUT_STIMULUM "stimulum_out" +#define ATMOS_GAS_MONITOR_SENSOR_STIMULUM "stimulum_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_TRITIUM "tritium_in" +#define ATMOS_GAS_MONITOR_OUTPUT_TRITIUM "tritium_out" +#define ATMOS_GAS_MONITOR_SENSOR_TRITIUM "tritium_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_H2O "h2o_in" +#define ATMOS_GAS_MONITOR_OUTPUT_H2O "h2o_out" +#define ATMOS_GAS_MONITOR_SENSOR_H2O "h2o_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_ZAUKER "zauker_in" +#define ATMOS_GAS_MONITOR_OUTPUT_ZAUKER "zauker_out" +#define ATMOS_GAS_MONITOR_SENSOR_ZAUKER "zauker_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_HELIUM "helium_in" +#define ATMOS_GAS_MONITOR_OUTPUT_HELIUM "helium_out" +#define ATMOS_GAS_MONITOR_SENSOR_HELIUM "helium_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_ANTINOBLIUM "antinoblium_in" +#define ATMOS_GAS_MONITOR_OUTPUT_ANTINOBLIUM "antinoblium_out" +#define ATMOS_GAS_MONITOR_SENSOR_ANTINOBLIUM "antinoblium_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_INCINERATOR "incinerator_in" +#define ATMOS_GAS_MONITOR_OUTPUT_INCINERATOR "incinerator_out" +#define ATMOS_GAS_MONITOR_SENSOR_INCINERATOR "incinerator_sensor" + +#define ATMOS_GAS_MONITOR_INPUT_TOXINS_LAB "toxinslab_in" +#define ATMOS_GAS_MONITOR_OUTPUT_TOXINS_LAB "toxinslab_out" +#define ATMOS_GAS_MONITOR_SENSOR_TOXINS_LAB "toxinslab_sensor" + +#define ATMOS_GAS_MONITOR_LOOP_DISTRIBUTION "distro-loop_meter" +#define ATMOS_GAS_MONITOR_LOOP_ATMOS_WASTE "atmos-waste_loop_meter" + +#define ATMOS_GAS_MONITOR_WASTE_ENGINE "engine-waste_out" +#define ATMOS_GAS_MONITOR_WASTE_ATMOS "atmos-waste_out" + +#define ATMOS_GAS_MONITOR_INPUT_SM "sm_in" +#define ATMOS_GAS_MONITOR_OUTPUT_SM "sm_out" +#define ATMOS_GAS_MONITOR_SENSOR_SM "sm_sense" + +#define ATMOS_GAS_MONITOR_INPUT_SM_WASTE "sm_waste_in" +#define ATMOS_GAS_MONITOR_OUTPUT_SM_WASTE "sm_waste_out" +#define ATMOS_GAS_MONITOR_SENSOR_SM_WASTE "sm_waste_sense" + +#define ATMOS_GAS_MONITOR_INPUT_TOXINS_WASTE "toxins_waste_in" +#define ATMOS_GAS_MONITOR_OUTPUT_TOXINS_WASTE "toxins_waste_out" +#define ATMOS_GAS_MONITOR_SENSOR_TOXINS_WASTE "toxins_waste_sense" + +//AIRLOCK CONTROLLER TAGS + +//RnD toxins burn chamber +#define INCINERATOR_TOXMIX_IGNITER "toxmix_igniter" +#define INCINERATOR_TOXMIX_VENT "toxmix_vent" +#define INCINERATOR_TOXMIX_DP_VENTPUMP "toxmix_airlock_pump" +#define INCINERATOR_TOXMIX_AIRLOCK_SENSOR "toxmix_airlock_sensor" +#define INCINERATOR_TOXMIX_AIRLOCK_CONTROLLER "toxmix_airlock_controller" +#define INCINERATOR_TOXMIX_AIRLOCK_INTERIOR "toxmix_airlock_interior" +#define INCINERATOR_TOXMIX_AIRLOCK_EXTERIOR "toxmix_airlock_exterior" + +//Atmospherics/maintenance incinerator +#define INCINERATOR_ATMOS_IGNITER "atmos_incinerator_igniter" +#define INCINERATOR_ATMOS_MAINVENT "atmos_incinerator_mainvent" +#define INCINERATOR_ATMOS_AUXVENT "atmos_incinerator_auxvent" +#define INCINERATOR_ATMOS_DP_VENTPUMP "atmos_incinerator_airlock_pump" +#define INCINERATOR_ATMOS_AIRLOCK_SENSOR "atmos_incinerator_airlock_sensor" +#define INCINERATOR_ATMOS_AIRLOCK_CONTROLLER "atmos_incinerator_airlock_controller" +#define INCINERATOR_ATMOS_AIRLOCK_INTERIOR "atmos_incinerator_airlock_interior" +#define INCINERATOR_ATMOS_AIRLOCK_EXTERIOR "atmos_incinerator_airlock_exterior" +#define TEST_ROOM_ATMOS_MAINVENT_1 "atmos_test_room_mainvent_1" +#define TEST_ROOM_ATMOS_MAINVENT_2 "atmos_test_room_mainvent_2" + +//Syndicate lavaland base incinerator (lavaland_surface_syndicate_base1.dmm) +#define INCINERATOR_SYNDICATELAVA_IGNITER "syndicatelava_igniter" +#define INCINERATOR_SYNDICATELAVA_MAINVENT "syndicatelava_mainvent" +#define INCINERATOR_SYNDICATELAVA_AUXVENT "syndicatelava_auxvent" +#define INCINERATOR_SYNDICATELAVA_DP_VENTPUMP "syndicatelava_airlock_pump" +#define INCINERATOR_SYNDICATELAVA_AIRLOCK_SENSOR "syndicatelava_airlock_sensor" +#define INCINERATOR_SYNDICATELAVA_AIRLOCK_CONTROLLER "syndicatelava_airlock_controller" +#define INCINERATOR_SYNDICATELAVA_AIRLOCK_INTERIOR "syndicatelava_airlock_interior" +#define INCINERATOR_SYNDICATELAVA_AIRLOCK_EXTERIOR "syndicatelava_airlock_exterior" diff --git a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm new file mode 100644 index 0000000000000..2069d6695b3d5 --- /dev/null +++ b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm @@ -0,0 +1,135 @@ +/** liters in a normal breath. note that breaths are taken once every 4 life ticks, which is 8 seconds + * Addendum for people tweaking this value in the future. + * Because o2 tank release values/human o2 requirements are very strictly set to the same pressure, small errors can cause breakage + * This comes from QUANTIZE being used in /datum/gas_mixture.remove(), forming a slight sawtooth pattern of the added/removed gas, centered on the actual pressure + * Changing BREATH_VOLUME can set us on the lower half of this sawtooth, making humans unable to breath at standard pressure. + * There's no good way I can come up with to hardcode a fix for this. So if you're going to change this variable + * graph the functions that describe how it is used/how it interacts with breath code, and pick something on the upper half of the sawtooth + * +**/ +#define BREATH_VOLUME 1.99 +/// Amount of air to take a from a tile +#define BREATH_PERCENTAGE (BREATH_VOLUME/CELL_VOLUME) + +//Defines for N2O and Healium euphoria moodlets +#define EUPHORIA_INACTIVE 0 +#define EUPHORIA_ACTIVE 1 +#define EUPHORIA_LAST_FLAG 2 + +#define MIASMA_CORPSE_MOLES 0.02 +#define MIASMA_GIBS_MOLES 0.005 + +#define MIN_TOXIC_GAS_DAMAGE 1 +#define MAX_TOXIC_GAS_DAMAGE 10 + +// Pressure limits. +/// This determins at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant) +#define HAZARD_HIGH_PRESSURE 550 +/// This determins when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE) +#define WARNING_HIGH_PRESSURE 325 +/// This is when the gray low pressure icon is displayed. (it is 2.5 * HAZARD_LOW_PRESSURE) +#define WARNING_LOW_PRESSURE 50 +/// This is when the black ultra-low pressure icon is displayed. (This one is set as a constant) +#define HAZARD_LOW_PRESSURE 20 + +/// This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount. +#define TEMPERATURE_DAMAGE_COEFFICIENT 1.5 + +/// The natural temperature for a body +#define BODYTEMP_NORMAL 310.15 +/// This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive. +#define BODYTEMP_AUTORECOVERY_DIVISOR 28 +/// Minimum amount of kelvin moved toward 310K per tick. So long as abs(310.15 - bodytemp) is more than 50. +#define BODYTEMP_AUTORECOVERY_MINIMUM 3 +///Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is lower than their body temperature. Make it lower to lose bodytemp faster. +#define BODYTEMP_COLD_DIVISOR 15 +/// Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is higher than their body temperature. Make it lower to gain bodytemp faster. +#define BODYTEMP_HEAT_DIVISOR 15 +/// The maximum number of degrees that your body can cool in 1 tick, due to the environment, when in a cold area. +#define BODYTEMP_COOLING_MAX -30 +/// The maximum number of degrees that your body can heat up in 1 tick, due to the environment, when in a hot area. +#define BODYTEMP_HEATING_MAX 30 +/// The body temperature limit the human body can take before it starts taking damage from heat. +/// This also affects how fast the body normalises it's temperature when hot. +/// 340k is about 66c, and rather high for a human. +#define BODYTEMP_HEAT_DAMAGE_LIMIT (BODYTEMP_NORMAL + 30) +/// The body temperature limit the human body can take before it starts taking damage from cold. +/// This also affects how fast the body normalises it's temperature when cold. +/// 270k is about -3c, that is below freezing and would hurt over time. +#define BODYTEMP_COLD_DAMAGE_LIMIT (BODYTEMP_NORMAL - 40) +/// The body temperature limit the human body can take before it will take wound damage. +#define BODYTEMP_HEAT_WOUND_LIMIT (BODYTEMP_NORMAL + 90) // 400.5 k +/// The modifier on cold damage limit hulks get ontop of their regular limit +#define BODYTEMP_HULK_COLD_DAMAGE_LIMIT_MODIFIER 25 +/// The modifier on cold damage hulks get. +#define HULK_COLD_DAMAGE_MOD 2 + +// Body temperature warning icons +/// The temperature the red icon is displayed. +#define BODYTEMP_HEAT_WARNING_3 (BODYTEMP_HEAT_DAMAGE_LIMIT + 360) //+700k +/// The temperature the orange icon is displayed. +#define BODYTEMP_HEAT_WARNING_2 (BODYTEMP_HEAT_DAMAGE_LIMIT + 120) //460K +/// The temperature the yellow icon is displayed. +#define BODYTEMP_HEAT_WARNING_1 (BODYTEMP_HEAT_DAMAGE_LIMIT) //340K +/// The temperature the light green icon is displayed. +#define BODYTEMP_COLD_WARNING_1 (BODYTEMP_COLD_DAMAGE_LIMIT) //270k +/// The temperature the cyan icon is displayed. +#define BODYTEMP_COLD_WARNING_2 (BODYTEMP_COLD_DAMAGE_LIMIT - 70) //200k +/// The temperature the blue icon is displayed. +#define BODYTEMP_COLD_WARNING_3 (BODYTEMP_COLD_DAMAGE_LIMIT - 150) //120k + +/// The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE +#define PRESSURE_DAMAGE_COEFFICIENT 2 +#define MAX_HIGH_PRESSURE_DAMAGE 2 +/// The amount of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). +#define LOW_PRESSURE_DAMAGE 2 + +/// Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this +#define COLD_SLOWDOWN_FACTOR 20 + + +//CLOTHES + +//Emergency skinsuits +#define EMERGENCY_HELM_MIN_TEMP_PROTECT 2.0 //The helmet is pressurized with air from the oxygen tank. If they don't take damage from that they won't take damage here +#define EMERGENCY_SUIT_MIN_TEMP_PROTECT 237 //This is the approximate average temperature of Mt. Everest in the winter + +/// what min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0. +#define SPACE_HELM_MIN_TEMP_PROTECT 2.0 +/// Thermal insulation works both ways /Malkevin +#define SPACE_HELM_MAX_TEMP_PROTECT 1500 +/// what min_cold_protection_temperature is set to for space-suit quality jumpsuits or suits. MUST NOT BE 0. +#define SPACE_SUIT_MIN_TEMP_PROTECT 2.0 +/// The min cold protection of a space suit without the heater active +#define SPACE_SUIT_MIN_TEMP_PROTECT_OFF 72 +#define SPACE_SUIT_MAX_TEMP_PROTECT 1500 + +/// Cold protection for firesuits +#define FIRE_SUIT_MIN_TEMP_PROTECT 60 +/// what max_heat_protection_temperature is set to for firesuit quality suits. MUST NOT BE 0. +#define FIRE_SUIT_MAX_TEMP_PROTECT 30000 +/// Cold protection for fire helmets +#define FIRE_HELM_MIN_TEMP_PROTECT 60 +/// for fire helmet quality items (red and white hardhats) +#define FIRE_HELM_MAX_TEMP_PROTECT 30000 + +/// what max_heat_protection_temperature is set to for firesuit quality suits and helmets. MUST NOT BE 0. +#define FIRE_IMMUNITY_MAX_TEMP_PROTECT 35000 + +/// For normal helmets +#define HELMET_MIN_TEMP_PROTECT 160 +/// For normal helmets +#define HELMET_MAX_TEMP_PROTECT 600 +/// For armor +#define ARMOR_MIN_TEMP_PROTECT 160 +/// For armor +#define ARMOR_MAX_TEMP_PROTECT 600 + +/// For some gloves (black and) +#define GLOVES_MIN_TEMP_PROTECT 2.0 +/// For some gloves +#define GLOVES_MAX_TEMP_PROTECT 1500 +/// For gloves +#define SHOES_MIN_TEMP_PROTECT 2.0 +/// For gloves +#define SHOES_MAX_TEMP_PROTECT 1500 diff --git a/code/__DEFINES/atmospherics/atmos_piping.dm b/code/__DEFINES/atmospherics/atmos_piping.dm new file mode 100644 index 0000000000000..3b01d29209a7c --- /dev/null +++ b/code/__DEFINES/atmospherics/atmos_piping.dm @@ -0,0 +1,83 @@ +//PIPES +//Defines for pipe bitmasking +#define NORTH_FULLPIPE (1<<0) //also just NORTH +#define SOUTH_FULLPIPE (1<<1) //also just SOUTH +#define EAST_FULLPIPE (1<<2) //also just EAST +#define WEST_FULLPIPE (1<<3) //also just WEST +#define NORTH_SHORTPIPE (1<<4) +#define SOUTH_SHORTPIPE (1<<5) +#define EAST_SHORTPIPE (1<<6) +#define WEST_SHORTPIPE (1<<7) +//Atmos pipe limits +/// (kPa) What pressure pumps and powered equipment max out at. +#define MAX_OUTPUT_PRESSURE 4500 +/// (L/s) Maximum speed powered equipment can work at. +#define MAX_TRANSFER_RATE 200 +/// How many percent of the contents that an overclocked volume pumps leak into the air +#define VOLUME_PUMP_LEAK_AMOUNT 0.1 +//used for device_type vars +#define UNARY 1 +#define BINARY 2 +#define TRINARY 3 +#define QUATERNARY 4 + +//TANKS +/// temperature in kelvins at which a tank will start to melt +#define TANK_MELT_TEMPERATURE 1000000 +/// Tank starts leaking +#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) +/// Tank spills all contents into atmosphere +#define TANK_RUPTURE_PRESSURE (35.*ONE_ATMOSPHERE) +/// Boom 3x3 base explosion +#define TANK_FRAGMENT_PRESSURE (40.*ONE_ATMOSPHERE) +/// +1 for each SCALE kPa aboe threshold +#define TANK_FRAGMENT_SCALE (6.*ONE_ATMOSPHERE) +#define TANK_MAX_RELEASE_PRESSURE (ONE_ATMOSPHERE*3) +#define TANK_MIN_RELEASE_PRESSURE 0 +#define TANK_DEFAULT_RELEASE_PRESSURE 16 + +//MULTIPIPES +//IF YOU EVER CHANGE THESE CHANGE SPRITES TO MATCH. +//layer = initial(layer) + piping_layer / 1000 in atmospherics/update_icon() to determine order of pipe overlap +#define PIPING_LAYER_MIN 1 +#define PIPING_LAYER_MAX 5 +#define PIPING_LAYER_DEFAULT 3 +#define PIPING_LAYER_P_X 5 +#define PIPING_LAYER_P_Y 5 +#define PIPING_LAYER_LCHANGE 0.05 + +/// intended to connect with all layers, check for all instead of just one. +#define PIPING_ALL_LAYER (1<<0) +/// can only be built if nothing else with this flag is on the tile already. +#define PIPING_ONE_PER_TURF (1<<1) +/// can only exist at PIPING_LAYER_DEFAULT +#define PIPING_DEFAULT_LAYER_ONLY (1<<2) +/// north/south east/west doesn't matter, auto normalize on build. +#define PIPING_CARDINAL_AUTONORMALIZE (1<<3) +/// intended to connect with everything, both layers and colors +#define PIPING_ALL_COLORS (1<<4) +/// can bridge over pipenets +#define PIPING_BRIDGE (1<<5) + +// Ventcrawling bitflags, handled in var/vent_movement +///Allows for ventcrawling to occur. All atmospheric machines have this flag on by default. Cryo is the exception +#define VENTCRAWL_ALLOWED (1<<0) +///Allows mobs to enter or leave from atmospheric machines. On for passive, unary, and scrubber vents. +#define VENTCRAWL_ENTRANCE_ALLOWED (1<<1) +///Used to check if a machinery is visible. Called by update_pipe_vision(). On by default for all except cryo. +#define VENTCRAWL_CAN_SEE (1<<2) + +GLOBAL_LIST_INIT(pipe_paint_colors, sort_list(list( + "amethyst" = rgb(130,43,255), //supplymain + "blue" = rgb(0,0,255), + "brown" = rgb(178,100,56), + "cyan" = rgb(0,255,249), + "dark" = rgb(69,69,69), + "green" = rgb(30,255,0), + "grey" = rgb(255,255,255), + "orange" = rgb(255,129,25), + "purple" = rgb(128,0,182), + "red" = rgb(255,0,0), + "violet" = rgb(64,0,128), + "yellow" = rgb(255,198,0) +))) diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 3fe2d6671f74c..386467bb0fa85 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -81,6 +81,8 @@ #define COLOR_DARK_ORANGE "#C3630C" #define COLOR_BEIGE "#CEB689" #define COLOR_DARK_MODERATE_ORANGE "#8B633B" +#define COLOR_TAN_ORANGE "#FF7B00" + #define COLOR_BROWN "#BA9F6D" #define COLOR_DARK_BROWN "#997C4F" diff --git a/code/__DEFINES/dcs/signals/signals_turf.dm b/code/__DEFINES/dcs/signals/signals_turf.dm index bec34d81c2614..4ae48a9008c62 100644 --- a/code/__DEFINES/dcs/signals/signals_turf.dm +++ b/code/__DEFINES/dcs/signals/signals_turf.dm @@ -15,3 +15,7 @@ #define COMSIG_TURF_AFTER_SHUTTLE_MOVE "turf_after_shuttle_move" /// from base of /datum/turf_reservation/proc/Release: (datum/turf_reservation/reservation) #define COMSIG_TURF_RESERVATION_RELEASED "turf_reservation_released" +//from /turf/open/temperature_expose(datum/gas_mixture/air, exposed_temperature) +#define COMSIG_TURF_EXPOSE "turf_expose" +///from /turf/proc/immediate_calculate_adjacent_turfs() +#define COMSIG_TURF_CALCULATED_ADJACENT_ATMOS "turf_calculated_adjacent_atmos" diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 8fb1dfae1eb18..fd6017c52576d 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -56,14 +56,16 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define HTML_USE_INITAL_ICON_1 (1<<13) /// Prevents direct access for anything in the contents of this atom. #define NO_DIRECT_ACCESS_FROM_CONTENTS_1 (1<<14) +/// Is this object currently processing in the atmos object list? +#define ATMOS_IS_PROCESSING_1 (1<<15) //turf-only flags. These use flags_1 too. // These exist to cover /turf and /area at the same time -#define NOJAUNT_1 (1<<15) -#define UNUSED_RESERVATION_TURF_1 (1<<16) -#define CAN_BE_DIRTY_1 (1<<17) //! If a turf can be made dirty at roundstart. This is also used in areas. -#define NO_LAVA_GEN_1 (1<<18) //! Blocks lava rivers being generated on the turf -#define NO_RUINS_1 (1<<19) //! Blocks ruins spawning on the turf +#define NOJAUNT_1 (1<<17) +#define UNUSED_RESERVATION_TURF_1 (1<<18) +#define CAN_BE_DIRTY_1 (1<<19) //! If a turf can be made dirty at roundstart. This is also used in areas. +#define NO_LAVA_GEN_1 (1<<20) //! Blocks lava rivers being generated on the turf +#define NO_RUINS_1 (1<<21) //! Blocks ruins spawning on the turf // Update flags for [/atom/proc/update_appearance] /// Update the atom's name diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 691d5c17c5e91..60e9bbbaacdc4 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -140,11 +140,16 @@ ///AI Camera Static #define CAMERA_STATIC_PLANE 200 +#define HIGH_GAME_PLANE 300 + ///Popup Chat Messages #define RUNECHAT_PLANE 650 /// Plane for balloon text (text that fades up) #define BALLOON_CHAT_PLANE 651 +#define ATMOS_GROUP_PLANE 652 +#define ATMOS_GROUP_LAYER 652 + ///--------------- FULLSCREEN IMAGES ------------ #define FULLSCREEN_PLANE 500 #define FLASH_LAYER 1 diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index e447eb3149ed0..e7a3b86930230 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -1,3 +1,9 @@ +// Remove these once we have Byond implementation. +#define ISNAN(a) (!(a==a)) +#define ISINF(a) (!ISNAN(a) && ISNAN(a-a)) +#define IS_INF_OR_NAN(a) (ISNAN(a-a)) +// Aight dont remove the rest + // Credits to Nickr5 for the useful procs I've taken from his library resource. // This file is quadruple wrapped for your pleasure // ( @@ -99,7 +105,7 @@ . = list() var/d = b*b - 4 * a * c var/bottom = 2 * a - if(d < 0) + if(d < 0 || IS_INF_OR_NAN(d) || IS_INF_OR_NAN(bottom)) return var/root = sqrt(d) . += (-b + root) / bottom diff --git a/code/__DEFINES/reactions.dm b/code/__DEFINES/reactions.dm index fd0dc83d6ad36..158cbdcb4c6eb 100644 --- a/code/__DEFINES/reactions.dm +++ b/code/__DEFINES/reactions.dm @@ -7,6 +7,7 @@ #define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30 #define FIRE_CARBON_ENERGY_RELEASED 100000 //! Amount of heat released per mole of burnt carbon into the tile #define FIRE_HYDROGEN_ENERGY_RELEASED 280000 //! Amount of heat released per mole of burnt hydrogen and/or tritium(hydrogen isotope) +#define FIRE_HYDROGEN_ENERGY_WEAK 280000 #define FIRE_PLASMA_ENERGY_RELEASED 3000000 //! Amount of heat released per mole of burnt plasma into the tile // Water Vapor: @@ -57,3 +58,8 @@ #define FUSION_RAD_MIDPOINT 15 //! If you decrease this by one, the fusion rads will *triple* and vice versa #define FUSION_MIDDLE_ENERGY_REFERENCE 1e6 //! This number is deceptively dangerous; sort of tied to TOROID_CALCULATED_THRESHOLD #define FUSION_BUFFER_DIVISOR 1 //! Increase this to cull unrobust fusions faster + +#define PRIORITY_PRE_FORMATION 1 +#define PRIORITY_FORMATION 2 +#define PRIORITY_POST_FORMATION 3 +#define PRIORITY_FIRE 4 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index ea425b2b949e6..c01e3a4a3a130 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -216,7 +216,6 @@ #define FIRE_PRIORITY_ASSETS 105 #define FIRE_PRIORITY_TGUI 110 #define FIRE_PRIORITY_TICKER 200 -#define FIRE_PRIORITY_ATMOS_ADJACENCY 300 #define FIRE_PRIORITY_CHAT 400 #define FIRE_PRIORITY_RUNECHAT 410 #define FIRE_PRIORITY_OVERLAYS 500 @@ -237,25 +236,6 @@ #define RUNLEVELS_DEFAULT (RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME) -// SSair run section -#define SSAIR_PIPENETS 1 -#define SSAIR_ATMOSMACHINERY 2 -#define SSAIR_EXCITEDGROUPS 3 -#define SSAIR_HIGHPRESSURE 4 -#define SSAIR_HOTSPOTS 5 -#define SSAIR_TURF_CONDUCTION 6 -#define SSAIR_REBUILD_PIPENETS 7 -#define SSAIR_EQUALIZE 8 -#define SSAIR_ACTIVETURFS 9 -#define SSAIR_TURF_POST_PROCESS 10 -#define SSAIR_FINALIZE_TURFS 11 -#define SSAIR_ATMOSMACHINERY_AIR 12 -#define SSAIR_DEFERRED_AIRS 13 - -// Explosion Subsystem subtasks -#define SSEXPLOSIONS_MOVABLES 1 -#define SSEXPLOSIONS_TURFS 2 -#define SSEXPLOSIONS_THROWS 3 //SSticker.current_state values /// Game is loading @@ -302,6 +282,25 @@ */ #define addtimer(args...) _addtimer(args, file = __FILE__, line = __LINE__) +// Air subsystem subtasks +#define SSAIR_PIPENETS 1 +#define SSAIR_ATMOSMACHINERY 2 +#define SSAIR_ACTIVETURFS 3 +#define SSAIR_HOTSPOTS 4 +#define SSAIR_EXCITEDGROUPS 5 +#define SSAIR_HIGHPRESSURE 6 +#define SSAIR_SUPERCONDUCTIVITY 7 +#define SSAIR_PROCESS_ATOMS 8 + +//Pipeline rebuild helper defines, these suck but it'll do for now +#define SSAIR_REBUILD_PIPELINE 1 +#define SSAIR_REBUILD_QUEUE 2 + +// Explosion Subsystem subtasks +#define SSEXPLOSIONS_MOVABLES 1 +#define SSEXPLOSIONS_TURFS 2 +#define SSEXPLOSIONS_THROWS 3 + // Subsystem delta times or tickrates, in seconds. I.e, how many seconds in between each process() call for objects being processed by that subsystem. // Only use these defines if you want to access some other objects processing delta_time, otherwise use the delta_time that is sent as a parameter to process() #define SSMACHINES_DT (SSmachines.wait/10) diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index 9e81c7044de12..33721fb74b428 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -11,7 +11,7 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/engine/eng // break_if_found is a typecache of turf/area types to return false if found // Please keep this proc type agnostic. If you need to restrict it do it elsewhere or add an arg. /proc/detect_room(turf/origin, list/break_if_found) - if(isclosedturf(origin)) + if(origin.blocks_air) return list(origin) . = list() @@ -34,7 +34,7 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/engine/eng if(break_if_found[checkT.type] || break_if_found[checkT.loc.type]) return FALSE var/static/list/cardinal_cache = list("[NORTH]"=TRUE, "[EAST]"=TRUE, "[SOUTH]"=TRUE, "[WEST]"=TRUE) - if(!cardinal_cache["[dir]"] || isclosedturf(checkT) || !CANATMOSPASS(sourceT, checkT)) + if(!cardinal_cache["[dir]"] || checkT.blocks_air || !CANATMOSPASS(sourceT, checkT, FALSE)) continue found_turfs += checkT // Since checkT is connected, add it to the list to be processed diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm index 409f2b65925af..a1445211416b1 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/__HELPERS/turfs.dm @@ -400,13 +400,13 @@ Turf and target are separate in case you want to teleport some distance from a t if(QDELETED(air)) return FALSE // Can most things breathe? - for(var/id in air.get_gases()) + for(var/id in air.gases) if(id in GLOB.hardcoded_gases) continue return FALSE - if(air.get_moles(GAS_O2) < 16 || air.get_moles(GAS_PLASMA) || air.get_moles(GAS_CO2) >= 10) + if(GET_MOLES(/datum/gas/oxygen, air) < 16 || air.gases[/datum/gas/plasma][MOLES] || GET_MOLES(/datum/gas/carbon_dioxide, air) >= 10) return FALSE - var/temperature = air.return_temperature() + var/temperature = air.temperature if(temperature <= 270 || temperature >= 360) return FALSE var/pressure = air.return_pressure() diff --git a/code/__byond_version_compat.dm b/code/__byond_version_compat.dm index fc667f8b9dd82..b4080328ffa09 100644 --- a/code/__byond_version_compat.dm +++ b/code/__byond_version_compat.dm @@ -20,9 +20,9 @@ /savefile/byond_version = MIN_COMPILER_VERSION #endif -#if defined(FASTDMM) || defined(CIBUILDING) + #if defined(FASTDMM) || defined(CIBUILDING) #define YES_I_WANT_515 -#endif + #endif // Temporary 515 block until it is completely compatible. // AnturK says there are issues with savefiles that would make it dangerous to test merge, // and so this check is in place to stop serious damage. diff --git a/code/_compile_options.dm b/code/_compile_options.dm index ce997dd8a79f9..f407b714baa10 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -144,18 +144,3 @@ #warn Building with Dream Maker is no longer supported and will result in missing interface files. #warn Switch to VSCode and when prompted install the recommended extensions, you can then either use the UI or press Ctrl+Shift+B to build the codebase. #endif - -#define AUXMOS (world.system_type == MS_WINDOWS ? "auxtools/auxmos.dll" : __detect_auxmos()) - -/proc/__detect_auxmos() - var/static/auxmos_path - if(!auxmos_path) - if (fexists("./libauxmos.so")) - auxmos_path = "./libauxmos.so" - else if (fexists("./auxtools/libauxmos.so")) - auxmos_path = "./auxtools/libauxmos.so" - else if (fexists("[world.GetConfig("env", "HOME")]/.byond/bin/libauxmos.so")) - auxmos_path = "[world.GetConfig("env", "HOME")]/.byond/bin/libauxmos.so" - else - CRASH("Could not find libauxmos.so") - return auxmos_path diff --git a/code/_globalvars/lists/color.dm b/code/_globalvars/lists/color.dm new file mode 100644 index 0000000000000..26c0d89b9f188 --- /dev/null +++ b/code/_globalvars/lists/color.dm @@ -0,0 +1,7 @@ +GLOBAL_LIST_INIT(contrast_colors, list( + COLOR_BLACK, + COLOR_DARK_CYAN, + COLOR_RED, + COLOR_TAN_ORANGE, + COLOR_VIOLET, +)) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index dd5f5e8722411..1ad6f9edaa258 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -87,6 +87,10 @@ client.screen -= alert qdel(alert) +// Proc to check for an alert +/mob/proc/has_alert(category) + return !isnull(alerts[category]) + /atom/movable/screen/alert icon = 'icons/hud/screen_alert.dmi' icon_state = "default" diff --git a/code/controllers/subsystem/adjacent_air.dm b/code/controllers/subsystem/adjacent_air.dm deleted file mode 100644 index 200dbc3e30de5..0000000000000 --- a/code/controllers/subsystem/adjacent_air.dm +++ /dev/null @@ -1,54 +0,0 @@ -SUBSYSTEM_DEF(adjacent_air) - name = "Atmos Adjacency" - flags = SS_BACKGROUND - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - wait = 10 - priority = FIRE_PRIORITY_ATMOS_ADJACENCY - var/list/queue = list() - var/list/disable_queue = list() - -/datum/controller/subsystem/adjacent_air/stat_entry() -#ifdef TESTING - . = ..("P:[length(queue)], S:[GLOB.atmos_adjacent_savings[1]], T:[GLOB.atmos_adjacent_savings[2]]") -#else - . = ..("P:[length(queue)]") -#endif - -/datum/controller/subsystem/adjacent_air/Initialize() - while(length(queue)) - fire(mc_check = FALSE) - return SS_INIT_SUCCESS - -/datum/controller/subsystem/adjacent_air/fire(resumed = FALSE, mc_check = TRUE) - if(SSair.thread_running()) - pause() - return - - var/list/disable_queue = src.disable_queue - - while (length(disable_queue)) - var/turf/terf = disable_queue[1] - var/arg = disable_queue[terf] - disable_queue.Cut(1,2) - - terf.ImmediateDisableAdjacency(arg) - - if(mc_check) - if(MC_TICK_CHECK) - return - else - CHECK_TICK - - var/list/queue = src.queue - - while (length(queue)) - var/turf/currT = queue[1] - queue.Cut(1,2) - - currT.ImmediateCalculateAdjacentTurfs() - - if(mc_check) - if(MC_TICK_CHECK) - break - else - CHECK_TICK diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 94c3f34263af0..a065e2458cf6e 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -6,64 +6,54 @@ SUBSYSTEM_DEF(air) flags = SS_BACKGROUND runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + var/cached_cost = 0 + + var/cost_atoms = 0 var/cost_turfs = 0 + var/cost_hotspots = 0 var/cost_groups = 0 var/cost_highpressure = 0 - var/cost_deferred_airs - var/cost_hotspots = 0 - var/cost_post_process = 0 var/cost_superconductivity = 0 var/cost_pipenets = 0 - var/cost_rebuilds = 0 var/cost_atmos_machinery = 0 - var/cost_equalize = 0 - var/thread_wait_ticks = 0 - var/cur_thread_wait_ticks = 0 - ///The last time the subsystem completely processed - var/last_complete_process = 0 - - var/low_pressure_turfs = 0 - var/high_pressure_turfs = 0 - - var/num_group_turfs_processed = 0 - var/num_equalize_processed = 0 + var/cost_rebuilds = 0 + var/cost_adjacent = 0 + var/list/excited_groups = list() + var/list/active_turfs = list() var/list/hotspots = list() var/list/networks = list() - var/list/pipenets_needing_rebuilt = list() - var/list/deferred_airs = list() - var/max_deferred_airs = 0 + var/list/rebuild_queue = list() + //Subservient to rebuild queue + var/list/expansion_queue = list() + /// List of turfs to recalculate adjacent turfs on before processing + var/list/adjacent_rebuild = list() + /// A list of machines that will be processed when currentpart == SSAIR_ATMOSMACHINERY. Use SSair.begin_processing_machine and SSair.stop_processing_machine to add and remove machines. var/list/obj/machinery/atmos_machinery = list() - var/list/obj/machinery/atmos_air_machinery = list() - var/list/pipe_init_dirs_cache = list() + var/list/pipe_init_dirs_cache = list() //atmos singletons var/list/gas_reactions = list() + var/list/atmos_gen + var/list/planetary = list() //Lets cache static planetary mixes + /// List of gas string -> canonical gas mixture + var/list/strings_to_mix = list() + //Special functions lists + var/list/turf/active_super_conductivity = list() var/list/turf/open/high_pressure_delta = list() + var/list/atom_process = list() - + /// A cache of objects that perisists between processing runs when resumed == TRUE. Dangerous, qdel'd objects not cleared from this may cause runtimes on processing. var/list/currentrun = list() - var/currentpart = SSAIR_REBUILD_PIPENETS + var/currentpart = SSAIR_PIPENETS var/map_loading = TRUE + var/list/queued_for_activation + var/display_all_groups = FALSE - var/log_explosive_decompression = TRUE // If things get spammy, admemes can turn this off. - - // Max number of turfs equalization will grab. - var/equalize_turf_limit = 10 - // Max number of turfs to look for a space turf, and max number of turfs that will be decompressed. - var/equalize_hard_turf_limit = 2000 - // Whether equalization should be enabled at all. - var/equalize_enabled = FALSE - // Whether turf-to-turf heat exchanging should be enabled. - var/heat_enabled = FALSE - // Max number of times process_turfs will share in a tick. - var/share_max_steps = 3 - // Excited group processing will try to equalize groups with total pressure difference less than this amount. - var/excited_group_pressure_goal = 1 - + // Supercruise Z-pausing var/list/paused_z_levels //Paused z-levels will not add turfs to active var/list/unpausing_z_levels = list() var/list/unpause_processing = list() @@ -71,72 +61,53 @@ SUBSYSTEM_DEF(air) var/list/pausing_z_levels = list() var/list/pause_processing = list() + ///The last time the subsystem completely processed + var/last_complete_process = 0 + + /datum/controller/subsystem/air/stat_entry(msg) msg += "C:{" - msg += "HP:[round(cost_highpressure,1)]|" + msg += "AT:[round(cost_turfs,1)]|" msg += "HS:[round(cost_hotspots,1)]|" - msg += "HE:[round(heat_process_time(),1)]|" + msg += "EG:[round(cost_groups,1)]|" + msg += "HP:[round(cost_highpressure,1)]|" msg += "SC:[round(cost_superconductivity,1)]|" msg += "PN:[round(cost_pipenets,1)]|" - msg += "AM:[round(cost_atmos_machinery,1)]" + msg += "AM:[round(cost_atmos_machinery,1)]|" + msg += "AO:[round(cost_atoms, 1)]|" + msg += "RB:[round(cost_rebuilds,1)]|" + msg += "AJ:[round(cost_adjacent,1)]|" msg += "} " - msg += "TC:{" - msg += "AT:[round(cost_turfs,1)]|" - msg += "EG:[round(cost_groups,1)]|" - msg += "EQ:[round(cost_equalize,1)]|" - msg += "PO:[round(cost_post_process,1)]" - msg += "}" - msg += "TH:[round(thread_wait_ticks,1)]|" + msg += "AT:[active_turfs.len]|" msg += "HS:[hotspots.len]|" - msg += "PN:[networks.len]|" + msg += "EG:[excited_groups.len]|" msg += "HP:[high_pressure_delta.len]|" - msg += "HT:[high_pressure_turfs]|" - msg += "LT:[low_pressure_turfs]|" - msg += "ET:[num_equalize_processed]|" - msg += "GT:[num_group_turfs_processed]|" - msg += "DF:[max_deferred_airs]|" - msg += "GA:[get_amt_gas_mixes()]|" - msg += "MG:[get_max_gas_mixes()]" + msg += "SC:[active_super_conductivity.len]|" + msg += "PN:[networks.len]|" + msg += "AM:[atmos_machinery.len]|" + msg += "AO:[atom_process.len]|" + msg += "RB:[rebuild_queue.len]|" + msg += "EP:[expansion_queue.len]|" + msg += "AJ:[adjacent_rebuild.len]|" + msg += "AT/MS:[round((cost ? active_turfs.len/cost : 0),0.1)]" return ..() -/datum/controller/subsystem/air/Initialize() + +/datum/controller/subsystem/air/Initialize(timeofday) map_loading = FALSE + gas_reactions = init_gas_reactions() setup_allturfs() setup_atmos_machinery() setup_pipenets() - gas_reactions = init_gas_reactions() - auxtools_update_reactions() + setup_turf_visuals() + process_adjacent_rebuild() return SS_INIT_SUCCESS -/datum/controller/subsystem/air/proc/extools_update_ssair() - -/datum/controller/subsystem/air/proc/auxtools_update_reactions() - -/proc/reset_all_air() - SSair.can_fire = 0 - message_admins("Air reset begun.") - for(var/turf/open/T in world) - T.Initalize_Atmos(0) - CHECK_TICK - message_admins("Air reset done.") - SSair.can_fire = 1 - -/datum/controller/subsystem/air/proc/thread_running() - return FALSE - -/proc/fix_corrupted_atmos() - -/datum/admins/proc/fixcorruption() - set category = "Debug" - set desc="Fixes air that has weird NaNs (-1.#IND and such). Hopefully." - set name="Fix Infinite Air" - fix_corrupted_atmos() - -/datum/controller/subsystem/air/fire(resumed = 0) +/datum/controller/subsystem/air/fire(resumed = FALSE) var/timer = TICK_USAGE_REAL - //If we have unpausing z-level, process them first + //If we have unpausing z-level, process them first if(length(unpausing_z_levels) && !length(unpause_processing)) var/z_value = unpausing_z_levels[1] unpausing_z_levels.Remove(z_value) @@ -162,7 +133,7 @@ SUBSYSTEM_DEF(air) while(length(pause_processing)) var/turf/T = pause_processing[length(pause_processing)] - T.ImmediateDisableAdjacency() + T.immediate_disable_adjacency() //Goodbye pause_processing.len -- //We overran this tick, stop processing @@ -171,164 +142,166 @@ SUBSYSTEM_DEF(air) if(MC_TICK_CHECK) return - if(currentpart == SSAIR_REBUILD_PIPENETS) + //Rebuilds can happen at any time, so this needs to be done outside of the normal system + cost_rebuilds = 0 + cost_adjacent = 0 + + // We need to have a solid setup for turfs before fire, otherwise we'll get massive runtimes and strange behavior + if(length(adjacent_rebuild)) timer = TICK_USAGE_REAL - var/list/pipenet_rebuilds = pipenets_needing_rebuilt - for(var/thing in pipenet_rebuilds) - var/obj/machinery/atmospherics/AT = thing - if(!istype(AT)) - continue - AT.build_network() - cost_rebuilds = MC_AVERAGE(cost_rebuilds, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - pipenets_needing_rebuilt.Cut() + process_adjacent_rebuild() + //This does mean that the apperent rebuild costs fluctuate very quickly, this is just the cost of having them always process, no matter what + cost_adjacent = TICK_USAGE_REAL - timer + if(state != SS_RUNNING) + return + + // Every time we fire, we want to make sure pipenets are rebuilt. The game state could have changed between each fire() proc call + // and anything missing a pipenet can lead to unintended behaviour at worse and various runtimes at best. + if(length(rebuild_queue) || length(expansion_queue)) + timer = TICK_USAGE_REAL + process_rebuilds() + //This does mean that the apperent rebuild costs fluctuate very quickly, this is just the cost of having them always process, no matter what + cost_rebuilds = TICK_USAGE_REAL - timer if(state != SS_RUNNING) return - resumed = FALSE - currentpart = SSAIR_PIPENETS if(currentpart == SSAIR_PIPENETS || !resumed) timer = TICK_USAGE_REAL + if(!resumed) + cached_cost = 0 process_pipenets(resumed) - cost_pipenets = MC_AVERAGE(cost_pipenets, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + cached_cost += TICK_USAGE_REAL - timer if(state != SS_RUNNING) return - resumed = 0 + cost_pipenets = MC_AVERAGE(cost_pipenets, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE currentpart = SSAIR_ATMOSMACHINERY - // This is only machinery like filters, mixers that don't interact with air + if(currentpart == SSAIR_ATMOSMACHINERY) timer = TICK_USAGE_REAL + if(!resumed) + cached_cost = 0 process_atmos_machinery(resumed) - cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + cached_cost += TICK_USAGE_REAL - timer if(state != SS_RUNNING) return - resumed = 0 - currentpart = SSAIR_HIGHPRESSURE + cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + currentpart = SSAIR_ACTIVETURFS - if(currentpart == SSAIR_HIGHPRESSURE) - timer = TICK_USAGE_REAL - process_high_pressure_delta(resumed) - cost_highpressure = MC_AVERAGE(cost_highpressure, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - if(state != SS_RUNNING) - return - resumed = 0 - currentpart = SSAIR_FINALIZE_TURFS - // This literally just waits for the turf processing thread to finish, doesn't do anything else. - // this is necessary cause the next step after this interacts with the air--we get consistency - // issues if we don't wait for it, disappearing gases etc. - if(currentpart == SSAIR_FINALIZE_TURFS) - finish_turf_processing(resumed) - if(state != SS_RUNNING) - cur_thread_wait_ticks++ - return - resumed = 0 - thread_wait_ticks = MC_AVERAGE(thread_wait_ticks, cur_thread_wait_ticks) - cur_thread_wait_ticks = 0 - currentpart = SSAIR_DEFERRED_AIRS - if(currentpart == SSAIR_DEFERRED_AIRS) - timer = TICK_USAGE_REAL - process_deferred_airs(resumed) - cost_deferred_airs = MC_AVERAGE(cost_deferred_airs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - if(state != SS_RUNNING) - return - resumed = 0 - currentpart = SSAIR_ATMOSMACHINERY_AIR - if(currentpart == SSAIR_ATMOSMACHINERY_AIR) + if(currentpart == SSAIR_ACTIVETURFS) timer = TICK_USAGE_REAL - process_atmos_air_machinery(resumed) - cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(!resumed) + cached_cost = 0 + process_active_turfs(resumed) + cached_cost += TICK_USAGE_REAL - timer if(state != SS_RUNNING) return - resumed = 0 + cost_turfs = MC_AVERAGE(cost_turfs, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE currentpart = SSAIR_HOTSPOTS - if(currentpart == SSAIR_HOTSPOTS) + if(currentpart == SSAIR_HOTSPOTS) //We do this before excited groups to allow breakdowns to be independent of adding turfs while still *mostly preventing mass fires timer = TICK_USAGE_REAL + if(!resumed) + cached_cost = 0 process_hotspots(resumed) - cost_hotspots = MC_AVERAGE(cost_hotspots, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - if(state != SS_RUNNING) - return - resumed = 0 - currentpart = heat_enabled ? SSAIR_TURF_CONDUCTION : SSAIR_ACTIVETURFS - // Heat -- slow and of questionable usefulness. Off by default for this reason. Pretty cool, though. - if(currentpart == SSAIR_TURF_CONDUCTION) - timer = TICK_USAGE_REAL - if(process_turf_heat(MC_TICK_REMAINING_MS)) - pause() - cost_superconductivity = MC_AVERAGE(cost_superconductivity, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + cached_cost += TICK_USAGE_REAL - timer if(state != SS_RUNNING) return - resumed = 0 - currentpart = SSAIR_ACTIVETURFS - // This simply starts the turf thread. It runs in the background until the FINALIZE_TURFS step, at which point it's waited for. - // This also happens to do all the commented out stuff below, all in a single separate thread. This is mostly so that the - // waiting is consistent. - if(currentpart == SSAIR_ACTIVETURFS) + cost_hotspots = MC_AVERAGE(cost_hotspots, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + currentpart = SSAIR_EXCITEDGROUPS + + if(currentpart == SSAIR_EXCITEDGROUPS) timer = TICK_USAGE_REAL - process_turfs(resumed) - cost_turfs = MC_AVERAGE(cost_turfs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(!resumed) + cached_cost = 0 + process_excited_groups(resumed) + cached_cost += TICK_USAGE_REAL - timer if(state != SS_RUNNING) return - resumed = 0 - /* - // Monstermos and/or Putnamos--making large pressure deltas move faster - if(currentpart == SSAIR_EQUALIZE) + cost_groups = MC_AVERAGE(cost_groups, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + currentpart = SSAIR_HIGHPRESSURE + + if(currentpart == SSAIR_HIGHPRESSURE) timer = TICK_USAGE_REAL - process_turf_equalize(resumed) - cost_equalize = MC_AVERAGE(cost_equalize, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(!resumed) + cached_cost = 0 + process_high_pressure_delta(resumed) + cached_cost += TICK_USAGE_REAL - timer if(state != SS_RUNNING) return - resumed = 0 - currentpart = SSAIR_EXCITEDGROUPS - // Making small pressure deltas equalize immediately so they don't process anymore - if(currentpart == SSAIR_EXCITEDGROUPS) + cost_highpressure = MC_AVERAGE(cost_highpressure, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + currentpart = SSAIR_SUPERCONDUCTIVITY + + if(currentpart == SSAIR_SUPERCONDUCTIVITY) timer = TICK_USAGE_REAL - process_excited_groups(resumed) - cost_groups = MC_AVERAGE(cost_groups, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(!resumed) + cached_cost = 0 + process_super_conductivity(resumed) + cached_cost += TICK_USAGE_REAL - timer if(state != SS_RUNNING) return - resumed = 0 - currentpart = SSAIR_TURF_POST_PROCESS - // Quick multithreaded "should we display/react?" checks followed by finishing those up before the next step - if(currentpart == SSAIR_TURF_POST_PROCESS) + cost_superconductivity = MC_AVERAGE(cost_superconductivity, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + currentpart = SSAIR_PROCESS_ATOMS + + if(currentpart == SSAIR_PROCESS_ATOMS) timer = TICK_USAGE_REAL - post_process_turfs(resumed) - cost_post_process = MC_AVERAGE(cost_post_process, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(!resumed) + cached_cost = 0 + process_atoms(resumed) + cached_cost += TICK_USAGE_REAL - timer if(state != SS_RUNNING) return - resumed = 0 - currentpart = SSAIR_HOTSPOTS - */ - currentpart = SSAIR_REBUILD_PIPENETS + cost_atoms = MC_AVERAGE(cost_atoms, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + + currentpart = SSAIR_PIPENETS last_complete_process = world.time + SStgui.update_uis(SSair) //Lightning fast debugging motherfucker /datum/controller/subsystem/air/Recover() - thread_wait_ticks = SSair.thread_wait_ticks - cur_thread_wait_ticks = SSair.cur_thread_wait_ticks - low_pressure_turfs = SSair.low_pressure_turfs - high_pressure_turfs = SSair.high_pressure_turfs - num_group_turfs_processed = SSair.num_group_turfs_processed - num_equalize_processed = SSair.num_equalize_processed + excited_groups = SSair.excited_groups + active_turfs = SSair.active_turfs hotspots = SSair.hotspots networks = SSair.networks - pipenets_needing_rebuilt = SSair.pipenets_needing_rebuilt - deferred_airs = SSair.deferred_airs - max_deferred_airs = SSair.max_deferred_airs + rebuild_queue = SSair.rebuild_queue + expansion_queue = SSair.expansion_queue + adjacent_rebuild = SSair.adjacent_rebuild atmos_machinery = SSair.atmos_machinery - atmos_air_machinery = SSair.atmos_air_machinery pipe_init_dirs_cache = SSair.pipe_init_dirs_cache gas_reactions = SSair.gas_reactions + atmos_gen = SSair.atmos_gen + planetary = SSair.planetary + active_super_conductivity = SSair.active_super_conductivity high_pressure_delta = SSair.high_pressure_delta + atom_process = SSair.atom_process currentrun = SSair.currentrun - currentpart = SSair.currentpart - map_loading = SSair.map_loading - log_explosive_decompression = SSair.log_explosive_decompression - equalize_turf_limit = SSair.equalize_turf_limit - equalize_hard_turf_limit = SSair.equalize_hard_turf_limit - equalize_enabled = SSair.equalize_enabled - heat_enabled = SSair.heat_enabled - share_max_steps = SSair.share_max_steps - excited_group_pressure_goal = SSair.excited_group_pressure_goal - paused_z_levels = SSair.paused_z_levels + queued_for_activation = SSair.queued_for_activation + +/datum/controller/subsystem/air/proc/process_adjacent_rebuild(init = FALSE) + var/list/queue = adjacent_rebuild + + while (length(queue)) + var/turf/currT = queue[1] + var/goal = queue[currT] + queue.Cut(1,2) + + currT.immediate_calculate_adjacent_turfs() + if(goal == MAKE_ACTIVE) + add_to_active(currT) + else if(goal == KILL_EXCITED) + add_to_active(currT, TRUE) + + if(init) + CHECK_TICK + else + if(MC_TICK_CHECK) + break /datum/controller/subsystem/air/proc/process_pipenets(resumed = FALSE) if (!resumed) @@ -345,115 +318,65 @@ SUBSYSTEM_DEF(air) if(MC_TICK_CHECK) return -/datum/controller/subsystem/air/proc/add_to_rebuild_queue(atmos_machine) - if(istype(atmos_machine, /obj/machinery/atmospherics)) - pipenets_needing_rebuilt += atmos_machine - -/datum/controller/subsystem/air/proc/process_deferred_airs(resumed = 0) - max_deferred_airs = max(deferred_airs.len,max_deferred_airs) - while(deferred_airs.len) - var/list/cur_op = deferred_airs[deferred_airs.len] - deferred_airs.len-- - var/datum/gas_mixture/air1 - var/datum/gas_mixture/air2 - if(isopenturf(cur_op[1])) - var/turf/open/T = cur_op[1] - air1 = T.return_air() - else - air1 = cur_op[1] - if(isopenturf(cur_op[2])) - var/turf/open/T = cur_op[2] - air2 = T.return_air() - else - air2 = cur_op[2] - if(istype(cur_op[3], /datum/callback)) - var/datum/callback/cb = cur_op[3] - cb.Invoke(air1, air2) - else - if(cur_op[3] == 0) - air1.transfer_to(air2, air1.total_moles()) - else - air1.transfer_ratio_to(air2, cur_op[3]) +/datum/controller/subsystem/air/proc/add_to_rebuild_queue(obj/machinery/atmospherics/atmos_machine) + if(istype(atmos_machine, /obj/machinery/atmospherics) && !atmos_machine.rebuilding) + rebuild_queue += atmos_machine + atmos_machine.rebuilding = TRUE + +/datum/controller/subsystem/air/proc/add_to_expansion(datum/pipeline/line, starting_point) + var/list/new_packet = new(SSAIR_REBUILD_QUEUE) + new_packet[SSAIR_REBUILD_PIPELINE] = line + new_packet[SSAIR_REBUILD_QUEUE] = list(starting_point) + expansion_queue += list(new_packet) + +/datum/controller/subsystem/air/proc/remove_from_expansion(datum/pipeline/line) + for(var/list/packet in expansion_queue) + if(packet[SSAIR_REBUILD_PIPELINE] == line) + expansion_queue -= packet + return + +/datum/controller/subsystem/air/proc/process_atoms(resumed = FALSE) + if(!resumed) + src.currentrun = atom_process.Copy() + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + while(currentrun.len) + var/atom/talk_to = currentrun[currentrun.len] + currentrun.len-- + if(!talk_to) + return + talk_to.process_exposure() if(MC_TICK_CHECK) return -/datum/controller/subsystem/air/proc/process_atmos_machinery(resumed = 0) +/datum/controller/subsystem/air/proc/process_atmos_machinery(resumed = FALSE) if (!resumed) src.currentrun = atmos_machinery.Copy() //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun while(currentrun.len) - var/obj/machinery/current_machinery = currentrun[currentrun.len] + var/obj/machinery/M = currentrun[currentrun.len] currentrun.len-- - if(!current_machinery) - atmos_machinery -= current_machinery - // Prevents uninitalized atmos machinery from processing. - if (!(current_machinery.flags_1 & INITIALIZED_1)) - continue - if(current_machinery.process_atmos() == PROCESS_KILL) - stop_processing_machine(current_machinery) + if(!M) + atmos_machinery -= M + if(M.process_atmos() == PROCESS_KILL) + stop_processing_machine(M) if(MC_TICK_CHECK) return -/datum/controller/subsystem/air/proc/process_atmos_air_machinery(resumed = 0) - var/seconds = wait * 0.1 + +/datum/controller/subsystem/air/proc/process_super_conductivity(resumed = FALSE) if (!resumed) - src.currentrun = atmos_air_machinery.Copy() + src.currentrun = active_super_conductivity.Copy() //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun while(currentrun.len) - var/obj/machinery/current_machinery = currentrun[currentrun.len] + var/turf/T = currentrun[currentrun.len] currentrun.len-- - // Prevents uninitalized atmos machinery from processing. - if (!(current_machinery.flags_1 & INITIALIZED_1)) - continue - if(!current_machinery) - atmos_air_machinery -= current_machinery - if(current_machinery.process_atmos(seconds) == PROCESS_KILL) - stop_processing_machine(current_machinery) + T.super_conduct() if(MC_TICK_CHECK) return -/** - * Adds a given machine to the processing system for SSAIR_ATMOSMACHINERY processing. - * - * Arguments: - * * machine - The machine to start processing. Can be any /obj/machinery. - */ -/datum/controller/subsystem/air/proc/start_processing_machine(obj/machinery/machine) - if(machine.atmos_processing) - return - machine.atmos_processing = TRUE - if(machine.interacts_with_air) - atmos_air_machinery += machine - else - atmos_machinery += machine - -/** - * Removes a given machine to the processing system for SSAIR_ATMOSMACHINERY processing. - * - * Arguments: - * * machine - The machine to stop processing. - */ -/datum/controller/subsystem/air/proc/stop_processing_machine(obj/machinery/machine) - if(!machine.atmos_processing) - return - machine.atmos_processing = FALSE - if(machine.interacts_with_air) - atmos_air_machinery -= machine - else - atmos_machinery -= machine - - // If we're currently processing atmos machines, there's a chance this machine is in - // the currentrun list, which is a cache of atmos_machinery. Remove it from that list - // as well to prevent processing qdeleted objects in the cache. - if(currentpart == SSAIR_ATMOSMACHINERY) - currentrun -= machine - if(machine.interacts_with_air && currentpart == SSAIR_ATMOSMACHINERY_AIR) - currentrun -= machine - -/datum/controller/subsystem/air/proc/process_turf_heat() - /datum/controller/subsystem/air/proc/process_hotspots(resumed = FALSE) if (!resumed) src.currentrun = hotspots.Copy() @@ -469,21 +392,16 @@ SUBSYSTEM_DEF(air) if(MC_TICK_CHECK) return - -/datum/controller/subsystem/air/proc/process_high_pressure_delta(resumed = 0) +/datum/controller/subsystem/air/proc/process_high_pressure_delta(resumed = FALSE) while (high_pressure_delta.len) var/turf/open/T = high_pressure_delta[high_pressure_delta.len] high_pressure_delta.len-- T.high_pressure_movements() T.pressure_difference = 0 - T.pressure_specific_target = null if(MC_TICK_CHECK) return -/datum/controller/subsystem/air/proc/process_turf_equalize(resumed = 0) - if(process_turf_equalize_auxtools(resumed,MC_TICK_REMAINING_MS)) - pause() - /* +/datum/controller/subsystem/air/proc/process_active_turfs(resumed = FALSE) //cache for sanic speed var/fire_count = times_fired if (!resumed) @@ -494,124 +412,493 @@ SUBSYSTEM_DEF(air) var/turf/open/T = currentrun[currentrun.len] currentrun.len-- if (T) - T.equalize_pressure_in_zone(fire_count) - //equalize_pressure_in_zone(T, fire_count) + T.process_cell(fire_count) if (MC_TICK_CHECK) return - */ -/datum/controller/subsystem/air/proc/process_turfs(resumed = 0) - if(process_turfs_auxtools(resumed,MC_TICK_REMAINING_MS)) - pause() - /* - //cache for sanic speed - var/fire_count = times_fired +/datum/controller/subsystem/air/proc/process_excited_groups(resumed = FALSE) if (!resumed) - src.currentrun = active_turfs.Copy() + src.currentrun = excited_groups.Copy() //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun while(currentrun.len) - var/turf/open/T = currentrun[currentrun.len] + var/datum/excited_group/EG = currentrun[currentrun.len] currentrun.len-- - if (T) - T.process_cell(fire_count) + EG.breakdown_cooldown++ + EG.dismantle_cooldown++ + if(EG.breakdown_cooldown >= EXCITED_GROUP_BREAKDOWN_CYCLES) + EG.self_breakdown(poke_turfs = TRUE) + else if(EG.dismantle_cooldown >= EXCITED_GROUP_DISMANTLE_CYCLES) + EG.dismantle() + if (MC_TICK_CHECK) + return + +/datum/controller/subsystem/air/proc/process_rebuilds() + //Yes this does mean rebuilding pipenets can freeze up the subsystem forever, but if we're in that situation something else is very wrong + var/list/currentrun = rebuild_queue + while(currentrun.len || length(expansion_queue)) + while(currentrun.len && !length(expansion_queue)) //If we found anything, process that first + var/obj/machinery/atmospherics/remake = currentrun[currentrun.len] + currentrun.len-- + if (!remake) + continue + remake.rebuild_pipes() + if (MC_TICK_CHECK) + return + + var/list/queue = expansion_queue + while(queue.len) + var/list/pack = queue[queue.len] + //We operate directly with the pipeline like this because we can trust any rebuilds to remake it properly + var/datum/pipeline/linepipe = pack[SSAIR_REBUILD_PIPELINE] + var/list/border = pack[SSAIR_REBUILD_QUEUE] + expand_pipeline(linepipe, border) + if(state != SS_RUNNING) //expand_pipeline can fail a tick check, we shouldn't let things get too fucky here + return + + linepipe.building = FALSE + queue.len-- + if (MC_TICK_CHECK) + return + +///Rebuilds a pipeline by expanding outwards, while yielding when sane +/datum/controller/subsystem/air/proc/expand_pipeline(datum/pipeline/net, list/border) + while(border.len) + var/obj/machinery/atmospherics/borderline = border[border.len] + border.len-- + + var/list/result = borderline.pipeline_expansion(net) + if(!length(result)) + continue + for(var/obj/machinery/atmospherics/considered_device in result) + if(!istype(considered_device, /obj/machinery/atmospherics/pipe)) + considered_device.set_pipenet(net, borderline) + net.add_machinery_member(considered_device) + continue + var/obj/machinery/atmospherics/pipe/item = considered_device + if(net.members.Find(item)) + continue + if(item.parent) + var/static/pipenetwarnings = 10 + if(pipenetwarnings > 0) + log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) around [AREACOORD(item)].") + pipenetwarnings-- + if(pipenetwarnings == 0) + log_mapping("build_pipeline(): further messages about pipenets will be suppressed") + + net.members += item + border += item + + net.air.volume += item.volume + item.parent = net + + if(item.air_temporary) + net.air.merge(item.air_temporary) + item.air_temporary = null + if (MC_TICK_CHECK) return - */ - -/datum/controller/subsystem/air/proc/process_excited_groups(resumed = 0) - if(process_excited_groups_auxtools(resumed,MC_TICK_REMAINING_MS)) - pause() - -/datum/controller/subsystem/air/proc/finish_turf_processing(resumed = 0) - if(finish_turf_processing_auxtools(MC_TICK_REMAINING_MS)) - pause() - -/datum/controller/subsystem/air/proc/post_process_turfs(resumed = 0) - if(post_process_turfs_auxtools(resumed,MC_TICK_REMAINING_MS)) - pause() - -/datum/controller/subsystem/air/proc/finish_turf_processing_auxtools() -/datum/controller/subsystem/air/proc/process_turfs_auxtools() -/datum/controller/subsystem/air/proc/post_process_turfs_auxtools() -/datum/controller/subsystem/air/proc/process_turf_equalize_auxtools() -/datum/controller/subsystem/air/proc/process_excited_groups_auxtools() -/datum/controller/subsystem/air/proc/get_amt_gas_mixes() -/datum/controller/subsystem/air/proc/get_max_gas_mixes() -/datum/controller/subsystem/air/proc/turf_process_time() -/datum/controller/subsystem/air/proc/heat_process_time() + +///Removes a turf from processing, and causes its excited group to clean up so things properly adapt to the change +/datum/controller/subsystem/air/proc/remove_from_active(turf/open/T) + active_turfs -= T + if(currentpart == SSAIR_ACTIVETURFS) + currentrun -= T + #ifdef VISUALIZE_ACTIVE_TURFS //Use this when you want details about how the turfs are moving, display_all_groups should work for normal operation + T.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_VIBRANT_LIME) + #endif + if(istype(T)) + T.excited = FALSE + if(T.excited_group) + //If this fires during active turfs it'll cause a slight removal of active turfs, as they breakdown if they have no excited group + //The group also expands by a tile per rebuild on each edge, suffering + T.excited_group.garbage_collect() //Kill the excited group, it'll reform on its own later + +///Puts an active turf to sleep so it doesn't process. Do this without cleaning up its excited group. +/datum/controller/subsystem/air/proc/sleep_active_turf(turf/open/T) + active_turfs -= T + if(currentpart == SSAIR_ACTIVETURFS) + currentrun -= T + #ifdef VISUALIZE_ACTIVE_TURFS + T.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_VIBRANT_LIME) + #endif + if(istype(T)) + T.excited = FALSE + +///Adds a turf to active processing, handles duplicates. Call this with blockchanges == TRUE if you want to nuke the assoc excited group +/datum/controller/subsystem/air/proc/add_to_active(turf/open/T, blockchanges = FALSE) + if(istype(T) && T.air) + T.significant_share_ticker = 0 + if(blockchanges && T.excited_group) //This is used almost exclusivly for shuttles, so the excited group doesn't stay behind + T.excited_group.garbage_collect() //Nuke it + if(T.excited) //Don't keep doing it if there's no point + return + #ifdef VISUALIZE_ACTIVE_TURFS + T.add_atom_colour(COLOR_VIBRANT_LIME, TEMPORARY_COLOUR_PRIORITY) + #endif + T.excited = TRUE + active_turfs += T + if(currentpart == SSAIR_ACTIVETURFS) + currentrun += T + else if(T.flags_1 & INITIALIZED_1) + for(var/turf/S in T.atmos_adjacent_turfs) + add_to_active(S, TRUE) + else if(map_loading) + if(queued_for_activation) + queued_for_activation[T] = T + return + else + T.requires_activation = TRUE /datum/controller/subsystem/air/StartLoadingMap() + LAZYINITLIST(queued_for_activation) map_loading = TRUE /datum/controller/subsystem/air/StopLoadingMap() map_loading = FALSE - -/datum/controller/subsystem/air/proc/pause_z(z_level) - LAZYADD(paused_z_levels, z_level) - unpausing_z_levels -= z_level - pausing_z_levels |= z_level - -/datum/controller/subsystem/air/proc/unpause_z(z_level) - pausing_z_levels -= z_level - unpausing_z_levels |= z_level - LAZYREMOVE(paused_z_levels, z_level) + for(var/T in queued_for_activation) + add_to_active(T, TRUE) + queued_for_activation.Cut() /datum/controller/subsystem/air/proc/setup_allturfs() - var/times_fired = ++src.times_fired - - for(var/turf/T as anything in ALL_TURFS()) - if (!T.init_air) + var/list/active_turfs = src.active_turfs + times_fired++ + + // Clear active turfs - faster than removing every single turf in the world + // one-by-one, and Initalize_Atmos only ever adds `src` back in. + #ifdef VISUALIZE_ACTIVE_TURFS + for(var/jumpy in active_turfs) + var/turf/active = jumpy + active.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_VIBRANT_LIME) + #endif + active_turfs.Cut() + var/time = 0 + + var/list/turf/open/difference_check = list() + for(var/turf/setup as anything in ALL_TURFS()) + if (!setup.init_air) continue - T.Initalize_Atmos(times_fired) + // We pass the tick as the current step so if we sleep the step changes + // This way we can make setting up adjacent turfs O(n) rather then O(n^2) + setup.Initalize_Atmos(time) + // We assert that we'll only get open turfs here + difference_check += setup + if(CHECK_TICK) + time++ + + // Now we're gonna compare for differences + // Taking advantage of current cycle being set to negative before this run to do A->B B->A prevention + for(var/turf/open/potential_diff as anything in difference_check) + // I can't use 0 here, so we're gonna do this instead. If it ever breaks I'll eat my shoe + potential_diff.current_cycle = -INFINITY + for(var/turf/open/enemy_tile as anything in potential_diff.atmos_adjacent_turfs) + // If it's already been processed, then it's already talked to us + if(enemy_tile.current_cycle == -INFINITY) + continue + // .air instead of .return_air() because we can guarentee that the proc won't do anything + if(potential_diff.air.compare(enemy_tile.air)) + //testing("Active turf found. Return value of compare(): [T.air.compare(enemy_tile.air)]") + if(!potential_diff.excited) + potential_diff.excited = TRUE + SSair.active_turfs += potential_diff + if(!enemy_tile.excited) + enemy_tile.excited = TRUE + SSair.active_turfs += enemy_tile + // No sense continuing to iterate + break CHECK_TICK + if(active_turfs.len) + var/starting_ats = active_turfs.len + sleep(world.tick_lag) + var/timer = world.timeofday + log_mapping("There are [starting_ats] active turfs at roundstart caused by a difference of the air between the adjacent turfs. You can see its coordinates using \"Mapping -> Show roundstart AT list\" verb (debug verbs required).") + for(var/turf/T in active_turfs) + GLOB.active_turfs_startlist += T + + //now lets clear out these active turfs + var/list/turfs_to_check = active_turfs.Copy() + do + var/list/new_turfs_to_check = list() + for(var/turf/open/T in turfs_to_check) + new_turfs_to_check += T.resolve_active_graph() + CHECK_TICK + + active_turfs += new_turfs_to_check + turfs_to_check = new_turfs_to_check + while (turfs_to_check.len) + + var/ending_ats = active_turfs.len + for(var/thing in excited_groups) + var/datum/excited_group/EG = thing + EG.self_breakdown(roundstart = TRUE) + EG.dismantle() + CHECK_TICK + + var/msg = "HEY! LISTEN! [DisplayTimeText(world.timeofday - timer)] were wasted processing [starting_ats] turf(s) (connected to [ending_ats - starting_ats] other turfs) with atmos differences at round start." + to_chat(world, "[msg]") + warning(msg) + +/turf/open/proc/resolve_active_graph() + . = list() + var/datum/excited_group/EG = excited_group + if (blocks_air || !air) + return + if (!EG) + EG = new + EG.add_turf(src) + + for (var/turf/open/ET in atmos_adjacent_turfs) + if (ET.blocks_air || !ET.air) + continue + + var/ET_EG = ET.excited_group + if (ET_EG) + if (ET_EG != EG) + EG.merge_groups(ET_EG) + EG = excited_group //merge_groups() may decide to replace our current EG + else + EG.add_turf(ET) + if (!ET.excited) + ET.excited = TRUE + . += ET + +/turf/open/space/resolve_active_graph() + return list() + /datum/controller/subsystem/air/proc/setup_atmos_machinery() - for (var/obj/machinery/atmospherics/AM in atmos_machinery + atmos_air_machinery) - AM.atmosinit() + for (var/obj/machinery/atmospherics/AM in atmos_machinery) + AM.atmos_init() CHECK_TICK //this can't be done with setup_atmos_machinery() because // all atmos machinery has to initalize before the first // pipenet can be built. /datum/controller/subsystem/air/proc/setup_pipenets() - for (var/obj/machinery/atmospherics/AM in atmos_machinery + atmos_air_machinery) - AM.build_network() + for (var/obj/machinery/atmospherics/AM in atmos_machinery) + var/list/targets = AM.get_rebuild_targets() + for(var/datum/pipeline/build_off as anything in targets) + build_off.build_pipeline_blocking(AM) CHECK_TICK +GLOBAL_LIST_EMPTY(colored_turfs) +GLOBAL_LIST_EMPTY(colored_images) +/datum/controller/subsystem/air/proc/setup_turf_visuals() + for(var/sharp_color in GLOB.contrast_colors) + var/obj/effect/overlay/atmos_excited/suger_high = new() + GLOB.colored_turfs += suger_high + var/image/shiny = new('icons/effects/effects.dmi', suger_high, "atmos_top", ATMOS_GROUP_LAYER) + shiny.plane = ATMOS_GROUP_PLANE + shiny.color = sharp_color + GLOB.colored_images += shiny + /datum/controller/subsystem/air/proc/setup_template_machinery(list/atmos_machines) - if(!initialized) // yogs - fixes randomized bars - return // yogs var/obj/machinery/atmospherics/AM for(var/A in 1 to atmos_machines.len) AM = atmos_machines[A] - AM.atmosinit() + AM.atmos_init() CHECK_TICK for(var/A in 1 to atmos_machines.len) AM = atmos_machines[A] - AM.build_network() + var/list/targets = AM.get_rebuild_targets() + for(var/datum/pipeline/build_off as anything in targets) + build_off.build_pipeline_blocking(AM) CHECK_TICK + /datum/controller/subsystem/air/proc/get_init_dirs(type, dir) if(!pipe_init_dirs_cache[type]) pipe_init_dirs_cache[type] = list() if(!pipe_init_dirs_cache[type]["[dir]"]) var/obj/machinery/atmospherics/temp = new type(null, FALSE, dir) - pipe_init_dirs_cache[type]["[dir]"] = temp.GetInitDirections() + pipe_init_dirs_cache[type]["[dir]"] = temp.get_init_directions() qdel(temp) return pipe_init_dirs_cache[type]["[dir]"] -#undef SSAIR_PIPENETS -#undef SSAIR_ATMOSMACHINERY -#undef SSAIR_EXCITEDGROUPS -#undef SSAIR_HIGHPRESSURE -#undef SSAIR_HOTSPOTS -#undef SSAIR_TURF_CONDUCTION -#undef SSAIR_EQUALIZE -#undef SSAIR_ACTIVETURFS -#undef SSAIR_TURF_POST_PROCESS -#undef SSAIR_FINALIZE_TURFS -#undef SSAIR_ATMOSMACHINERY_AIR +/datum/controller/subsystem/air/proc/generate_atmos() + atmos_gen = list() + for(var/T in subtypesof(/datum/atmosphere)) + var/datum/atmosphere/atmostype = T + atmos_gen[initial(atmostype.id)] = new atmostype + +/// Takes a gas string, returns the matching mutable gas_mixture +/datum/controller/subsystem/air/proc/parse_gas_string(gas_string) + var/datum/gas_mixture/cached = strings_to_mix[gas_string] + if(cached) + if(istype(cached, /datum/gas_mixture/immutable)) + return cached + return cached.copy() + + var/datum/gas_mixture/canonical_mix = new() + // We set here so any future key changes don't fuck us + strings_to_mix[gas_string] = canonical_mix + gas_string = preprocess_gas_string(gas_string) + + var/list/gas = params2list(gas_string) + if(gas["TEMP"]) + canonical_mix.temperature = text2num(gas["TEMP"]) + canonical_mix.temperature_archived = canonical_mix.temperature + gas -= "TEMP" + else // if we do not have a temp in the new gas mix lets assume room temp. + canonical_mix.temperature = T20C + for(var/id in gas) + var/path = id + if(!ispath(path)) + path = gas_id2path(path) //a lot of these strings can't have embedded expressions (especially for mappers), so support for IDs needs to stick around + SET_MOLES(path, canonical_mix, text2num(gas[id])) + + if(istype(canonical_mix, /datum/gas_mixture/immutable)) + return canonical_mix + return canonical_mix.copy() + +/datum/controller/subsystem/air/proc/preprocess_gas_string(gas_string) + if(!atmos_gen) + generate_atmos() + if(!atmos_gen[gas_string]) + return gas_string + var/datum/atmosphere/mix = atmos_gen[gas_string] + return mix.gas_string + +/** + * Adds a given machine to the processing system for SSAIR_ATMOSMACHINERY processing. + * + * This should be fast, so no error checking is done. + * If you start adding in things you shouldn't, you'll cause runtimes every 2 seconds for every + * object you added. Do not use irresponsibly. + * Arguments: + * * machine - The machine to start processing. Can be any /obj/machinery. + */ +/datum/controller/subsystem/air/proc/start_processing_machine(obj/machinery/machine) + if(machine.atmos_processing) + return + machine.atmos_processing = TRUE + +/** + * Removes a given machine to the processing system for SSAIR_ATMOSMACHINERY processing. + * + * This should be fast, so no error checking is done. + * If you call this proc when your machine isn't processing, you're likely attempting to + * remove something that isn't in a list with over 1000 objects, twice. Do not use + * irresponsibly. + * Arguments: + * * machine - The machine to stop processing. + */ +/datum/controller/subsystem/air/proc/stop_processing_machine(obj/machinery/machine) + if(!machine.atmos_processing) + return + machine.atmos_processing = FALSE + atmos_machinery -= machine + + // If we're currently processing atmos machines, there's a chance this machine is in + // the currentrun list, which is a cache of atmos_machinery. Remove it from that list + // as well to prevent processing qdeleted objects in the cache. + if(currentpart == SSAIR_ATMOSMACHINERY) + currentrun -= machine + +/datum/controller/subsystem/air/ui_state(mob/user) + return GLOB.debug_state + +/datum/controller/subsystem/air/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AtmosControlPanel") + ui.set_autoupdate(FALSE) + ui.open() + +/datum/controller/subsystem/air/ui_data(mob/user) + var/list/data = list() + data["excited_groups"] = list() + for(var/datum/excited_group/group in excited_groups) + var/turf/T = group.turf_list[1] + var/area/target = get_area(T) + var/max = 0 + #ifdef TRACK_MAX_SHARE + for(var/who in group.turf_list) + var/turf/open/lad = who + max = max(lad.max_share, max) + #endif + data["excited_groups"] += list(list( + "jump_to" = REF(T), //Just go to the first turf + "group" = REF(group), + "area" = target.name, + "breakdown" = group.breakdown_cooldown, + "dismantle" = group.dismantle_cooldown, + "size" = group.turf_list.len, + "should_show" = group.should_display, + "max_share" = max + )) + data["active_size"] = active_turfs.len + data["hotspots_size"] = hotspots.len + data["excited_size"] = excited_groups.len + data["conducting_size"] = active_super_conductivity.len + data["frozen"] = can_fire + data["show_all"] = display_all_groups + data["fire_count"] = times_fired + #ifdef TRACK_MAX_SHARE + data["display_max"] = TRUE + #else + data["display_max"] = FALSE + #endif + var/atom/movable/screen/plane_master/plane = user.hud_used.plane_masters["[ATMOS_GROUP_PLANE]"] + data["showing_user"] = (plane.alpha == 255) + return data + +/datum/controller/subsystem/air/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(. || !check_rights_for(usr.client, R_DEBUG)) + return + switch(action) + if("move-to-target") + var/turf/target = locate(params["spot"]) + if(!target) + return + usr.forceMove(target) + if("toggle-freeze") + can_fire = !can_fire + return TRUE + if("toggle_show_group") + var/datum/excited_group/group = locate(params["group"]) + if(!group) + return + group.should_display = !group.should_display + if(display_all_groups) + return TRUE + if(group.should_display) + group.display_turfs() + else + group.hide_turfs() + return TRUE + if("toggle_show_all") + display_all_groups = !display_all_groups + for(var/datum/excited_group/group in excited_groups) + if(display_all_groups) + group.display_turfs() + else if(!group.should_display) //Don't flicker yeah? + group.hide_turfs() + return TRUE + if("toggle_user_display") + var/atom/movable/screen/plane_master/plane = ui.user.hud_used.plane_masters["[ATMOS_GROUP_PLANE]"] + + if(!plane.alpha) + if(ui.user.client) + ui.user.client.images += GLOB.colored_images + plane.alpha = 255 + else + if(ui.user.client) + ui.user.client.images -= GLOB.colored_images + plane.alpha = 0 + return TRUE + +// Supercruise Z-pausing +/datum/controller/subsystem/air/proc/pause_z(z_level) + LAZYADD(paused_z_levels, z_level) + unpausing_z_levels -= z_level + pausing_z_levels |= z_level + +/datum/controller/subsystem/air/proc/unpause_z(z_level) + pausing_z_levels -= z_level + unpausing_z_levels |= z_level + LAZYREMOVE(paused_z_levels, z_level) diff --git a/code/controllers/subsystem/explosion.dm b/code/controllers/subsystem/explosion.dm index 76c517e7eb0b2..d74e8910d94bb 100644 --- a/code/controllers/subsystem/explosion.dm +++ b/code/controllers/subsystem/explosion.dm @@ -33,7 +33,7 @@ SUBSYSTEM_DEF(explosions) var/list/explosions = list() - var/currentpart = SSAIR_REBUILD_PIPENETS + var/currentpart = SSAIR_REBUILD_PIPELINE /datum/controller/subsystem/explosions/stat_entry(msg) @@ -625,8 +625,6 @@ SUBSYSTEM_DEF(explosions) currentpart = SSEXPLOSIONS_TURFS -#undef SSAIR_REBUILD_PIPENETS - #undef EXPLOSION_THROW_SPEED #undef SSEX_TURF #undef SSEX_OBJ diff --git a/code/datums/atmosphere/_atmosphere.dm b/code/datums/atmosphere/_atmosphere.dm index df76b3f2a4111..521e5a74ff2c3 100644 --- a/code/datums/atmosphere/_atmosphere.dm +++ b/code/datums/atmosphere/_atmosphere.dm @@ -23,9 +23,10 @@ // First let's set up the gasmix and base gases for this template // We make the string from a gasmix in this proc because gases need to calculate their pressure var/datum/gas_mixture/gasmix = new - gasmix.set_temperature(rand(minimum_temp, maximum_temp)) + gasmix.temperature = rand(minimum_temp, maximum_temp) for(var/i in base_gases) - gasmix.set_moles(i, base_gases[i]) + SET_MOLES(i, gasmix, base_gases[i]) + // Now let the random choices begin var/datum/gas/gastype @@ -37,23 +38,23 @@ else gastype = pick(restricted_gases) amount = restricted_gases[gastype] - if(gasmix.get_moles(gastype)) + if(GET_MOLES(gastype, gasmix)) continue amount *= rand(50, 200) / 100 // Randomly modifes the amount from half to double the base for some variety amount *= pressure_scalar // If we pick a really small target pressure we want roughly the same mix but less of it all amount = CEILING(amount, 0.1) - gasmix.set_moles(gastype, gasmix.get_moles(gastype) + amount) + ADD_MOLES(gastype, gasmix, amount) // That last one put us over the limit, remove some of it while(gasmix.return_pressure() > target_pressure) - gasmix.set_moles(gastype, gasmix.get_moles(gastype) - (gasmix.get_moles(gastype) * 0.1)) - gasmix.set_moles(gastype, FLOOR(gasmix.get_moles(gastype), 0.1)) + SET_MOLES(gastype, gasmix, GET_MOLES(gastype, gasmix) * 0.9) + SET_MOLES(gastype, gasmix, FLOOR(GET_MOLES(gastype,gasmix), 0.1)) // Now finally lets make that string var/list/gas_string_builder = list() - for(var/i in gasmix.get_gases()) - gas_string_builder += "[GLOB.gas_data.ids[i]]=[gasmix.get_moles(i)]" + for(var/i in gasmix.gases) + gas_string_builder += "[gasmix.gases[i][GAS_META][META_GAS_ID]]=[GET_MOLES(i, gasmix)]" gas_string_builder += "TEMP=[gasmix.return_temperature()]" gas_string = gas_string_builder.Join(";") diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 3db152283651f..cb3aa6f9030e0 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -141,12 +141,12 @@ if(!newturf) qdel(src) - var/atom/curloc = master.loc + var/atom/current_location = master.loc for(var/atom/movable/movable_orbiter as anything in current_orbiters) if(QDELETED(movable_orbiter) || movable_orbiter.loc == newturf) continue movable_orbiter.abstract_move(newturf) - if(CHECK_TICK && master.loc != curloc) + if(CHECK_TICK && master.loc != current_location) // We moved again during the checktick, cancel current operation break diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 2058459838839..87e2bf66adb4f 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -134,7 +134,7 @@ if(end == start) return TRUE var/turf/Temp = get_step_towards(end, start) - if(!CANATMOSPASS(end, Temp)) + if(!CANATMOSPASS(end, Temp, FALSE)) return FALSE end = Temp diff --git a/code/datums/diseases/advance/symptoms/clockwork.dm b/code/datums/diseases/advance/symptoms/clockwork.dm index efc5526b72d83..796b950d948ef 100644 --- a/code/datums/diseases/advance/symptoms/clockwork.dm +++ b/code/datums/diseases/advance/symptoms/clockwork.dm @@ -107,8 +107,8 @@ var/obj/item/organ/lungs/clockwork/organ = new() if(robustbits) organ.gas_max = list( - GAS_PLASMA = 15, - GAS_CO2 = 15, + /datum/gas/plasma = 15, + /datum/gas/carbon_dioxide = 15, ) organ.SA_para_min = 15 organ.SA_sleep_min = 15 diff --git a/code/datums/elements/atmos_requirements.dm b/code/datums/elements/atmos_requirements.dm index d944a4dbac53f..ddffd374ba120 100644 --- a/code/datums/elements/atmos_requirements.dm +++ b/code/datums/elements/atmos_requirements.dm @@ -45,10 +45,10 @@ if(!ST.air && (atmos_requirements["min_oxy"] || atmos_requirements["min_tox"] || atmos_requirements["min_n2"] || atmos_requirements["min_co2"])) return FALSE - var/plas = ST.air.get_moles(GAS_PLASMA) - var/oxy = ST.air.get_moles(GAS_O2) - var/n2 = ST.air.get_moles(GAS_N2) - var/co2 = ST.air.get_moles(GAS_CO2) + var/plas = GET_MOLES(/datum/gas/plasma, ST.air) + var/oxy = GET_MOLES(/datum/gas/oxygen, ST.air) + var/n2 = GET_MOLES(/datum/gas/nitrogen, ST.air) + var/co2 = GET_MOLES(/datum/gas/carbon_dioxide, ST.air) . = TRUE if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"]) diff --git a/code/datums/elements/atmos_sensitive.dm b/code/datums/elements/atmos_sensitive.dm new file mode 100644 index 0000000000000..07187f9f57da9 --- /dev/null +++ b/code/datums/elements/atmos_sensitive.dm @@ -0,0 +1,71 @@ +//This element facilitates reaction to atmos changes when a tile is inactive. +//It adds the object to a list on SSair to be processed for so long as the object wants to be processed +//And removes it as soon as the object is no longer interested +//Don't put it on things that tend to clump into one spot, you will cause lag spikes. +/datum/element/atmos_sensitive + element_flags = ELEMENT_DETACH + +/datum/element/atmos_sensitive/Attach(datum/target) + if(!isatom(target)) //How + return ELEMENT_INCOMPATIBLE + var/atom/to_track = target + if(isopenturf(to_track.loc)) + to_track.RegisterSignal(to_track.loc, COMSIG_TURF_EXPOSE, /atom/proc/check_atmos_process) + RegisterSignal(to_track, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) + return ..() + +/datum/element/atmos_sensitive/Detach(datum/source, force) + var/atom/us = source + us.UnregisterSignal(get_turf(us), COMSIG_TURF_EXPOSE) + if(us.flags_1 & ATMOS_IS_PROCESSING_1) + SSair.atom_process -= us + us.flags_1 &= ~ATMOS_IS_PROCESSING_1 + return ..() + +/datum/element/atmos_sensitive/proc/handle_move(datum/source, atom/movable/oldloc, direction, forced) + var/atom/microchipped_lad = source + microchipped_lad.UnregisterSignal(oldloc, COMSIG_TURF_EXPOSE) + if(isopenturf(microchipped_lad.loc)) + var/turf/open/new_spot = microchipped_lad.loc + microchipped_lad.RegisterSignal(new_spot, COMSIG_TURF_EXPOSE, /atom/proc/check_atmos_process) + microchipped_lad.check_atmos_process(null, new_spot.air, new_spot.temperature) //Make sure you're properly registered + +/atom/proc/check_atmos_process(datum/source, datum/gas_mixture/air, exposed_temperature) + if(should_atmos_process(air, exposed_temperature)) + if(flags_1 & ATMOS_IS_PROCESSING_1) + return + SSair.atom_process += src + flags_1 |= ATMOS_IS_PROCESSING_1 + else if(flags_1 & ATMOS_IS_PROCESSING_1) + SSair.atom_process -= src + flags_1 &= ~ATMOS_IS_PROCESSING_1 + +/atom/proc/process_exposure() + var/turf/open/spot + if(istype(loc, /turf/open)) + spot = loc + else //If you end up in a locker or a wall reconsider your life decisions + SSair.atom_process -= src + flags_1 &= ~ATMOS_IS_PROCESSING_1 + return + if(!should_atmos_process(spot.air, spot.air.temperature)) //Things can change without a tile becoming active + SSair.atom_process -= src + flags_1 &= ~ATMOS_IS_PROCESSING_1 + return + atmos_expose(spot.air, spot.air.temperature) + +/turf/open/process_exposure() + if(!should_atmos_process(air, air.temperature)) + SSair.atom_process -= src + flags_1 &= ~ATMOS_IS_PROCESSING_1 + return + atmos_expose(air, air.temperature) + +///We use this proc to check if we should start processing an item, or continue processing it. Returns true/false as expected +/atom/proc/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return FALSE + + +///This is your process() proc +/atom/proc/atmos_expose(datum/gas_mixture/air, exposed_temperature) + return diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c8ae188439383..ced40e8e14041 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1890,7 +1890,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/atom) /atom/proc/plasma_ignition(strength, mob/user, reagent_reaction) var/turf/T = get_turf(src) var/datum/gas_mixture/environment = T.return_air() - if(environment.get_moles(GAS_O2) >= PLASMA_MINIMUM_OXYGEN_NEEDED) //Flashpoint ignition can only occur with at least this much oxygen present + if(GET_MOLES(/datum/gas/oxygen, environment) >= PLASMA_MINIMUM_OXYGEN_NEEDED) //Flashpoint ignition can only occur with at least this much oxygen present //no reason to alert admins or create an explosion if there's not enough power to actually make an explosion if(strength > 1) if(user) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 20e5b0d19fad2..35c5a444afa30 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -110,9 +110,9 @@ if(loc) //Restore air flow if we were blocking it (movables with ATMOS_PASS_PROC will need to do this manually if necessary) - if(((CanAtmosPass == ATMOS_PASS_DENSITY && density) || CanAtmosPass == ATMOS_PASS_NO) && isturf(loc)) - CanAtmosPass = ATMOS_PASS_YES - air_update_turf(TRUE) + if(((can_atmos_pass == ATMOS_PASS_DENSITY && density) || can_atmos_pass == ATMOS_PASS_NO) && isturf(loc)) + can_atmos_pass = ATMOS_PASS_YES + air_update_turf(TRUE, FALSE) loc.handle_atom_del(src) if(opacity) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index dce7441b2ebe0..44485333a193d 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -412,7 +412,7 @@ continue // No parent vent // Stops Aliens getting stuck in small networks. // See: Security, Virology - if(length(temp_vent_parent.other_atmosmch) > 20) + if(length(temp_vent_parent.other_atmos_machines) > 20) vents += temp_vent if(!length(vents)) log_game("DYNAMIC: [ruletype] ruleset [name] ready() failed due to no valid spawn locations.") @@ -709,7 +709,7 @@ var/datum/pipeline/temp_vent_parent = temp_vent.parents[1] if(!temp_vent_parent) continue // No parent vent - if(length(temp_vent_parent.other_atmosmch) > 20) + if(length(temp_vent_parent.other_atmos_machines) > 20) vents += temp_vent // Makes sure the pipeline is large enough if(!length(vents)) log_game("DYNAMIC: [ruletype] ruleset [name] ready() failed due to no valid spawn locations.") diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 1b80a82c1e2fa..28f9b58003668 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -143,7 +143,8 @@ /datum/objective_item/steal/plasma/check_special_completion(obj/item/tank/T) var/target_amount = text2num(name) var/found_amount = 0 - found_amount += T.air_contents.get_moles(GAS_PLASMA) + var/datum/gas_mixture/mix = T.return_air() + found_amount += GET_MOLES(/datum/gas/plasma, mix) return found_amount>=target_amount /datum/objective_item/steal/functionalai diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 6ae592b4ea064..1b7840893eae6 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -137,14 +137,15 @@ Class Procs: var/tgui_id // ID of TGUI interface var/ui_style // ID of custom TGUI style (optional) - ///Is this machine currently in the atmos machinery queue? - var/atmos_processing = FALSE ///Is this machine currently in the atmos machinery queue, but also interacting with turf air? var/interacts_with_air = FALSE /// Maximum time an EMP will disable this machine for var/emp_disable_time = 2 MINUTES + ///Is this machine currently in the atmos machinery queue? + var/atmos_processing = FALSE + /obj/machinery/Initialize(mapload) if(!armor) armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0, BLEED = 0) diff --git a/code/game/machinery/airlock_cycle_control.dm b/code/game/machinery/airlock_cycle_control.dm index 817eca6e9aaa5..3a23c3c16cdde 100644 --- a/code/game/machinery/airlock_cycle_control.dm +++ b/code/game/machinery/airlock_cycle_control.dm @@ -549,7 +549,7 @@ for(var/I = 1; I <= turfs.len; I++) var/turf/open/T = turfs[I] if(assume_roles) - T.ImmediateCalculateAdjacentTurfs() + T.immediate_calculate_adjacent_turfs() for(var/turf/open/T2 in T.atmos_adjacent_turfs) if(get_dist(initial_turf, T2) > 5) config_error_str = "Airlock too big" diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 5b4734f272836..53811b7529f86 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -67,9 +67,9 @@ )) var/total_moles = air_sample.total_moles() if(total_moles) - for(var/gas_id in air_sample.get_gases()) - var/gas_name = GLOB.gas_data.names[gas_id] - signal.data["gases"][gas_name] = air_sample.get_moles(gas_id) / total_moles * 100 + for(var/gas in air_sample.gases) + var/gas_name = air_sample.gases[gas][GAS_META][META_GAS_NAME] + signal.data["gases"][gas_name] = gas[MOLES] / total_moles * 100 radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index ccbddf896fdd9..be0833818c9d7 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1225,7 +1225,7 @@ sleep(open_speed - 1) density = FALSE z_flags &= ~(Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP) - air_update_turf(1) + air_update_turf(TRUE, FALSE) sleep(1) layer = OPEN_DOOR_LAYER update_icon(AIRLOCK_OPEN, 1) @@ -1270,12 +1270,12 @@ if(air_tight) set_density(TRUE) z_flags |= (Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP) - air_update_turf(1) + air_update_turf(TRUE, TRUE) sleep(1) if(!air_tight) set_density(TRUE) z_flags |= (Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP) - air_update_turf(1) + air_update_turf(TRUE, TRUE) sleep(open_speed - 1) if(!safe) crush() diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index b19a591943781..5886bcd78c5ff 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -219,16 +219,20 @@ icon = 'icons/obj/doors/airlocks/station/plasma.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_plasma -/obj/machinery/door/airlock/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - if(plasma_ignition(6)) - PlasmaBurn() +/obj/machinery/door/airlock/plasma/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) /obj/machinery/door/airlock/plasma/bullet_act(obj/projectile/Proj) if(!(Proj.nodamage) && Proj.damage_type == BURN) if(plasma_ignition(6, Proj?.firer)) PlasmaBurn() . = ..() +/obj/machinery/door/airlock/plasma/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return (exposed_temperature > 300) + +/obj/machinery/door/airlock/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature) + PlasmaBurn() /obj/machinery/door/airlock/plasma/proc/PlasmaBurn() var/obj/structure/door_assembly/DA @@ -240,7 +244,7 @@ DA.update_icon() DA.update_name() -/obj/machinery/door/airlock/plasma/BlockThermalConductivity() //we don't stop the heat~ +/obj/machinery/door/airlock/plasma/block_superconductivity() //we don't stop the heat~ return 0 /obj/machinery/door/airlock/plasma/attackby(obj/item/C, mob/user, params) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index b303eb31cd972..bff717e4bf737 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -13,7 +13,7 @@ z_flags = Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP max_integrity = 350 armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 100, FIRE = 80, ACID = 70, STAMINA = 0, BLEED = 0) - CanAtmosPass = ATMOS_PASS_DENSITY + can_atmos_pass = ATMOS_PASS_DENSITY flags_1 = PREVENT_CLICK_UNDER_1 ricochet_chance_mod = 0.8 damage_deflection = 10 @@ -46,7 +46,7 @@ . = ..() set_init_door_layer() update_freelook_sight() - air_update_turf(1) + air_update_turf(TRUE, TRUE) GLOB.airlocks += src spark_system = new /datum/effect_system/spark_spread spark_system.set_up(2, 1, src) @@ -82,6 +82,7 @@ if(spark_system) qdel(spark_system) spark_system = null + air_update_turf(TRUE, FALSE) return ..() /obj/machinery/door/Bumped(atom/movable/AM) @@ -117,7 +118,8 @@ /obj/machinery/door/Move() var/turf/T = loc . = ..() - move_update_air(T) + if(density) //Gotta be closed my friend + move_update_air(T) /obj/machinery/door/CanAllowThrough(atom/movable/mover, border_dir) . = ..() @@ -199,7 +201,7 @@ var/max_moles = min_moles // okay this is a bit hacky. First, we set density to 0 and recalculate our adjacent turfs density = FALSE - T.ImmediateCalculateAdjacentTurfs() + T.immediate_calculate_adjacent_turfs() // then we use those adjacent turfs to figure out what the difference between the lowest and highest pressures we'd be holding is for(var/turf/open/T2 in T.atmos_adjacent_turfs) if((flags_1 & ON_BORDER_1) && get_dir(src, T2) != dir) @@ -210,7 +212,7 @@ if(moles > max_moles) max_moles = moles density = TRUE - T.ImmediateCalculateAdjacentTurfs() // alright lets put it back + T.immediate_calculate_adjacent_turfs() // alright lets put it back return max_moles - min_moles > 20 /obj/machinery/door/attackby(obj/item/I, mob/user, params) @@ -295,7 +297,7 @@ update_appearance() set_opacity(0) operating = FALSE - air_update_turf(1) + air_update_turf(TRUE, FALSE) update_freelook_sight() if(autoclose) spawn(autoclose) @@ -329,7 +331,7 @@ if(visible && !glass) set_opacity(1) operating = FALSE - air_update_turf(1) + air_update_turf(TRUE, TRUE) update_freelook_sight() if(safe) CheckForMobs() @@ -387,7 +389,7 @@ if(!glass && GLOB.cameranet) GLOB.cameranet.updateVisibility(src, 0) -/obj/machinery/door/BlockThermalConductivity() // All non-glass airlocks block heat, this is intended. +/obj/machinery/door/block_superconductivity() // All non-glass airlocks block heat, this is intended. if(opacity || heat_proof) return 1 return 0 diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 278110a0b6331..01a8a7fd7089d 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -344,7 +344,7 @@ if(reconsider_immediately) var/turf/open/T = FD.loc if(istype(T)) - T.ImmediateCalculateAdjacentTurfs() + T.immediate_calculate_adjacent_turfs() /obj/machinery/door/firedoor/proc/emergency_pressure_stop(consider_timer = TRUE) set waitfor = 0 @@ -380,7 +380,7 @@ /obj/machinery/door/firedoor/border_only icon = 'icons/obj/doors/firelocks/edge_Doorfire.dmi' flags_1 = ON_BORDER_1 - CanAtmosPass = ATMOS_PASS_PROC + can_atmos_pass = ATMOS_PASS_PROC assemblytype = /obj/structure/firelock_frame/border /obj/machinery/door/firedoor/border_only/Initialize(mapload) @@ -471,7 +471,7 @@ leaving.Bump(src) return COMPONENT_ATOM_BLOCK_EXIT -/obj/machinery/door/firedoor/border_only/CanAtmosPass(turf/T) +/obj/machinery/door/firedoor/border_only/can_atmos_pass(turf/T, vertical = FALSE) if(get_dir(loc, T) == dir) return !density else diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 58bae417d81cd..18ceb0a345954 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -14,7 +14,7 @@ flags_1 = ON_BORDER_1 opacity = FALSE pass_flags_self = PASSTRANSPARENT - CanAtmosPass = ATMOS_PASS_PROC + can_atmos_pass = ATMOS_PASS_PROC interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN network_id = NETWORK_DOOR_AIRLOCKS z_flags = NONE // reset zblock @@ -57,6 +57,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/door/window) /obj/machinery/door/window/ComponentInitialize() . = ..() + AddElement(/datum/element/atmos_sensitive) AddComponent(/datum/component/ntnet_interface) /obj/machinery/door/window/Destroy() @@ -65,6 +66,8 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/door/window) if(obj_integrity == 0) playsound(src, "shatter", 70, 1) electronics = null + var/turf/floor = get_turf(src) + floor.air_update_turf(TRUE, FALSE) return ..() /obj/machinery/door/window/update_icon() @@ -132,7 +135,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/door/window) return TRUE -/obj/machinery/door/window/CanAtmosPass(turf/T) +/obj/machinery/door/window/can_atmos_pass(turf/T, vertical = FALSE) if(get_dir(loc, T) == dir) return !density else @@ -178,7 +181,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/door/window) icon_state ="[base_state]open" sleep(operationdelay) set_density(FALSE) - air_update_turf(1) + air_update_turf(TRUE, FALSE) update_freelook_sight() if(operating == 1) //emag again @@ -201,7 +204,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/door/window) icon_state = base_state set_density(TRUE) - air_update_turf(1) + air_update_turf(TRUE, TRUE) update_freelook_sight() sleep(operationdelay) @@ -244,10 +247,11 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/door/window) C.name = name qdel(src) -/obj/machinery/door/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > T0C + (reinf ? 1600 : 800)) - take_damage(round(exposed_volume / 200), BURN, 0, 0) - ..() +/obj/machinery/door/window/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return (exposed_temperature > T0C + (reinf ? 1600 : 800)) + +/obj/machinery/door/window/atmos_expose(datum/gas_mixture/air, exposed_temperature) + take_damage(round(exposed_temperature / 200), BURN, 0, 0) /obj/machinery/door/window/should_emag(mob/user) // Don't allow emag if the door is currently open or moving diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 820bf6fd17ff8..ce6076b73d4da 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -36,7 +36,7 @@ var/detecting = 1 var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone - var/last_alarm = 0 + COOLDOWN_DECLARE(last_alarm) var/area/myarea = null var/locked = FALSE //Are we locked? @@ -54,6 +54,15 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/firealarm) LAZYADD(myarea.firealarms, src) RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, PROC_REF(check_security_level)) +/obj/machinery/firealarm/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + +/obj/machinery/firealarm/proc/handle_alert(datum/source, new_alert) + SIGNAL_HANDLER + if(is_station_level(z)) + update_appearance() + /obj/machinery/firealarm/Destroy() myarea.firereset(src) LAZYREMOVE(myarea.firealarms, src) @@ -122,11 +131,11 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/firealarm) if(do_after(eminence, 20, target=get_turf(eminence))) attack_hand(eminence) -/obj/machinery/firealarm/temperature_expose(datum/gas_mixture/air, temperature, volume) - if((temperature > T0C + 200 || temperature < BODYTEMP_COLD_DAMAGE_LIMIT) && (last_alarm+FIREALARM_COOLDOWN < world.time) && !(obj_flags & EMAGGED) && detecting && !machine_stat) - alarm() - try_lock(null, TRUE) - ..() +/obj/machinery/firealarm/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return (exposed_temperature > T0C + 200 || exposed_temperature < BODYTEMP_COLD_DAMAGE_LIMIT) && !(obj_flags & EMAGGED) && detecting && !machine_stat + +/obj/machinery/firealarm/atmos_expose(datum/gas_mixture/air, exposed_temperature) + alarm() /** * Signal handler for checking if we should update fire alarm appearance accordingly to a newly set security level @@ -142,9 +151,9 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/firealarm) update_appearance() /obj/machinery/firealarm/proc/alarm(mob/user) - if(!is_operational || (last_alarm+FIREALARM_COOLDOWN > world.time)) + if(!is_operational || !COOLDOWN_FINISHED(src, last_alarm)) return - last_alarm = world.time + COOLDOWN_START(src, last_alarm, FIREALARM_COOLDOWN) var/area/A = get_area(src) A.firealert(src) playsound(loc, 'goon/sound/machinery/FireAlarm.ogg', 75) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index dc911ee7c38f9..df6d54cba49ef 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -70,9 +70,9 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/item/pipe) /obj/item/pipe/dropped() ..() if(loc) - setPipingLayer(piping_layer) + set_piping_layer(piping_layer) -/obj/item/pipe/proc/setPipingLayer(new_layer = PIPING_LAYER_DEFAULT) +/obj/item/pipe/proc/set_piping_layer(new_layer = PIPING_LAYER_DEFAULT) var/obj/machinery/atmospherics/fakeA = pipe_type if(initial(fakeA.pipe_flags) & PIPING_ALL_LAYER) @@ -144,7 +144,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/item/pipe) return TRUE if((M.piping_layer != piping_layer) && !((M.pipe_flags | flags) & PIPING_ALL_LAYER)) //don't continue if either pipe goes across all layers continue - if(M.GetInitDirections() & SSair.get_init_dirs(pipe_type, fixed_dir())) // matches at least one direction on either type of pipe + if(M.get_init_directions() & SSair.get_init_dirs(pipe_type, fixed_dir())) // matches at least one direction on either type of pipe to_chat(user, "There is already a pipe at that location!") return TRUE // no conflicts found @@ -164,7 +164,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/item/pipe) /obj/item/pipe/proc/build_pipe(obj/machinery/atmospherics/A) A.setDir(fixed_dir()) - A.SetInitDirections() + A.set_init_directions() if(pipename) A.name = pipename diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 6555d153e70ed..a833357a37f6e 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -47,7 +47,7 @@ return var/p_dir = text2num(href_list["dir"]) var/obj/item/pipe/P = new (loc, p_type, p_dir) - P.setPipingLayer(piping_layer) + P.set_piping_layer(piping_layer) P.add_fingerprint(usr) wait = world.time + 10 if(href_list["makemeter"]) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index a92709d21a5bb..954f1583fc51c 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -10,12 +10,16 @@ anchored = TRUE resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF max_integrity = 200 //The shield can only take so much beating (prevents perma-prisons) - CanAtmosPass = ATMOS_PASS_DENSITY + can_atmos_pass = ATMOS_PASS_DENSITY /obj/structure/emergency_shield/Initialize(mapload) . = ..() setDir(pick(GLOB.cardinals)) - air_update_turf(1) + air_update_turf(TRUE, TRUE) + +/obj/structure/emergency_shield/Destroy() + air_update_turf(TRUE, FALSE) + . = ..() /obj/structure/emergency_shield/Move() var/turf/T = loc @@ -60,7 +64,6 @@ max_integrity = 20 mouse_opacity = MOUSE_OPACITY_TRANSPARENT layer = ABOVE_MOB_LAYER - /obj/structure/emergency_shield/invoker/emp_act(severity) return diff --git a/code/game/machinery/shuttle/shuttle_engine.dm b/code/game/machinery/shuttle/shuttle_engine.dm index 02c5de77af61c..33d4830c2edb1 100644 --- a/code/game/machinery/shuttle/shuttle_engine.dm +++ b/code/game/machinery/shuttle/shuttle_engine.dm @@ -122,8 +122,8 @@ var/deltaTemperature = req_power / heat_cap if(deltaTemperature < 0) return - env.set_temperature(env.return_temperature() + deltaTemperature) - air_update_turf() + env.temperature = env.return_temperature() + deltaTemperature + air_update_turf(FALSE, FALSE) /obj/machinery/shuttle/engine/attackby(obj/item/I, mob/living/user, params) check_setup() diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm index 1c1a9330a5d21..05901c3b57fd0 100644 --- a/code/game/machinery/shuttle/shuttle_heater.dm +++ b/code/game/machinery/shuttle/shuttle_heater.dm @@ -29,14 +29,14 @@ pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY - var/gas_type = GAS_PLASMA + var/gas_type = /datum/gas/plasma var/efficiency_multiplier = 1 var/gas_capacity = 0 /obj/machinery/atmospherics/components/unary/shuttle/heater/New() . = ..() GLOB.custom_shuttle_machines += src - SetInitDirections() + set_init_directions() update_adjacent_engines() updateGasStats() @@ -47,13 +47,13 @@ /obj/machinery/atmospherics/components/unary/shuttle/heater/on_construction() ..(dir, dir) - SetInitDirections() + set_init_directions() update_adjacent_engines() /obj/machinery/atmospherics/components/unary/shuttle/heater/default_change_direction_wrench(mob/user, obj/item/I) if(!..()) return FALSE - SetInitDirections() + set_init_directions() var/obj/machinery/atmospherics/node = nodes[1] if(node) node.disconnect(src) @@ -62,12 +62,11 @@ return nullifyPipenet(parents[1]) - atmosinit() + atmos_init() node = nodes[1] if(node) - node.atmosinit() - node.addMember(src) - build_network() + node.atmos_init() + node.add_member(src) return TRUE /obj/machinery/atmospherics/components/unary/shuttle/heater/RefreshParts() @@ -84,14 +83,14 @@ /obj/machinery/atmospherics/components/unary/shuttle/heater/examine(mob/user) . = ..() var/datum/gas_mixture/air_contents = airs[1] - . += "The engine heater's gas dial reads [air_contents.get_moles(gas_type)] moles of gas.
" + . += "The engine heater's gas dial reads [GET_MOLES(gas_type, air_contents)] moles of gas.
" /obj/machinery/atmospherics/components/unary/shuttle/heater/proc/updateGasStats() var/datum/gas_mixture/air_contents = airs[1] if(!air_contents) return - air_contents.set_volume(gas_capacity) - air_contents.set_temperature(T20C) + air_contents.volume = gas_capacity + air_contents.temperature = T20C /obj/machinery/atmospherics/components/unary/shuttle/heater/proc/hasFuel(var/required) var/datum/gas_mixture/air_contents = airs[1] @@ -99,8 +98,7 @@ return moles >= required /obj/machinery/atmospherics/components/unary/shuttle/heater/proc/consumeFuel(var/amount) - var/datum/gas_mixture/air_contents = airs[1] - air_contents.remove(amount) + remove_air(amount) return /obj/machinery/atmospherics/components/unary/shuttle/heater/attackby(obj/item/I, mob/living/user, params) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 5df43092dea74..495bdd164560e 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -120,8 +120,8 @@ if(mode == HEATER_MODE_COOL) delta_temperature *= -1 if(delta_temperature) - environment.set_temperature(environment.return_temperature() + delta_temperature) - air_update_turf() + environment.temperature = environment.return_temperature() + delta_temperature + air_update_turf(FALSE, FALSE) cell.use(required_energy / efficiency) /obj/machinery/space_heater/RefreshParts() diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 5ea702d1d52d5..58cfb9ad0ddb8 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -32,6 +32,10 @@ slippery_foam = FALSE var/absorbed_plasma = 0 +/obj/effect/particle_effect/foam/firefighting/ComponentInitialize() + ..() + RemoveElement(/datum/element/atmos_sensitive) + /obj/effect/particle_effect/foam/firefighting/process() ..() @@ -40,12 +44,12 @@ if(hotspot && istype(T) && T.air) qdel(hotspot) var/datum/gas_mixture/G = T.air - var/plas_amt = min(30,G.get_moles(GAS_PLASMA)) //Absorb some plasma - G.adjust_moles(GAS_PLASMA, -plas_amt) + var/plas_amt = min(30,GET_MOLES(/datum/gas/plasma, G)) //Absorb some plasma + REMOVE_MOLES(/datum/gas/plasma, G, plas_amt) absorbed_plasma += plas_amt - if(G.return_temperature() > T20C) - G.set_temperature(max(G.return_temperature()/2,T20C)) - T.air_update_turf() + if(G.temperature > T20C) + G.temperature = max(G.return_temperature()/2,T20C) + T.air_update_turf(FALSE, FALSE) /obj/effect/particle_effect/foam/firefighting/kill_foam() STOP_PROCESSING(SSfastprocess, src) @@ -65,9 +69,6 @@ L.adjust_fire_stacks(-2) L.ExtinguishMob() -/obj/effect/particle_effect/foam/firefighting/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - return - /obj/effect/particle_effect/foam/metal name = "aluminium foam" metal = ALUMINUM_FOAM @@ -107,6 +108,7 @@ /obj/effect/particle_effect/foam/Initialize(mapload) . = ..() + AddElement(/datum/element/atmos_sensitive) create_reagents(1000) //limited by the size of the reagent holder anyway. START_PROCESSING(SSfastprocess, src) playsound(src, 'sound/effects/bubbles2.ogg', 80, 1, -3) @@ -191,7 +193,7 @@ /obj/effect/particle_effect/foam/proc/spread_foam() var/turf/t_loc = get_turf(src) - for(var/turf/T in t_loc.GetAtmosAdjacentTurfs()) + for(var/turf/T in t_loc.get_atmos_adjacent_turfs()) var/obj/effect/particle_effect/foam/foundfoam = locate() in T //Don't spread foam where there's already foam! if(foundfoam) continue @@ -207,16 +209,13 @@ F.add_atom_colour(color, FIXED_COLOUR_PRIORITY) F.metal = metal +/obj/effect/particle_effect/foam/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 475 -/obj/effect/particle_effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(prob(max(0, exposed_temperature - 475))) //foam dissolves when heated +/obj/effect/particle_effect/foam/atmos_expose(datum/gas_mixture/air, exposed_temperature) + if(prob(max(0, exposed_temperature - 475))) //foam dissolves when heated kill_foam() - -/obj/effect/particle_effect/foam/metal/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - return - - /////////////////////////////////////////////// //FOAM EFFECT DATUM /datum/effect_system/foam_spread @@ -286,11 +285,15 @@ desc = "A lightweight foamed metal wall." gender = PLURAL max_integrity = 20 - CanAtmosPass = ATMOS_PASS_DENSITY + can_atmos_pass = ATMOS_PASS_DENSITY /obj/structure/foamedmetal/Initialize(mapload) . = ..() - air_update_turf(1) + air_update_turf(TRUE, TRUE) + +/obj/structure/foamedmetal/Destroy() + air_update_turf(TRUE, FALSE) + . = ..() /obj/structure/foamedmetal/Move() var/turf/T = loc @@ -333,14 +336,14 @@ O.ClearWet() if(O.air) var/datum/gas_mixture/G = O.air - G.set_temperature(293.15) + G.temperature = 293.15 for(var/obj/effect/hotspot/H in O) qdel(H) - for(var/I in G.get_gases()) - if(I == GAS_O2 || I == GAS_N2) + for(var/I in G.gases) + if(I == /datum/gas/oxygen || I == /datum/gas/nitrogen) continue - G.set_moles(I, 0) - O.air_update_turf() + SET_MOLES(I , G, 0) + for(var/obj/machinery/atmospherics/components/unary/U in O) if(!U.welded) U.welded = TRUE diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 62922d034df1b..bef1f6710853c 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -91,7 +91,7 @@ if(!t_loc) return var/list/newsmokes = list() - for(var/turf/T in t_loc.GetAtmosAdjacentTurfs(!circle)) + for(var/turf/T in t_loc.get_atmos_adjacent_turfs(!circle)) var/obj/effect/particle_effect/smoke/foundsmoke = locate() in T //Don't spread smoke where there's already smoke! if(foundsmoke) continue @@ -175,13 +175,14 @@ if(T.air) var/datum/gas_mixture/G = T.air if(!distcheck || get_dist(T, location) < blast) // Otherwise we'll get silliness like people using Nanofrost to kill people through walls with cold air - G.set_temperature(temperature) - T.air_update_turf() + G.temperature = temperature + T.air_update_turf(FALSE, FALSE) for(var/obj/effect/hotspot/H in T) qdel(H) - if(G.get_moles(GAS_PLASMA)) - G.adjust_moles(GAS_N2, G.get_moles(GAS_PLASMA)) - G.set_moles(GAS_PLASMA, 0) + if(G.gases[/datum/gas/plasma][MOLES]) + ADD_MOLES(/datum/gas/nitrogen, G, G.gases[/datum/gas/plasma][MOLES]) + G.gases[/datum/gas/plasma][MOLES] = 0 + if (weldvents) for(var/obj/machinery/atmospherics/components/unary/U in T) if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber. diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index fc8577bf8a700..6e7fb59e1bcbb 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -5,7 +5,7 @@ anchored = TRUE opacity = FALSE density = TRUE - CanAtmosPass = ATMOS_PASS_DENSITY + can_atmos_pass = ATMOS_PASS_DENSITY z_flags = Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP var/timeleft = 300 //Set to 0 for permanent forcefields (ugh) @@ -26,7 +26,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/forcefield) name = "glowing wall" icon = 'icons/effects/cult_effects.dmi' icon_state = "cultshield" - CanAtmosPass = ATMOS_PASS_NO + can_atmos_pass = ATMOS_PASS_NO timeleft = 200 ///////////Mimewalls/////////// diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 700439c06377a..825319a593222 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -96,7 +96,7 @@ for(var/turf/open/floor/earth in view(3,src)) if(is_type_in_typecache(earth, blacklisted_glowshroom_turfs)) continue - if(!ownturf.CanAtmosPass(earth)) + if(!ownturf.can_atmos_pass(earth)) continue if(spreadsIntoAdjacent || !locate(/obj/structure/glowshroom) in view(1,earth)) possibleLocs += earth @@ -165,9 +165,11 @@ if(damage_type == BURN && damage_amount) playsound(src.loc, 'sound/items/welder.ogg', 100, 1) -/obj/structure/glowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - take_damage(5, BURN, 0, 0) +/obj/structure/glowshroom/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 300 + +/obj/structure/glowshroom/atmos_expose(datum/gas_mixture/air, exposed_temperature) + take_damage(5, BURN, 0, 0) /obj/structure/glowshroom/acid_act(acidpwr, acid_volume) . = 1 @@ -175,3 +177,7 @@ var/obj/effect/decal/cleanable/molten_object/I = new (get_turf(src)) I.desc = "Looks like this was \an [src] some time ago." qdel(src) + +/obj/structure/glowshroom/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index b398597382f38..01fcdc9fa0b09 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -84,6 +84,16 @@ vis_flags = VIS_INHERIT_ID appearance_flags = KEEP_TOGETHER | LONG_GLIDE | PIXEL_SCALE +/obj/effect/overlay/atmos_excited + name = "excited group" + icon = null + icon_state = null + anchored = TRUE // should only appear in vis_contents, but to be safe + appearance_flags = RESET_TRANSFORM | TILE_BOUND + invisibility = INVISIBILITY_ABSTRACT + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + vis_flags = VIS_INHERIT_PLANE + plane = HIGH_GAME_PLANE /obj/effect/overlay/light_cone name = "" icon = 'icons/effects/light_overlays/light_cone.dmi' diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 2a9ac99c7d876..64013dc498a24 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -1,10 +1,9 @@ - -/proc/create_portal_pair(turf/source, turf/destination, _creator = null, _lifespan = 300, accuracy = 0, newtype = /obj/effect/portal, atmos_link_override) +/proc/create_portal_pair(turf/source, turf/destination, _lifespan = 300, accuracy = 0, newtype = /obj/effect/portal) if(!istype(source) || !istype(destination)) return var/turf/actual_destination = get_teleport_turf(destination, accuracy) - var/obj/effect/portal/P1 = new newtype(source, _creator, _lifespan, null, FALSE, null, atmos_link_override) - var/obj/effect/portal/P2 = new newtype(actual_destination, _creator, _lifespan, P1, TRUE, null, atmos_link_override) + var/obj/effect/portal/P1 = new newtype(source, _lifespan, null, FALSE, null) + var/obj/effect/portal/P2 = new newtype(actual_destination, _lifespan, P1, TRUE, null) if(!istype(P1)||!istype(P2)) return P1.link_portal(P2) @@ -138,16 +137,16 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/portal) return FALSE atmos_source.atmos_adjacent_turfs[atmos_destination] = TRUE atmos_destination.atmos_adjacent_turfs[atmos_source] = TRUE - atmos_source.air_update_turf(FALSE) - atmos_destination.air_update_turf(FALSE) + atmos_source.air_update_turf(FALSE, FALSE) + atmos_destination.air_update_turf(FALSE, FALSE) /obj/effect/portal/proc/unlink_atmos() if(istype(atmos_source)) - if(istype(atmos_destination) && !atmos_source.Adjacent(atmos_destination) && !CANATMOSPASS(atmos_destination, atmos_source)) + if(istype(atmos_destination) && !atmos_source.Adjacent(atmos_destination) && !CANATMOSPASS(atmos_destination, atmos_source, FALSE)) LAZYREMOVE(atmos_source.atmos_adjacent_turfs, atmos_destination) atmos_source = null if(istype(atmos_destination)) - if(istype(atmos_source) && !atmos_destination.Adjacent(atmos_source) && !CANATMOSPASS(atmos_source, atmos_destination)) + if(istype(atmos_source) && !atmos_destination.Adjacent(atmos_source) && !CANATMOSPASS(atmos_source, atmos_destination, FALSE)) LAZYREMOVE(atmos_destination.atmos_adjacent_turfs, atmos_source) atmos_destination = null @@ -156,7 +155,6 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/portal) call(creator, "on_portal_destroy")(src, src.loc) creator = null GLOB.portals -= src - unlink_atmos() if(hardlinked && !QDELETED(linked)) QDEL_NULL(linked) else diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index 04e93d4ffe2bf..774854c758c3c 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -1,6 +1,6 @@ #define CELSIUS_TO_KELVIN(T_K) ((T_K) + T0C) -#define OPTIMAL_TEMP_K_PLA_BURN_SCALE(PRESSURE_P,PRESSURE_O,TEMP_O) (((PRESSURE_P) * GLOB.gas_data.specific_heats[GAS_PLASMA]) / (((PRESSURE_P) * GLOB.gas_data.specific_heats[GAS_PLASMA] + (PRESSURE_O) * GLOB.gas_data.specific_heats[GAS_O2]) / PLASMA_UPPER_TEMPERATURE - (PRESSURE_O) * GLOB.gas_data.specific_heats[GAS_O2] / CELSIUS_TO_KELVIN(TEMP_O))) +#define OPTIMAL_TEMP_K_PLA_BURN_SCALE(PRESSURE_P,PRESSURE_O,TEMP_O) (((PRESSURE_P) * GLOB.meta_gas_info[/datum/gas/plasma][META_GAS_SPECIFIC_HEAT]) / (((PRESSURE_P) * GLOB.meta_gas_info[/datum/gas/plasma][META_GAS_SPECIFIC_HEAT] + (PRESSURE_O) * GLOB.meta_gas_info[/datum/gas/oxygen][META_GAS_SPECIFIC_HEAT]) / PLASMA_UPPER_TEMPERATURE - (PRESSURE_O) * GLOB.meta_gas_info[/datum/gas/oxygen][META_GAS_SPECIFIC_HEAT] / CELSIUS_TO_KELVIN(TEMP_O))) #define OPTIMAL_TEMP_K_PLA_BURN_RATIO(PRESSURE_P,PRESSURE_O,TEMP_O) (CELSIUS_TO_KELVIN(TEMP_O) * PLASMA_OXYGEN_FULLBURN * (PRESSURE_P) / (PRESSURE_O)) /obj/effect/spawner/newbomb @@ -16,19 +16,22 @@ /obj/effect/spawner/newbomb/Initialize(mapload) . = ..() var/obj/item/transfer_valve/V = new(src.loc) - var/obj/item/tank/internals/plasma/PT = new(V) - var/obj/item/tank/internals/oxygen/OT = new(V) + var/obj/item/tank/internals/plasma/plasma_tank = new(V) + var/obj/item/tank/internals/oxygen/oxygen_tank = new(V) - PT.air_contents.set_moles(GAS_PLASMA, pressure_p*PT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_p))) - PT.air_contents.set_temperature(CELSIUS_TO_KELVIN(temp_p)) + var/datum/gas_mixture/plasma_mix = plasma_tank.return_air() + var/datum/gas_mixture/oxygen_mix = oxygen_tank.return_air() - OT.air_contents.set_moles(GAS_O2, pressure_o*OT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_o))) - OT.air_contents.set_temperature(CELSIUS_TO_KELVIN(temp_o)) + SET_MOLES(/datum/gas/plasma, plasma_mix, pressure_p*plasma_mix.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_p))) + plasma_mix.temperature = CELSIUS_TO_KELVIN(temp_p) - V.tank_one = PT - V.tank_two = OT - PT.master = V - OT.master = V + SET_MOLES(/datum/gas/oxygen, oxygen_mix, pressure_o*oxygen_mix.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_o))) + oxygen_mix.temperature = CELSIUS_TO_KELVIN(temp_o) + + V.tank_one = plasma_tank + V.tank_two = oxygen_tank + plasma_tank.master = V + oxygen_tank.master = V if(assembly_type) var/obj/item/assembly/A = new assembly_type(V) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 8a84e300264da..ad71ee98fbed5 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -7,7 +7,9 @@ density = FALSE max_integrity = 15 - +/obj/structure/spider/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) /obj/structure/spider/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) if(damage_type == BURN)//the stickiness of the web mutes all attack sounds except fire damage type @@ -27,9 +29,11 @@ damage_amount *= 2 . = ..() -/obj/structure/spider/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - take_damage(5, BURN, 0, 0) +/obj/structure/spider/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 300 + +/obj/structure/spider/atmos_expose(datum/gas_mixture/air, exposed_temperature) + take_damage(5, BURN, 0, 0) /obj/structure/spider/stickyweb icon_state = "stickyweb1" @@ -127,9 +131,11 @@ else to_chat(user, "[src] isn't ready yet!") -/obj/structure/spider/eggcluster/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 500) - take_damage(5, BURN, 0, 0) +/obj/structure/spider/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 300 + +/obj/structure/spider/atmos_expose(datum/gas_mixture/air, exposed_temperature) + take_damage(5, BURN, 0, 0) /obj/structure/spider/eggcluster/Destroy() var/list/spawners = GLOB.mob_spawners[name] @@ -258,7 +264,7 @@ if(get_dist(src, entry_vent) <= 1) var/list/vents = list() var/datum/pipeline/entry_vent_parent = entry_vent.parents[1] - for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in entry_vent_parent.other_atmosmch) + for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in entry_vent_parent.other_atmos_machines) vents.Add(temp_vent) if(!vents.len) entry_vent = null diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index a1015199fb9ea..7345f04f1e809 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -925,7 +925,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) for(var/direction in GLOB.cardinals) var/turf/C = get_step(W, direction) var/list/dupes = checkdupes(C) - if(start.CanAtmosPass(C) && !dupes.len) + if(start.can_atmos_pass(C) && !dupes.len) candidates += C if(!candidates.len) to_chat(user, "Valid target not found...") diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index d2afedcffb032..2c2bff330fd12 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -533,7 +533,7 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( P.update() P.add_fingerprint(usr) - P.setPipingLayer(piping_layer) + P.set_piping_layer(piping_layer) if(findtext("[queued_p_type]", "/obj/machinery/atmospherics/pipe") && !findtext("[queued_p_type]", "layer_manifold")) P.add_atom_colour(GLOB.pipe_paint_colors[paint_color], FIXED_COLOUR_PRIORITY) if(mode & WRENCH_MODE) diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 01aa2723fba17..3bd6b4adbd707 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -266,9 +266,9 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/chrono_field) /obj/structure/chrono_field/return_air() //we always have nominal air and temperature var/datum/gas_mixture/GM = new - GM.set_moles(GAS_O2, MOLES_O2STANDARD) - GM.set_moles(GAS_N2, MOLES_N2STANDARD) - GM.set_temperature(T20C) + SET_MOLES(/datum/gas/oxygen, GM, MOLES_O2STANDARD) + SET_MOLES(/datum/gas/nitrogen, GM, MOLES_N2STANDARD) + GM.temperature = T20C return GM /obj/structure/chrono_field/singularity_act() diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index 8f93c94e7dc9f..ff72b5a63cf8a 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -86,7 +86,7 @@ z_flags = Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP mouse_opacity = MOUSE_OPACITY_OPAQUE resistance_flags = INDESTRUCTIBLE - CanAtmosPass = ATMOS_PASS_DENSITY + can_atmos_pass = ATMOS_PASS_DENSITY armor = list(MELEE = 0, BULLET = 25, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) var/obj/item/forcefield_projector/generator diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index fe483c15e7822..3b737d37910ce 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -655,9 +655,9 @@ GENE SCANNER message += "Volume: [volume] L" message += "Pressure: [round(pressure,0.01)] kPa" - for(var/id in air_contents.get_gases()) - var/gas_concentration = air_contents.get_moles(id)/total_moles - message += "[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] % ([round(air_contents.get_moles(id), 0.01)] mol)" + for(var/id in air_contents.gases) + var/gas_concentration = GET_MOLES(id,air_contents)/total_moles + message += "[air_contents.gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] % ([round(GET_MOLES(id, air_contents), 0.01)] mol)" message += "Temperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)" else @@ -691,37 +691,37 @@ GENE SCANNER else message += "Pressure: [round(pressure, 0.01)] kPa" if(total_moles) - var/o2_concentration = environment.get_moles(GAS_O2)/total_moles - var/n2_concentration = environment.get_moles(GAS_N2)/total_moles - var/co2_concentration = environment.get_moles(GAS_CO2)/total_moles - var/plasma_concentration = environment.get_moles(GAS_PLASMA)/total_moles + var/o2_concentration = GET_MOLES(/datum/gas/oxygen, environment)/total_moles + var/n2_concentration = GET_MOLES(/datum/gas/nitrogen, environment)/total_moles + var/co2_concentration = GET_MOLES(/datum/gas/carbon_dioxide, environment)/total_moles + var/plasma_concentration = GET_MOLES(/datum/gas/plasma, environment)/total_moles if(abs(n2_concentration - N2STANDARD) < 20) - message += "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_N2), 0.01)] mol)" + message += "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(n2_concentration*total_moles, 0.01)] mol)" else - message += "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_N2), 0.01)] mol)" + message += "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(n2_concentration*total_moles, 0.01)] mol)" if(abs(o2_concentration - O2STANDARD) < 2) - message += "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_O2), 0.01)] mol)" + message += "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(o2_concentration*total_moles, 0.01)] mol)" else - message += "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_O2), 0.01)] mol)" + message += "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(o2_concentration*total_moles, 0.01)] mol)" if(co2_concentration > 0.01) - message += "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_CO2), 0.01)] mol)" + message += "CO2: [round(co2_concentration*100, 0.01)] % ([round(co2_concentration*total_moles, 0.01)] mol)" else - message += "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_CO2), 0.01)] mol)" + message += "CO2: [round(co2_concentration*100, 0.01)] % ([round(co2_concentration*total_moles, 0.01)] mol)" if(plasma_concentration > 0.005) - message += "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_PLASMA), 0.01)] mol)" + message += "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(plasma_concentration*total_moles, 0.01)] mol)" else - message += "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_PLASMA), 0.01)] mol)" + message += "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(plasma_concentration*total_moles, 0.01)] mol)" - for(var/id in environment.get_gases()) + for(var/id in environment.gases) if(id in GLOB.hardcoded_gases) continue - var/gas_concentration = environment.get_moles(id)/total_moles - message += "[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] % ([round(environment.get_moles(id), 0.01)] mol)" - message += "Temperature: [round(environment.return_temperature()-T0C, 0.01)] °C ([round(environment.return_temperature(), 0.01)] K)" + var/gas_concentration = GET_MOLES(id, environment)/total_moles + message += "[environment.gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] % ([round(gas_concentration*total_moles, 0.01)] mol)" + message += "Temperature: [round(environment.temperature-T0C, 0.01)] °C ([round(environment.temperature, 0.01)] K)" to_chat(user, EXAMINE_BLOCK(jointext(message, "\n"))) /obj/item/analyzer/ranged diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 3e38084aca31a..d92e08fc04466 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -128,24 +128,34 @@ /obj/item/transfer_valve/proc/merge_gases(datum/gas_mixture/target, change_volume = TRUE) var/target_self = FALSE - if(!target || (target == tank_one.air_contents)) - target = tank_two.air_contents - if(target == tank_two.air_contents) + var/datum/gas_mixture/mix_one = tank_one.return_air() + var/datum/gas_mixture/mix_two = tank_two.return_air() + if(!target || (target == mix_one)) + target = mix_two + if(target == mix_two) target_self = TRUE if(change_volume) if(!target_self) - target.set_volume(target.return_volume() + tank_two.air_contents.return_volume()) - target.set_volume(target.return_volume() + tank_one.air_contents.return_volume()) - tank_one.air_contents.transfer_ratio_to(target, 1) + target.volume += tank_two.volume + target.volume += mix_one.volume + var/datum/gas_mixture/temp + temp = mix_one.remove_ratio(1) + target.merge(temp) if(!target_self) - tank_two.air_contents.transfer_ratio_to(target, 1) + temp = mix_two.remove_ratio(1) + target.merge(temp) /obj/item/transfer_valve/proc/split_gases() if (!valve_open || !tank_one || !tank_two) return - var/ratio1 = tank_one.air_contents.return_volume()/tank_two.air_contents.return_volume() - tank_two.air_contents.transfer_ratio_to(tank_one.air_contents, ratio1) - tank_two.air_contents.set_volume(tank_two.air_contents.return_volume() - tank_one.air_contents.return_volume()) + var/datum/gas_mixture/mix_one = tank_one.return_air() + var/datum/gas_mixture/mix_two = tank_two.return_air() + + var/volume_ratio = mix_one.volume/mix_two.volume + var/datum/gas_mixture/temp + temp = mix_two.remove_ratio(volume_ratio) + mix_one.merge(temp) + mix_two.volume -= mix_one.volume /* Exadv1: I know this isn't how it's going to work, but this was just to check diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 9499d02af4e8c..8d21ec0a2f00f 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -79,6 +79,9 @@ if(ishuman(user)) if(!can_trigger_gun(user)) return + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, "You can't bring yourself to fire \the [src]! You don't want to risk harming anyone...") + return if(user && user.get_active_held_item() == src) // Make sure our user is still holding us var/turf/target_turf = get_turf(target) if(target_turf) @@ -196,7 +199,7 @@ for(var/turf/T in turflist) if(T == previousturf) continue //so we don't burn the tile we be standin on - var/list/turfs_sharing_with_prev = previousturf.GetAtmosAdjacentTurfs(alldir=1) + var/list/turfs_sharing_with_prev = previousturf.get_atmos_adjacent_turfs(alldir=1) if(!(T in turfs_sharing_with_prev)) break if(igniter) @@ -206,7 +209,7 @@ sleep(1) previousturf = T operating = FALSE - for(var/mob/M as() in viewers(1, loc)) + for(var/mob/M in viewers(1, loc)) if((M.client && M.machine == src)) attack_self(M) @@ -214,13 +217,16 @@ /obj/item/flamethrower/proc/default_ignite(turf/target, release_amount = 0.05) //TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this... //Transfer 5% of current tank air contents to turf - var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(release_amount) - air_transfer.set_moles(GAS_PLASMA, air_transfer.get_moles(GAS_PLASMA) * 5) + var/datum/gas_mixture/tank_mix = ptank.return_air() + var/datum/gas_mixture/air_transfer = tank_mix.remove_ratio(release_amount) + + if(air_transfer.gases[/datum/gas/plasma]) + air_transfer.gases[/datum/gas/plasma][MOLES] *= 5 //Suffering target.assume_air(air_transfer) //Burn it based on transfered gas - target.hotspot_expose((ptank.air_contents.return_temperature()*2) + 380,500) + target.hotspot_expose((tank_mix.temperature*2) + 380,500) //location.hotspot_expose(1000,500,1) - + SSair.add_to_active(target) /obj/item/flamethrower/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index ca61f9fe5f675..aaad02b4a8230 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -45,9 +45,12 @@ burst() return ..() -/obj/item/latexballon/temperature_expose(datum/gas_mixture/air, temperature, volume) - if(temperature > T0C+100) - burst() +/obj/item/latexballon/should_atmos_process(datum/gas_mixture/air, temperature) + return temperature > T0C+100 + +/obj/item/latexballon/atmos_expose(datum/gas_mixture/air, temperature) + burst() + /obj/item/latexballon/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/tank)) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 7b54ef206b615..08840699641e8 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -871,7 +871,7 @@ T.visible_message("[T] smacks into [src] and rapidly flashes to ash.",\ "You hear a loud crack as you are washed with a wave of heat.") shard.Consume() - CALCULATE_ADJACENT_TURFS(T) + CALCULATE_ADJACENT_TURFS(T, MAKE_ACTIVE) /obj/item/melee/supermatter_sword/add_blood_DNA(list/blood_dna) return FALSE diff --git a/code/game/objects/items/peppercloud.dm b/code/game/objects/items/peppercloud.dm index 27c1ecf3bf5d1..7b6fd8de8b06c 100644 --- a/code/game/objects/items/peppercloud.dm +++ b/code/game/objects/items/peppercloud.dm @@ -69,7 +69,7 @@ var/turf/previous = get_turf(user) var/turf/next = get_step(user, direction) for (var/i in 1 to 2) - if (!CANATMOSPASS(next, previous)) + if (!CANATMOSPASS(next, previous, FALSE)) break previous = next next = get_step(previous, direction) diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 9b47f6b89cce0..0a5fc3cd38e69 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -152,7 +152,7 @@ if(!tank && checktank) to_chat(user, "\The [src] can't fire without a source of gas.") return - if(tank && !tank.air_contents.remove(gasPerThrow * pressureSetting)) + if(tank && !tank.remove_air(gasPerThrow * pressureSetting)) to_chat(user, "\The [src] lets out a weak hiss and doesn't react!") return if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(75) && clumsyCheck && iscarbon(user)) diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index f558447a11618..1ff01ddb4c1d3 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -78,7 +78,7 @@ if(!tank) to_chat(user, "\The [src] can't operate without a source of gas!") return - var/datum/gas_mixture/gasused = tank.air_contents.remove(gasperfist * fisto_setting) + var/datum/gas_mixture/gasused = tank.remove_air(gasperfist * fisto_setting) var/turf/T = get_turf(src) if(!T) return @@ -96,7 +96,7 @@ return ..() if(gasused.total_moles() < gasperfist * fisto_setting) T.assume_air(gasused) - T.air_update_turf() + T.air_update_turf(FALSE, FALSE) to_chat(user, "\The [src]'s piston-ram lets out a weak hiss, it needs more gas!") playsound(loc, 'sound/weapons/punch4.ogg', 50, 1) force = (baseforce / 2) @@ -114,7 +114,7 @@ var/mob/living/carbon/human/H = target if(H.check_shields(src, force)) T.assume_air(gasused) - T.air_update_turf() + T.air_update_turf(FALSE, FALSE) return target.visible_message("[user]'s powerfist lets out a loud hiss as [user.p_they()] punch[user.p_es()] [target.name]!", \ "You cry out in pain as [user]'s punch flings you backwards!", ignored_mobs = list(user)) @@ -131,6 +131,6 @@ user.changeNext_move(CLICK_CD_MELEE * click_delay) T.assume_air(gasused) - T.air_update_turf() + T.air_update_turf(FALSE, FALSE) return ..() diff --git a/code/game/objects/items/stacks/sheets/mineral/materials.dm b/code/game/objects/items/stacks/sheets/mineral/materials.dm index 8ce8b3e34c4d8..cad2e6eeae939 100644 --- a/code/game/objects/items/stacks/sheets/mineral/materials.dm +++ b/code/game/objects/items/stacks/sheets/mineral/materials.dm @@ -99,9 +99,11 @@ Mineral Sheets else return ..() -/obj/item/stack/sheet/mineral/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - plasma_ignition(amount/5) +/obj/item/stack/sheet/mineral/plasma/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 300 + +/obj/item/stack/sheet/mineral/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature) + plasma_ignition(amount/5) /obj/item/stack/sheet/mineral/plasma/bullet_act(obj/projectile/Proj) if(!(Proj.nodamage) && Proj.damage_type == BURN) diff --git a/code/game/objects/items/stacks/sheets/organic/leather.dm b/code/game/objects/items/stacks/sheets/organic/leather.dm index fdd63ac72fbc9..0de8f6c8abea8 100644 --- a/code/game/objects/items/stacks/sheets/organic/leather.dm +++ b/code/game/objects/items/stacks/sheets/organic/leather.dm @@ -38,6 +38,11 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/item/stack/sheet/leather/wetleather) . = ..() AddElement(/datum/element/dryable, /obj/item/stack/sheet/leather) + +/obj/item/stack/sheet/leather/wetleather/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + //Step two to make leather - washing /obj/item/stack/sheet/leather/hairlesshide/machine_wash(obj/machinery/washing_machine/WM) @@ -46,14 +51,15 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/item/stack/sheet/leather/wetleather) //Step three to make leather - drying, either naturally or... in a more induced way. -/obj/item/stack/sheet/leather/wetleather/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - ..() - if(exposed_temperature >= drying_threshold_temperature) - wetness-- - if(wetness == 0) - new /obj/item/stack/sheet/leather(drop_location(), 1) - wetness = initial(wetness) - use(1) +/obj/item/stack/sheet/leather/wetleather/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return (exposed_temperature > drying_threshold_temperature) + +/obj/item/stack/sheet/leather/wetleather/atmos_expose(datum/gas_mixture/air, exposed_temperature) + wetness-- + if(wetness == 0) + new /obj/item/stack/sheet/leather(drop_location(), 1) + wetness = initial(wetness) + use(1) /obj/item/stack/sheet/leather/wetleather/microwave_act(obj/machinery/microwave/MW) ..() diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 072351d11c440..6b16d97ab3f59 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -8,7 +8,7 @@ w_class = WEIGHT_CLASS_BULKY distribute_pressure = ONE_ATMOSPHERE * O2STANDARD actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization) - var/gas_type = GAS_O2 + var/gas_type = /datum/gas/oxygen var/on = FALSE var/stabilizers = FALSE var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not @@ -29,7 +29,7 @@ /obj/item/tank/jetpack/populate_gas() if(gas_type) - air_contents.set_moles(gas_type, ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C))) + SET_MOLES(gas_type, air_contents, ((6 * ONE_ATMOSPHERE * volume / (R_IDEAL_GAS_EQUATION * T20C)))) /obj/item/tank/jetpack/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/toggle_jetpack)) @@ -335,8 +335,11 @@ /obj/item/tank/jetpack/combustion/populate_gas() var/moles_full = ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)) var/ideal_o2_percent = (1 / PLASMA_OXYGEN_FULLBURN) * 2 - air_contents.set_moles(GAS_PLASMA, moles_full * (1 - ideal_o2_percent)) - air_contents.set_moles(GAS_O2, moles_full * ideal_o2_percent) + var/datum/gas_mixture/temp_air_contents = return_air() + + SET_MOLES(/datum/gas/plasma, temp_air_contents, moles_full*(1-ideal_o2_percent)) + SET_MOLES(/datum/gas/oxygen, temp_air_contents, moles_full*ideal_o2_percent) + /obj/item/tank/jetpack/combustion/allow_thrust(num, mob/living/user, use_fuel = TRUE) if(!on || !known_user) @@ -346,16 +349,17 @@ return var/potential_energy = 0 + var/datum/gas_mixture/our_mix = return_air() // Minified version of plasmafire burn reaction, with a "controlled" burnrate adjustment due to the high energy output of the reaction // Also produces no waste products (CO2/Trit) var/oxygen_burn_rate = (OXYGEN_BURN_RATE_BASE - 1) var/plasma_burn_rate = 0 - if(air_contents.get_moles(GAS_O2) > air_contents.get_moles(GAS_PLASMA)*PLASMA_OXYGEN_FULLBURN) - plasma_burn_rate = air_contents.get_moles(GAS_PLASMA)/PLASMA_BURN_RATE_DELTA + if(GET_MOLES(/datum/gas/oxygen, our_mix) > GET_MOLES(/datum/gas/plasma, our_mix) * PLASMA_OXYGEN_FULLBURN) + plasma_burn_rate = GET_MOLES(/datum/gas/plasma, our_mix)/PLASMA_BURN_RATE_DELTA else - plasma_burn_rate = (air_contents.get_moles(GAS_O2)/PLASMA_OXYGEN_FULLBURN)/PLASMA_BURN_RATE_DELTA + plasma_burn_rate = (GET_MOLES(/datum/gas/plasma, our_mix)/PLASMA_OXYGEN_FULLBURN)/PLASMA_BURN_RATE_DELTA if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY) - plasma_burn_rate = min(plasma_burn_rate,air_contents.get_moles(GAS_PLASMA),air_contents.get_moles(GAS_O2)/oxygen_burn_rate) //Ensures matter is conserved properly + plasma_burn_rate = min(plasma_burn_rate,GET_MOLES(/datum/gas/plasma, our_mix),GET_MOLES(/datum/gas/oxygen, our_mix)/oxygen_burn_rate) //Ensures matter is conserved properly potential_energy = FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate) // Normalize thrust volume to joules @@ -369,8 +373,8 @@ // Consume if(use_fuel) - air_contents.set_moles(GAS_PLASMA, QUANTIZE(air_contents.get_moles(GAS_PLASMA) - plasma_burn_rate)) - air_contents.set_moles(GAS_O2, QUANTIZE(air_contents.get_moles(GAS_O2) - (plasma_burn_rate * oxygen_burn_rate))) + SET_MOLES(/datum/gas/plasma, our_mix, QUANTIZE(GET_MOLES(/datum/gas/plasma, our_mix) - plasma_burn_rate)) + SET_MOLES(/datum/gas/oxygen, our_mix, QUANTIZE(GET_MOLES(/datum/gas/oxygen, our_mix) - (plasma_burn_rate * oxygen_burn_rate))) update_fade(15) update_lifespan(4) @@ -382,7 +386,7 @@ icon_state = "jetpack-black" item_state = "jetpack-black" distribute_pressure = 0 - gas_type = GAS_CO2 + gas_type = /datum/gas/carbon_dioxide // Integrated suit jetpacks // These use the tanks of a suit's suit storage instead of an internal tank, and their parent hardsuit assigns their known user. @@ -430,7 +434,7 @@ return var/mob/living/carbon/human/H = user tank = H.s_store - air_contents = tank.air_contents + air_contents = tank.return_air() RegisterSignals(tank, list(COMSIG_ITEM_DROPPED, COMSIG_PARENT_QDELETING), PROC_REF(on_tank_drop)) START_PROCESSING(SSobj, src) ..() diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index f7a4ffdcd7397..0ff3a83c01fdb 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -30,7 +30,7 @@ /obj/item/tank/internals/oxygen/populate_gas() - air_contents.set_moles(GAS_O2, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + SET_MOLES(/datum/gas/oxygen, air_contents, 6*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) /obj/item/tank/internals/oxygen/yellow desc = "A tank of oxygen, this one is yellow." @@ -56,8 +56,8 @@ force = 10 /obj/item/tank/internals/anesthetic/populate_gas() - air_contents.set_moles(GAS_O2, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) - air_contents.set_moles(GAS_NITROUS, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) + SET_MOLES(/datum/gas/oxygen, air_contents, 3*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + SET_MOLES(/datum/gas/nitrous_oxide, air_contents, 3*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) /* * Air @@ -71,8 +71,8 @@ dog_fashion = /datum/dog_fashion/back /obj/item/tank/internals/air/populate_gas() - air_contents.set_moles(GAS_O2, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) - air_contents.set_moles(GAS_N2, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) + SET_MOLES(/datum/gas/oxygen, air_contents, 6*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + SET_MOLES(/datum/gas/nitrogen, air_contents, 6*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) /* * Plasma @@ -87,7 +87,7 @@ /obj/item/tank/internals/plasma/populate_gas() - air_contents.set_moles(GAS_PLASMA, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + SET_MOLES(/datum/gas/plasma, air_contents, 10*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/flamethrower)) @@ -103,7 +103,7 @@ return ..() /obj/item/tank/internals/plasma/full/populate_gas() - air_contents.set_moles(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + SET_MOLES(/datum/gas/plasma, air_contents, 10*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasma/empty/populate_gas() return @@ -122,10 +122,10 @@ distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE /obj/item/tank/internals/plasmaman/populate_gas() - air_contents.set_moles(GAS_PLASMA, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + SET_MOLES(/datum/gas/plasma, air_contents, (3*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C))) /obj/item/tank/internals/plasmaman/full/populate_gas() - air_contents.set_moles(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + SET_MOLES(/datum/gas/plasma, air_contents, (10*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C))) /obj/item/tank/internals/plasmaman/empty/populate_gas() return @@ -143,7 +143,7 @@ w_class = WEIGHT_CLASS_SMALL //thanks i forgot this /obj/item/tank/internals/plasmaman/belt/full/populate_gas() - air_contents.set_moles(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + SET_MOLES(/datum/gas/plasma, air_contents, 6*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasmaman/belt/empty/populate_gas() return @@ -170,7 +170,7 @@ /obj/item/tank/internals/emergency_oxygen/populate_gas() - air_contents.set_moles(GAS_O2, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + SET_MOLES(/datum/gas/oxygen, air_contents, 0.5*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/emergency_oxygen/empty/populate_gas() return @@ -214,5 +214,5 @@ volume = 1 /obj/item/tank/internals/emergency_oxygen/clown/populate_gas() - air_contents.set_moles(GAS_O2, (9.99*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - air_contents.set_moles(GAS_NITROUS, (0.01*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + SET_MOLES(/datum/gas/oxygen, air_contents, 9.99*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C)) + SET_MOLES(/datum/gas/nitrous_oxide, air_contents, 0.01*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C)) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 6405e4b22a110..6c2085185fe8c 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -1,5 +1,8 @@ #define TTV_NO_CASING_MOD 0.25 #define REACTIONS_BEFORE_EXPLOSION 3 +/// How much time (in seconds) is assumed to pass while assuming air. Used to scale overpressure/overtemp damage when assuming air. +#define ASSUME_AIR_DT_FACTOR 1 + /obj/item/tank name = "tank" @@ -24,6 +27,9 @@ var/volume = 70 /// Mob that is currently breathing from the tank. var/mob/living/carbon/breathing_mob = null + ///Used by process() to track if there's a reason to process each tick + var/excited = TRUE + var/leaking = FALSE /obj/item/tank/dropped(mob/living/user, silent) . = ..() @@ -63,7 +69,7 @@ . = ..() air_contents = new(volume) //liters - air_contents.set_temperature(T20C) + air_contents.temperature = T20C populate_gas() @@ -91,7 +97,7 @@ . += "The gauge reads [round(air_contents.total_moles(), 0.01)] mol at [round(src.air_contents.return_pressure(),0.01)] kPa." //yogs can read mols - var/celsius_temperature = src.air_contents.return_temperature()-T0C + var/celsius_temperature = air_contents.return_temperature()-T0C var/descriptive if (celsius_temperature < 20) @@ -125,7 +131,7 @@ var/turf/T = get_turf(src) if(T) T.assume_air(air_contents) - air_update_turf() + air_update_turf(FALSE, FALSE) playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) qdel(src) @@ -208,34 +214,36 @@ distribute_pressure = clamp(round(pressure), TANK_MIN_RELEASE_PRESSURE, TANK_MAX_RELEASE_PRESSURE) /obj/item/tank/remove_air(amount) + START_PROCESSING(SSobj, src) return air_contents.remove(amount) /obj/item/tank/remove_air_ratio(ratio) - return air_contents.remove_ratio(ratio) + return remove_air_ratio(ratio) /obj/item/tank/return_air() + START_PROCESSING(SSobj, src) return air_contents /obj/item/tank/return_analyzable_air() return air_contents /obj/item/tank/assume_air(datum/gas_mixture/giver) + START_PROCESSING(SSobj, src) air_contents.merge(giver) - - check_status() - return 1 + handle_tolerances(ASSUME_AIR_DT_FACTOR) + return TRUE /obj/item/tank/assume_air_moles(datum/gas_mixture/giver, moles) + START_PROCESSING(SSobj, src) giver.transfer_to(air_contents, moles) - - check_status() - return 1 + handle_tolerances(ASSUME_AIR_DT_FACTOR) + return TRUE /obj/item/tank/assume_air_ratio(datum/gas_mixture/giver, ratio) + START_PROCESSING(SSobj, src) giver.transfer_ratio_to(air_contents, ratio) - - check_status() - return 1 + handle_tolerances(ASSUME_AIR_DT_FACTOR) + return TRUE /obj/item/tank/proc/remove_air_volume(volume_to_return) if(!air_contents) @@ -249,19 +257,60 @@ return remove_air(moles_needed) -/obj/item/tank/process() + +/obj/item/tank/process(delta_time) + if(!air_contents) + return + //Allow for reactions - air_contents.react(src) - check_status() + excited = (excited | air_contents.react(src)) + excited = (excited | handle_tolerances(delta_time)) -/obj/item/tank/proc/check_status() - //Handle exploding, leaking, and rupturing of the tank + if(!excited) + STOP_PROCESSING(SSobj, src) + excited = FALSE + if(QDELETED(src) || !air_contents) + return + var/atom/location = loc + if(!location) + return + var/datum/gas_mixture/leaked_gas = air_contents.remove_ratio(0.25) + location.assume_air(leaked_gas) + location.air_update_turf(FALSE, FALSE) + +/** + * Handles the minimum and maximum pressure tolerances of the tank. + * + * Returns true if it did anything of significance, false otherwise + * Arguments: + * - delta_time: How long has passed between ticks. + */ +/obj/item/tank/proc/handle_tolerances(delta_time) if(!air_contents) - return 0 + return FALSE var/pressure = air_contents.return_pressure() var/temperature = air_contents.return_temperature() + if(temperature >= TANK_MELT_TEMPERATURE) + var/temperature_damage_ratio = (temperature - TANK_MELT_TEMPERATURE) / temperature + take_damage(max_integrity * temperature_damage_ratio * delta_time, BURN, FIRE, FALSE, NONE) + if(QDELETED(src)) + return TRUE + + if(pressure >= TANK_LEAK_PRESSURE) + var/pressure_damage_ratio = (pressure - TANK_LEAK_PRESSURE) / (TANK_RUPTURE_PRESSURE - TANK_LEAK_PRESSURE) + take_damage(max_integrity * pressure_damage_ratio * delta_time, BRUTE, BOMB, FALSE, NONE) + return TRUE + return FALSE + +/// Handles rupturing and fragmenting +/obj/item/tank/obj_destruction(damage_flag) + if(!air_contents) + return ..() + + /// Handle fragmentation + var/pressure = air_contents.return_pressure() if(pressure > TANK_FRAGMENT_PRESSURE) var/explosion_mod = 1 @@ -283,29 +332,20 @@ else qdel(src) - else if(pressure > TANK_RUPTURE_PRESSURE || temperature > TANK_MELT_TEMPERATURE) - if(integrity <= 0) - var/turf/T = get_turf(src) - if(!T) - return - T.assume_air(air_contents) - playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) - qdel(src) - else - integrity-- - - else if(pressure > TANK_LEAK_PRESSURE) - if(integrity <= 0) - var/turf/T = get_turf(src) - if(!T) - return - var/datum/gas_mixture/leaked_gas = air_contents.remove_ratio(0.25) - T.assume_air(leaked_gas) - else - integrity-- + return ..() + +/// Handles the tank springing a leak. +/obj/item/tank/obj_break(damage_flag) + . = ..() + + START_PROCESSING(SSobj, src) + + if(obj_integrity < 0) // So we don't play the alerts while we are exploding or rupturing. + return + visible_message("[src] springs a leak!") + playsound(src, 'sound/effects/spray.ogg', 10, TRUE, -3) - else if(integrity < 3) - integrity++ #undef TTV_NO_CASING_MOD #undef REACTIONS_BEFORE_EXPLOSION +#undef ASSUME_AIR_DT_FACTOR diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 8517bb98133d6..ea84999c08274 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -63,12 +63,16 @@ anchored = TRUE max_integrity = 200 var/resintype = null - CanAtmosPass = ATMOS_PASS_DENSITY + can_atmos_pass = ATMOS_PASS_DENSITY /obj/structure/alien/resin/Initialize(mapload) . = ..() - air_update_turf(TRUE) + air_update_turf(TRUE, TRUE) + +/obj/structure/alien/resin/Destroy() + air_update_turf(TRUE, FALSE) + . = ..() /obj/structure/alien/resin/Move() var/turf/T = loc @@ -84,7 +88,7 @@ smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN, SMOOTH_GROUP_ALIEN_WALLS) canSmoothWith = list(SMOOTH_GROUP_ALIEN_WALLS) -/obj/structure/alien/resin/wall/BlockThermalConductivity() +/obj/structure/alien/resin/wall/block_superconductivity() return 1 /obj/structure/alien/resin/membrane @@ -171,13 +175,17 @@ icon = 'icons/obj/smooth_structures/alien/weeds3.dmi' base_icon_state = "weeds3" +/obj/structure/alien/weeds/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + /obj/structure/alien/weeds/proc/expand() var/turf/U = get_turf(src) if(is_type_in_typecache(U, blacklisted_turfs)) qdel(src) return FALSE - for(var/turf/T in U.GetAtmosAdjacentTurfs()) + for(var/turf/T in U.get_atmos_adjacent_turfs()) if((locate(/obj/structure/alien/weeds) in T)) continue @@ -187,9 +195,11 @@ new /obj/structure/alien/weeds(T) return TRUE -/obj/structure/alien/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - take_damage(5, BURN, 0, 0) +/obj/structure/alien/weeds/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 300 + +/obj/structure/alien/weeds/atmos_expose(datum/gas_mixture/air, exposed_temperature) + take_damage(5, BURN, 0, 0) //Weed nodes /obj/structure/alien/weeds/node @@ -260,6 +270,10 @@ if(status == BURST) obj_integrity = integrity_failure * max_integrity +/obj/structure/alien/egg/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + /obj/structure/alien/egg/update_icon() ..() switch(status) @@ -337,10 +351,11 @@ if(status != BURST) Burst(kill=TRUE) -/obj/structure/alien/egg/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 500) - take_damage(5, BURN, 0, 0) +/obj/structure/alien/egg/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 500 +/obj/structure/alien/egg/atmos_expose(datum/gas_mixture/air, exposed_temperature) + take_damage(5, BURN, 0, 0) /obj/structure/alien/egg/HasProximity(atom/movable/AM) if(status == GROWN) diff --git a/code/game/objects/structures/crates_lockers/crates/critter.dm b/code/game/objects/structures/crates_lockers/crates/critter.dm index 2fda6f1ebc050..bae75aa791f76 100644 --- a/code/game/objects/structures/crates_lockers/crates/critter.dm +++ b/code/game/objects/structures/crates_lockers/crates/critter.dm @@ -69,7 +69,7 @@ /obj/structure/closet/crate/critter/return_air() if(tank) - return tank.air_contents + return tank.return_air() else return loc.return_air() diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index deaa9387817f0..460a2a0e2e916 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -16,7 +16,7 @@ opacity = TRUE max_integrity = 100 can_be_unanchored = FALSE - CanAtmosPass = ATMOS_PASS_DENSITY + can_atmos_pass = ATMOS_PASS_DENSITY rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE rad_insulation = RAD_MEDIUM_INSULATION var/mineral = /obj/item/stack/sheet/iron @@ -28,7 +28,7 @@ /obj/structure/falsewall/Initialize(mapload) . = ..() - air_update_turf(TRUE) + air_update_turf(TRUE, TRUE) /obj/structure/falsewall/ratvar_act() new /obj/structure/falsewall/brass(loc) @@ -57,7 +57,7 @@ z_flags &= density ? (Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP) : ~(Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP) opening = FALSE update_icon() - air_update_turf(TRUE) + air_update_turf(TRUE, !density) /obj/structure/falsewall/update_icon()//Calling icon_update will refresh the smoothwalls if it's closed, otherwise it will make sure the icon is correct if it's open if(opening) @@ -261,6 +261,10 @@ mineral = /obj/item/stack/sheet/mineral/plasma walltype = /turf/closed/wall/mineral/plasma +/obj/structure/falsewall/plasma/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + /obj/structure/falsewall/plasma/attackby(obj/item/W, mob/user, params) if(W.is_hot() > 300) if(plasma_ignition(6, user)) @@ -269,11 +273,12 @@ else return ..() -/obj/structure/falsewall/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - if(plasma_ignition(6)) - new /obj/structure/girder/displaced(loc) +/obj/structure/falsewall/plasma/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 300 +/obj/structure/falsewall/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature) + if(plasma_ignition(6)) + new /obj/structure/girder/displaced(loc) /obj/structure/falsewall/plasma/bullet_act(obj/projectile/Proj) if(!(Proj.nodamage) && Proj.damage_type == BURN) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 23cdc4cc5c25e..654e541a5fe62 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -24,6 +24,10 @@ pipe_astar_cost = 1\ ) +/obj/structure/grille/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + /obj/structure/grille/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, armour_penetration = 0) . = ..() update_icon() @@ -327,11 +331,11 @@ return FALSE return FALSE -/obj/structure/grille/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(!broken) - if(exposed_temperature > T0C + 1500) - take_damage(1, BURN, 0, 0) - ..() +/obj/structure/grille/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > T0C + 1500 && !broken + +/obj/structure/grille/atmos_expose(datum/gas_mixture/air, exposed_temperature) + take_damage(1, BURN, 0, 0) /obj/structure/grille/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(isobj(AM)) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index e4704b0e9e266..0252988e0836c 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -91,7 +91,7 @@ icon_state = "holo_firelock" density = FALSE anchored = TRUE - CanAtmosPass = ATMOS_PASS_NO + can_atmos_pass = ATMOS_PASS_NO alpha = 150 rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE rad_insulation = RAD_LIGHT_INSULATION @@ -107,11 +107,12 @@ . = ..() var/turf/local = get_turf(loc) ADD_TRAIT(local, TRAIT_FIREDOOR_STOP, TRAIT_GENERIC) - air_update_turf(TRUE) + air_update_turf(TRUE, TRUE) /obj/structure/holosign/barrier/atmos/Destroy() var/turf/local = get_turf(loc) REMOVE_TRAIT(local, TRAIT_FIREDOOR_STOP, TRAIT_GENERIC) + air_update_turf(TRUE, FALSE) return ..() /obj/structure/holosign/barrier/atmos/Move(atom/newloc, direct) diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 4a9790843926e..4fc1430cb6ec4 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -12,7 +12,7 @@ icon_state = "metal" max_integrity = 200 armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0) - CanAtmosPass = ATMOS_PASS_DENSITY + can_atmos_pass = ATMOS_PASS_DENSITY rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE rad_insulation = RAD_MEDIUM_INSULATION @@ -28,12 +28,18 @@ /obj/structure/mineral_door/Initialize(mapload) . = ..() - air_update_turf(TRUE) + air_update_turf(TRUE, TRUE) + +/obj/structure/mineral_door/Destroy() + if(!door_opened) + air_update_turf(TRUE, FALSE) + . = ..() /obj/structure/mineral_door/Move() var/turf/T = loc . = ..() - move_update_air(T) + if(!door_opened) + move_update_air(T) /obj/structure/mineral_door/Bumped(atom/movable/AM) ..() @@ -93,7 +99,7 @@ set_density(FALSE) z_flags &= ~(Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP) door_opened = TRUE - air_update_turf(1) + air_update_turf(TRUE, FALSE) update_appearance() isSwitchingStates = FALSE @@ -114,7 +120,7 @@ z_flags |= (Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP) set_opacity(TRUE) door_opened = FALSE - air_update_turf(1) + air_update_turf(TRUE, TRUE) update_appearance() isSwitchingStates = FALSE @@ -133,7 +139,7 @@ /obj/structure/mineral_door/set_anchored(anchorvalue) //called in default_unfasten_wrench() chain . = ..() set_opacity(anchored ? !door_opened : FALSE) - air_update_turf(TRUE) + air_update_turf(TRUE, anchorvalue) /obj/structure/mineral_door/wrench_act(mob/living/user, obj/item/I) default_unfasten_wrench(user, I, 40) @@ -249,7 +255,8 @@ sheetType = /obj/item/stack/sheet/mineral/plasma /obj/structure/mineral_door/transparent/plasma/ComponentInitialize() - return + . = ..() + AddElement(/datum/element/atmos_sensitive) /obj/structure/mineral_door/transparent/plasma/welder_act(mob/living/user, obj/item/I) return @@ -260,9 +267,11 @@ else return ..() -/obj/structure/mineral_door/transparent/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - plasma_ignition(6) +/obj/structure/mineral_door/transparent/plasma/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 300 + +/obj/structure/mineral_door/transparent/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature) + plasma_ignition(6) /obj/structure/mineral_door/transparent/plasma/bullet_act(obj/projectile/Proj) if(!(Proj.nodamage) && Proj.damage_type == BURN) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 5f7c20babfaaa..314ab69d4b7d8 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -260,14 +260,14 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/mirror) if(P.starting) var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/turf/curloc = get_turf(src) + var/turf/current_location = get_turf(src) // redirect the projectile P.original = locate(new_x, new_y, P.z) - P.starting = curloc + P.starting = current_location P.firer = src - P.yo = new_y - curloc.y - P.xo = new_x - curloc.x + P.yo = new_y - current_location.y + P.xo = new_x - current_location.x var/new_angle_s = P.Angle + 180 while(new_angle_s > 180) // Translate to regular projectile degrees new_angle_s -= 360 diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index ac850ce157a0d..fe0755830c57c 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -7,7 +7,7 @@ density = FALSE anchored = TRUE layer = BELOW_OBJ_LAYER - CanAtmosPass = ATMOS_PASS_NO + can_atmos_pass = ATMOS_PASS_NO /obj/structure/plasticflaps/opaque opacity = TRUE @@ -105,4 +105,10 @@ /obj/structure/plasticflaps/Initialize(mapload) . = ..() - air_update_turf(TRUE) + air_update_turf(TRUE, TRUE) + +/obj/structure/plasticflaps/Destroy() + var/atom/oldloc = loc + . = ..() + if (oldloc) + oldloc.air_update_turf(TRUE, FALSE) diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index fd1aa3564fc91..e6029035d64dc 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -7,10 +7,10 @@ density = TRUE anchored = FALSE max_integrity = 100 - CanAtmosPass = ATMOS_PASS_DENSITY + can_atmos_pass = ATMOS_PASS_DENSITY var/oreAmount = 5 var/material_drop_type = /obj/item/stack/sheet/iron - CanAtmosPass = ATMOS_PASS_DENSITY + can_atmos_pass = ATMOS_PASS_DENSITY material_modifier = 0.5 material_flags = MATERIAL_EFFECTS | MATERIAL_AFFECT_STATISTICS /// Beauty component mood modifier @@ -109,8 +109,14 @@ name = "statue of a scientist" icon_state = "sci" -/obj/structure/statue/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) +/obj/structure/statue/plasma/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + +/obj/structure/statue/plasma/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 300 + +/obj/structure/statue/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature) plasma_ignition(6) diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 8bd3f81253726..6f7c3af18be4d 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -152,9 +152,10 @@ sleep(OPEN_DURATION + 2) pod_moving = 0 if(!QDELETED(pod)) - var/datum/gas_mixture/floor_mixture = loc.return_air() - equalize_all_gases_in_list(list(pod.air_contents,floor_mixture)) - air_update_turf() + return + var/datum/gas_mixture/floor_mixture = loc.return_air() + pod.air_contents.equalize(floor_mixture) + air_update_turf(FALSE, FALSE) /obj/structure/transit_tube/station/init_tube_dirs() switch(dir) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 869b85ca5f0bc..9513de4580f99 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -13,9 +13,10 @@ /obj/structure/transit_tube_pod/Initialize(mapload) . = ..() - air_contents.set_moles(GAS_O2, MOLES_O2STANDARD) - air_contents.set_moles(GAS_N2, MOLES_N2STANDARD) - air_contents.set_temperature(T20C) + SET_MOLES(/datum/gas/oxygen, air_contents, 6*ONE_ATMOSPHERE*air_contents.volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + SET_MOLES(/datum/gas/nitrogen, air_contents, 6*ONE_ATMOSPHERE*air_contents.volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) + + air_contents.temperature = T20C /obj/structure/transit_tube_pod/Destroy() @@ -169,10 +170,10 @@ return giver.transfer_ratio_to(air_contents, ratio) /obj/structure/transit_tube_pod/remove_air(amount) - return air_contents.remove(amount) + return remove_air(amount) /obj/structure/transit_tube_pod/remove_air_ratio(ratio) - return air_contents.remove_ratio(ratio) + return remove_air_ratio(ratio) /obj/structure/transit_tube_pod/transfer_air(datum/gas_mixture/taker, moles) return air_contents.transfer_to(taker, moles) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 71687e38f612c..b963a5876cfea 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -18,7 +18,7 @@ density = FALSE layer = ABOVE_OBJ_LAYER //Just above doors anchored = FALSE - CanAtmosPass = ATMOS_PASS_PROC + can_atmos_pass = ATMOS_PASS_PROC dir = NORTH set_dir_on_move = FALSE @@ -37,7 +37,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/windoor_assembly) . = ..() if(set_dir) setDir(set_dir) - air_update_turf(1) + air_update_turf(TRUE, TRUE) var/static/list/loc_connections = list( COMSIG_ATOM_EXIT = PROC_REF(on_exit), @@ -47,7 +47,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/windoor_assembly) /obj/structure/windoor_assembly/Destroy() set_density(FALSE) - air_update_turf(1) + air_update_turf(TRUE, FALSE) return ..() /obj/structure/windoor_assembly/Move() @@ -73,11 +73,11 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/windoor_assembly) return TRUE -/obj/structure/windoor_assembly/CanAtmosPass(turf/T) +/obj/structure/windoor_assembly/can_atmos_pass(turf/T, vertical = FALSE) if(get_dir(loc, T) == dir) return !density else - return 1 + return TRUE /obj/structure/windoor_assembly/proc/on_exit(datum/source, atom/movable/leaving, direction) SIGNAL_HANDLER diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 7c791af59dd82..2ffd7ba27740c 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -11,7 +11,7 @@ can_be_unanchored = TRUE resistance_flags = ACID_PROOF armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0) - CanAtmosPass = ATMOS_PASS_PROC + can_atmos_pass = ATMOS_PASS_PROC rad_insulation = RAD_VERY_LIGHT_INSULATION rad_flags = RAD_PROTECT_CONTENTS pass_flags_self = PASSTRANSPARENT @@ -60,7 +60,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window) state = WINDOW_SCREWED_TO_FRAME ini_dir = dir - air_update_turf(1) + air_update_turf(TRUE, TRUE) if(fulltile) setDir() @@ -79,6 +79,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window) /obj/structure/window/ComponentInitialize() . = ..() AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ,null,CALLBACK(src, PROC_REF(can_be_rotated)),CALLBACK(src, PROC_REF(after_rotation))) + AddElement(/datum/element/atmos_sensitive) /obj/structure/window/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_DECONSTRUCT) @@ -242,7 +243,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window) /obj/structure/window/set_anchored(anchorvalue) ..() - air_update_turf(TRUE) + air_update_turf(TRUE, anchorvalue) update_nearby_icons() /obj/structure/window/proc/check_state(checked_state) @@ -319,11 +320,12 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window) return TRUE /obj/structure/window/proc/after_rotation(mob/user,rotation_type) + air_update_turf(TRUE, FALSE) ini_dir = dir add_fingerprint(user) /obj/structure/window/Destroy() - set_density(FALSE) + air_update_turf(TRUE, FALSE) air_update_turf(1) update_nearby_icons() return ..() @@ -334,7 +336,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window) . = ..() move_update_air(T) -/obj/structure/window/CanAtmosPass(turf/T) +/obj/structure/window/can_atmos_pass(turf/T, vertical = FALSE) if(!anchored || !density) return TRUE return !(fulltile || dir == get_dir(loc, T)) @@ -363,11 +365,11 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window) crack_overlay = mutable_appearance('icons/obj/structures.dmi', "damage[ratio]", -(layer+0.1)) add_overlay(crack_overlay) -/obj/structure/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/structure/window/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > T0C + heat_resistance - if(exposed_temperature > (T0C + heat_resistance)) - take_damage(round(exposed_volume / 100), BURN, 0, 0) - ..() +/obj/structure/window/atmos_expose(datum/gas_mixture/air, exposed_temperature) + take_damage(round(air.return_volume() / 100), BURN, 0, 0) /obj/structure/window/get_dumping_location(obj/item/storage/source,mob/user) return null @@ -431,6 +433,10 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window) glass_type = /obj/item/stack/sheet/plasmaglass rad_insulation = RAD_NO_INSULATION +/obj/structure/window/plasma/ComponentInitialize() + . = ..() + RemoveElement(/datum/element/atmos_sensitive) + /obj/structure/window/plasma/spawnDebris(location) . = list() . += new /obj/item/shard/plasma(location) @@ -676,7 +682,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window) glass_type = /obj/item/stack/sheet/paperframes heat_resistance = 233 decon_speed = 10 - CanAtmosPass = ATMOS_PASS_YES + can_atmos_pass = ATMOS_PASS_YES resistance_flags = FLAMMABLE armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) breaksound = 'sound/items/poster_ripped.ogg' diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index c4e3061cc1862..8a09a5c6661ef 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -15,7 +15,8 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(turf_type) var/turf/newT = ChangeTurf(turf_type, baseturf_type, flags) - CALCULATE_ADJACENT_TURFS(newT) + SSair.remove_from_active(newT) + CALCULATE_ADJACENT_TURFS(newT, KILL_EXCITED) /turf/proc/copyTurf(turf/T) if(T.type != type) @@ -98,6 +99,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( blueprint_data = null var/list/old_baseturfs = baseturfs + var/old_type = type var/list/post_change_callbacks = list() SEND_SIGNAL(src, COMSIG_TURF_CHANGE, path, new_baseturfs, flags, post_change_callbacks) @@ -131,7 +133,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( new_turf.explosion_level = old_exl if(!(flags & CHANGETURF_DEFER_CHANGE)) - new_turf.AfterChange(flags) + new_turf.AfterChange(flags, old_type) new_turf.blueprint_data = old_bp new_turf.rcd_memory = old_rcd_memory @@ -165,25 +167,29 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if ((flags & CHANGETURF_INHERIT_AIR) && ispath(path, /turf/open)) var/datum/gas_mixture/stashed_air = new() stashed_air.copy_from(air) + var/stashed_state = excited + var/datum/excited_group/stashed_group = excited_group . = ..() if (!.) // changeturf failed or didn't do anything QDEL_NULL(stashed_air) return var/turf/open/newTurf = . newTurf.air.copy_from(stashed_air) - update_air_ref(planetary_atmos ? 1 : 2) QDEL_NULL(stashed_air) + newTurf.excited = stashed_state + newTurf.excited_group = stashed_group + #ifdef VISUALIZE_ACTIVE_TURFS + if(stashed_state) + newTurf.add_atom_colour(COLOR_VIBRANT_LIME, TEMPORARY_COLOUR_PRIORITY) + #endif + if(stashed_group) + if(stashed_group.should_display || SSair.display_all_groups) + stashed_group.display_turf(newTurf) else + SSair.remove_from_active(src) //Clean up wall excitement, and refresh excited groups if(ispath(path,/turf/closed)) flags |= CHANGETURF_RECALC_ADJACENT - update_air_ref(-1) - . = ..() - else - . = ..() - if(flags & CHANGETURF_SKIP) // don't init air before the air subsystem runs - return - if(!istype(air,/datum/gas_mixture)) - Initalize_Atmos(0) + . = ..() /turf/closed/ChangeTurf(path, list/new_baseturfs, flags) if(ispath(path,/turf/open)) @@ -308,12 +314,14 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( //If you modify this function, ensure it works correctly with lateloaded map templates. -/turf/proc/AfterChange(flags) //called after a turf has been replaced in ChangeTurf() +/turf/proc/AfterChange(flags, oldType) //called after a turf has been replaced in ChangeTurf() levelupdate() if(flags & CHANGETURF_RECALC_ADJACENT) - ImmediateCalculateAdjacentTurfs() - else - CALCULATE_ADJACENT_TURFS(src) + immediate_calculate_adjacent_turfs() + if(ispath(oldType, /turf/closed) && istype(src, /turf/open)) + SSair.add_to_active(src) + else //In effect, I want closed turfs to make their tile active when sheered, but we need to queue it since they have no adjacent turfs + CALCULATE_ADJACENT_TURFS(src, (!(ispath(oldType, /turf/closed) && istype(src, /turf/open)) ? NORMAL_TURF : MAKE_ACTIVE)) //update firedoor adjacency var/list/turfs_to_check = get_adjacent_open_turfs(src) | src @@ -329,7 +337,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(above) above.update_mimic() -/turf/open/AfterChange(flags) +/turf/open/AfterChange(flags, oldType) ..() RemoveLattice() if(!(flags & (CHANGETURF_IGNORE_AIR | CHANGETURF_INHERIT_AIR))) @@ -338,18 +346,41 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( //////Assimilate Air////// /turf/open/proc/Assimilate_Air() var/turf_count = LAZYLEN(atmos_adjacent_turfs) - if(isclosedturf(src) || !turf_count) //if there weren't any open turfs, no need to update. + if(blocks_air || !turf_count) //if there weren't any open turfs, no need to update. return var/datum/gas_mixture/total = new//Holders to assimilate air from nearby turfs - - for(var/T in atmos_adjacent_turfs) - var/turf/open/S = T - if(!S.air) - continue - total.merge(S.air) - - air.copy_from(total.remove_ratio(1/turf_count)) + var/list/total_gases = total.gases + //Stolen blatently from self_breakdown + var/list/turf_list = atmos_adjacent_turfs + src + var/turflen = turf_list.len + var/energy = 0 + var/heat_cap = 0 + + for(var/t in turf_list) + var/turf/open/T = t + //Cache? + var/datum/gas_mixture/turf/mix = T.air + //"borrowing" this code from merge(), I need to play with the temp portion. Lets expand it out + //temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity + var/capacity = mix.heat_capacity() + energy += mix.temperature * capacity + heat_cap += capacity + + var/list/giver_gases = mix.gases + for(var/giver_id in giver_gases) + ASSERT_GAS_IN_LIST(giver_id, total_gases) + total_gases[giver_id][MOLES] += giver_gases[giver_id][MOLES] + + total.temperature = energy / heat_cap + for(var/id in total_gases) + total_gases[id][MOLES] /= turflen + + for(var/t in turf_list) + var/turf/open/T = t + T.air.copy_from(total) + T.update_visuals() + SSair.add_to_active(T) /turf/proc/ReplaceWithLattice() ScrapeAway(flags = CHANGETURF_INHERIT_AIR) diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index d5c58225c5352..0edfbe99ceaa8 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -5,7 +5,9 @@ CREATION_TEST_IGNORE_SELF(/turf/closed) opacity = TRUE density = TRUE init_air = FALSE + blocks_air = TRUE rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE + init_air = FALSE rad_insulation = RAD_MEDIUM_INSULATION pass_flags_self = PASSCLOSEDTURF diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 471dc4d0c96bd..2bf90d07bd56f 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -15,7 +15,7 @@ opacity = TRUE density = TRUE layer = EDGED_TURF_LAYER - initial_temperature = 293.15 + temperature = 293.15 max_integrity = 200 var/environment_type = "asteroid" var/turf/open/floor/plating/turf_type = /turf/open/floor/plating/asteroid/airless @@ -91,11 +91,33 @@ for(var/obj/effect/temp_visual/mining_overlay/M in src) qdel(M) var/flags = NONE + var/old_type = type if(defer_change) // TODO: make the defer change var a var for any changeturf flag flags = CHANGETURF_DEFER_CHANGE - ScrapeAway(null, flags) - addtimer(CALLBACK(src, PROC_REF(AfterChange)), 1, TIMER_UNIQUE) - playsound(src, 'sound/effects/break_stone.ogg', 50, 1) //beautiful destruction + var/turf/open/mined = ScrapeAway(null, flags) + addtimer(CALLBACK(src, PROC_REF(AfterChange), old_type), 1, TIMER_UNIQUE) + playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) //beautiful destruction + mined.update_visuals() + +/turf/closed/mineral/attack_animal(mob/living/simple_animal/user, list/modifiers) + if((user.environment_smash & ENVIRONMENT_SMASH_WALLS) || (user.environment_smash & ENVIRONMENT_SMASH_RWALLS)) + gets_drilled(user) + ..() + +/turf/closed/mineral/attack_alien(mob/living/carbon/alien/user, list/modifiers) + to_chat(user, "You start digging into the rock...") + playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) + if(do_after(user, 4 SECONDS, target = src)) + to_chat(user, "You tunnel into the rock.") + gets_drilled(user) + +/turf/closed/mineral/attack_hulk(mob/living/carbon/human/H) + ..() + if(do_after(H, 50, target = src)) + playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) + H.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") + gets_drilled(H) + return TRUE /turf/closed/mineral/Bumped(atom/movable/AM) ..() diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index 6dcd409cc3e94..d20f14269db7b 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -148,10 +148,11 @@ new /obj/structure/girder/displaced(loc) ..() -/turf/closed/wall/mineral/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)//Doesn't fucking work because walls don't interact with air :( - if(exposed_temperature > 300) - if(plasma_ignition(6)) - new /obj/structure/girder/displaced(loc) +/turf/closed/wall/mineral/plasma/should_atmos_process(datum/gas_mixture/air, exposed_temperature)//Doesn't work because walls have superconduction turned off + return exposed_temperature > 300 +/turf/closed/wall/mineral/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature) + if(plasma_ignition(6)) + new /obj/structure/girder/displaced(loc) /turf/closed/wall/mineral/plasma/bullet_act(obj/projectile/Proj) if(!(Proj.nodamage) && Proj.damage_type == BURN) diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 92ae1a410434b..f45a33f5e74cd 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -35,13 +35,6 @@ CREATION_TEST_IGNORE_SELF(/turf/open) ///Is this floor no-slip? var/traction = FALSE -/turf/open/Initialize(mapload) - . = ..() - if(broken) - break_tile(TRUE) - if(burnt) - burn_tile(TRUE) - /turf/open/ComponentInitialize() . = ..() if(wet) @@ -131,6 +124,7 @@ CREATION_TEST_IGNORE_SELF(/turf/open) icon = 'icons/turf/boss_floors.dmi' icon_state = "boss" baseturfs = /turf/open/indestructible/boss + planetary_atmos = TRUE initial_gas_mix = LAVALAND_DEFAULT_ATMOS /turf/open/indestructible/boss/air @@ -138,6 +132,7 @@ CREATION_TEST_IGNORE_SELF(/turf/open) /turf/open/indestructible/hierophant icon = 'icons/turf/floors/hierophant_floor.dmi' + planetary_atmos = TRUE initial_gas_mix = LAVALAND_DEFAULT_ATMOS baseturfs = /turf/open/indestructible/hierophant tiled_dirt = FALSE @@ -160,7 +155,7 @@ CREATION_TEST_IGNORE_SELF(/turf/open) /turf/open/indestructible/binary name = "tear in the fabric of reality" - CanAtmosPass = ATMOS_PASS_NO + can_atmos_pass = ATMOS_PASS_NO baseturfs = /turf/open/indestructible/binary icon_state = "binary" footstep = FOOTSTEP_PLATING @@ -171,20 +166,20 @@ CREATION_TEST_IGNORE_SELF(/turf/open) /turf/open/indestructible/airblock icon_state = "bluespace" + blocks_air = TRUE + init_air = FALSE baseturfs = /turf/open/indestructible/airblock - CanAtmosPass = ATMOS_PASS_NO init_air = FALSE -/turf/open/Initalize_Atmos(times_fired) - if(!istype(air, /datum/gas_mixture/turf)) - air = new(2500,src) - air.copy_from_turf(src) - update_air_ref(planetary_atmos ? 1 : 2) - - update_visuals() - - ImmediateCalculateAdjacentTurfs() +/turf/open/Initalize_Atmos(time) + excited = FALSE + if(!blocks_air) + if(!istype(air,/datum/gas_mixture/turf)) + air = new(2500,src) + air.copy_from_turf(src) + current_cycle = time + init_immediate_calculate_adjacent_turfs() /turf/open/proc/GetHeatCapacity() . = air.heat_capacity() @@ -193,8 +188,8 @@ CREATION_TEST_IGNORE_SELF(/turf/open) . = air.return_temperature() /turf/open/proc/TakeTemperature(temp) - air.set_temperature(air.return_temperature() + temp) - air_update_turf() + air.temperature = air.return_temperature() + temp + air_update_turf(FALSE, FALSE) /turf/open/proc/freeze_turf() for(var/obj/I in contents) @@ -282,11 +277,11 @@ CREATION_TEST_IGNORE_SELF(/turf/open) /turf/open/rad_act(pulse_strength) . = ..() - if (air.get_moles(GAS_CO2) && air.get_moles(GAS_O2)) - pulse_strength = min(pulse_strength,air.get_moles(GAS_CO2)*1000,air.get_moles(GAS_O2)*2000) //Ensures matter is conserved properly - air.set_moles(GAS_CO2, max(air.get_moles(GAS_CO2)-(pulse_strength/1000),0)) - air.set_moles(GAS_O2, max(air.get_moles(GAS_O2)-(pulse_strength/2000),0)) - air.adjust_moles(GAS_PLUOXIUM, pulse_strength/4000) + if (air.gases[/datum/gas/carbon_dioxide] && air.gases[/datum/gas/oxygen]) + pulse_strength = min(pulse_strength,air.gases[/datum/gas/carbon_dioxide][MOLES]*1000,air.gases[/datum/gas/oxygen][MOLES]*2000) //Ensures matter is conserved properly + ADD_MOLES(/datum/gas/carbon_dioxide, air, (pulse_strength/1000)-air.gases[/datum/gas/carbon_dioxide][MOLES]) + ADD_MOLES(/datum/gas/oxygen, air, (pulse_strength/2000)-air.gases[/datum/gas/oxygen][MOLES]) + ADD_MOLES(/datum/gas/pluoxium, air, pulse_strength/4000) /turf/open/proc/break_tile(force, allow_base) LAZYINITLIST(damage_overlays) diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index fb4e463d83fad..f020ce5827daa 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -97,7 +97,7 @@ return make_plating() /turf/open/floor/wood/cold - initial_temperature = 255.37 + temperature = 255.37 /turf/open/floor/wood/airless initial_gas_mix = AIRLESS_ATMOS diff --git a/code/game/turfs/open/floor/mineral_floor.dm b/code/game/turfs/open/floor/mineral_floor.dm index 99d133c7ed1f8..956c640f7749c 100644 --- a/code/game/turfs/open/floor/mineral_floor.dm +++ b/code/game/turfs/open/floor/mineral_floor.dm @@ -40,8 +40,10 @@ icons = list("plasma","plasma_dam") max_integrity = 200 -/turf/open/floor/mineral/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) +/turf/open/floor/mineral/plasma/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 300 + +/turf/open/floor/mineral/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature) PlasmaBurn(exposed_temperature) /turf/open/floor/mineral/plasma/attackby(obj/item/W, mob/user, params) diff --git a/code/game/turfs/open/floor/plating/asteroid.dm b/code/game/turfs/open/floor/plating/asteroid.dm index 99c6a4fd910fc..255cea68f632a 100644 --- a/code/game/turfs/open/floor/plating/asteroid.dm +++ b/code/game/turfs/open/floor/plating/asteroid.dm @@ -95,7 +95,6 @@ GM = new . = ..() air = GM - update_air_ref(2) return /turf/open/floor/plating/lavaland_baseturf @@ -153,7 +152,6 @@ GM = new . = ..() air = GM - update_air_ref(2) return /turf/open/floor/plating/asteroid/airless diff --git a/code/game/turfs/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm index 9b5051e161135..dbd89b785cda3 100644 --- a/code/game/turfs/open/floor/plating/misc_plating.dm +++ b/code/game/turfs/open/floor/plating/misc_plating.dm @@ -132,7 +132,6 @@ GM = new . = ..() air = GM - update_air_ref(2) return /turf/open/floor/plating/beach @@ -329,7 +328,7 @@ icon = 'icons/turf/floors/ice_turf.dmi' icon_state = "ice-0" initial_gas_mix = FROZEN_ATMOS - initial_temperature = 180 + temperature = 180 planetary_atmos = TRUE baseturfs = /turf/open/floor/plating/ice slowdown = 1 @@ -360,10 +359,10 @@ base_icon_state = "red_ice" /turf/open/floor/plating/ice/colder - initial_temperature = 140 + temperature = 140 /turf/open/floor/plating/ice/temperate - initial_temperature = 255.37 + temperature = 255.37 /turf/open/floor/plating/ice/break_tile() return @@ -378,7 +377,7 @@ icon = 'icons/turf/snow.dmi' icon_state = "snowplating" initial_gas_mix = FROZEN_ATMOS - initial_temperature = 180 + temperature = 180 attachment_holes = FALSE planetary_atmos = TRUE footstep = FOOTSTEP_SAND @@ -399,10 +398,10 @@ canSmoothWith = list(SMOOTH_GROUP_FLOOR_SNOWED) /turf/open/floor/plating/snowed/colder - initial_temperature = 140 + temperature = 140 /turf/open/floor/plating/snowed/temperatre - initial_temperature = 255.37 + temperature = 255.37 /turf/open/floor/plating/elevatorshaft name = "elevator shaft" diff --git a/code/game/turfs/open/floor/reinf_floor.dm b/code/game/turfs/open/floor/reinf_floor.dm index e59930ab35da0..e1314dcd979be 100644 --- a/code/game/turfs/open/floor/reinf_floor.dm +++ b/code/game/turfs/open/floor/reinf_floor.dm @@ -130,8 +130,7 @@ icon_state = "plating" floor_tile = null var/obj/effect/clockwork/overlay/floor/bloodcult/realappearance - CanAtmosPass = ATMOS_PASS_NO - CanAtmosPassVertical = ATMOS_PASS_NO + can_atmos_pass = ATMOS_PASS_NO /turf/open/floor/engine/cult/Initialize(mapload) diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index 4cef4cfdf32af..e2a19f3f905e5 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -5,7 +5,6 @@ CREATION_TEST_IGNORE_SUBTYPES(/turf/open/openspace) desc = "Watch your step!" icon_state = "invisible" baseturfs = /turf/open/openspace - CanAtmosPassVertical = ATMOS_PASS_YES overfloor_placed = FALSE underfloor_accessibility = UNDERFLOOR_INTERACTABLE allow_z_travel = TRUE diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index d4e29778c1bab..74d37063b3db8 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -13,7 +13,7 @@ allow_z_travel = TRUE - initial_temperature = TCMB + temperature = TCMB thermal_conductivity = 0 heat_capacity = 700000 @@ -25,9 +25,10 @@ var/destination_x var/destination_y - var/static/datum/gas_mixture/immutable/space/space_gas + var/static/datum/gas_mixture/immutable/space/space_gas = new // We do NOT want atmos adjacent turfs init_air = FALSE + run_later = TRUE plane = PLANE_SPACE layer = SPACE_LAYER light_power = 0.25 @@ -60,7 +61,6 @@ if(!space_gas) space_gas = new air = space_gas - update_air_ref(0) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") @@ -70,6 +70,9 @@ if(IS_DYNAMIC_LIGHTING(A)) overlays += GLOB.starlight_overlay + if(requires_activation) + SSair.add_to_active(src, TRUE) + return INITIALIZE_HINT_NORMAL /turf/open/space/Destroy() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 2a1875a7ad17d..d577cece8f933 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -23,7 +23,7 @@ CREATION_TEST_IGNORE_SELF(/turf) var/list/baseturfs = /turf/baseturf_bottom /// How hot the turf is, in kelvin - var/initial_temperature = T20C + var/temperature = T20C /// Used for fire, if a melting temperature was reached, it will be destroyed var/to_be_destroyed = 0 @@ -36,6 +36,10 @@ CREATION_TEST_IGNORE_SELF(/turf) //If true, turf will allow users to float up and down in 0 grav. var/allow_z_travel = FALSE + /// Whether the turf blocks atmos from passing through it or not + var/blocks_air = FALSE + + flags_1 = CAN_BE_DIRTY_1 /// For the station blueprints, images of objects eg: pipes @@ -124,7 +128,7 @@ CREATION_TEST_IGNORE_SELF(/turf) add_overlay(GLOB.fullbright_overlay) if(requires_activation) - CALCULATE_ADJACENT_TURFS(src) + CALCULATE_ADJACENT_TURFS(src, KILL_EXCITED) if(color) add_atom_colour(color, FIXED_COLOUR_PRIORITY) @@ -148,12 +152,6 @@ CREATION_TEST_IGNORE_SELF(/turf) set_custom_materials(temp_list) ComponentInitialize() - if(isopenturf(src)) - var/turf/open/O = src - __auxtools_update_turf_temp_info(isspaceturf(get_z_base_turf()) && !O.planetary_atmos) - else - update_air_ref(-1) - __auxtools_update_turf_temp_info(isspaceturf(get_z_base_turf())) //Handle turf texture var/datum/turf_texture/TT = get_turf_texture() @@ -162,15 +160,9 @@ CREATION_TEST_IGNORE_SELF(/turf) return INITIALIZE_HINT_NORMAL -/turf/proc/__auxtools_update_turf_temp_info() - -/turf/return_temperature() - -/turf/proc/set_temperature() - /// Initializes our adjacent turfs. If you want to avoid this, do not override it, instead set init_air to FALSE -/turf/proc/Initalize_Atmos(times_fired) - CALCULATE_ADJACENT_TURFS(src) +/turf/proc/Initalize_Atmos(time) + CALCULATE_ADJACENT_TURFS(src, NORMAL_TURF) /turf/Destroy(force) . = QDEL_HINT_IWILLGC diff --git a/code/game/world.dm b/code/game/world.dm index 1ab3064883a49..fb5fb13f99482 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -32,7 +32,6 @@ GLOBAL_VAR(restart_counter) */ /world/proc/Genesis() // auxtools has to go BEFORE tracy, otherwise tracy will clobber its hook addresses - AUXTOOLS_CHECK(AUXMOS) #ifdef USE_BYOND_TRACY #warn USE_BYOND_TRACY is enabled init_byond_tracy() @@ -346,13 +345,11 @@ GLOBAL_VAR(restart_counter) log_world("World rebooted at [time_stamp()]") shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss. - AUXTOOLS_SHUTDOWN(AUXMOS) ..() #endif /world/Del() shutdown_logging() // makes sure the thread is closed before end, else we terminate - AUXTOOLS_SHUTDOWN(AUXMOS) var/debug_server = world.GetConfig("env", "AUXTOOLS_DEBUG_DLL") if (debug_server) LIBCALL(debug_server, "auxtools_shutdown")() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 9ff0afaa39ec6..88a3610baea4a 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -190,7 +190,6 @@ GLOBAL_PROTECT(admin_verbs_debug) /client/proc/reload_configuration, /client/proc/give_all_spells, /datum/admins/proc/create_or_modify_area, - /datum/admins/proc/fixcorruption, #ifdef TESTING /client/proc/check_missing_sprites, /client/proc/run_dynamic_simulations, @@ -813,6 +812,9 @@ GLOBAL_PROTECT(admin_verbs_hideable) var/datum/gas_mixture/GM = new for(var/turf/open/F in view()) + if(F.blocks_air) + //skip walls + continue GM.parse_gas_string(F.initial_gas_mix) F.copy_air(GM) F.update_visuals() diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index 0a4abfd033111..48434dba49ee4 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -21,13 +21,6 @@ if(pipe.z && (!pipe.nodes || !pipe.nodes.len || (null in pipe.nodes))) to_chat(usr, "Unconnected [pipe.name] located at [ADMIN_VERBOSEJMP(pipe)]") - //Erroneous Connections, e.g. duplicate pipes - //This uses pipeline_expansion(), so you can detect some atmos machineries causing problems at pipenet code. - for (var/obj/machinery/atmospherics/AM in GLOB.machines) - for (var/obj/machinery/atmospherics/AMT in AM.pipeline_expansion()) - if (!(AM in AMT.pipeline_expansion())) - to_chat(usr, "Errorneous connections around [AM.name]. Duplicate or rogue pipes suspected at or around [ADMIN_VERBOSEJMP(AM)]") - /client/proc/powerdebug() set category = "Mapping" set name = "Check Power" diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index ea3f0eb3df786..b42bf93316bb3 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -624,7 +624,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(Rad.anchored) if(!Rad.loaded_tank) var/obj/item/tank/internals/plasma/Plasma = new/obj/item/tank/internals/plasma(Rad) - Plasma.air_contents.set_moles(GAS_PLASMA, 70) + var/datum/gas_mixture/plasma_air = Plasma.return_air() + SET_MOLES(/datum/gas/plasma, plasma_air, 70) + Rad.drainratio = 0 Rad.loaded_tank = Plasma Plasma.forceMove(Rad) @@ -949,13 +951,15 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_DEBUG) || !C) return - var/gas_to_add = input(usr, "Choose a gas to modify.", "Choose a gas.") as null|anything in GLOB.gas_data.ids + var/gas_to_add = input(usr, "Choose a gas to modify.", "Choose a gas.") as null|anything in subtypesof(/datum/gas) var/amount = input(usr, "Choose the amount of moles.", "Choose the amount.", 0) as num var/temp = input(usr, "Choose the temperature (Kelvin).", "Choose the temp (K).", 0) as num + var/datum/gas_mixture/C_air = C.return_air() + + SET_MOLES(gas_to_add, C_air, amount) - C.air_contents.set_moles(gas_to_add, amount) - C.air_contents.set_temperature(temp) + C_air.temperature = (temp) C.update_icon() message_admins("[key_name_admin(src)] modified \the [C.name] at [AREACOORD(C)] - Gas: [gas_to_add], Moles: [amount], Temp: [temp].") diff --git a/code/modules/admin/verbs/fix_air.dm b/code/modules/admin/verbs/fix_air.dm new file mode 100644 index 0000000000000..0550c3f66788c --- /dev/null +++ b/code/modules/admin/verbs/fix_air.dm @@ -0,0 +1,20 @@ +// Proc taken from yogstation, credit to nichlas0010 for the original +/client/proc/fix_air(turf/open/T in world) + set name = "Fix Air" + set category = "Admin.Game" + set desc = "Fixes air in specified radius." + + if(!holder) + to_chat(src, "Only administrators may use this command.") + return + if(check_rights(R_ADMIN,1)) + var/range=input("Enter range:","Num",2) as num + message_admins("[key_name_admin(usr)] fixed air with range [range] in area [T.loc.name]") + usr.log_message("fixed air with range [range] in area [T.loc.name]", LOG_ADMIN) + for(var/turf/open/F in range(range,T)) + if(F.blocks_air) + //skip walls + continue + var/datum/gas_mixture/GM = SSair.parse_gas_string(F.initial_gas_mix) + F.copy_air(GM) + F.update_visuals() diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 49b62ad129736..f9a57802c061c 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -9,7 +9,7 @@ anchored = TRUE layer = BELOW_MOB_LAYER pass_flags_self = PASSBLOB - CanAtmosPass = ATMOS_PASS_PROC + can_atmos_pass = ATMOS_PASS_PROC var/point_return = 0 //How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed. max_integrity = 30 armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 70, STAMINA = 0, BLEED = 0) @@ -34,7 +34,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/blob) setDir(pick(GLOB.cardinals)) update_icon() if(atmosblock) - air_update_turf(1) + air_update_turf(TRUE, TRUE) ConsumeTile() /obj/structure/blob/proc/creation_action() //When it's created by the overmind, do this. @@ -43,7 +43,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/blob) /obj/structure/blob/Destroy() if(atmosblock) atmosblock = FALSE - air_update_turf(1) + air_update_turf(TRUE, FALSE) if(overmind) overmind.blobs_legit -= src //if it was in the legit blobs list, it isn't now GLOB.blobs -= src //it's no longer in the all blobs list either @@ -67,10 +67,10 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/blob) result++ . -= result - 1 -/obj/structure/blob/BlockThermalConductivity() +/obj/structure/blob/block_superconductivity() return atmosblock -/obj/structure/blob/CanAtmosPass(turf/T) +/obj/structure/blob/can_atmos_pass(turf/T, vertical = FALSE) return !atmosblock /obj/structure/blob/update_icon() //Updates color based on overmind color if we have an overmind. diff --git a/code/modules/antagonists/blob/structures/shield.dm b/code/modules/antagonists/blob/structures/shield.dm index f39f8613c25e7..78584de481596 100644 --- a/code/modules/antagonists/blob/structures/shield.dm +++ b/code/modules/antagonists/blob/structures/shield.dm @@ -31,7 +31,7 @@ . = ..() if(. && obj_integrity > 0) atmosblock = obj_integrity < (max_integrity * 0.5) - air_update_turf(TRUE) + air_update_turf(TRUE, atmosblock) /obj/structure/blob/shield/update_icon_state() icon_state = "[initial(icon_state)][(obj_integrity < (max_integrity * 0.5)) ? "_damaged" : null]" diff --git a/code/modules/antagonists/clock_cult/clockwork_turfs.dm b/code/modules/antagonists/clock_cult/clockwork_turfs.dm index 67e43966441e2..35f95839d3096 100644 --- a/code/modules/antagonists/clock_cult/clockwork_turfs.dm +++ b/code/modules/antagonists/clock_cult/clockwork_turfs.dm @@ -343,7 +343,7 @@ damage_deflection = 30 normal_integrity = 240 air_tight = FALSE - CanAtmosPass = ATMOS_PASS_YES + can_atmos_pass = ATMOS_PASS_YES var/construction_state = GEAR_SECURE //Pinion airlocks have custom deconstruction allow_repaint = FALSE diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 7b13e2af68e76..b1b787d0e4702 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -674,7 +674,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/rune/narsie) invocation = "Khari'd! Eske'te tannin!" icon_state = "4" color = RUNE_COLOR_DARKRED - CanAtmosPass = ATMOS_PASS_DENSITY + can_atmos_pass = ATMOS_PASS_DENSITY var/datum/timedevent/density_timer var/recharging = FALSE @@ -694,7 +694,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/rune/wall) GLOB.wall_runes -= src return ..() -/obj/effect/rune/wall/BlockThermalConductivity() +/obj/effect/rune/wall/block_superconductivity() return density /obj/effect/rune/wall/invoke(var/list/invokers) diff --git a/code/modules/atmospherics/Atmospherics.md b/code/modules/atmospherics/Atmospherics.md new file mode 100644 index 0000000000000..f0ebe8ba0041c --- /dev/null +++ b/code/modules/atmospherics/Atmospherics.md @@ -0,0 +1,528 @@ +# Atmospherics +## 1. Preamble + +This file will be written in the first person in the interest of having a laid back style, as some of the concepts here would be ass to read as technical writing. Understand that this isn't the work of one person, but the combined efforts of several contributors. It is a living document, and one you should strive to keep up to date. + +I have ~~stolen~~ adapted this document from the work of duncathan, an off and on maintainer who is responsible for the majority of the quality of the current atmos system. He pushed through several code cleanliness and sanity refactors to the system, and wrote the rundown of gas mixtures you'll find in this document. See the [original](https://gist.github.com/duncathan/77d918748d153b4f31a8f76f6085b91a) for his draft. + +Now, the purpose of this bit of documentation. + +Over the history of /tg/ there have been several periods where one or no active coders understood how atmospherics works, or even how it was intended to work. We've lost several major pieces of functionality, not because none knew how they worked, but because none knew that they should work, or even that they existed. + +Atmospherics tends to be a somewhat cloudy corner of our codebase, unless you know exactly what to look for noticing that something is broken can be a feat in and of itself. + +My goal here is to solve that problem once and for all. Not everything will be documented in this file, I won't go line by line. I will however describe how things ought to work, and how some of the more complex stuff is meant to run. + +Atmospherics is a very complicated and intimidating system of SS13, and as such very few contributors have ever made changes to it. Even fewer is the number of contributors who have made changes to the more fundamental aspects of atmos, such as Environmental Atmos or gas mixtures. There are several other factors for this, of course. In the case of Environmental, its arcane nature coupled with its extremely important gameplay effects leave it a very undesirable target for even the least sane coder. As for gas mixtures, they were virtually untouchable without extensive reworks of the code. This [paste-bin](https://pastebin.com/bwy4KpBE) is a good example; it lists all the files one would need to make changes in order to add a new type of gas in the old system. As you can imagine, the sheer bulk of work one would need to do to accomplish this essentially invalidated any such attempts. However, my primary goal is to bring atmos to a state where any coder will be able to understand how and why it works, as well as cleanly and relatively easily make changes or additions to the system. While much progress to this end has been achieved, still very few have taken advantage of the new frameworks to try to implement meaningful features or changes. The purpose of this document is to lay out the inner workings of the entire atmos system, such that someone who does not have an intimate understand of the system like myself will be able to contribute to the system nonetheless. + +Recognizing this desire, I hope and believe that you who are reading this are willing to learn and contribute. + +Thank you. + +## 2. Introduction to Atmos + +Hello! So glad you could join us. + +Atmospherics is the system we use to simulate gases. Might as well get that out of the way. It is made up of several major parts, and a few more minor ones. We'll be covering the air subsystem, gas mixtures, reactions, environmental flow, and pipenets in the document. + +If you'd like to understand more about how environmental atmos works after reading the relevant subsection, go to Appendix B. It discusses how to properly visualize the system, and what different behavior looks like. + +Now then, into the breach. + +## 3. The Air Controller + +![Cyclical graph of one atmos tick](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/Cycle.png) + +*Figure 3.1: The structure of one air controller tick. Not totally accurate, but it will do* + + The air controller is, at its core, quite simple, yet it is absolutely fundamental to the atmospheric system. The air controller is the clock which triggers all continuous actions within the atmos system, such as vents distributing air or gas moving between tiles. The actions taken by the air controller are quite simple, and will be enumerated here. Much of the substance of the air ticker is due to the game's master controller, whose intricacies I will not delve into for this document. I will however go into more detail about how SSAir in particular works in Chapter 6. In any case, this is a simplified list of the air controller's actions in a single tick: +1. Rebuild Pipenets + - Runs each time SSAir processes, sometimes out of order. It ensures that no pipeline sit unresolved or unbuilt + - Processes the `rebuild_queue` list into the `expansion_queue` list, and then builds a full pipeline piecemeal. We do a ton of fenagling here to reduce overrun +2. Pipenets + - Updates the internal gasmixes of attached pipe machinery, and reacts the gases in a pipeline + - Calls `process()` on each `/datum/pipenet` in the `networks` list +3. Machinery + - Handles machines that effect atmospherics, think vents, the supermatter, pumps, all that + - Calls `process_atmos()` on each `/obj/machinery` (typically `/obj/machinery/atmospherics`) in the `atmos_machinery` list + - May remove the machinery from said list if `process_atmos()` returns `PROCESS_KILL` +4. Active turfs + - This is the heart and soul of environmental atmos, see more details below + - All you need to know right now is it manages moving gas from tile to tile + - Calls `process_cell()` on each `/turf/open` in the `active_turfs` list +5. Excited groups + - Manages excited groups, which are core to working flow simulation + - More details to come, they handle differences between gasmixtures when active turfs can't do the job + - Increases the `breakdown_cooldown` and `dismantle_cooldown` for each `/datum/excited_group` in the `excited_groups` list + - If either cooldown for a given excited group has passed its threshold + - Calls `self_breakdown()` or `dismantle()` appropriately on the excited group. +6. High pressure deltas + - Takes the gas movement from Active Turfs and uses it to move objects on said turfs + - Calls `high_pressure_movements()` on each `/turf/open` in the `high_pressure_delta` list. + - Sets each turf's `pressure_difference` to 0 +7. Hotspots + - These are what you might know as fire, at least the effect of it. + - They deal with burning things, and color calculations, lots of color calculations + - Calls `process()` on each `/obj/effect/hotspot` in the `hotspots` list +8. Superconductivity + - Moves heat through turfs that don't allow gas to pass + - Deals with heating up the floor below windows, and some other more painful heat stuff + - Calls `super_conduct()` on each `/turf` in the `active_super_conductivity` list +9. Atoms + - Processes things in the world that should know about gas changes, used to account for turfs sleeping, I'll get more into that in a bit + - Calls `process_exposure()` on each `/atom` in the `atom_process` list + +## 4. Gas Mixtures +If the air controller is the heart of atmos, then gas mixtures make up its blood. The bulk of all atmos calculations are performed within a given gas mixture datum (an instance of `/datum/gas_mixture`), be it within a turf or within an emergency oxygen tank or within a pipe. In particular, `/datum/gas_mixture/proc/share()` is the cornerstone of atmos simulation, as it and its stack perform all the calculations for equalizing two gas mixtures. + +Gas mixtures contain some of the oldest code still in our codebase, and it is remarkable that overall, the logic behind the majority of gas mixture procs has gone unchanged since the days of Exadv1. Despite being in some sense "oldcode", the logic itself is quite robust and based in real world physics. Thankfully, gas mixtures already are quite well documented in terms of their behavior. Their file is well commented and kept up to date. I will, however, elaborate on some of the less obvious operations here. Additionally, I will document the structure of gas lists, and how one should interface with a gas mixture should you choose to use one in other code. + +Now don't be scared by the code mind, it's SPOOKY PHYSICS but it's not the devil, we can break it down into component parts to understand it. + +```DM +//transfer of thermal energy (via changed heat capacity) between self and sharer + if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY) + temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity +``` +*Snippet 4.1: excerpt from `/datum/gas_mixture/proc/share()`* + +The snippet above is an example of one particularly strange looking calculation. This part of share() is updating the temperature of a gas mixture to account for lost or gained thermal energy as gas moves to/from the mixture, since gases themselves carry heat. To understand this snippet, it is important to understand the difference between heat and temperature. For the most part, the average coder need only concern himself with temperature, as it is a familiar experience for anybody. However, internally in atmos, heat (thermal energy) is the truly important quantity. Heat is defined as temperature multiplied by heat capacity, and is measured in joules. Typically within atmos, we are more concerned with manipulating heat than temperature; however, temperature is tracked rather than heat largely to make interfacing with the system simpler for the average coder. Thus, this snippet modifies heat in terms of temperature - it adds/subtracts three terms, each of which measure heat, to determine the new heat in the gas mixture. This heat is then divided by the mixture's heat capacity in order to determine temperature. + +One trick to understanding passages like this is to do some simple dimensional analysis. Look only at the units, and ensure that whenever a variable is assigned that it is being assigned the appropriate unit. The snippet previously discussed can be represented with the following units: `temperature = ((J/K)*K - (J/K)*K + (J/K)*K)/(J/K)`. Simplified, you get `(J-J+J)*K/J` and then simply `J*K/J` and `K`, verifying that temperature is being set to a value in kelvins. This trick has proven invaluable to me when debugging the inner workings of gas mixtures. + +### Gases + +The true beauty of the gas mixture datum is how it represents the gases it contains. A bit of history: gas mixtures used to represent gas in two ways - there were the four primary gases (oxygen, nitrogen, carbon dioxide, and plasma) which were hardcoded. Each gas mixture had two vars (moles and archived moles, a concept to be explained later) to represent each of these gases. Calculations such as thermal energy made use of predefined constants for these hardcoded gases. The benefit of this was that they were extremely quick - only a single datum var access was needed for each one. In contrast, there were trace gases, for which there were a list of gas datums. The only trace gas available in normal gameplay was nitrous oxide (N2O or sleeping agent), though through adminnery it was possible to create oxygen agent B and volatile fuel, curious gases which will be described later for historical reasons. Trace gases, in contrast to hardcoded gases, were quite modular. To add a new trace gas one needed only to define a new subtype of /datum/gas and add appropriate behavior wherever desired, such as breath code. Unfortunately, of course, trace gases were slooooow. Calculations on trace gases were significantly more costly than hardcoded gases. The problem was obvious - it seemed impossible to have a gas definition which shared the modularity of trace gases without sacrificing too much of the performance of the hardcoded gases. + +What then to do? There was no option to port an improvement from another codebase. As far as I am aware, there have been no significant downstream improvements to gas mixtures. The other major upstream codebase, Baystation12, uses a very different atmos system; in particular, their XGM gas mixtures have their own solution to this problem. To summarize XGM, there is a singleton which has associative lists of gas metadata (information such as specific heat, or which overlay to display when the gas is present) which gets accessed whenever such information is needed. To count moles, each gas mixture has an associative list of gas ids mapped to mole counts. There were a couple of problems with this approach: 1. There was no measure of archived moles. While it would be easy to simply add a second associative list, this has non-trivial memory implications as well as a potential increase to total datum var accesses within internal atmos calculations. 2. The singleton used for storing metadata helps with the memory impact that using full datums would have, but does not properly address the cost of datum var accesses, as to access metadata you must still access a datum var on the singleton. + +For some time, without a clear solution, we simply stuck to the status quo and left gases non-modular. Eventually, however, there was an idea. + +Enter Listmos. + +### The Gas List +The solution we came to was beautifully simple, but founded on some unintuitive principles. While datum var accesses are quite slow, proc var accesses are acceptable. If we use a reference for a given var, this can be exploited by "caching" the reference inside of a proc var. How can we take advantage of this without using a datum, thus nullifying the benefit? + +The answer was to use a list. The critical realization was that a gas datum functioned more so as a struct than as a class. There were no procs attached to gas datums; only vars. While DM lacks a true struct with quick lookup times, a list works very well to perform the same function. Thus, the current structure of gas was created, under the name Listmos. + +Each gas mixture has an associative list, gases, which maps according to a key to a particular gas. This gas is itself a list (not an associative list, mind) with three elements; these elements correspond to the moles, archived moles, and to another list. This final list is a singleton - only one instance of it exists per gas, and all gas instances of a particular type point to this same list as their third element. The final list contains the metadata for the gas, such as specific heat or the name of the gas. The structure of the metadata list varies according to how many attributes are defined overall for all gases, but it is also non-associative since the structure can never change post-compile, so we save a little bit of performance by avoiding associative lookups. + +Each type of gas is defined by defining a new subtype of /datum/gas. These datums do not get instantiated; they merely serve as a convenient and familiar means for a coder unfamiliar with the inner workings of listmos to define a new gas. Additionally, the type paths serve a second use as the keys used to access a particular gas within the gases list. It is easiest to demonstrate the manipulation of gas, including these list accesses, with an example. + +### Interfacing with a Gas Mixture + +```DM +var/datum/gas_mixture/air = new +air.assert_gas(/datum/gas/oxygen) +air.gases[/datum/gas/oxygen][MOLES] = 100 +world << air.gases[/datum/gas/oxygen][GAS_META][META_GAS_NAME] //outputs "Oxygen" +world << air.gases.heat_capacity() //outputs 2000 (100 mol * 20 J/K/mol) +air.gases[/datum/gas/oxygen][MOLES] -= 110 +air.garbage_collect() //oxygen is now removed from the gases list, since it was empty +``` +*Snippet 4.2: gas mixture usage examples* + +Of particular note in this snippet are the two procs assert_gas() and garbage_collect(). These procs are very important while interfacing with gas mixtures. If you are uncertain about whether a given mixture has a particular gas, you must use assert_gas() before any reads or writes from the gas. If you fail to use assert_gas() then there will be runtime errors when you try to access the inner lists. When you remove any number of moles from a given gas, be sure to call garbage_collect(). This proc removes all gases which have mole counts less than or equal to 0. This is a memory and performance enhancement for list accesses achieved by reducing the size of the list, and also saves us from having to do sanity checks for negative moles whenever gas is removed. As a quick reference, here is a list of common procs/vars/list indices which the average coder may wish to use when interfacing with a gas mixture. + +##### Gas Mixture Datum +* *`/datum/gas_mixture/proc/assert_gas()`* - Used before accessing a particular type of gas. +* *`/datum/gas_mixture/proc/assert_gases()`* - Shorthand for calling assert_gas() multiple times. +* *`/datum/gas_mixture/proc/garbage_collect()`* - Used after removing any number of moles from a mixture. +* *`/datum/gas_mixture/proc/return_pressure()`* - Pressure is what should be displayed to players to quantify gas; measured in kilopascals. +* *`/datum/gas_mixture/var/temperature`* - Measured in kelvins. Useful constants are T0C and T20C for 0 and 20 degrees Celsius respectively, and TCMB,the temperature of space and the lower bound for temperature in atmos. +* *`/datum/gas_mixture/var/volume`* - Measured in liters. + +While we're on the subject, `/datum/gas_mixture` has two subtypes. +The first is `/datum/gas_mixture/turf`, which exists for literally one purpose. When a turf is empty, we want it to have the same heat capacity as space. This lets us achieve that by overriding `heat_capacity()` + +The second is `/datum/gas_mixture/immutable`, which itself has two subtypes. +The type is built to allow for gasmixtures that serve as infinite sources of "something", which can't be changed or mutated. +It's used by `/datum/gas_mixture/immutable/space`, which implements some particular things for `heat_capacity()` and some optimizations for gas operations. +It's also implemented by `/datum/gas_mixture/immutable/planetary`, which is used for planetary turfs, and has some code that makes actually having a gasmix possible. + + +##### Gas List +* *`gases[path][MOLES]`* - Quantity of a particular gas within a mixture. +* *`gases[path][GAS_META][META_GAS_NAME]`* - The long name of a gas, ex. "Oxygen" or "Hyper-noblium" +* *`gases[path][GAS_META][META_GAS_ID]`* - The internal ID of a given gas, ex. "o2" or "nob" + +### Reactions +While defining a new gas on its own is very simple, there is no gas-specific behavior defined within /datum/gas. This behavior gets defined in a few places, notably breath code (to be discussed later) and in reactions. The most important and well known reaction in SS13 is fire - the combustion of plasma. Reactions are used for several things - in particular, it is conventional (though by no means enforced) that to form a gas, a reaction must occur. Creating a new reaction is fairly simple, this is the area of atmos that has received the most attention over the last few years, and the best place to start. Don't be scared of the size of reactions.dm, it's not that complex. + +There are two procs needed when defining a new reaction, /datum/gas_reaction/proc/init_reqs() and /datum/gas_reaction/proc/react(). init_reqs() initializes the requirements for the reaction to occur. There is a list, min_requirements, which maps gas paths to required amount of moles. It also maps three specific strings ("TEMP", "MAX_TEMP" and "ENER") to temperature in kelvins and thermal energy in joules. More behavior could easily be added here, but it hasn't yet for performance reasons because no reactions have need of it. + +As for react(), it is where all the behavior of the reaction is defined. The proc must return one of NO_REACTION, REACTING, or STOP_REACTIONS. The proc takes one or optionally two arguments. The first, mandatory, argument is a gas mixture on which to perform calculations; this mixture is what is reacting. The second, optional, argument is a turf or pipenet, specifically the thing which contains the gas mixture. You may choose for the reaction to affect the object in some way. Note that it is conventional for constants within reactions to be #define'd at the top of the file and #undef'd at the end. + +## 5. Environmental Atmos + +This is a rather large subject, we will need to cover gas flow, turf sleeping, superconduction, and much more. Strap in and enjoy the ride! + +### A Word On `Share()` + +Each pair of turfs will only ever call `share()` on each other once. They use an archived cycle to keep track of +this ordering + +That means turf A calling share on turf B should work the same as turf B calling share on turf A + +The key idea of FEA, the core sharing system we use is that neighboring cells should effectively equalize with each other. +So taken on a line, you'd have two sharing partners, the cells to your left and right. The end goal of the simulation is for all the tiles on the line to have the same mix. But we can't just jump to that. So each "tick" we take our mix and average it with the mixes of the two tiles next to us. + +There's an equation for this that's considered standard in heat simulation. (Watch this video: https://www.youtube.com/watch?v=ly4S0oi3Yz8) +We can't use it because means each pair of turfs needs to talk to each other twice, which is pain expensive. That and I'm pretty sure it would prevent us from yielding + +So instead of a complex form of averaging, we portion up tiles. So if you have two neighbors and you have something they don't, you can give them each a third. Have to keep one for ourselves mind, because otherwise we'll run out of gas. They can then act on this portion however they like, and we can likewise act on a portion of them to our liking. + +We know how much gas a tile had at the outset because of the archived moles list index. If we take more then we're owed in any shares before all other turfs have had their say, we could end up with negative moles. We expend a lot of effort to avoid this. + +The math for this looks like (totaldeltagas)/(neighborcount + 1) + +You may notice something like this in `process_cell()`. It's not quite the same though. + +Back in the old FEA days, neighbor count was hardcoded to 4 (Likely because this is what cell sharing on an infinite grid would look like). This means that turf A -> turf B is the same as turf B -> turf A, because they're each portioning up the gas in the same way. + +But when we moved to LINDA, we started using the length of our atmos_adjacent_turfs list (or an analog). +We need this so things like multiz can work, and so tiles in a corner share in a way that makes sense. + +Because of this, turf A -> turf B was no longer the same as turf B -> turf A, assuming one of those turfs had a different neighbor count, from I DON'T KNOW WALLS? + +The fix for this was to use our neighbor count when moving gas from our tile to someone else's, and use the sharer's neighbor count when taking from it. + +This makes sense intuitively if you think of it like portioning up a tile, but I've included a rundown to make +it a bit easier to prove to yourself. + +
+Take a look + +I have 10 +You have 20 +let's share +I've got 2 partners +you've got 3 partners +so you want to give me 1/4th of your gas +I want to give you 1/3rd of my gas + +the total gas diff between me and you is -10 +since it's negative you get to decide how to portion it +so the total amount to share is -2.5 +I end up with 12.5 +you end up with 17.5 + +again + +total diff is -5 +to share is 1.25 +I end up with 13.75 +you end up with 16.25 + +again + +total diff is -2.5 +to share is 0.3125 +I end up with 14.0625 +you end up with 15.9375 + +
+ +We need to do this because if the portions get mixed up, our archived gas list ends up lying about how much of each gas type we have available to share. +This can lead to negative moles, which the system is not prepared for. + +This is also why we queue space's sucking till the end of a tile's `process_cell()` btw, by that point we can ensure that no other tile will need to check for our mix, so we can freely violate our portioning. + + +### Active Turfs +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/FlowVisuals.png) + +*Figure 5.1: A visual of the algorithm `process_cell()` implements, ignoring our optimizations* + +Active turfs are the backbone of how gas moves from tile to tile. While most of `process_cell()` should be easy enough to understand, I am going to go into some detail about archiving, since I think it's a common source of hiccups. + +* *`archived_cycle`* this var stores the last cycle of the atmos loop that the turf processed on. The key point to notice here is that when processing a turf, we don't share with all its neighbors, we only talk to those who haven't processed yet. This is because the remainder of `process_cell()` and especially `share()` are like addition. We can add in any order we like, and we only need to add once. This is what archived gases are for by the way, they store the state of the relevant tile before any processing occurs. + +Alright then, with that out of the way, what is an active turf. + +This is actually the main success of LINDA, the math for gas movement is r4407 goon code or older, but that implementation (FEA) had a glaring issue. All turfs processed, or rather, all `/simulated` turfs processed. There was a separate type for `/unsimulated` turfs, but that was mostly used for things like centcom or space. Aside from that all the turfs that could in theory have gas on them needed to process each tick. `process_cell()` didn't quite look how it does now mind, but this was still a horrible state of affairs. + +The major difference between then and now is our turfs will stop processing. They sit idle most of the round, wake up when something changes around them, process until no major changes are happening, and then go to sleep. + +Active turfs also poke all the listening objects sitting on them, and start to process them so they can react to heat or gas changes. We do this so objects don't need to process when nothing has changed, but they also can operate through a turf sleeping. In essence this is like waking up things that ought to be listening to us. + +If we just used active turfs sleeping would be easy as pie, we could do it turf by turf. But we don't. + +### Excited Groups + +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/Unsettled.png) +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/Settled.png) + +*Figure 5.2.1-5.2.2: Settled VS Unsettled gases, this is what excited groups do* + +I didn't mention this above, but active turf processing, or really `share()`, has a fatal flaw. The amount of gas moved per tick goes down exponentially the further away a turf is from the source of changes, or diffs. + +With only active turfs breaches would never settle, and as soon as a tile becomes active it would never rest again. (This is one of the reasons I wrote this document by the way, excited groups nearly totally broke around about 2016, and none at the time noticed because the code was so twisted none knew how it ought to work, so it persisted for 4 years past that) + +So active turfs are bad at evening out diffs. What can we do to solve this? + +Enter the excited group. We hold a list of all the turfs that have talked to each other, then we keep track of how active those turfs are. When they start to wind down, we spread all the gas out evenly between them, and the group starts to spread again. They tend to fill the space given to them, so be careful with open plan stations. + +This is `self_breakdown()`, our equalization step. It cuts down on churn, and keeps things flowing smoothly. + +I've been talking kinda abstractly about turfs sleeping. That's because turfs on their own don't stop waiting to process once they have an excited group. Groups have secondary roles as the grim reaper of active turfs. When a group is totally inactive, and nothing whatsoever is going on, it will `dismantle()`, putting all of the turfs inside it to sleep, and killing itself. + +### A brief romp to talk about excited groups and LAST_SHARE_CHECK + +Excited groups can tell the amount of diff being shared by hooking into a value `share()` sets on gasmixes, the absolute amount of gas shared by each tile. The issue is this isn't pressure, it's molar count. So heat being shared in a sealed room causes excited groups to break down, then reform from sources. This isn't a major issue due to how breakdown evens things out, but it's worth knowing. + +### Back to the main thread + +Now this would all be fine, but as I'm sure you've noticed, there's a crouching pile of lag hiding here. What happens if the excited group has turfs with a fire on them over in cargo, but the flow of gas started in medical? There's no point processing the majority of the tiles, but we still want to keep the group alive for equalization. + +### Turfs can have a little nap + +Originally LINDA only had the above 2 constructions, but we ran into a problem when making planetary turfs. The old implementation was mutable, but shared with a copy of its initial mix each tick. This lead to problems. In essence, the groups never stopped spreading so long as a source of diffs existed. This is because the job of excited groups is to move the diffs from the source, to the edges of the group. But we put these mixes on huge open planets. Doesn't really work out so well. + +To combat this, a timer was added to each turf. It reset when a significant share was made, but otherwise if enough time passed the turf was forcibly removed from the active_turfs list. Unfortunately for us, this had unintended side effects. + +When a turf is removed from active, the excited group is broken down, as it's assumed that the proc will only be called when the landscape of the map itself has changed. You begin to see the issue. With large enough space, excited groups broke, totally. Constant rebuilds into dismantles, cycling forever. + +Now this issue here is we'd like to keep this napping, but we don't want to `garbage_collect()` the excited group constantly. + +So, a new proc was added, `sleep_active_turf()`. It removes the active turf from processing, but doesn't `garbage_collect()` the group. + +You'd think this would cause issues with maintaining the shape of an excited group, however this isn't actually a priority, since `garbage_collect()` and the subsequent rebuild in `process_cell()` causes turfs that are actually active to reform, just as it always has. This has benefits, as it lessens the tendency of one group to cover a huge space, equalize all at once, and fuck with things. + +There's another issue here however, how do we deal with things that react to heat? A firelock shouldn't just open because the turf that the alarm is on went to sleep. Thus, atom_process, as I mentioned before, a list of atoms with requirements and things to do. It processes them until their requirements are not met, then it removes them from its list them. + +There's one more major aspect of environmental atmos to cover, and while it's not the most misunderstood, it is the code with the worst set dressing. + +### Superconduction, or why var names really matter + +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/Superconduction.png) + +*Figure 5.3: The death of a pug, and a visual description of what superconduction does* + +Superconduction, an odd name really, it doesn't really describe much of anything aside from something to do with heat. It gets worse, trust me. + +Superconduction is the system that makes heat move through solid objects, so in theory walls, windows, airlocks, so on. This is another one that just broke one day, and none noticed cause none knew what it was meant to do. + +There's another issue with it, the var names don't mean what you think, and it is very old code, so it's hard to grasp. You can do it, you've made it this far. + +So then, what does superconduction do, and what do all these damn vars mean. + +### What does superconduction do? + +As I mentioned above, superconduction shares heat where heat can't normally travel. It does this by heating up the turf the heat is in, not the gasmix, the turf itself. This temperature is then shared with adjacent turfs, based on `thermal_conductivity`, a value between 0 and 1 that slows the heat share. Turfs also have a `heat_capacity`, which is how hard it is to heat, along with providing a threshold for the lowest temperature that can melt the turf. + +There's one more, and it's a doozy. `atmos_superconductivity` is a set of directions that we cannot share with. I know. It's set in can_atmos_pass(), a rather heady set of procs that build `atmos_adjacent_turfs`, and also modify `atmos_superconductivity`. + +So then, a review. + +* *`thermal_conductivity`* Ranges from 0 to 1, effects how easy it is for a turf to receive heat +* *`heat_capacity`* Large numbers mean it's harder to heat, but holds more heat. You get it. Also used for turf melting +* *`atmos_supeconductivity`* Bitfield of directions we **can't** share in, this is often set by firelocks and such + +One more thing, turfs will superconduct until they either run out of energy, or temperature. This is a stable system because turfs "conduct" with space, which is why floods of heat will equalize to about 690k over time. + +## 6. Processing time, Dynamic scaling, and what slows us down the most + +This will require/impart a light understanding of the master controller, I will go over what makes the atmos subsystem slow, what can be done, and what it effects. + +First, some new vocab. + +* *`wait`* Subsystem var, it is the amount of time to "wait" between each fire, or process. Measured in deciseconds. +* *`MC_TICK_CHECK`* A define that checks to see if the subsystem has taken more then it's allotted time. In the case of SSAir we use it to allow for dynamic scaling + +The MC entry for SSAir is very helpful for debugging, and it is good to understand before I talk about cost. + +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/SSAirAtRest.png) + +*Figure 6.1: SSAir sitting doing little to nothing turf wise, only processing pipenets and atmos machines* + +As you can see here, SSAir is a bit of a jumble, don't worry, it'll make sense in a second. The first line is in this order: cost, tick_usage, tick_overrun, ticks. +All of these are averages by the way. + +* *`cost`* Cost is the raw time spent running the subsystem in milliseconds +* *`tick_usage`* The percent of each byond tick the last fire() took. Tends to be twice cost, good for comparing with overrun. +* *`tick_overrun`* A percentage of how far past our allotted time we ran. This is what causes Time Dilation, it's bad. +* *`ticks`* The amount of subsystem fires it takes to run through all the subprocesses once. + +The second line is the cost each subprocess contributed per full cycle, this is a rolling average. It'll give you a good feel for what is misbehaving. (The only exception to this is pipenet rebuilds, the last entry. Because of its nature as something that can happen at any time, it doesn't have a rolling average, instead it just displays the time it used last process) + +The third line is the amount of "whatever" in each subprocess. Handy for noticing dupe bugs and crying at active turf cost. Speaking of, the last entry is the active turfs per overall cost. Not a great metric, but larger is better. + +Now then, what the hell is going on in that image. + +### Dynamic scaling + +SSAir has a wait of 5 deciseconds, or 500ms. This means it wants to fire roughly twice a second. You'll see in a moment why this hardly ever happens. + +See that image from before? Notice how the cost of SSAir at rest is about 40ms? yeahhhhh. + +The atmos subsystem was used as a testing ground for the robustness of the master-controller. It used to have a wait of 2 seconds, but that was lowered to 0.5 as it was thought that the system could handle it. It can! But this can have annoying side effects. As you know, we edge right up against 1/10th of the wait when sitting at rest, and if we start to make diffs... + +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/GasTypes.png) + +*Figure 6.2: SSAir when a high amount of active turfs are operating, with a large selection of gastypes for each tile* + +As you can see, active turfs can be really slow. Oh but it gets so much worse. + +Active turf cost is mostly held up in `react()`, `share()` and `compare()`. `react()` and `share()` scale directly with the amount of gas in the air. `compare()` does better, but none of them do that great. + +For this reason, and because excited groups spread gas out so much, we want to keep the variation of gastypes in the air relatively low. + +react() is called for every active turf, and every pipenet. On each react call for reasons I don't want to go into right now, we need to iterate over every reaction and do a preliminary test. Therefor, the more datum reactions we have, the slower those two processes go. + +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/LargeExcitedGroup.png) + +*Figure 6.3: The effects of a large excited group on overtime* + +It's hard to tell here because I took the picture right as it happen, but when large excited groups go through `self_breakdown()` they can overtime by a significant deal. This is because `self_breakdown()` can't be delayed, or done in two parts. We can't let an older gasmix that's already been collected have say 1000 mols of plasma added, then go into breakdown and delete it all. Thus, the overtime cost. This was with a excited group 900 tiles large though, so it isn't nearly ever this bad. It also scales with the amount of gases in the same way that `share()` does. + +On the whole excited groups are the only major source of overrun, consider this a treatise on why that 900ms cost number next to atmos isn't making the server die. It's really that excited group mass equalizing constantly. + +## 7. What we want atmos code to be + +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/DiffsSettling.png) + +*Figure 7.1: Diffs settling out as they should, around their sources* + +Our goal is not to simulate real life atmospherics. It is instead to put on a show of doing so. To sleep wherever we can, and fake it as hard as possible. + +This is matters the most with environmental stuff, but it's everywhere you look. + +The goal of active turfs, excited groups, and sleeping is to isolate the processing that needs to happen, and move diffs from their source to a consumer as much as we can. We don't simulate every tile, and most of the changes to LINDA have been directed at simulating as little as we can get away with. + +Hell, space being cold is a hack we use to make gameplay interesting. There's a lot more stuff like this, because this isn't a simulator, it's a theater production. + +Performance and gameplay are much more important then realism. In all your work on the subsystem, keep this in mind, and you'll build fast and quality code. + +## 8. Pipelines and pipeline machinery + +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/PipelineVisuals.png) + +*Figure 8.1: The structure of pipelines shown in color, components are a mix* + +`/datum/pipeline` handles the simulation of piping and such. It has 2 main actions, one of which you should know very well. The other is slightly more of a hurdle. + +To understand pipelines you'll first need to understand how we process things like pumps or vents, atmos components that is. +To start with, a set of pipes is treated as one gas mixture, however several different components draw from this mix. Think pumps, heaters, mixers, vents, etc. + +Since these components change the mix itself, we can't just let them all act on the mix at once, because that would cause concerns around the order in which things process, and so on. +We don't want canisters that blow up half the time, and the other half of the time don't. Better then to give each component its own gas mix that it alone can act on, that will be shared with the pipeline as a whole. Pipelines do something similar to active turfs by the way, they won't re-equalize their mix if nothing about the state of things has changed. + +We do this sharing based on the proportion of volume between all the components. So if you want a component to consume more gas, give it a higher volume. + +On that note, I'd like to be clear about something. In lines of connected pipes, each pipe doesn't have its own gasmix, they instead share mixes, as the pipes themselves won't have any effect on the state of the mix. + +Oh, and pipelines react the gas mixture inside them, thought I should mention that. + +### A short note on rebuilding + +Everything that needs a pipeline should have it before it's allowed to do any processing. This is to prevent runtimes and shitcode related things. + +The act of rebuilding a pipeline is quite expensive however, since it involves iterating over all the connected pipes/components. +That's why we go to such great pains to make sure no large amount of work is allowed to happen at once. It's in an attempt to avoid the excited group settling type of lag I discussed above. It's ok for atmos to lock up for a short period if the system isn't killing the game as a whole. + + +All the other behavior of pipes and pipe components are handled by atmos machinery. I'll give a brief rundown of how they're classified, but the details of each machine are left as an exercise to the reader. + + +#### Pipes + +The raw pipes. They have some amount of nuance, mostly around layers, but it's not too tricky to deal with. + +##### Heat Exchange + +The HE pipes, used to transfer heat from the pipe to the turf it's sitting on. These work directly with the pipeline's mix, which is ehhhh? Might need some touching up, perhaps making them subnets that do one heat transfer. Not too big a deal in any case, since they're the only thing that acts directly on a pipeline mix. They have some other behavior, like glowing when hot, but it's minor. + +#### Components + +These are the components I described above, they have some sort of internal gas mix that they act on in some manner. + +The following classifications are very simple, but I'll run them over anyhow + +##### Unary + +Unary devices can only interact with one pipeline, aside from some exceptions, like the heat exchanger. The type path comes from the amount of pipelines a device expects gas-mixtures from. I'm sure you can see where this is going. + +##### Binary + +Binary devices connect to 2 pipelines. + +##### Trinary + +Trinary devices connect to 3 p- Listen you get it already. + +##### Fusion + +Finally something more interesting. Unfortunately I'm not familiar with the inner workings of this machine, but this folder deals with hypertorus code. + +#### Other + +This is for the oddballs, the one offs, the half useless things. Things that are tied to the module, but that we don't have a better spot for. Think meters, stuff like that. + +#### Portable + +These are the atmos machines you can move around. They interface with connectors to talk to pipelines, and can contain tanks. Not a whole lot more to discuss here. + +## 9. A word on processing + +You may have noticed that a large portion of the optimizations we do are focused around not checking to see if we need to do work. + +This is essentially what active turfs are built around, and it's a somewhat unfinished project. There's still quite a few things in atmos, mostly machinery, that check each fire to see if they should be doing work. There's a general pattern to solving this sort of thing by the way, centralize the ways a bit of outside code can interact with a "thing", and then when the outside code does something that might warrant processing, start processing. + +This attitude needs to be applied to a few large targets, and you may see it crop up when reading through the code. Keep this in mind, and make sure to respect the rules that describe how to work with the object, or things will go to shit. + +## Appendix A - Glossary + +* *LINDA* - Our environmental gas system, created by Aranclanos, Beautiful in Spanish +* *Naps* - A healthy pastime +* *Gas mixtures* - The datums that store gas information, key to listmos and our underlying method of handling well gas +* *Diffs* - The differences between gasmixes. We want to get rid of these over time, and clump them up with their sources so we don't need to process too many turfs +* *FEA* - Finite Element Analysis, the underlying system our atmos is built on top of. Ugly in Spanish +* *Pipelines* - The datum that represents and handles the gasmixtures of a set of pipes and their components +* *Components* - Atmos machines that act on pipelines, modifying their mix +* *Active Turfs* - An optimization of FEA implemented in LINDA that causes processing to only occur when differences are equalizing +* *Excited Groups* - Evens out groups of active turfs to compensate for the way `share()` works +* *Carbon dioxide* - What the fuck is this?] +* *MC* - The master controller, makes sure all subsystems get the time they need to process, prevents lockups from one subsystem having a lot of work + +## Appendix B - How to test environmental atmos +If you really want to get a feeling for how flow works you'll need to load up the game and make some diffs. What follows is a short description of how to set up testing. + +To start with, you should enable the `TESTING` define in compile_options.dm, this toggles `VISUALIZE_ACTIVE_TURFS` and `TRACK_MAX_SHARE`. These two debug methods are very helpful for understanding flow, but they aren't cheap, so we make them a compile time option. Active turfs will show up as green, don't worry about the second define, it's coming right up. + +Past that you'll want to turn on excited group highlighting, to do this open the atmos control panel in the debug tab and toggle both personal view and display all. Display all makes turfs display their group and personal view shows/hides the groups from you, it's faster to toggle this, and this way you don't piss off the other debuggers on live. + +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/AtmosControlPanel.png) + +*Figure B.1: The atmospherics control panel* + +To go into more detail about the control panel, it is split into two parts. At the top there's a readout of some relevant stats, the amount of active turfs, how many times the subsystem has fired, etc. You can get the same information from the SSAir MC entry, but it's a bit harder to read. I detail this in the section on performance in environmental atmos. There's a button that turns the subsystem on/off in the top left, it's handy for debugging and seeing how things work step by step. Use it if you need to slow things down. + +The rest of the panel is where things get more interesting, it's a readout of excited groups, sorted by area name. Most of it ought to be obvious, this is where `TRACK_MAX_SHARE` comes into effect. If it's defined, excited groups will have an extra entry which displays the largest molar diff in the group. This is useful for diagnosing group breakdown issues, and getting a feel for when a group will next breakdown. You can also toggle the visibility of each individual group here, and teleport to the group by clicking on the area name. + +### What to look for + +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/StartingOut.png) + +An excited group can contain 2 things, sources of diffs, and dead tiles. + +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/MovingForward.png) + +Of course, if left unchecked active turfs will spread further and further out, slowly lowering the amount of dead tiles. + +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/SleepWorking.png) + +Excited group breakdown causes them to recede and wrap around the things causing them + +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/CleanupTroubles.png) + +Cleanup causes a major recession due to turfs becoming suddenly no longer having an excited group + +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/StrangeGrowth.png) +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/OddGrowth%2BMonkey.png) + +Due to how process_cell() works, active turfs will spread strangely when low on diffs + +![](https://raw.githubusercontent.com/LemonInTheDark/documentation-assets/atmos-pics/atmos/Flickering.png) + +They will also occasionally nap, then immediately wake back up. This is either because of a discrepancy between `compare()` and `LAST_SHARE_CHECK`, or just the result of sleeping being a thing. diff --git a/code/modules/atmospherics/auxgm/gas_types.dm b/code/modules/atmospherics/auxgm/gas_types.dm deleted file mode 100644 index a5e7c8ec7a73a..0000000000000 --- a/code/modules/atmospherics/auxgm/gas_types.dm +++ /dev/null @@ -1,128 +0,0 @@ -/datum/gas/oxygen - id = GAS_O2 - specific_heat = 20 - name = "Oxygen" - oxidation_temperature = T0C - 100 // it checks max of this and fire temperature, so rarely will things spontaneously combust - -/datum/gas/nitrogen - id = GAS_N2 - specific_heat = 20 - breath_alert_info = list( - not_enough_alert = list( - alert_category = "not_enough_nitro", - alert_type = /atom/movable/screen/alert/not_enough_nitro - ), - too_much_alert = list( - alert_category = "too_much_nitro", - alert_type = /atom/movable/screen/alert/too_much_nitro - ) - ) - name = "Nitrogen" - -/datum/gas/carbon_dioxide //what the fuck is this? - id = GAS_CO2 - specific_heat = 30 - name = "Carbon Dioxide" - breath_results = GAS_O2 - breath_alert_info = list( - not_enough_alert = list( - alert_category = "not_enough_co2", - alert_type = /atom/movable/screen/alert/not_enough_co2 - ), - too_much_alert = list( - alert_category = "too_much_co2", - alert_type = /atom/movable/screen/alert/too_much_co2 - ) - ) - fusion_power = 3 - enthalpy = -393500 - -/datum/gas/plasma - id = GAS_PLASMA - specific_heat = 200 - name = "Plasma" - gas_overlay = "plasma" - moles_visible = MOLES_GAS_VISIBLE - flags = GAS_FLAG_DANGEROUS - // no fire info cause it has its own bespoke reaction for trit generation reasons - enthalpy = FIRE_PLASMA_ENERGY_RELEASED // 3000000, 3 megajoules, 3000 kj - -/datum/gas/water_vapor - id = GAS_H2O - specific_heat = 40 - name = "Water Vapor" - gas_overlay = "water_vapor" - moles_visible = MOLES_GAS_VISIBLE - fusion_power = 8 - breath_reagent = /datum/reagent/water - enthalpy = -241800 // FIRE_HYDROGEN_ENERGY_RELEASED is actually what this was supposed to be - -/datum/gas/hypernoblium - id = GAS_HYPERNOB - specific_heat = 2000 - name = "Hyper-noblium" - gas_overlay = "freon" - moles_visible = MOLES_GAS_VISIBLE - -/datum/gas/nitrous_oxide - id = GAS_NITROUS - specific_heat = 40 - name = "Nitrous Oxide" - gas_overlay = "nitrous_oxide" - moles_visible = MOLES_GAS_VISIBLE * 2 - flags = GAS_FLAG_DANGEROUS - fire_products = list(GAS_N2 = 1) - oxidation_rate = 0.5 - oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST + 100 - enthalpy = 81600 - -/datum/gas/nitryl - id = GAS_NITRYL - specific_heat = 20 - name = "Nitryl" - gas_overlay = "nitryl" - moles_visible = MOLES_GAS_VISIBLE - flags = GAS_FLAG_DANGEROUS - fusion_power = 15 - fire_products = list(GAS_N2 = 0.5) - oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50 - enthalpy = 33200 - -/datum/gas/tritium - id = GAS_TRITIUM - specific_heat = 10 - name = "Tritium" - gas_overlay = "tritium" - moles_visible = MOLES_GAS_VISIBLE - flags = GAS_FLAG_DANGEROUS - fusion_power = 1 - /* - these are for when we add hydrogen, trit gets to keep its hardcoded fire for legacy reasons - fire_provides = list(GAS_H2O = 2) - fire_burn_rate = 2 - enthalpy = FIRE_HYDROGEN_ENERGY_RELEASED - fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50 - */ - -/datum/gas/bz - id = GAS_BZ - specific_heat = 20 - name = "BZ" - flags = GAS_FLAG_DANGEROUS - fusion_power = 8 - enthalpy = FIRE_CARBON_ENERGY_RELEASED // it is a mystery - -/datum/gas/stimulum - id = GAS_STIMULUM - specific_heat = 5 - name = "Stimulum" - fusion_power = 7 - -/datum/gas/pluoxium - id = GAS_PLUOXIUM - specific_heat = 80 - name = "Pluoxium" - fusion_power = 10 - oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST * 1000 // it is VERY stable - oxidation_rate = 8 - enthalpy = -50000 // but it reduces the heat output a bit diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index 8dd811cc64e8f..ba58e4a7c70c0 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -8,26 +8,47 @@ /turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) return +/** + * Handles the creation of hotspots and initial activation of turfs. + * Setting the conditions for the reaction to actually happen for gasmixtures + * is handled by the hotspot itself, specifically perform_exposure(). + */ /turf/open/hotspot_expose(exposed_temperature, exposed_volume, soh) - if(!air) + //If the air doesn't exist we just return false + var/list/air_gases = air?.gases + if(!air_gases) return - if (air.get_oxidation_power(exposed_temperature) < 0.5) + . = air_gases[/datum/gas/oxygen] + var/oxy = . ? .[MOLES] : 0 + if (oxy < 0.5) return - var/has_fuel = air.get_moles(GAS_PLASMA) > 0.5 || air.get_moles(GAS_TRITIUM) > 0.5 || air.get_fuel_amount(exposed_temperature) > 0.5 + . = air_gases[/datum/gas/plasma] + var/tox = . ? .[MOLES] : 0 + . = air_gases[/datum/gas/tritium] + var/trit = . ? .[MOLES] : 0 if(active_hotspot) if(soh) - if(has_fuel) + if(tox > 0.5 || trit > 0.5) if(active_hotspot.temperature < exposed_temperature) active_hotspot.temperature = exposed_temperature if(active_hotspot.volume < exposed_volume) active_hotspot.volume = exposed_volume return - if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && has_fuel) + if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && (tox > 0.5 || trit > 0.5 )) + active_hotspot = new /obj/effect/hotspot(src, exposed_volume*25, exposed_temperature) -//This is the icon for fire on turfs, also helps for nurturing small fires until they are full tile + active_hotspot.just_spawned = (current_cycle < SSair.times_fired) + //remove just_spawned protection if no longer processing this cell + SSair.add_to_active(src) + + +/** + * Hotspot objects interfaces with the temperature of turf gasmixtures while also providing visual effects. + * One important thing to note about hotspots are that they can roughly be divided into two categories based on the bypassing variable. + */ /obj/effect/hotspot anchored = TRUE mouse_opacity = MOUSE_OPACITY_TRANSPARENT @@ -37,15 +58,22 @@ blend_mode = BLEND_ADD light_system = MOVABLE_LIGHT light_range = LIGHT_RANGE_FIRE - // increase power for more bloom - light_power = 4 + light_power = 1 light_color = LIGHT_COLOR_FIRE + /** + * Volume is the representation of how big and healthy a fire is. + * Hotspot volume will be divided by turf volume to get the ratio for temperature setting on non bypassing mode. + * Also some visual stuffs for fainter fires. + */ var/volume = 125 + /// Temperature handles the initial ignition and the colouring. var/temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST + /// Whether the hotspot is new or not. Used for bypass logic. + var/just_spawned = TRUE + /// Whether the hotspot becomes passive and follows the gasmix temp instead of changing it. var/bypassing = FALSE var/visual_update_tick = 0 - var/first_cycle = TRUE CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/hotspot) @@ -59,12 +87,21 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/hotspot) temperature = starting_temperature perform_exposure() setDir(pick(GLOB.cardinals)) - air_update_turf() - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - + air_update_turf(FALSE, FALSE) + +/** + * Perform interactions between the hotspot and the gasmixture. + * + * For the first tick, hotspots will take a sample of the air in the turf, + * set the temperature equal to a certain amount, and then reacts it. + * In some implementations the ratio comes out to around 1, so all of the air in the turf. + * + * Afterwards if the reaction is big enough it mostly just tags along the fire, + * copying the temperature and handling the colouring. + * If the reaction is too small it will perform like the first tick. + * + * Also calls fire_act() which handles burning. + */ /obj/effect/hotspot/proc/perform_exposure() var/turf/open/location = loc if(!istype(location) || !(location.air)) @@ -72,28 +109,30 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/hotspot) location.active_hotspot = src - bypassing = !first_cycle && volume > CELL_VOLUME*0.95 || location.air.return_temperature() > FUSION_TEMPERATURE_THRESHOLD - if(first_cycle) - first_cycle = FALSE + bypassing = !just_spawned && (volume > CELL_VOLUME*0.95) + //Passive mode if(bypassing) volume = location.air.reaction_results["fire"]*FIRE_GROWTH_RATE - temperature = location.air.return_temperature() + temperature = location.air.temperature + //Active mode else - var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.return_volume()) + var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.volume) if(affected) //in case volume is 0 - affected.set_temperature(temperature) + affected.temperature = temperature affected.react(src) - temperature = affected.return_temperature() + temperature = affected.temperature volume = affected.reaction_results["fire"]*FIRE_GROWTH_RATE location.assume_air(affected) + // Handles the burning of atoms. for(var/A in location) var/atom/AT = A - if(!QDELETED(AT) && AT != src) // It's possible that the item is deleted in temperature_expose + if(!QDELETED(AT) && AT != src) AT.fire_act(temperature, volume) return +/// Mathematics to be used for color calculation. /obj/effect/hotspot/proc/gauss_lerp(x, x1, x2) var/b = (x1 + x2) * 0.5 var/c = (x2 - x1) / 6 @@ -115,22 +154,18 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/hotspot) heat_b = LERP(heat_b,255,normal_amt) heat_a -= gauss_lerp(temperature, -5000, 5000) * 128 greyscale_fire -= normal_amt - light_power = 4 if(temperature > 40000) //Past this temperature the fire will gradually turn a bright purple var/purple_amt = temperature < LERP(40000,200000,0.5) ? gauss_lerp(temperature, 40000, 200000) : 1 heat_r = LERP(heat_r,255,purple_amt) - light_power = 5 if(temperature > 200000 && temperature < 500000) //Somewhere at this temperature nitryl happens. var/sparkle_amt = gauss_lerp(temperature, 200000, 500000) var/mutable_appearance/sparkle_overlay = mutable_appearance('icons/effects/effects.dmi', "shieldsparkles") sparkle_overlay.blend_mode = BLEND_ADD sparkle_overlay.alpha = sparkle_amt * 255 - light_power = 6 add_overlay(sparkle_overlay) if(temperature > 400000 && temperature < 1500000) //Lightning because very anime. var/mutable_appearance/lightning_overlay = mutable_appearance(icon, "overcharged") lightning_overlay.blend_mode = BLEND_ADD - light_power = 6 add_overlay(lightning_overlay) if(temperature > 4500000) //This is where noblium happens. Some fusion-y effects. var/fusion_amt = temperature < LERP(4500000,12000000,0.5) ? gauss_lerp(temperature, 4500000, 12000000) : 1 @@ -146,7 +181,6 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/hotspot) heat_b = LERP(heat_b,150,fusion_amt) add_overlay(fusion_overlay) add_overlay(rainbow_overlay) - light_power = 8 set_light_color(rgb(LERP(250, heat_r, greyscale_fire), LERP(160, heat_g, greyscale_fire), LERP(25, heat_b, greyscale_fire))) @@ -157,19 +191,34 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/hotspot) color = list(LERP(0.3, 1, 1-greyscale_fire) * heat_r,0.3 * heat_g * greyscale_fire,0.3 * heat_b * greyscale_fire, 0.59 * heat_r * greyscale_fire,LERP(0.59, 1, 1-greyscale_fire) * heat_g,0.59 * heat_b * greyscale_fire, 0.11 * heat_r * greyscale_fire,0.11 * heat_g * greyscale_fire,LERP(0.11, 1, 1-greyscale_fire) * heat_b, 0,0,0) alpha = heat_a -#define INSUFFICIENT(path) (location.air.get_moles(path) < 0.5) +#define INSUFFICIENT(path) (!location.air.gases[path] || location.air.gases[path][MOLES] < 0.5) + +/** + * Regular process proc for hotspots governed by the controller. + * Handles the calling of perform_exposure() which handles the bulk of temperature processing. + * Burning or fire_act() are also called by perform_exposure(). + * Also handles the dying and qdeletion of the hotspot and hotspot creations on adjacent cardinal turfs. + * And some visual stuffs too! Colors and fainter icons for specific conditions. + */ /obj/effect/hotspot/process() + if(just_spawned) + just_spawned = FALSE + return + var/turf/open/location = loc if(!istype(location)) qdel(src) return - location.eg_reset_cooldowns() + if(location.excited_group) + location.excited_group.reset_cooldowns() if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1)) qdel(src) return - if(!location.air || location.air.get_oxidation_power() < 0.5 || (INSUFFICIENT(GAS_PLASMA) && INSUFFICIENT(GAS_TRITIUM) && location.air.get_fuel_amount() < 0.5)) + + //Not enough / nothing to burn + if(!location.air || (INSUFFICIENT(/datum/gas/plasma) && INSUFFICIENT(/datum/gas/tritium)) || INSUFFICIENT(/datum/gas/oxygen)) qdel(src) return @@ -179,9 +228,9 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/hotspot) icon_state = "3" location.burn_tile() - //Possible spread due to radiated heat - if(location.air.return_temperature() > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD) - var/radiated_temperature = location.air.return_temperature()*FIRE_SPREAD_RADIOSITY_SCALE + //Possible spread due to radiated heat. + if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD) + var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE for(var/t in location.atmos_adjacent_turfs) var/turf/open/T = t if(!T.active_hotspot) @@ -196,11 +245,6 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/hotspot) if((visual_update_tick++ % 7) == 0) update_color() - if(temperature > location.max_fire_temperature_sustained) - location.max_fire_temperature_sustained = temperature - - if(location.heat_capacity && temperature > location.heat_capacity) - location.to_be_destroyed = TRUE return TRUE /obj/effect/hotspot/Destroy() @@ -208,27 +252,10 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/hotspot) var/turf/open/T = loc if(istype(T) && T.active_hotspot == src) T.active_hotspot = null - DestroyTurf() return ..() -/obj/effect/hotspot/proc/DestroyTurf() - if(isturf(loc)) - var/turf/T = loc - if(T.to_be_destroyed && !T.changing_turf) - var/chance_of_deletion - if (T.heat_capacity) //beware of division by zero - chance_of_deletion = T.max_fire_temperature_sustained / T.heat_capacity * 8 //there is no problem with prob(23456), min() was redundant --rastaf0 - else - chance_of_deletion = 100 - if(prob(chance_of_deletion)) - T.Melt() - else - T.to_be_destroyed = FALSE - T.max_fire_temperature_sustained = 0 - /obj/effect/hotspot/proc/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) SIGNAL_HANDLER - if(isliving(arrived)) var/mob/living/immolated = arrived immolated.fire_act(temperature, volume) diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index 0e8fbf2666760..30e97e4ba7d26 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -1,69 +1,97 @@ -/atom/var/CanAtmosPass = ATMOS_PASS_YES -/atom/var/CanAtmosPassVertical = ATMOS_PASS_YES +/atom + ///Check if atmos can pass in this atom (ATMOS_PASS_YES, ATMOS_PASS_NO, ATMOS_PASS_DENSITY, ATMOS_PASS_PROC) + var/can_atmos_pass = ATMOS_PASS_YES -/atom/proc/CanAtmosPass(turf/T) - switch (CanAtmosPass) +/atom/proc/can_atmos_pass(turf/target_turf, vertical = FALSE) + switch (can_atmos_pass) if (ATMOS_PASS_PROC) return ATMOS_PASS_YES if (ATMOS_PASS_DENSITY) return !density else - return CanAtmosPass - -/turf/CanAtmosPass = ATMOS_PASS_NO -/turf/CanAtmosPassVertical = ATMOS_PASS_NO - -/turf/open/CanAtmosPass = ATMOS_PASS_PROC -/turf/open/CanAtmosPassVertical = ATMOS_PASS_PROC - -/turf/open/CanAtmosPass(turf/T, vertical = FALSE) - var/dir = vertical ? get_dir_multiz(src, T) : get_dir(src, T) - var/opp = REVERSE_DIR(dir) - . = TRUE - if(vertical && !(zAirOut(dir, T) && T.zAirIn(dir, src))) - . = FALSE - if(isclosedturf(src) || isclosedturf(T)) - . = FALSE - if (T == src) - return . - for(var/obj/O in contents+T.contents) - var/turf/other = (O.loc == src ? T : src) - if(!(vertical? (CANVERTICALATMOSPASS(O, other)) : (CANATMOSPASS(O, other)))) - . = FALSE - if(O.BlockThermalConductivity()) //the direction and open/closed are already checked on CanAtmosPass() so there are no arguments - conductivity_blocked_directions |= dir - T.conductivity_blocked_directions |= opp - if(!.) - return . - -/atom/movable/proc/BlockThermalConductivity() // Objects that don't let heat through. + return can_atmos_pass + +/turf + can_atmos_pass = ATMOS_PASS_NO + +/turf/open + can_atmos_pass = ATMOS_PASS_PROC + +///Do NOT use this to see if 2 turfs are connected, it mutates state, and we cache that info anyhow. +///Use TURFS_CAN_SHARE or TURF_SHARES depending on your usecase +/turf/open/can_atmos_pass(turf/target_turf, vertical = FALSE) + var/can_pass = TRUE + var/direction = vertical ? get_dir_multiz(src, target_turf) : get_dir(src, target_turf) + var/opposite_direction = REVERSE_DIR(direction) + if(vertical && !(zAirOut(direction, target_turf) && target_turf.zAirIn(direction, src))) + can_pass = FALSE + if(blocks_air || target_turf.blocks_air) + can_pass = FALSE + //This path is a bit weird, if we're just checking with ourselves no sense asking objects on the turf + if (target_turf == src) + return can_pass + + //Can't just return if canpass is false here, we need to set superconductivity + for(var/obj/checked_object in contents + target_turf.contents) + var/turf/other = (checked_object.loc == src ? target_turf : src) + if(CANATMOSPASS(checked_object, other, vertical)) + continue + can_pass = FALSE + //the direction and open/closed are already checked on can_atmos_pass() so there are no arguments + if(checked_object.block_superconductivity()) + atmos_supeconductivity |= direction + target_turf.atmos_supeconductivity |= opposite_direction + return FALSE //no need to keep going, we got all we asked (Is this even faster? fuck you it's soul) + + //Superconductivity is a bitfield of directions we can't conduct with + //Yes this is really weird. Fuck you + atmos_supeconductivity &= ~direction + target_turf.atmos_supeconductivity &= ~opposite_direction + + return can_pass + +/atom/movable/proc/block_superconductivity() // objects that block air and don't let superconductivity act. Only firelocks atm. return FALSE -/turf/proc/ImmediateCalculateAdjacentTurfs() - if(SSair.thread_running()) - CALCULATE_ADJACENT_TURFS(src) - return +/// This proc is a more deeply optimized version of immediate_calculate_adjacent_turfs +/// It contains dumbshit, and also stuff I just can't do at runtime +/// If you're not editing behavior, just read that proc. It's less bad +/turf/proc/init_immediate_calculate_adjacent_turfs() + //Basic optimization, if we can't share why bother asking other people ya feel? + // You know it's gonna be stupid when they include a unit test in the atmos code + // Yes, inlining the string concat does save 0.1 seconds + #ifdef UNIT_TESTS + ASSERT(UP == 16) + ASSERT(DOWN == 32) + #endif LAZYINITLIST(src.atmos_adjacent_turfs) - var/is_closed = isclosedturf(src) var/list/atmos_adjacent_turfs = src.atmos_adjacent_turfs - var/canpass = CANATMOSPASS(src, src) - var/canvpass = CANVERTICALATMOSPASS(src, src) + var/canpass = CANATMOSPASS(src, src, FALSE) // I am essentially inlineing two get_dir_multizs here, because they're way too slow on their own. I'm sorry brother var/list/z_traits = SSmapping.multiz_levels[z] for(var/direction in GLOB.cardinals_multiz) // Yes this is a reimplementation of get_step_mutliz. It's faster tho. fuck you + // Oh also yes UP and DOWN do just point to +1 and -1 and not z offsets + // Multiz is shitcode welcome home var/turf/current_turf = (direction & (UP|DOWN)) ? \ (direction & UP) ? \ - (z_traits[Z_LEVEL_UP]) ? \ + (z_traits["16"]) ? \ (get_step(locate(x, y, z + 1), NONE)) : \ (null) : \ - (z_traits[Z_LEVEL_DOWN]) ? \ + (z_traits["32"]) ? \ (get_step(locate(x, y, z - 1), NONE)) : \ (null) : \ (get_step(src, direction)) - if(!isopenturf(current_turf)) + if(!isopenturf(current_turf)) // not interested in you brother continue - if(!is_closed && ((direction & (UP|DOWN)) ? (canvpass && CANVERTICALATMOSPASS(current_turf, src)) : (canpass && CANATMOSPASS(current_turf, src)))) + // The assumption is that ONLY DURING INIT if two tiles have the same cycle, there's no way canpass(a->b) will be different then canpass(b->a), so this is faster + // Saves like 1.2 seconds + if(current_turf.current_cycle >= current_cycle) + continue + + //Can you and me form a deeper relationship, or is this just a passing wind + // (direction & (UP | DOWN)) is just "is this vertical" by the by + if(canpass && CANATMOSPASS(current_turf, src, (direction & (UP|DOWN))) && !(blocks_air || current_turf.blocks_air)) LAZYINITLIST(current_turf.atmos_adjacent_turfs) atmos_adjacent_turfs[current_turf] = TRUE current_turf.atmos_adjacent_turfs[src] = TRUE @@ -72,48 +100,42 @@ if (current_turf.atmos_adjacent_turfs) current_turf.atmos_adjacent_turfs -= src UNSETEMPTY(current_turf.atmos_adjacent_turfs) - current_turf.set_sleeping(isclosedturf(current_turf)) - current_turf.__update_auxtools_turf_adjacency_info() + SEND_SIGNAL(current_turf, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS) + UNSETEMPTY(atmos_adjacent_turfs) src.atmos_adjacent_turfs = atmos_adjacent_turfs - set_sleeping(is_closed) - __update_auxtools_turf_adjacency_info() + SEND_SIGNAL(src, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS) -/turf/proc/ImmediateDisableAdjacency(disable_adjacent = TRUE) - if(SSair.thread_running()) - SSadjacent_air.disable_queue[src] = disable_adjacent - return - if(disable_adjacent) - // I am essentially inlineing two get_dir_multizs here, because they're way too slow on their own. I'm sorry brother - var/list/z_traits = SSmapping.multiz_levels[z] - for(var/direction in GLOB.cardinals_multiz) - // Yes this is a reimplementation of get_step_mutliz. It's faster tho. - var/turf/current_turf = (direction & (UP|DOWN)) ? \ - (direction & UP) ? \ - (z_traits[Z_LEVEL_UP]) ? \ - (get_step(locate(x, y, z + 1), NONE)) : \ - (null) : \ - (z_traits[Z_LEVEL_DOWN]) ? \ - (get_step(locate(x, y, z - 1), NONE)) : \ - (null) : \ - (get_step(src, direction)) - if(!istype(current_turf)) - continue +/turf/proc/immediate_calculate_adjacent_turfs() + LAZYINITLIST(src.atmos_adjacent_turfs) + var/list/atmos_adjacent_turfs = src.atmos_adjacent_turfs + var/canpass = CANATMOSPASS(src, src, FALSE) + for(var/direction in GLOB.cardinals_multiz) + var/turf/current_turf = get_step_multiz(src, direction) + if(!isopenturf(current_turf)) // not interested in you brother + continue + + //Can you and me form a deeper relationship, or is this just a passing wind + // (direction & (UP | DOWN)) is just "is this vertical" by the by + if(canpass && CANATMOSPASS(current_turf, src, (direction & (UP|DOWN))) && !(blocks_air || current_turf.blocks_air)) + LAZYINITLIST(current_turf.atmos_adjacent_turfs) + atmos_adjacent_turfs[current_turf] = TRUE + current_turf.atmos_adjacent_turfs[src] = TRUE + else + atmos_adjacent_turfs -= current_turf if (current_turf.atmos_adjacent_turfs) current_turf.atmos_adjacent_turfs -= src UNSETEMPTY(current_turf.atmos_adjacent_turfs) - current_turf.__update_auxtools_turf_adjacency_info() - LAZYCLEARLIST(atmos_adjacent_turfs) - __update_auxtools_turf_adjacency_info() + SEND_SIGNAL(current_turf, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS) -/turf/proc/set_sleeping(should_sleep) + UNSETEMPTY(atmos_adjacent_turfs) + src.atmos_adjacent_turfs = atmos_adjacent_turfs -/turf/proc/__update_auxtools_turf_adjacency_info() //returns a list of adjacent turfs that can share air with this one. //alldir includes adjacent diagonal tiles that can share // air with both of the related adjacent cardinal tiles -/turf/proc/GetAtmosAdjacentTurfs(alldir = 0) +/turf/proc/get_atmos_adjacent_turfs(alldir = 0) var/adjacent_turfs if (atmos_adjacent_turfs) adjacent_turfs = atmos_adjacent_turfs.Copy() @@ -123,61 +145,79 @@ if (!alldir) return adjacent_turfs - var/turf/curloc = src + var/turf/current_location = src for (var/direction in GLOB.diagonals_multiz) - var/matchingDirections = 0 - var/turf/S = get_step_multiz(curloc, direction) - if(!S) + var/matching_directions = 0 + var/turf/checked_turf = get_step_multiz(current_location, direction) + if(!checked_turf) continue - for (var/checkDirection in GLOB.cardinals_multiz) - var/turf/checkTurf = get_step(S, checkDirection) - if(!S.atmos_adjacent_turfs || !S.atmos_adjacent_turfs[checkTurf]) + for (var/check_direction in GLOB.cardinals_multiz) + var/turf/secondary_turf = get_step(checked_turf, check_direction) + if(!checked_turf.atmos_adjacent_turfs || !checked_turf.atmos_adjacent_turfs[secondary_turf]) continue - if (adjacent_turfs[checkTurf]) - matchingDirections++ + if (adjacent_turfs[secondary_turf]) + matching_directions++ - if (matchingDirections >= 2) - adjacent_turfs += S + if (matching_directions >= 2) + adjacent_turfs += checked_turf break return adjacent_turfs -/** - * For the love of all that is holy, DO NOT SET `command` TO TRUE ON HOTCODE. This will cause atmos to freeze up for considerable amounts at a time. - * In fact- please just refrain from using this if you're not changing how atmos flows turf to turf - */ -/atom/proc/air_update_turf(command = 0) - if(!SSair.initialized) // I'm sorry for polutting user code, I'll do 10 hail giacom's - return - if(!isturf(loc) && command) +/atom/proc/air_update_turf(update = FALSE, remove = FALSE) + var/turf/local_turf = get_turf(loc) + if(!local_turf) return - var/turf/T = get_turf(loc) - T.air_update_turf(command) + local_turf.air_update_turf(update, remove) -/turf/air_update_turf(command = 0) - if(!SSair.initialized) // I'm sorry for polutting user code, I'll do 10 hail giacom's - return - if(command) - ImmediateCalculateAdjacentTurfs() +/** + * A helper proc for dealing with atmos changes + * + * Ok so this thing is pretty much used as a catch all for all the situations someone might wanna change something + * About a turfs atmos. It's real clunky, and someone needs to clean it up, but not today. + * Arguments: + * * update - Has the state of the structures in the world changed? If so, update our adjacent atmos turf list, if not, don't. + * * remove - Are you removing an active turf (Read wall), or adding one +*/ +/turf/air_update_turf(update = FALSE, remove = FALSE) + if(update) + immediate_calculate_adjacent_turfs() + if(remove) + SSair.remove_from_active(src) + else + SSair.add_to_active(src) -/atom/movable/proc/move_update_air(turf/T) - if(isturf(T)) - T.air_update_turf(1) - air_update_turf(1) +/atom/movable/proc/move_update_air(turf/target_turf) + if(isturf(target_turf)) + target_turf.air_update_turf(TRUE, FALSE) //You're empty now + air_update_turf(TRUE, TRUE) //You aren't /atom/proc/atmos_spawn_air(text) //because a lot of people loves to copy paste awful code lets just make an easy proc to spawn your plasma fires - var/turf/open/T = get_turf(src) - if(!istype(T)) + var/turf/open/local_turf = get_turf(src) + if(!istype(local_turf)) return - T.atmos_spawn_air(text) + local_turf.atmos_spawn_air(text) /turf/open/atmos_spawn_air(text) if(!text || !air) return - var/datum/gas_mixture/G = new - G.parse_gas_string(text) - assume_air(G) + var/datum/gas_mixture/turf_mixture = SSair.parse_gas_string(text) + + air.merge(turf_mixture) + archive() + SSair.add_to_active(src) + +/turf/proc/immediate_disable_adjacency(disable_adjacent = TRUE) + if(disable_adjacent) + for(var/direction in GLOB.cardinals_multiz) + var/turf/T = get_step_multiz(src, direction) + if(!istype(T)) + continue + if (T.atmos_adjacent_turfs) + T.atmos_adjacent_turfs -= src + UNSETEMPTY(T.atmos_adjacent_turfs) + LAZYCLEARLIST(atmos_adjacent_turfs) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 5af7263477686..925a0e9dfe3b8 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -1,106 +1,98 @@ /turf - //conductivity is divided by 10 when interacting with air for balance purposes + //used for temperature calculations var/thermal_conductivity = 0.05 - var/heat_capacity = 1 + var/heat_capacity = INFINITY //This should be opt in rather then opt out + var/temperature_archived - //list of open turfs adjacent to us + ///list of turfs adjacent to us that air can flow onto var/list/atmos_adjacent_turfs - //bitfield of dirs in which we thermal conductivity is blocked - var/conductivity_blocked_directions = NONE - - //used for mapping and for breathing while in walls (because that's a thing that needs to be accounted for...) - //string parsed by /datum/gas/proc/copy_from_turf + ///bitfield of dirs in which we are superconducitng + var/atmos_supeconductivity = NONE + + //used to determine whether we should archive + var/archived_cycle = 0 + var/current_cycle = 0 + + /** + * used for mapping and for breathing while in walls (because that's a thing that needs to be accounted for...) + * string parsed by /datum/gas/proc/copy_from_turf + * approximation of MOLES_O2STANDARD and MOLES_N2STANDARD pending byond allowing constant expressions to be embedded in constant strings + * If someone will place 0 of some gas there, SHIT WILL BREAK. Do not do that. + **/ var/initial_gas_mix = OPENTURF_DEFAULT_ATMOS //approximation of MOLES_O2STANDARD and MOLES_N2STANDARD pending byond allowing constant expressions to be embedded in constant strings // If someone will place 0 of some gas there, SHIT WILL BREAK. Do not do that. /turf/open //used for spacewind + ///Pressure difference between two turfs var/pressure_difference = 0 + ///Where the difference come from (from higher pressure to lower pressure) var/pressure_direction = 0 - var/turf/pressure_specific_target + ///Excited group we are part of + var/datum/excited_group/excited_group + ///Are we active? + var/excited = FALSE + ///Our gas mix var/datum/gas_mixture/turf/air + ///If there is an active hotspot on us store a reference to it here var/obj/effect/hotspot/active_hotspot - var/planetary_atmos = FALSE //air will revert to initial_gas_mix over time - - var/list/atmos_overlay_types //gas IDs of current active gas overlays + /// air will slowly revert to initial_gas_mix + var/planetary_atmos = FALSE + /// once our paired turfs are finished with all other shares, do one 100% share + /// exists so things like space can ask to take 100% of a tile's gas + var/run_later = FALSE + + ///gas IDs of current active gas overlays + var/list/atmos_overlay_types + var/significant_share_ticker = 0 + #ifdef TRACK_MAX_SHARE + var/max_share = 0 + #endif /turf/open/Initialize(mapload) - if (planetary_atmos && Debugger?.enabled) - var/static/list/planet_atmos_types = list() - if(planet_atmos_types[type]) - air = planet_atmos_types[type] - else - air = new(2500,src) - air.copy_from_turf(src) - update_air_ref(1) - planet_atmos_types[type] = air - else - air = new(2500,src) - air.copy_from_turf(src) - update_air_ref(planetary_atmos ? 1 : 2) + if(!blocks_air) + air = create_gas_mixture() + if(planetary_atmos) + if(!SSair.planetary[initial_gas_mix]) + var/datum/gas_mixture/immutable/planetary/mix = new + mix.parse_string_immutable(initial_gas_mix) + SSair.planetary[initial_gas_mix] = mix + if(broken) + break_tile(TRUE) + if(burnt) + burn_tile(TRUE) . = ..() /turf/open/Destroy() if(active_hotspot) QDEL_NULL(active_hotspot) + // Adds the adjacent turfs to the current atmos processing + for(var/near_turf in atmos_adjacent_turfs) + SSair.add_to_active(near_turf) return ..() -/turf/proc/update_air_ref() - /////////////////GAS MIXTURE PROCS/////////////////// -/turf/open/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air - return assume_air_ratio(giver, 1) +///Copies all gas info from the turf into a new gas_mixture, along with our temperature +///Returns the created gas_mixture +/turf/proc/create_gas_mixture() + var/datum/gas_mixture/mix = SSair.parse_gas_string(initial_gas_mix) -/turf/open/assume_air_moles(datum/gas_mixture/giver, moles) - if(!giver) - return FALSE - if(SSair.thread_running()) - var giver_moles = giver.total_moles() - if(giver_moles > 0) - SSair.deferred_airs += list(list(giver, air, moles / giver_moles)) - else - SSair.deferred_airs += list(list(giver, air, 0)) - else - giver.transfer_to(air, moles) - update_visuals() - return TRUE + //acounts for changes in temperature + var/turf/parent = parent_type + if(temperature != initial(temperature) || temperature != initial(parent.temperature)) + mix.temperature = temperature -/turf/open/assume_air_ratio(datum/gas_mixture/giver, ratio) - if(!giver) - return FALSE - if(SSair.thread_running()) - SSair.deferred_airs += list(list(giver, air, ratio)) - else - giver.transfer_ratio_to(air, ratio) - update_visuals() - return TRUE - -/turf/open/transfer_air(datum/gas_mixture/taker, moles) - if(!taker || !return_air()) // shouldn't transfer from space - return FALSE - if(SSair.thread_running()) - var air_moles = air.total_moles() - if(air_moles > 0) - SSair.deferred_airs += list(list(air, taker, moles / air_moles)) - else - SSair.deferred_airs += list(list(air, taker, 0)) - else - air.transfer_to(taker, moles) - update_visuals() - return TRUE + return mix -/turf/open/transfer_air_ratio(datum/gas_mixture/taker, ratio) - if(!taker || !return_air()) +/turf/open/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air + if(!giver) return FALSE - if(SSair.thread_running()) - SSair.deferred_airs += list(list(air, taker, ratio)) - else - air.transfer_ratio_to(taker, ratio) - update_visuals() + air.merge(giver) + update_visuals() return TRUE /turf/open/remove_air(amount) @@ -109,15 +101,9 @@ update_visuals() return removed -/turf/open/remove_air_ratio(ratio) - var/datum/gas_mixture/ours = return_air() - var/datum/gas_mixture/removed = ours.remove_ratio(ratio) - update_visuals() - return removed - -/turf/open/proc/copy_air_with_tile(turf/open/T) - if(istype(T)) - air.copy_from(T.air) +/turf/open/proc/copy_air_with_tile(turf/open/target_turf) + if(istype(target_turf)) + air.copy_from(target_turf.air) /turf/open/proc/copy_air(datum/gas_mixture/copy) if(copy) @@ -125,9 +111,8 @@ /turf/return_air() RETURN_TYPE(/datum/gas_mixture) - var/datum/gas_mixture/GM = new - GM.copy_from_turf(src) - return GM + var/datum/gas_mixture/copied_mixture = create_gas_mixture() + return copied_mixture /turf/open/return_air() RETURN_TYPE(/datum/gas_mixture) @@ -136,15 +121,48 @@ /turf/open/return_analyzable_air() return return_air() -/turf/temperature_expose() - if(return_temperature() > heat_capacity) +/turf/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return (exposed_temperature >= heat_capacity || to_be_destroyed) + +/turf/atmos_expose(datum/gas_mixture/air, exposed_temperature) + if(exposed_temperature >= heat_capacity) to_be_destroyed = TRUE + if(to_be_destroyed && exposed_temperature >= max_fire_temperature_sustained) + max_fire_temperature_sustained = min(exposed_temperature, max_fire_temperature_sustained + heat_capacity / 4) //Ramp up to 100% yeah? + if(to_be_destroyed && !changing_turf) + turf_burn() + +/turf/proc/turf_burn() + burn_tile() + var/chance_of_deletion + if (heat_capacity) //beware of division by zero + chance_of_deletion = max_fire_temperature_sustained / heat_capacity * 8 //there is no problem with prob(23456), min() was redundant --rastaf0 + else + chance_of_deletion = 100 + if(prob(chance_of_deletion)) + Melt() + max_fire_temperature_sustained = 0 + else + to_be_destroyed = FALSE + +/turf/open/turf_burn() + if(!active_hotspot) //Might not even be needed since excited groups are no longer cringe + ..() +/turf/temperature_expose(datum/gas_mixture/air, exposed_temperature) + atmos_expose(air, exposed_temperature) -/turf/open/proc/eg_reset_cooldowns() -/turf/open/proc/eg_garbage_collect() -/turf/open/proc/get_excited() -/turf/open/proc/set_excited() +/turf/open/temperature_expose(datum/gas_mixture/air, exposed_temperature) + SEND_SIGNAL(src, COMSIG_TURF_EXPOSE, air, exposed_temperature) + check_atmos_process(null, air, exposed_temperature) //Manually do this to avoid needing to use elements, don't want 200 second atom init times + +/turf/proc/archive() + temperature_archived = temperature + +/turf/open/archive() + air.archive() + archived_cycle = SSair.times_fired + temperature_archived = temperature /////////////////////////GAS OVERLAYS////////////////////////////// @@ -162,13 +180,16 @@ src.atmos_overlay_types = null return + var/list/gases = air.gases - for(var/id in air.get_gases()) + for(var/id in gases) if (nonoverlaying_gases[id]) continue - var/gas_overlay = GLOB.gas_data.overlays[id] - if(gas_overlay && air.get_moles(id) > GLOB.gas_data.visibility[id]) - new_overlay_types += gas_overlay[min(FACTOR_GAS_VISIBLE_MAX, CEILING(air.get_moles(id) / MOLES_GAS_VISIBLE_STEP, 1))] + var/gas = gases[id] + var/gas_meta = gas[GAS_META] + var/gas_overlay = gas_meta[META_GAS_OVERLAY] + if(gas_overlay && gas[MOLES] > gas_meta[META_GAS_MOLES_VISIBLE]) + new_overlay_types += gas_overlay[min(TOTAL_VISIBLE_STATES, CEILING(gas[MOLES] / MOLES_GAS_VISIBLE_STEP, 1))] if (atmos_overlay_types) for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added @@ -183,108 +204,495 @@ UNSETEMPTY(new_overlay_types) src.atmos_overlay_types = new_overlay_types -/turf/open/proc/set_visuals(list/new_overlay_types) - if (atmos_overlay_types) - for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added - vis_contents -= overlay - - if (length(new_overlay_types)) - if (atmos_overlay_types) - vis_contents += new_overlay_types - atmos_overlay_types //don't add overlays that already exist - else - vis_contents += new_overlay_types - UNSETEMPTY(new_overlay_types) - src.atmos_overlay_types = new_overlay_types - /proc/typecache_of_gases_with_no_overlays() . = list() for (var/gastype in subtypesof(/datum/gas)) var/datum/gas/gasvar = gastype if (!initial(gasvar.gas_overlay)) - .[initial(gasvar.id)] = TRUE + .[gastype] = TRUE /////////////////////////////SIMULATION/////////////////////////////////// +#ifdef TRACK_MAX_SHARE +#define LAST_SHARE_CHECK \ + var/last_share = our_air.last_share;\ + max_share = max(last_share, max_share);\ + if(last_share > MINIMUM_AIR_TO_SUSPEND){\ + our_excited_group.reset_cooldowns();\ + cached_ticker = 0;\ + enemy_tile.significant_share_ticker = 0;\ + } else if(last_share > MINIMUM_MOLES_DELTA_TO_MOVE) {\ + our_excited_group.dismantle_cooldown = 0;\ + cached_ticker = 0;\ + enemy_tile.significant_share_ticker = 0;\ + } +#else +#define LAST_SHARE_CHECK \ + var/last_share = our_air.last_share;\ + if(last_share > MINIMUM_AIR_TO_SUSPEND){\ + our_excited_group.reset_cooldowns();\ + cached_ticker = 0;\ + enemy_tile.significant_share_ticker = 0;\ + } else if(last_share > MINIMUM_MOLES_DELTA_TO_MOVE) {\ + our_excited_group.dismantle_cooldown = 0;\ + cached_ticker = 0;\ + enemy_tile.significant_share_ticker = 0;\ + } +#endif +#ifdef TRACK_MAX_SHARE +#define PLANET_SHARE_CHECK \ + var/last_share = our_air.last_share;\ + max_share = max(last_share, max_share);\ + if(last_share > MINIMUM_AIR_TO_SUSPEND){\ + our_excited_group.reset_cooldowns();\ + cached_ticker = 0;\ + } else if(last_share > MINIMUM_MOLES_DELTA_TO_MOVE) {\ + our_excited_group.dismantle_cooldown = 0;\ + cached_ticker = 0;\ + } +#else +#define PLANET_SHARE_CHECK \ + var/last_share = our_air.last_share;\ + if(last_share > MINIMUM_AIR_TO_SUSPEND){\ + our_excited_group.reset_cooldowns();\ + cached_ticker = 0;\ + } else if(last_share > MINIMUM_MOLES_DELTA_TO_MOVE) {\ + our_excited_group.dismantle_cooldown = 0;\ + cached_ticker = 0;\ + } +#endif /turf/proc/process_cell(fire_count) + SSair.remove_from_active(src) + +/turf/open/process_cell(fire_count) + if(archived_cycle < fire_count) //archive self if not already done + archive() + + current_cycle = fire_count + var/cached_ticker = significant_share_ticker + cached_ticker += 1 + + //cache for sanic speed + var/list/adjacent_turfs = atmos_adjacent_turfs + var/datum/excited_group/our_excited_group = excited_group + var/our_share_coeff = 1/(LAZYLEN(adjacent_turfs) + 1) + + var/datum/gas_mixture/our_air = air + + var/list/share_end + + #ifdef TRACK_MAX_SHARE + max_share = 0 //Gotta reset our tracker + #endif -/turf/open/proc/equalize_pressure_in_zone(cyclenum) -/turf/open/proc/consider_firelocks(turf/T2) - var/reconsider_adj = FALSE - for(var/obj/machinery/door/firedoor/FD in T2) - if((FD.flags_1 & ON_BORDER_1) && get_dir(T2, src) != FD.dir) + for(var/turf/open/enemy_tile as anything in adjacent_turfs) + // This var is only rarely set, exists so turfs can request to share at the end of our sharing + // We need this so we can assume share is communative, which we need to do to avoid a hellish amount of garbage_collect()s + if(enemy_tile.run_later) + LAZYADD(share_end, enemy_tile) + + if(fire_count <= enemy_tile.current_cycle) continue - FD.emergency_pressure_stop() - reconsider_adj = TRUE - for(var/obj/machinery/door/firedoor/FD in src) - if((FD.flags_1 & ON_BORDER_1) && get_dir(src, T2) != FD.dir) + enemy_tile.archive() + + /******************* GROUP HANDLING START *****************************************************************/ + + var/should_share_air = FALSE + var/datum/gas_mixture/enemy_air = enemy_tile.air + + //cache for sanic speed + var/datum/excited_group/enemy_excited_group = enemy_tile.excited_group + //If we are both in an excited group, and they aren't the same, merge. + //If we are both in an excited group, and you're active, share + //If we pass compare, and if we're not already both in a group, lets join up + //If we both pass compare, add to active and share + if(our_excited_group && enemy_excited_group) + if(our_excited_group != enemy_excited_group) + //combine groups (this also handles updating the excited_group var of all involved turfs) + our_excited_group.merge_groups(enemy_excited_group) + our_excited_group = excited_group //update our cache + if(our_excited_group && enemy_excited_group && enemy_tile.excited) //If you're both excited, no need to compare right? + should_share_air = TRUE + else if(our_air.compare(enemy_air)) //Lets see if you're up for it + SSair.add_to_active(enemy_tile) //Add yourself young man + var/datum/excited_group/existing_group = our_excited_group || enemy_excited_group || new + if(!our_excited_group) + existing_group.add_turf(src) + if(!enemy_excited_group) + existing_group.add_turf(enemy_tile) + our_excited_group = excited_group + should_share_air = TRUE + + //air sharing + if(should_share_air) + var/difference = our_air.share(enemy_air, our_share_coeff, 1 / (LAZYLEN(enemy_tile.atmos_adjacent_turfs) + 1)) + if(difference) + if(difference > 0) + consider_pressure_difference(enemy_tile, difference) + else + enemy_tile.consider_pressure_difference(src, -difference) + //This acts effectivly as a very slow timer, the max deltas of the group will slowly lower until it breaksdown, they then pop up a bit, and fall back down until irrelevant + LAST_SHARE_CHECK + + + /******************* GROUP HANDLING FINISH *********************************************************************/ + + if (planetary_atmos) //share our air with the "atmosphere" "above" the turf + var/datum/gas_mixture/planetary_mix = SSair.planetary[initial_gas_mix] + // archive ourself again so we don't accidentally share more gas than we currently have + archive() + if(our_air.compare(planetary_mix)) + if(!our_excited_group) + var/datum/excited_group/new_group = new + new_group.add_turf(src) + our_excited_group = excited_group + // shares 4/5 of our difference in moles with the atmosphere + our_air.share(planetary_mix, 0.8, 0.8) + // temperature share with the atmosphere with an inflated heat capacity to simulate faster sharing with a large atmosphere + our_air.temperature_share(planetary_mix, OPEN_HEAT_TRANSFER_COEFFICIENT, planetary_mix.temperature_archived, planetary_mix.heat_capacity() * 5) + planetary_mix.garbage_collect() + PLANET_SHARE_CHECK + + for(var/turf/open/enemy_tile as anything in share_end) + var/datum/gas_mixture/enemy_mix = enemy_tile.air + archive() + // We share 100% of our mix in this step. Let's jive + var/difference = our_air.share(enemy_mix, 1, 1) + LAST_SHARE_CHECK + if(!difference) continue - FD.emergency_pressure_stop() - reconsider_adj = TRUE - if(reconsider_adj) - T2.ImmediateCalculateAdjacentTurfs() // We want those firelocks closed yesterday. - -/turf/proc/handle_decompression_floor_rip() -/turf/open/floor/handle_decompression_floor_rip(sum) - if(sum > 20 && prob(clamp(sum / 20, 0, 15))) - if(floor_tile) - new floor_tile(src) - make_plating() + if(difference > 0) + consider_pressure_difference(enemy_tile, difference) + else + enemy_tile.consider_pressure_difference(src, difference) -/turf/open/floor/plating/handle_decompression_floor_rip() - return + our_air.react(src) -/turf/open/floor/engine/handle_decompression_floor_rip() - return + update_visuals() + if(!consider_superconductivity(starting = TRUE) && !active_hotspot) //Might need to include the return of react() here + if(!our_excited_group) //If nothing of interest is happening, kill the active turf + SSair.remove_from_active(src) //This will kill any connected excited group, be careful (This broke atmos for 4 years) + if(cached_ticker > EXCITED_GROUP_DISMANTLE_CYCLES) //If you're stalling out, take a rest + SSair.sleep_active_turf(src) -/turf/open/process_cell(fire_count) + significant_share_ticker = cached_ticker //Save our changes + temperature_expose(our_air, our_air.temperature) //////////////////////////SPACEWIND///////////////////////////// -/turf/proc/consider_pressure_difference() - return - -/turf/open/consider_pressure_difference(turf/T, difference) +/turf/open/proc/consider_pressure_difference(turf/target_turf, difference) SSair.high_pressure_delta |= src if(difference > pressure_difference) - pressure_direction = get_dir(src, T) + pressure_direction = get_dir(src, target_turf) pressure_difference = difference /turf/open/proc/high_pressure_movements() - var/atom/movable/M - var/multiplier = 1 - if(locate(/obj/structure/rack) in src) - multiplier *= 0.1 - else if(locate(/obj/structure/table) in src) - multiplier *= 0.2 + var/atom/movable/moving_atom for(var/thing in src) - M = thing - if (!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired) - M.experience_pressure_difference(pressure_difference * multiplier, pressure_direction, 0, pressure_specific_target) - -/atom/movable/var/pressure_resistance = 10 -/atom/movable/var/last_high_pressure_movement_air_cycle = 0 - -/atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0, throw_target) + moving_atom = thing + if (!moving_atom.anchored && !moving_atom.pulledby && moving_atom.last_high_pressure_movement_air_cycle < SSair.times_fired) + moving_atom.experience_pressure_difference(pressure_difference, pressure_direction) + +/atom/movable + ///How much delta pressure is needed for us to move + var/pressure_resistance = 10 + var/last_high_pressure_movement_air_cycle = 0 + +/atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) + var/const/PROBABILITY_OFFSET = 25 + var/const/PROBABILITY_BASE_PRECENT = 75 + var/max_force = sqrt(pressure_difference) * (MOVE_FORCE_DEFAULT / 5) set waitfor = FALSE - if(SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_PRESSURE_PUSH) & COMSIG_MOVABLE_BLOCKS_PRESSURE) - return - - var/const/PROBABILITY_OFFSET = 40 - var/const/PROBABILITY_BASE_PRECENT = 10 - var/max_force = sqrt(pressure_difference)*(MOVE_FORCE_DEFAULT / 5) var/move_prob = 100 - if(pressure_resistance > 0) - move_prob = (pressure_difference/pressure_resistance*PROBABILITY_BASE_PRECENT)-PROBABILITY_OFFSET + if (pressure_resistance > 0) + move_prob = (pressure_difference / pressure_resistance * PROBABILITY_BASE_PRECENT) - PROBABILITY_OFFSET move_prob += pressure_resistance_prob_delta - if(move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO)))) - var/move_force = max_force * clamp(move_prob, 0, 100) / 100 - if(move_force > 6000) - // WALLSLAM HELL TIME OH BOY - var/turf/throw_turf = get_ranged_target_turf(get_turf(src), direction, round(move_force / 2000)) - if(throw_target && (get_dir(src, throw_target) & direction)) - throw_turf = get_turf(throw_target) - var/throw_speed = clamp(round(move_force / 3000), 1, 10) - throw_at(throw_turf, move_force / 3000, throw_speed) - else - step(src, direction) + if (move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO)))) + step(src, direction) last_high_pressure_movement_air_cycle = SSair.times_fired + +///////////////////////////EXCITED GROUPS///////////////////////////// + +/* + I've got a problem with excited groups + Adding tiles works out fine, but if you try and remove them, we get issues + The main one is to do with how sleeping tiles are processed + If a tile is sleeping, it is removed from the active turfs list and not processed at all + The issue comes when we try and reform excited groups after a removal like this + and the turfs just poof go fully to sleep. + We solve this with excited group cleanup. See the documentation for more details. +*/ +/datum/excited_group + ///Stores a reference to the turfs we are controlling + var/list/turf_list = list() + ///If this is over EXCITED_GROUP_BREAKDOWN_CYCLES we call self_breakdown() + var/breakdown_cooldown = 0 + ///If this is over EXCITED_GROUP_DISMANTLE_CYCLES we call dismantle() + var/dismantle_cooldown = 0 + ///Used for debug to show the excited groups active and their turfs + var/should_display = FALSE + ///Id of the index color of the displayed group + var/display_id = 0 + ///Wrapping loop of the index colors + var/static/wrapping_id = 0 + +/datum/excited_group/New() + SSair.excited_groups += src + +/datum/excited_group/proc/add_turf(turf/open/target_turf) + turf_list += target_turf + target_turf.excited_group = src + dismantle_cooldown = 0 + if(should_display || SSair.display_all_groups) + display_turf(target_turf) + +/datum/excited_group/proc/merge_groups(datum/excited_group/target_group) + if(turf_list.len > target_group.turf_list.len) + SSair.excited_groups -= target_group + for(var/turf/open/group_member as anything in target_group.turf_list) + group_member.excited_group = src + turf_list += group_member + should_display = target_group.should_display | should_display + if(should_display || SSair.display_all_groups) + target_group.hide_turfs() + display_turfs() + breakdown_cooldown = min(breakdown_cooldown, target_group.breakdown_cooldown) //Take the smaller of the two options + dismantle_cooldown = 0 + else + SSair.excited_groups -= src + for(var/turf/open/group_member as anything in turf_list) + group_member.excited_group = target_group + target_group.turf_list += group_member + target_group.should_display = target_group.should_display | should_display + if(target_group.should_display || SSair.display_all_groups) + hide_turfs() + target_group.display_turfs() + target_group.breakdown_cooldown = min(breakdown_cooldown, target_group.breakdown_cooldown) + target_group.dismantle_cooldown = 0 + + +/datum/excited_group/proc/reset_cooldowns() + breakdown_cooldown = 0 + dismantle_cooldown = 0 + + +/datum/excited_group/proc/self_breakdown(roundstart = FALSE, poke_turfs = FALSE) + var/datum/gas_mixture/shared_mix = new + + //make local for sanic speed + var/list/shared_gases = shared_mix.gases + var/list/turf_list = src.turf_list + var/turflen = turf_list.len + var/imumutable_in_group = FALSE + var/energy = 0 + var/heat_cap = 0 + + for(var/turf/open/group_member as anything in turf_list) + //Cache? + var/datum/gas_mixture/turf/mix = group_member.air + if (roundstart && istype(group_member.air, /datum/gas_mixture/immutable)) + imumutable_in_group = TRUE + shared_mix.copy_from(group_member.air) //This had better be immutable young man + shared_gases = shared_mix.gases //update the cache + break + //"borrowing" this code from merge(), I need to play with the temp portion. Lets expand it out + //temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity + var/capacity = mix.heat_capacity() + energy += mix.temperature * capacity + heat_cap += capacity + + var/list/giver_gases = mix.gases + for(var/giver_id in giver_gases) + ASSERT_GAS_IN_LIST(giver_id, shared_gases) + shared_gases[giver_id][MOLES] += giver_gases[giver_id][MOLES] + + if(!imumutable_in_group) + shared_mix.temperature = energy / heat_cap + for(var/id in shared_gases) + shared_gases[id][MOLES] /= turflen + shared_mix.garbage_collect() + + for(var/turf/open/group_member as anything in turf_list) + if(group_member.planetary_atmos) //We do this as a hack to try and minimize unneeded excited group spread over planetary turfs + group_member.air.copy_from(SSair.planetary[group_member.initial_gas_mix]) //Comes with a cost of "slower" drains, but it's worth it + else + group_member.air.copy_from(shared_mix) //Otherwise just set the mix to a copy of our equalized mix + group_member.update_visuals() + if(poke_turfs) //Because we only activate all these once every breakdown, in event of lag due to this code and slow space + vent things, increase the wait time for breakdowns + SSair.add_to_active(group_member) + group_member.significant_share_ticker = EXCITED_GROUP_DISMANTLE_CYCLES //Max out the ticker, if they don't share next tick, nuke em + + breakdown_cooldown = 0 + +///Dismantles the excited group, puts allll the turfs to sleep +/datum/excited_group/proc/dismantle() + for(var/turf/open/current_turf as anything in turf_list) + current_turf.excited = FALSE + current_turf.significant_share_ticker = 0 + SSair.active_turfs -= current_turf + #ifdef VISUALIZE_ACTIVE_TURFS //Use this when you want details about how the turfs are moving, display_all_groups should work for normal operation + current_turf.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_VIBRANT_LIME) + #endif + garbage_collect() + +//Breaks down the excited group, this doesn't sleep the turfs mind, just removes them from the group +/datum/excited_group/proc/garbage_collect() + if(display_id) //If we ever did make those changes + hide_turfs() + for(var/turf/open/current_turf as anything in turf_list) + current_turf.excited_group = null + turf_list.Cut() + SSair.excited_groups -= src + if(SSair.currentpart == SSAIR_EXCITEDGROUPS) + SSair.currentrun -= src + +/datum/excited_group/proc/display_turfs() + if(display_id == 0) //Hasn't been shown before + wrapping_id = wrapping_id % GLOB.colored_turfs.len + wrapping_id++ //We do this after because lists index at 1 + display_id = wrapping_id + for(var/thing in turf_list) + var/turf/display = thing + display.vis_contents += GLOB.colored_turfs[display_id] + +/datum/excited_group/proc/hide_turfs() + for(var/thing in turf_list) + var/turf/display = thing + display.vis_contents -= GLOB.colored_turfs[display_id] + display_id = 0 + +/datum/excited_group/proc/display_turf(turf/thing) + if(display_id == 0) //Hasn't been shown before + wrapping_id = wrapping_id % GLOB.colored_turfs.len + wrapping_id++ //We do this after because lists index at 1 + display_id = wrapping_id + thing.vis_contents += GLOB.colored_turfs[display_id] + +////////////////////////SUPERCONDUCTIVITY///////////////////////////// + +/** +ALLLLLLLLLLLLLLLLLLLLRIGHT HERE WE GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO + +Read the code for more details, but first, a brief concept discussion/area + +Our goal here is to "model" heat moving through solid objects, so walls, windows, and sometimes doors. +We do this by heating up the floor itself with the heat of the gasmix ontop of it, this is what the coeffs are for here, they slow that movement +Then we go through the process below. + +If an active turf is fitting, we add it to processing, conduct with any covered tiles, (read windows and sometimes walls) +Then we space some of our heat, and think about if we should stop conducting. +**/ + +/turf/proc/conductivity_directions() + if(archived_cycle < SSair.times_fired) + archive() + return ALL_CARDINALS + +///Returns a set of directions that we should be conducting in, NOTE, atmos_supeconductivity is ACTUALLY inversed, don't worrry about it +/turf/open/conductivity_directions() + if(blocks_air) + return ..() + for(var/direction in GLOB.cardinals) + var/turf/checked_turf = get_step(src, direction) + if(!(checked_turf in atmos_adjacent_turfs) && !(atmos_supeconductivity & direction)) + . |= direction + +///These two procs are a bit of a web, I belive in you +/turf/proc/neighbor_conduct_with_src(turf/open/other) + if(!other.blocks_air) //Solid but neighbor is open + other.temperature_share_open_to_solid(src) + else //Both tiles are solid + other.share_temperature_mutual_solid(src, thermal_conductivity) + temperature_expose(null, temperature) + +/turf/open/neighbor_conduct_with_src(turf/other) + if(blocks_air) + return ..() + + if(!other.blocks_air) //Both tiles are open + var/turf/open/open_other = other + open_other.air.temperature_share(air, WINDOW_HEAT_TRANSFER_COEFFICIENT) + else //Open but neighbor is solid + temperature_share_open_to_solid(other) + SSair.add_to_active(src) + + +/turf/proc/super_conduct() + var/conductivity_directions = conductivity_directions() + + if(conductivity_directions) + //Conduct with tiles around me + for(var/direction in GLOB.cardinals) + if(!(conductivity_directions & direction)) + continue + var/turf/neighbor = get_step(src, direction) + + if(!neighbor.thermal_conductivity) + continue + + if(neighbor.archived_cycle < SSair.times_fired) + neighbor.archive() + + neighbor.neighbor_conduct_with_src(src) + + neighbor.consider_superconductivity() + + radiate_to_spess() + + finish_superconduction() + +/turf/proc/finish_superconduction(temp = temperature) + //Make sure still hot enough to continue conducting heat + if(temp < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION) + SSair.active_super_conductivity -= src + return FALSE + +/turf/open/finish_superconduction() + //Conduct with air on my tile if I have it + if(!blocks_air) + temperature = air.temperature_share(null, thermal_conductivity, temperature, heat_capacity) + ..((blocks_air ? temperature : air.temperature)) + +///Should we attempt to superconduct? +/turf/proc/consider_superconductivity(starting) + if(!thermal_conductivity) + return FALSE + + SSair.active_super_conductivity |= src + return TRUE + +/turf/open/consider_superconductivity(starting) + if(air.temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) + return FALSE + if(air.heat_capacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant. + return FALSE + return ..() + +/turf/closed/consider_superconductivity(starting) + if(temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) + return FALSE + return ..() + +/turf/proc/radiate_to_spess() //Radiate excess tile heat to space + if(temperature <= T0C) //Considering 0 degC as te break even point for radiation in and out + return + var/delta_temperature = (temperature_archived - TCMB) //hardcoded space temperature + if(heat_capacity <= 0 || abs(delta_temperature) <= MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + return + var/heat = thermal_conductivity * delta_temperature * \ + (heat_capacity * HEAT_CAPACITY_VACUUM / (heat_capacity + HEAT_CAPACITY_VACUUM)) + temperature -= heat/heat_capacity + +/turf/open/proc/temperature_share_open_to_solid(turf/sharer) + sharer.temperature = air.temperature_share(null, sharer.thermal_conductivity, sharer.temperature, sharer.heat_capacity) + +/turf/proc/share_temperature_mutual_solid(turf/sharer, conduction_coefficient) //This is all just heat sharing, don't get freaked out + var/delta_temperature = (temperature_archived - sharer.temperature_archived) + if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER && heat_capacity && sharer.heat_capacity) + var/heat = conduction_coefficient * delta_temperature * \ + (heat_capacity * sharer.heat_capacity / (heat_capacity + sharer.heat_capacity)) //The larger the combined capacity the less is shared + temperature -= heat / heat_capacity //The higher your own heat cap the less heat you get from this arrangement + sharer.temperature += heat / sharer.heat_capacity + +#undef LAST_SHARE_CHECK +#undef PLANET_SHARE_CHECK diff --git a/code/modules/atmospherics/gasmixtures/auxgm.dm b/code/modules/atmospherics/gasmixtures/auxgm.dm deleted file mode 100644 index 25e58dd50e898..0000000000000 --- a/code/modules/atmospherics/gasmixtures/auxgm.dm +++ /dev/null @@ -1,130 +0,0 @@ -GLOBAL_LIST_INIT(hardcoded_gases, list(GAS_O2, GAS_N2, GAS_CO2, GAS_PLASMA)) //the main four gases, which were at one time hardcoded -GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GAS_PLUOXIUM, GAS_STIMULUM, GAS_NITRYL))) //unable to react amongst themselves - -// Auxgm -// It's a send-up of XGM, like what baystation got. -// It's got the same architecture as XGM, but it's structured -// differently to make it more convenient for auxmos. - -// Most important compared to TG is that it does away with hardcoded typepaths, -// which lead to problems on the auxmos end anyway. We cache the string value -// references on the Rust end, so no performance is lost here. - -// Also allows you to add new gases at runtime - -/proc/_auxtools_register_gas(datum/gas/gas) // makes sure auxtools knows stuff about this gas - -/datum/auxgm - var/list/datums = list() - var/list/specific_heats = list() - var/list/names = list() - var/list/visibility = list() - var/list/overlays = list() - var/list/flags = list() - var/list/ids = list() - var/list/typepaths = list() - var/list/fusion_powers = list() - var/list/breathing_classes = list() - var/list/breath_results = list() - var/list/breath_reagents = list() - var/list/breath_reagents_dangerous = list() - var/list/breath_alert_info = list() - var/list/oxidation_temperatures = list() - var/list/oxidation_rates = list() - var/list/fire_temperatures = list() - var/list/enthalpies = list() - var/list/fire_products = list() - var/list/fire_burn_rates = list() - - -/datum/gas - var/id = "" - var/specific_heat = 0 - var/name = "" - var/gas_overlay = "" //icon_state in icons/effects/atmospherics.dmi - var/moles_visible = null - var/flags = NONE //currently used by canisters - var/fusion_power = 0 // How much the gas destabilizes a fusion reaction - var/breath_results = GAS_CO2 // what breathing this breathes out - var/breath_reagent = null // what breathing this adds to your reagents - var/breath_reagent_dangerous = null // what breathing this adds to your reagents IF it's above a danger threshold - var/list/breath_alert_info = null // list for alerts that pop up when you have too much/not enough of something - var/oxidation_temperature = null // temperature above which this gas is an oxidizer; null for none - var/oxidation_rate = 1 // how many moles of this can oxidize how many moles of material - var/fire_temperature = null // temperature above which gas may catch fire; null for none - var/list/fire_products = null // what results when this gas is burned (oxidizer or fuel); null for none - var/enthalpy = 0 // how much energy is released per mole of fuel burned - var/fire_burn_rate = 1 // how many moles are burned per product released - -/datum/gas/proc/breath(partial_pressure, light_threshold, heavy_threshold, moles, mob/living/carbon/C, obj/item/organ/lungs/lungs) - // This is only called on gases with the GAS_FLAG_BREATH_PROC flag. When possible, do NOT use this-- - // greatly prefer just adding a reagent. This is mostly around for legacy reasons. - return null - -/datum/auxgm/proc/add_gas(datum/gas/gas) - var/g = gas.id - if(g) - datums[g] = gas - specific_heats[g] = gas.specific_heat - names[g] = gas.name - if(gas.moles_visible) - visibility[g] = gas.moles_visible - overlays[g] = new /list(FACTOR_GAS_VISIBLE_MAX) - for(var/i in 1 to FACTOR_GAS_VISIBLE_MAX) - overlays[g][i] = new /obj/effect/overlay/gas(gas.gas_overlay, i * 255 / FACTOR_GAS_VISIBLE_MAX) - else - visibility[g] = 0 - overlays[g] = 0 - flags[g] = gas.flags - ids[g] = g - typepaths[g] = gas.type - fusion_powers[g] = gas.fusion_power - - if(gas.breath_alert_info) - breath_alert_info[g] = gas.breath_alert_info - breath_results[g] = gas.breath_results - if(gas.breath_reagent) - breath_reagents[g] = gas.breath_reagent - if(gas.breath_reagent_dangerous) - breath_reagents_dangerous[g] = gas.breath_reagent_dangerous - - if(gas.oxidation_temperature) - oxidation_temperatures[g] = gas.oxidation_temperature - oxidation_rates[g] = gas.oxidation_rate - if(gas.fire_products) - fire_products[g] = gas.fire_products - enthalpies[g] = gas.enthalpy - else if(gas.fire_temperature) - fire_temperatures[g] = gas.fire_temperature - fire_burn_rates[g] = gas.fire_burn_rate - if(gas.fire_products) - fire_products[g] = gas.fire_products - enthalpies[g] = gas.enthalpy - - _auxtools_register_gas(gas) - -/proc/finalize_gas_refs() - -/datum/auxgm/New() - for(var/gas_path in subtypesof(/datum/gas)) - var/datum/gas/gas = new gas_path - add_gas(gas) - for(var/breathing_class_path in subtypesof(/datum/breathing_class)) - var/datum/breathing_class/class = new breathing_class_path - breathing_classes[breathing_class_path] = class - finalize_gas_refs() - -GLOBAL_DATUM_INIT(gas_data, /datum/auxgm, new) - -/obj/effect/overlay/gas - icon = 'icons/effects/atmospherics.dmi' - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - anchored = TRUE // should only appear in vis_contents, but to be safe - layer = FLY_LAYER - appearance_flags = TILE_BOUND - vis_flags = NONE - -/obj/effect/overlay/gas/New(state, alph) - . = ..() - icon_state = state - alpha = alph diff --git a/code/modules/atmospherics/auxgm/breathing_classes.dm b/code/modules/atmospherics/gasmixtures/breathing_classes.dm similarity index 67% rename from code/modules/atmospherics/auxgm/breathing_classes.dm rename to code/modules/atmospherics/gasmixtures/breathing_classes.dm index cfc82adbffa16..57d557a89612c 100644 --- a/code/modules/atmospherics/auxgm/breathing_classes.dm +++ b/code/modules/atmospherics/gasmixtures/breathing_classes.dm @@ -17,27 +17,36 @@ /datum/breathing_class/proc/get_effective_pp(datum/gas_mixture/breath) var/mol = 0 for(var/gas in gases) - mol += breath.get_moles(gas) * gases[gas] + mol += GET_MOLES(gas,breath) * gases[gas] return (mol/breath.total_moles()) * breath.return_pressure() /datum/breathing_class/oxygen gases = list( - GAS_O2 = 1, - GAS_PLUOXIUM = 8, - GAS_CO2 = -0.7, // CO2 isn't actually toxic, just an asphyxiant + /datum/gas/oxygen = 1, + /datum/gas/pluoxium = 8, + /datum/gas/carbon_dioxide = -0.7, // CO2 isn't actually toxic, just an asphyxiant ) products = list( - GAS_CO2 = 1, + /datum/gas/carbon_dioxide = 1, ) /datum/breathing_class/plasma gases = list( - GAS_PLASMA = 1 + /datum/gas/plasma = 1 ) products = list( - GAS_CO2 = 1 + /datum/gas/carbon_dioxide = 1 ) low_alert_category = "not_enough_tox" low_alert_datum = /atom/movable/screen/alert/not_enough_tox high_alert_category = "too_much_tox" high_alert_datum = /atom/movable/screen/alert/too_much_tox + +/proc/breathing_class_list() + var/list/breathing_classes = list() + for(var/breathing_class_path in subtypesof(/datum/breathing_class)) + var/datum/breathing_class/class = new breathing_class_path + breathing_classes[breathing_class_path] = class + return breathing_classes + +GLOBAL_LIST_INIT(breathing_class_info, breathing_class_list()) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index a98e8ab5df44d..89f0f69ec635d 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -1,306 +1,748 @@ +/** + *I feel the need to document what happens here. Basically this is used + *catch rounding errors, and make gas go away in small portions. + *People have raised it to higher levels in the past, do not do this. Consider this number a soft limit + *If you're making gasmixtures that have unexpected behavior related to this value, you're doing something wrong. + * + *On an unrelated note this may cause a bug that creates negative gas, related to round(). When it has a second arg it will round up. + *So for instance round(0.5, 1) == 1. I've hardcoded a fix for this into share, by forcing the garbage collect. + *Any other attempts to fix it just killed atmos. I leave this to a greater man then I + */ +GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm +GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) + +/proc/init_gaslist_cache() + . = list() + for(var/id in GLOB.meta_gas_info) + var/list/cached_gas = new(3) + + .[id] = cached_gas + + cached_gas[MOLES] = 0 + cached_gas[ARCHIVE] = 0 + cached_gas[GAS_META] = GLOB.meta_gas_info[id] + /datum/gas_mixture - /// Never ever set this variable, hooked into vv_get_var for view variables viewing. - var/gas_list_view_only - var/initial_volume = CELL_VOLUME //liters + var/list/gases + var/temperature = 0 //kelvins + var/tmp/temperature_archived = 0 + var/volume = CELL_VOLUME //liters + var/last_share = 0 + /// The fire key contains information that might determine the volume of hotspots. var/list/reaction_results - var/list/analyzer_results //used for analyzer feedback - not initialized until its used - var/_extools_pointer_gasmixture // Contains the index in the gas vector for this gas mixture in rust land. Don't. Touch. This. Var. - -GLOBAL_LIST_INIT(auxtools_atmos_initialized, FALSE) - -/proc/auxtools_atmos_init() + /// Used for analyzer feedback - not initialized until its used + var/list/analyzer_results + /// Whether to call garbage_collect() on the sharer during shares, used for immutable mixtures + var/gc_share = FALSE + /// When this gas mixture was last touched by pipeline processing + /// I am sorry + var/pipeline_cycle = -1 /datum/gas_mixture/New(volume) + gases = new if (!isnull(volume)) - initial_volume = volume - AUXTOOLS_CHECK(AUXMOS) - if(!GLOB.auxtools_atmos_initialized && auxtools_atmos_init()) - GLOB.auxtools_atmos_initialized = TRUE - __gasmixture_register() + src.volume = volume reaction_results = new -/* -we use a hook instead -/datum/gas_mixture/Del() - __gasmixture_unregister() - . = ..() -*/ - -/datum/gas_mixture/vv_edit_var(var_name, var_value) - if(var_name == "_extools_pointer_gasmixture") - return FALSE // please no. segfaults bad. - if(var_name == "gas_list_view_only") - return FALSE - return ..() - -/datum/gas_mixture/vv_get_var(var_name) - . = ..() - if(var_name == "gas_list_view_only") - var/list/dummy = get_gases() - for(var/gas in dummy) - dummy[gas] = get_moles(gas) - dummy["CAP [gas]"] = partial_heat_capacity(gas) - dummy["TEMP"] = return_temperature() - dummy["PRESSURE"] = return_pressure() - dummy["HEAT CAPACITY"] = heat_capacity() - dummy["TOTAL MOLES"] = total_moles() - dummy["VOLUME"] = return_volume() - dummy["THERMAL ENERGY"] = thermal_energy() - return debug_variable("gases (READ ONLY)", dummy, 0, src) - -/datum/gas_mixture/vv_get_dropdown() - . = ..() - VV_DROPDOWN_OPTION("", "---") - VV_DROPDOWN_OPTION(VV_HK_PARSE_GASSTRING, "Parse Gas String") - VV_DROPDOWN_OPTION(VV_HK_EMPTY, "Empty") - VV_DROPDOWN_OPTION(VV_HK_SET_MOLES, "Set Moles") - VV_DROPDOWN_OPTION(VV_HK_SET_TEMPERATURE, "Set Temperature") - VV_DROPDOWN_OPTION(VV_HK_SET_VOLUME, "Set Volume") - -/datum/gas_mixture/vv_do_topic(list/href_list) - . = ..() +//listmos procs +//use the macros in performance intensive areas. for their definitions, refer to code/__DEFINES/atmospherics.dm + + ///assert_gas(gas_id) - used to guarantee that the gas list for this id exists in gas_mixture.gases. + //Must be used before adding to a gas. May be used before reading from a gas. +/datum/gas_mixture/proc/assert_gas(gas_id) + ASSERT_GAS(gas_id, src) + + ///assert_gases(args) - shorthand for calling ASSERT_GAS() once for each gas type. +/datum/gas_mixture/proc/assert_gases(...) + for(var/id in args) + ASSERT_GAS(id, src) + + ///add_gas(gas_id) - similar to assert_gas(), but does not check for an existing gas list for this id. This can clobber existing gases. + ///Used instead of assert_gas() when you know the gas does not exist. Faster than assert_gas(). +/datum/gas_mixture/proc/add_gas(gas_id) + ADD_GAS(gas_id, gases) + + ///add_gases(args) - shorthand for calling add_gas() once for each gas_type. +/datum/gas_mixture/proc/add_gases(...) + var/cached_gases = gases + for(var/id in args) + ADD_GAS(id, cached_gases) + + ///garbage_collect() - removes any gas list which is empty. + ///If called with a list as an argument, only removes gas lists with IDs from that list. + ///Must be used after subtracting from a gas. Must be used after assert_gas() + ///if assert_gas() was called only to read from the gas. + ///By removing empty gases, processing speed is increased. +/datum/gas_mixture/proc/garbage_collect(list/tocheck) + var/list/cached_gases = gases + for(var/id in (tocheck || cached_gases)) + if(QUANTIZE(cached_gases[id][MOLES]) <= 0) + cached_gases -= id + + //PV = nRT + + ///joules per kelvin +/datum/gas_mixture/proc/heat_capacity(data = MOLES) + var/list/cached_gases = gases + . = 0 + for(var/id in cached_gases) + var/gas_data = cached_gases[id] + . += gas_data[data] * gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] + + /// Same as above except vacuums return HEAT_CAPACITY_VACUUM +/datum/gas_mixture/turf/heat_capacity(data = MOLES) + var/list/cached_gases = gases + . = 0 + for(var/id in cached_gases) + var/gas_data = cached_gases[id] + . += gas_data[data] * gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] if(!.) - return - if(href_list[VV_HK_PARSE_GASSTRING]) - var/gasstring = input(usr, "Input Gas String (WARNING: Advanced. Don't use this unless you know how these work.", "Gas String Parse") as text|null - if(!istext(gasstring)) - return - log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Set to gas string [gasstring].") - message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Set to gas string [gasstring].") - parse_gas_string(gasstring) - if(href_list[VV_HK_EMPTY]) - log_admin("[key_name(usr)] emptied gas mixture [REF(src)].") - message_admins("[key_name(usr)] emptied gas mixture [REF(src)].") - clear() - if(href_list[VV_HK_SET_MOLES]) - var/list/gases = get_gases() - for(var/gas in gases) - gases[gas] = get_moles(gas) - var/gasid = input(usr, "What kind of gas?", "Set Gas") as null|anything in GLOB.gas_data.ids - if(!gasid) - return - var/amount = input(usr, "Input amount", "Set Gas", gases[gasid] || 0) as num|null - if(!isnum(amount)) - return - amount = max(0, amount) - log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Set gas [gasid] to [amount] moles.") - message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Set gas [gasid] to [amount] moles.") - set_moles(gasid, amount) - if(href_list[VV_HK_SET_TEMPERATURE]) - var/temp = input(usr, "Set the temperature of this mixture to?", "Set Temperature", return_temperature()) as num|null - if(!isnum(temp)) - return - temp = max(2.7, temp) - log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Changed temperature to [temp].") - message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Changed temperature to [temp].") - set_temperature(temp) - if(href_list[VV_HK_SET_VOLUME]) - var/volume = input(usr, "Set the volume of this mixture to?", "Set Volume", return_volume()) as num|null - if(!isnum(volume)) - return - volume = max(0, volume) - log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Changed volume to [volume].") - message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Changed volume to [volume].") - set_volume(volume) - -/datum/gas_mixture/proc/__gasmixture_unregister() -/datum/gas_mixture/proc/__gasmixture_register() - -/proc/gas_types() - var/list/L = subtypesof(/datum/gas) - for(var/gt in L) - var/datum/gas/G = gt - L[gt] = initial(G.specific_heat) - return L - -/datum/gas_mixture/proc/heat_capacity() //joules per kelvin - -/datum/gas_mixture/proc/partial_heat_capacity(gas_type) + . += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space + /// Calculate moles /datum/gas_mixture/proc/total_moles() + var/cached_gases = gases + TOTAL_MOLES(cached_gases, .) + +/// Checks to see if gas amount exists in mixture. +/// Do NOT use this in code where performance matters! +/// It's better to batch calls to garbage_collect(), especially in places where you're checking many gastypes +/datum/gas_mixture/proc/has_gas(gas_id, amount=0) + ASSERT_GAS(gas_id, src) + var/is_there_gas = amount < gases[gas_id][MOLES] + garbage_collect() + return is_there_gas + +/// Calculate pressure in kilopascals +/datum/gas_mixture/proc/return_pressure() + if(volume) // to prevent division by zero + var/cached_gases = gases + TOTAL_MOLES(cached_gases, .) + . *= R_IDEAL_GAS_EQUATION * temperature / volume + return + return 0 -/datum/gas_mixture/proc/return_pressure() //kilopascals + /// Calculate temperature in kelvins +/datum/gas_mixture/proc/return_temperature() + return temperature -/datum/gas_mixture/proc/return_temperature() //kelvins + /// Calculate volume in liters +/datum/gas_mixture/proc/return_volume() + return max(0, volume) -/datum/gas_mixture/proc/set_min_heat_capacity(n) -/datum/gas_mixture/proc/set_temperature(new_temp) -/datum/gas_mixture/proc/set_volume(new_volume) -/datum/gas_mixture/proc/get_moles(gas_type) -/datum/gas_mixture/proc/get_by_flag(flag) -/datum/gas_mixture/proc/set_moles(gas_type, moles) -/datum/gas_mixture/proc/scrub_into(datum/gas_mixture/target, ratio, list/gases) -/datum/gas_mixture/proc/mark_immutable() -/datum/gas_mixture/proc/get_gases() -/datum/gas_mixture/proc/add(amt) -/datum/gas_mixture/proc/subtract(amt) -/datum/gas_mixture/proc/multiply(factor) -/datum/gas_mixture/proc/divide(factor) -/datum/gas_mixture/proc/get_last_share() -/datum/gas_mixture/proc/clear() + /// Calculate thermal energy in joules +/datum/gas_mixture/proc/thermal_energy() + return THERMAL_ENERGY(src) //see code/__DEFINES/atmospherics.dm; use the define in performance critical areas -/datum/gas_mixture/proc/adjust_moles(gas_type, amt = 0) - set_moles(gas_type, clamp(get_moles(gas_type) + amt,0,INFINITY)) + ///Update archived versions of variables. Returns: 1 in all cases +/datum/gas_mixture/proc/archive() + var/list/cached_gases = gases -/datum/gas_mixture/proc/adjust_moles_temp(gas_type, amt, temperature) + temperature_archived = temperature + for(var/id in cached_gases) + cached_gases[id][ARCHIVE] = cached_gases[id][MOLES] -/datum/gas_mixture/proc/adjust_multi() + return TRUE -/datum/gas_mixture/proc/return_volume() //liters + ///Merges all air from giver into self. Deletes giver. Returns: 1 if we are mutable, 0 otherwise +/datum/gas_mixture/proc/merge(datum/gas_mixture/giver) + if(!giver) + return FALSE -/datum/gas_mixture/proc/thermal_energy() //joules + //heat transfer + if(abs(temperature - giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/self_heat_capacity = heat_capacity() + var/giver_heat_capacity = giver.heat_capacity() + var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity + if(combined_heat_capacity) + temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity + + var/list/cached_gases = gases //accessing datum vars is slower than proc vars + var/list/giver_gases = giver.gases + //gas transfer + for(var/giver_id in giver_gases) + ASSERT_GAS_IN_LIST(giver_id, cached_gases) + cached_gases[giver_id][MOLES] += giver_gases[giver_id][MOLES] + + return TRUE + + ///Proportionally removes amount of gas from the gas_mixture. + ///Returns: gas_mixture with the gases removed +/datum/gas_mixture/proc/remove(amount) + var/sum + var/list/cached_gases = gases + TOTAL_MOLES(cached_gases, sum) + amount = min(amount, sum) //Can not take more air than tile has! + if(amount <= 0) + return null + var/datum/gas_mixture/removed = new type + var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars -/datum/gas_mixture/proc/archive() - //Update archived versions of variables - //Returns: 1 in all cases + removed.temperature = temperature + for(var/id in cached_gases) + ADD_GAS(id, removed.gases) + removed_gases[id][MOLES] = QUANTIZE((cached_gases[id][MOLES] / sum) * amount) + cached_gases[id][MOLES] -= removed_gases[id][MOLES] + garbage_collect() -/datum/gas_mixture/proc/merge(datum/gas_mixture/giver) - //Merges all air from giver into self. Does NOT delete the giver. - //Returns: 1 if we are mutable, 0 otherwise + return removed -/datum/gas_mixture/proc/remove(amount) - //Proportionally removes amount of gas from the gas_mixture - //Returns: gas_mixture with the gases removed + ///Proportionally removes amount of gas from the gas_mixture. + ///Returns: gas_mixture with the gases removed +/datum/gas_mixture/proc/remove_ratio(ratio) + if(ratio <= 0) + return null + ratio = min(ratio, 1) -/datum/gas_mixture/proc/remove_by_flag(flag, amount) - //Removes amount of gas from the gas mixture by flag - //Returns: gas_mixture with gases that match the flag removed + var/list/cached_gases = gases + var/datum/gas_mixture/removed = new type + var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars -/datum/gas_mixture/proc/transfer_to(datum/gas_mixture/target, amount) + removed.temperature = temperature + for(var/id in cached_gases) + ADD_GAS(id, removed.gases) + removed_gases[id][MOLES] = QUANTIZE(cached_gases[id][MOLES] * ratio) + cached_gases[id][MOLES] -= removed_gases[id][MOLES] -/datum/gas_mixture/proc/transfer_ratio_to(datum/gas_mixture/target, ratio) - //Transfers ratio of gas to target. Equivalent to target.merge(remove_ratio(amount)) but faster. + garbage_collect() -/datum/gas_mixture/proc/remove_ratio(ratio) - //Proportionally removes amount of gas from the gas_mixture - //Returns: gas_mixture with the gases removed + return removed + + ///Removes an amount of a specific gas from the gas_mixture. + ///Returns: gas_mixture with the gas removed +/datum/gas_mixture/proc/remove_specific(gas_id, amount) + var/list/cached_gases = gases + amount = min(amount, cached_gases[gas_id][MOLES]) + if(amount <= 0) + return null + var/datum/gas_mixture/removed = new type + var/list/removed_gases = removed.gases + removed.temperature = temperature + ADD_GAS(gas_id, removed.gases) + removed_gases[gas_id][MOLES] = amount + cached_gases[gas_id][MOLES] -= amount + + garbage_collect(list(gas_id)) + return removed + ///Distributes the contents of two mixes equally between themselves + //Returns: bool indicating whether gases moved between the two mixes +/datum/gas_mixture/proc/equalize(datum/gas_mixture/other) + . = FALSE + if(abs(return_temperature() - other.return_temperature()) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) + . = TRUE + var/self_heat_cap = heat_capacity() + var/other_heat_cap = other.heat_capacity() + var/new_temp = (temperature * self_heat_cap + other.temperature * other_heat_cap) / (self_heat_cap + other_heat_cap) + temperature = new_temp + other.temperature = new_temp + + var/min_p_delta = 0.1 + var/total_volume = volume + other.volume + var/list/gas_list = gases | other.gases + for(var/gas_id in gas_list) + assert_gas(gas_id) + other.assert_gas(gas_id) + //math is under the assumption temperatures are equal + if(abs(gases[gas_id][MOLES] / volume - other.gases[gas_id][MOLES] / other.volume) > min_p_delta / (R_IDEAL_GAS_EQUATION * temperature)) + . = TRUE + var/total_moles = gases[gas_id][MOLES] + other.gases[gas_id][MOLES] + gases[gas_id][MOLES] = total_moles * (volume/total_volume) + other.gases[gas_id][MOLES] = total_moles * (other.volume/total_volume) + + + ///Creates new, identical gas mixture + ///Returns: duplicate gas mixture /datum/gas_mixture/proc/copy() - //Creates new, identical gas mixture - //Returns: duplicate gas mixture + // Type as /list/list to make spacemandmm happy with the inlined access we do down there + var/list/list/cached_gases = gases + var/datum/gas_mixture/copy = new type + var/list/copy_gases = copy.gases -/datum/gas_mixture/proc/copy_from(datum/gas_mixture/sample) - //Copies variables from sample - //Returns: 1 if we are mutable, 0 otherwise + copy.temperature = temperature + for(var/id in cached_gases) + // Sort of a sideways way of doing ADD_GAS() + // Faster tho, gotta save those cpu cycles + copy_gases[id] = cached_gases[id].Copy() + copy_gases[id][ARCHIVE] = 0 -/datum/gas_mixture/proc/copy_from_turf(turf/model) - //Copies all gas info from the turf into the gas list along with temperature - //Returns: 1 if we are mutable, 0 otherwise + return copy -/datum/gas_mixture/proc/parse_gas_string(gas_string) - //Copies variables from a particularly formatted string. - //Returns: 1 if we are mutable, 0 otherwise -/datum/gas_mixture/proc/share(datum/gas_mixture/sharer) - //Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length - //Returns: amount of gas exchanged (+ if sharer received) +///Copies variables from sample +///Returns: TRUE if we are mutable, FALSE otherwise +/datum/gas_mixture/proc/copy_from(datum/gas_mixture/sample) + var/list/cached_gases = gases //accessing datum vars is slower than proc vars + // Type as /list/list to make spacemandmm happy with the inlined access we do down there + var/list/list/sample_gases = sample.gases -/datum/gas_mixture/proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - //Performs temperature sharing calculations (via conduction) between two gas_mixtures assuming only 1 boundary length - //Returns: new temperature of the sharer + //remove all gases + cached_gases.Cut() -/datum/gas_mixture/proc/compare(datum/gas_mixture/sample) - //Compares sample to self to see if within acceptable ranges that group processing may be enabled - //Returns: a string indicating what check failed, or "" if check passes + temperature = sample.temperature + for(var/id in sample_gases) + cached_gases[id] = sample_gases[id].Copy() + cached_gases[id][ARCHIVE] = 0 + + return TRUE + +///Copies variables from sample, moles multiplicated by partial +///Returns: TRUE if we are mutable, FALSE otherwise +/datum/gas_mixture/proc/copy_from_ratio(datum/gas_mixture/sample, partial = 1) + var/list/cached_gases = gases //accessing datum vars is slower than proc vars + var/list/sample_gases = sample.gases -/datum/gas_mixture/proc/react(turf/open/dump_location) - //Performs various reactions such as combustion or fusion (LOL) - //Returns: 1 if any reaction took place; 0 otherwise + //remove all gases not in the sample + cached_gases &= sample_gases -/datum/gas_mixture/proc/adjust_heat(amt) - //Adjusts the thermal energy of the gas mixture, rather than having to do the full calculation. - //Returns: null + temperature = sample.temperature + for(var/id in sample_gases) + ASSERT_GAS_IN_LIST(id, cached_gases) + cached_gases[id][MOLES] = sample_gases[id][MOLES] * partial -/datum/gas_mixture/proc/equalize_with(datum/gas_mixture/giver) - //Makes this mix have the same temperature and gas ratios as the giver, but with the same pressure, accounting for volume. - //Returns: null + return TRUE -/datum/gas_mixture/proc/get_oxidation_power(temp) - //Gets how much oxidation this gas can do, optionally at a given temperature. + ///Copies all gas info from the turf into the gas list along with temperature + ///Returns: TRUE if we are mutable, FALSE otherwise +/datum/gas_mixture/proc/copy_from_turf(turf/model) + parse_gas_string(model.initial_gas_mix) -/datum/gas_mixture/proc/get_fuel_amount(temp) - //Gets how much fuel for fires (not counting trit/plasma!) this gas has, optionally at a given temperature. + //acounts for changes in temperature + var/turf/model_parent = model.parent_type + if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature)) + temperature = model.temperature -/proc/equalize_all_gases_in_list(list/L) - //Makes every gas in the given list have the same pressure, temperature and gas proportions. - //Returns: null + return TRUE -/datum/gas_mixture/proc/__remove_by_flag() + ///Copies variables from a particularly formatted string. + ///Returns: 1 if we are mutable, 0 otherwise +/datum/gas_mixture/proc/parse_gas_string(gas_string) + gas_string = SSair.preprocess_gas_string(gas_string) + + var/list/gases = src.gases + var/list/gas = params2list(gas_string) + if(gas["TEMP"]) + temperature = text2num(gas["TEMP"]) + temperature_archived = temperature + gas -= "TEMP" + else // if we do not have a temp in the new gas mix lets assume room temp. + temperature = T20C + gases.Cut() + for(var/id in gas) + var/path = id + if(!ispath(path)) + path = gas_id2path(path) //a lot of these strings can't have embedded expressions (especially for mappers), so support for IDs needs to stick around + ADD_GAS(path, gases) + gases[path][MOLES] = text2num(gas[id]) + return 1 -/datum/gas_mixture/remove_by_flag(flag, amount) - var/datum/gas_mixture/removed = new type - __remove_by_flag(removed, flag, amount) +/// Performs air sharing calculations between two gas_mixtures +/// share() is communitive, which means A.share(B) needs to be the same as B.share(A) +/// If we don't retain this, we will get negative moles. Don't do it +/// Returns: amount of gas exchanged (+ if sharer received) +/datum/gas_mixture/proc/share(datum/gas_mixture/sharer, our_coeff, sharer_coeff) + var/list/cached_gases = gases + var/list/sharer_gases = sharer.gases + + var/list/only_in_sharer = sharer_gases - cached_gases + var/list/only_in_cached = cached_gases - sharer_gases + + var/temperature_delta = temperature_archived - sharer.temperature_archived + var/abs_temperature_delta = abs(temperature_delta) + + var/old_self_heat_capacity = 0 + var/old_sharer_heat_capacity = 0 + if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + old_self_heat_capacity = heat_capacity() + old_sharer_heat_capacity = sharer.heat_capacity() + + var/heat_capacity_self_to_sharer = 0 //heat capacity of the moles transferred from us to the sharer + var/heat_capacity_sharer_to_self = 0 //heat capacity of the moles transferred from the sharer to us + + var/moved_moles = 0 + var/abs_moved_moles = 0 + + //GAS TRANSFER + + //Prep + for(var/id in only_in_sharer) //create gases not in our cache + ADD_GAS(id, cached_gases) + for(var/id in only_in_cached) //create gases not in the sharing mix + ADD_GAS(id, sharer_gases) + + for(var/id in cached_gases) //transfer gases + var/gas = cached_gases[id] + var/sharergas = sharer_gases[id] + var/delta = QUANTIZE(gas[ARCHIVE] - sharergas[ARCHIVE]) //the amount of gas that gets moved between the mixtures + + if(!delta) + continue + + // If we have more gas then they do, gas is moving from us to them + // This means we want to scale it by our coeff. Vis versa for their case + if(delta > 0) + delta = delta * our_coeff + else + delta = delta * sharer_coeff + + if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/gas_heat_capacity = delta * gas[GAS_META][META_GAS_SPECIFIC_HEAT] + if(delta > 0) + heat_capacity_self_to_sharer += gas_heat_capacity + else + heat_capacity_sharer_to_self -= gas_heat_capacity //subtract here instead of adding the absolute value because we know that delta is negative. + + gas[MOLES] -= delta + sharergas[MOLES] += delta + moved_moles += delta + abs_moved_moles += abs(delta) + + last_share = abs_moved_moles + + //THERMAL ENERGY TRANSFER + if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer + var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self + + //transfer of thermal energy (via changed heat capacity) between self and sharer + if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY) + temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity + + if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) + sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity + //thermal energy of the system (self and sharer) is unchanged + + if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY) + if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.1) // <10% change in sharer heat capacity + temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT) + + if(length(only_in_sharer + only_in_cached)) //if all gases were present in both mixtures, we know that no gases are 0 + garbage_collect(only_in_cached) //any gases the sharer had, we are guaranteed to have. gases that it didn't have we are not. + sharer.garbage_collect(only_in_sharer) //the reverse is equally true + else if (initial(sharer.gc_share)) + sharer.garbage_collect() + + if(temperature_delta > MINIMUM_TEMPERATURE_TO_MOVE || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) + var/our_moles + TOTAL_MOLES(cached_gases,our_moles) + var/their_moles + TOTAL_MOLES(sharer_gases,their_moles) + return (temperature_archived*(our_moles + moved_moles) - sharer.temperature_archived*(their_moles - moved_moles)) * R_IDEAL_GAS_EQUATION / volume + + ///Performs temperature sharing calculations (via conduction) between two gas_mixtures assuming only 1 boundary length + ///Returns: new temperature of the sharer +/datum/gas_mixture/proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) + //transfer of thermal energy (via conduction) between self and sharer + if(sharer) + sharer_temperature = sharer.temperature_archived + var/temperature_delta = temperature_archived - sharer_temperature + if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/self_heat_capacity = heat_capacity(ARCHIVE) + sharer_heat_capacity = sharer_heat_capacity || sharer.heat_capacity(ARCHIVE) + + if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) + var/heat = conduction_coefficient*temperature_delta* \ + (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) + + temperature = max(temperature - heat/self_heat_capacity, TCMB) + sharer_temperature = max(sharer_temperature + heat/sharer_heat_capacity, TCMB) + if(sharer) + sharer.temperature = sharer_temperature + if (initial(sharer.gc_share)) + sharer.garbage_collect() + return sharer_temperature + //thermal energy of the system (self and sharer) is unchanged + + ///Compares sample to self to see if within acceptable ranges that group processing may be enabled + ///Returns: a string indicating what check failed, or "" if check passes +/datum/gas_mixture/proc/compare(datum/gas_mixture/sample) + var/list/sample_gases = sample.gases //accessing datum vars is slower than proc vars + var/list/cached_gases = gases + var/moles_sum = 0 + + for(var/id in cached_gases | sample_gases) // compare gases from either mixture + // Yes this is actually fast. I too hate it here + var/gas_moles = cached_gases[id]?[MOLES] || 0 + var/sample_moles = sample_gases[id]?[MOLES] || 0 + // Brief explanation. We are much more likely to not pass this first check then pass the first and fail the second + // Because of this, double calculating the delta is FASTER then inserting it into a var + if(abs(gas_moles - sample_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) + if(abs(gas_moles - sample_moles) > gas_moles * MINIMUM_AIR_RATIO_TO_MOVE) + return id + // similarly, we will rarely get cut off, so this is cheaper then doing it later + moles_sum += gas_moles + + if(moles_sum > MINIMUM_MOLES_DELTA_TO_MOVE) //Don't consider temp if there's not enough mols + if(abs(temperature - sample.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) + return "temp" + + return "" + + ///Performs various reactions such as combustion or fusion (LOL) + ///Returns: 1 if any reaction took place; 0 otherwise +/datum/gas_mixture/proc/react(datum/holder) + . = NO_REACTION + var/list/cached_gases = gases + if(!length(cached_gases)) + return - return removed + var/list/maximum = list() + var/list/pre_formation = list() + var/list/mid_formation = list() + var/list/post_formation = list() + var/list/fires = list() + var/list/gas_reactions = SSair.gas_reactions + for(var/gas_id in cached_gases) + var/list/reaction_set = gas_reactions[gas_id] + if(!reaction_set) + continue + pre_formation += reaction_set[1] + mid_formation += reaction_set[2] + post_formation += reaction_set[3] + fires += reaction_set[4] + + var/list/reactions = pre_formation + mid_formation + post_formation + fires + + if(!length(reactions)) + return -/datum/gas_mixture/proc/__remove() -/datum/gas_mixture/remove(amount) - var/datum/gas_mixture/removed = new type - __remove(removed, amount) + //Fuck you + if(cached_gases[/datum/gas/hypernoblium] && cached_gases[/datum/gas/hypernoblium][MOLES] >= REACTION_OPPRESSION_THRESHOLD && temperature > 20) + return STOP_REACTIONS - return removed + reaction_results = new + //It might be worth looking into updating these after each reaction, but that makes us care more about order of operations, so be careful + var/temp = temperature + reaction_loop: + for(var/datum/gas_reaction/reaction as anything in reactions) + + var/list/reqs = reaction.requirements + if((reqs["MIN_TEMP"] && temp < reqs["MIN_TEMP"]) || (reqs["MAX_TEMP"] && temp > reqs["MAX_TEMP"])) + continue + + for(var/id in reqs) + if (id == "MIN_TEMP" || id == "MAX_TEMP") + continue + if(!cached_gases[id] || cached_gases[id][MOLES] < reqs[id]) + continue reaction_loop + + //at this point, all requirements for the reaction are satisfied. we can now react() + . |= reaction.react(src, holder) + + + if(.) //If we changed the mix to any degree + garbage_collect() + + +/** + * Takes the amount of the gas you want to PP as an argument + * So I don't have to do some hacky switches/defines/magic strings + * eg: + * Plas_PP = get_partial_pressure(gas_mixture.plasma) + * O2_PP = get_partial_pressure(gas_mixture.oxygen) + * get_breath_partial_pressure(gas_pp) --> gas_pp/total_moles()*breath_pp = pp + * get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() + * + * 10/20*5 = 2.5 + * 10 = 2.5/5*20 + */ + +/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure) + return (gas_pressure * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME +///inverse +/datum/gas_mixture/proc/get_true_breath_pressure(partial_pressure) + return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * temperature) + +/** + * Counts how much pressure will there be if we impart MOLAR_ACCURACY amounts of our gas to the output gasmix. + * We do all of this without actually transferring it so dont worry about it changing the gasmix. + * Returns: Resulting pressure (number). + * Args: + * - output_air (gasmix). + */ +/datum/gas_mixture/proc/gas_pressure_minimum_transfer(datum/gas_mixture/output_air) + var/resulting_energy = output_air.thermal_energy() + (MOLAR_ACCURACY / total_moles() * thermal_energy()) + var/resulting_capacity = output_air.heat_capacity() + (MOLAR_ACCURACY / total_moles() * heat_capacity()) + return (output_air.total_moles() + MOLAR_ACCURACY) * R_IDEAL_GAS_EQUATION * (resulting_energy / resulting_capacity) / output_air.volume + + +/** Returns the amount of gas to be pumped to a specific container. + * Args: + * - output_air. The gas mix we want to pump to. + * - target_pressure. The target pressure we want. + * - ignore_temperature. Returns a cheaper form of gas calculation, useful if the temperature difference between the two gasmixes is low or nonexistant. + */ +/datum/gas_mixture/proc/gas_pressure_calculate(datum/gas_mixture/output_air, target_pressure, ignore_temperature = FALSE) + if((total_moles() <= 0) || (temperature <= 0)) + return FALSE -/datum/gas_mixture/proc/__remove_ratio() -/datum/gas_mixture/remove_ratio(ratio) - var/datum/gas_mixture/removed = new type - __remove_ratio(removed, ratio) + var/pressure_delta = 0 + if((output_air.temperature <= 0) || (output_air.total_moles() <= 0)) + ignore_temperature = TRUE + pressure_delta = target_pressure + else + pressure_delta = target_pressure - output_air.return_pressure() - return removed + if(pressure_delta < 0.01 || gas_pressure_minimum_transfer(output_air) > target_pressure) + return FALSE -/datum/gas_mixture/copy() - var/datum/gas_mixture/copy = new type - copy.copy_from(src) + if(ignore_temperature) + return (pressure_delta*output_air.volume)/(temperature * R_IDEAL_GAS_EQUATION) + + // Lower and upper bound for the moles we must transfer to reach the pressure. The answer is bound to be here somewhere. + var/pv = target_pressure * output_air.volume + var/rt_low = R_IDEAL_GAS_EQUATION * max(temperature, output_air.temperature) // Low refers to the resulting mole, this number is actually higher. + var/rt_high = R_IDEAL_GAS_EQUATION * min(temperature, output_air.temperature) + // These works by assuming our gas has extremely high heat capacity + // and the resultant gasmix will hit either the highest or lowest temperature possible. + var/lower_limit = max((pv / rt_low) - output_air.total_moles(), 0) + var/upper_limit = (pv / rt_high) - output_air.total_moles() // In theory this should never go below zero, the pressure_delta check above should account for this. + + /* + * We have PV=nRT as a nice formula, we can rearrange it into nT = PV/R + * But now both n and T can change, since any incoming moles also change our temperature. + * So we need to unify both our n and T, somehow. + * + * We can rewrite T as (our old thermal energy + incoming thermal energy) divided by (our old heat capacity + incoming heat capacity) + * T = (W1 + n/N2 * W2) / (C1 + n/N2 * C2). C being heat capacity, W being work, N being total moles. + * + * In total we now have our equation be: (N1 + n) * (W1 + n/N2 * W2) / (C1 + n/N2 * C2) = PV/R + * Now you can rearrange this and find out that it's a quadratic equation and pretty much solvable with the formula. Will be a bit messy though. + * + * W2/N2n^2 + + * (N1*W2/N2)n + W1n - ((PV/R)*C2/N2)n + + * (-(PV/R)*C1) + N1W1 = 0 + * + * We will represent each of these terms with A, B, and C. A for the n^2 part, B for the n^1 part, and C for the n^0 part. + * We then put this into the famous (-b +/- sqrt(b^2-4ac)) / 2a formula. + * + * Oh, and one more thing. By "our" we mean the gasmix in the argument. We are the incoming one here. We are number 2, target is number 1. + * If all this counting fucks up, we revert first to Newton's approximation, then the old simple formula. + */ + + // Our thermal energy and moles + var/w2 = thermal_energy() + var/n2 = total_moles() + var/c2 = heat_capacity() + + // Target thermal energy and moles + var/w1 = output_air.thermal_energy() + var/n1 = output_air.total_moles() + var/c1 = output_air.heat_capacity() + + /// The PV/R part in our equation. + var/pvr = pv / R_IDEAL_GAS_EQUATION + + /// x^2 in the quadratic + var/a_value = w2/n2 + /// x^1 in the quadratic + var/b_value = ((n1*w2)/n2) + w1 - (pvr*c2/n2) + /// x^0 in the quadratic + var/c_value = (-1*pvr*c1) + n1 * w1 + + . = gas_pressure_quadratic(a_value, b_value, c_value, lower_limit, upper_limit) + if(.) + return + . = gas_pressure_approximate(a_value, b_value, c_value, lower_limit, upper_limit) + if(.) + return + // Inaccurate and will probably explode but whatever. + return (pressure_delta*output_air.volume)/(temperature * R_IDEAL_GAS_EQUATION) + +/// Actually tries to solve the quadratic equation. +/// Do mind that the numbers can get very big and might hit BYOND's single point float limit. +/datum/gas_mixture/proc/gas_pressure_quadratic(a, b, c, lower_limit, upper_limit) + var/solution + if(!IS_INF_OR_NAN(a) && !IS_INF_OR_NAN(b) && !IS_INF_OR_NAN(c)) + solution = max(SolveQuadratic(a, b, c)) + if((solution > lower_limit) && (solution < upper_limit)) //SolveQuadratic can return nulls so be careful here + return solution + stack_trace("Failed to solve pressure quadratic equation. A: [a]. B: [b]. C:[c]. Current value = [solution]. Expected lower limit: [lower_limit]. Expected upper limit: [upper_limit].") + return FALSE - return copy +/// Approximation of the quadratic equation using Newton-Raphson's Method. +/// We use the slope of an approximate value to get closer to the root of a given equation. +/datum/gas_mixture/proc/gas_pressure_approximate(a, b, c, lower_limit, upper_limit) + var/solution + if(!IS_INF_OR_NAN(a) && !IS_INF_OR_NAN(b) && !IS_INF_OR_NAN(c)) + /// We need to start off at a reasonably good estimate. For very big numbers the amount of moles is most likely small so better start with lower_limit. + solution = lower_limit + for (var/iteration in 1 to ATMOS_PRESSURE_APPROXIMATION_ITERATIONS) + var/diff = (a*solution**2 + b*solution + c) / (2*a*solution + b) // f(sol) / f'(sol) + solution -= diff // xn+1 = xn - f(sol) / f'(sol) + if(abs(diff) < MOLAR_ACCURACY && (solution > lower_limit) && (solution < upper_limit)) + return solution + stack_trace("Newton's Approximation for pressure failed after [ATMOS_PRESSURE_APPROXIMATION_ITERATIONS] iterations. A: [a]. B: [b]. C:[c]. Current value: [solution]. Expected lower limit: [lower_limit]. Expected upper limit: [upper_limit].") + return FALSE -/datum/gas_mixture/copy_from_turf(turf/model) - set_temperature(initial(model.initial_temperature)) - parse_gas_string(model.initial_gas_mix) - return 1 +/datum/gas_mixture/proc/remove_specific_ratio(gas_id, ratio) + if(ratio <= 0) + return null + ratio = min(ratio, 1) -/datum/gas_mixture/proc/__auxtools_parse_gas_string(gas_string) + var/list/cached_gases = gases + var/datum/gas_mixture/removed = new type + var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars -/datum/gas_mixture/parse_gas_string(gas_string) - return __auxtools_parse_gas_string(gas_string) + removed.temperature = temperature + ADD_GAS(gas_id, removed.gases) + removed_gases[gas_id][MOLES] = QUANTIZE(cached_gases[gas_id][MOLES] * ratio) + cached_gases[gas_id][MOLES] -= removed_gases[gas_id][MOLES] -/datum/gas_mixture/proc/set_analyzer_results(instability) - if(!analyzer_results) - analyzer_results = new - analyzer_results["fusion"] = instability + garbage_collect(list(gas_id)) -//Mathematical proofs: -/* -get_breath_partial_pressure(gas_pp) --> gas_pp/total_moles()*breath_pp = pp -get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() + return removed -10/20*5 = 2.5 -10 = 2.5/5*20 -*/ +/// Pumps gas from src to output_air. Amount depends on target_pressure +/datum/gas_mixture/proc/pump_gas_to(datum/gas_mixture/output_air, target_pressure, specific_gas = null) + var/temperature_delta = abs(temperature - output_air.temperature) + var/datum/gas_mixture/removed + var/transfer_moles + + if(specific_gas) + // This is necessary because the specific heat capacity of a gas might be different from our gasmix. + var/datum/gas_mixture/temporary = remove_specific_ratio(specific_gas, 1) + transfer_moles = temporary.gas_pressure_calculate(output_air, target_pressure, temperature_delta <= 5) + removed = temporary.remove_specific(specific_gas, transfer_moles) + else + transfer_moles = gas_pressure_calculate(output_air, target_pressure, temperature_delta <= 5) + removed = remove(transfer_moles) + + if(!removed) + return FALSE -/datum/gas_mixture/turf + output_air.merge(removed) + return TRUE /// Releases gas from src to output air. This means that it can not transfer air to gas mixture with higher pressure. -/datum/gas_mixture/proc/release_gas_to(datum/gas_mixture/output_air, target_pressure) +/datum/gas_mixture/proc/release_gas_to(datum/gas_mixture/output_air, target_pressure, rate=1) var/output_starting_pressure = output_air.return_pressure() var/input_starting_pressure = return_pressure() + //Need at least 10 KPa difference to overcome friction in the mechanism if(output_starting_pressure >= min(target_pressure,input_starting_pressure-10)) - //No need to pump gas if target is already reached or input pressure is too low - //Need at least 10 kPa difference to overcome friction in the mechanism return FALSE + //Can not have a pressure delta that would cause output_pressure > input_pressure + target_pressure = output_starting_pressure + min(target_pressure - output_starting_pressure, (input_starting_pressure - output_starting_pressure)/2) + var/temperature_delta = abs(temperature - output_air.temperature) - //Calculate necessary moles to transfer using PV = nRT - if((total_moles() > 0) && (return_temperature()>0)) - var/pressure_delta = min(target_pressure - output_starting_pressure, (input_starting_pressure - output_starting_pressure)/2) - //Can not have a pressure delta that would cause output_pressure > input_pressure + var/transfer_moles = gas_pressure_calculate(output_air, target_pressure, temperature_delta <= 5) - var/transfer_moles = pressure_delta*output_air.return_volume()/(return_temperature() * R_IDEAL_GAS_EQUATION) + //Actually transfer the gas + var/datum/gas_mixture/removed = remove(transfer_moles * rate) - //Actually transfer the gas - var/datum/gas_mixture/removed = remove(transfer_moles) - output_air.merge(removed) - return TRUE - return FALSE + if(!removed) + return FALSE + + output_air.merge(removed) + return TRUE + +/datum/gas_mixture/proc/scrub_into(datum/gas_mixture/target, ratio, list/gases) + for (var/gas in gases) + transfer_ratio_to(target, ratio) + +/datum/gas_mixture/proc/transfer_to(datum/gas_mixture/receiver, var/moles) + return receiver.merge(remove(moles)) -/datum/gas_mixture/proc/vv_react(datum/holder) - return react(holder) +/datum/gas_mixture/proc/transfer_ratio_to(datum/gas_mixture/receiver, var/ratio) + return receiver.merge(remove_ratio(ratio)) diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm new file mode 100644 index 0000000000000..e20e1b487b395 --- /dev/null +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -0,0 +1,194 @@ +GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/plasma)) //the main four gases, which were at one time hardcoded +//Now this is what I call history +GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/pluoxium, /datum/gas/stimulum, /datum/gas/nitryl))) //unable to react amongst themselves + +/proc/meta_gas_list() + . = subtypesof(/datum/gas) + for(var/gas_path in .) + var/list/gas_info = new(11) + var/datum/gas/gas = gas_path + var/datum/gas/instance = new(gas_path) + + gas_info[META_GAS_SPECIFIC_HEAT] = initial(gas.specific_heat) + gas_info[META_GAS_NAME] = initial(gas.name) + + gas_info[META_GAS_MOLES_VISIBLE] = initial(gas.moles_visible) + if(initial(gas.moles_visible) != null) + gas_info[META_GAS_OVERLAY] = new /list(TOTAL_VISIBLE_STATES) + for(var/i in 1 to TOTAL_VISIBLE_STATES) + gas_info[META_GAS_OVERLAY][i] = new /obj/effect/overlay/gas(initial(gas.gas_overlay), log(4, (i+0.4*TOTAL_VISIBLE_STATES) / (0.35*TOTAL_VISIBLE_STATES)) * 255) + + gas_info[META_GAS_FUSION_POWER] = initial(gas.fusion_power) + gas_info[META_GAS_DANGER] = initial(gas.dangerous) + gas_info[META_GAS_ID] = initial(gas.id) + gas_info[META_GAS_BREATH_ALERT_INFO] = instance.breath_alert_info.Copy() + gas_info[META_GAS_BREATH_REAGENT] = initial(gas.breath_reagent) + gas_info[META_GAS_BREATH_RESULTS] = initial(gas.breath_results) + gas_info[META_GAS_BREATH_REAGENT_DANGEROUS] = initial(gas.breath_reagent_dangerous) + + .[gas_path] = gas_info + +/proc/gas_id2path(id) + var/list/meta_gas = GLOB.meta_gas_info + if(id in meta_gas) + return id + for(var/path in meta_gas) + if(meta_gas[path][META_GAS_ID] == id) + return path + return "" + +/*||||||||||||||/----------\||||||||||||||*\ +||||||||||||||||[GAS DATUMS]|||||||||||||||| +||||||||||||||||\__________/|||||||||||||||| +||||These should never be instantiated. |||| +||||They exist only to make it easier |||| +||||to add a new gas. They are accessed |||| +||||only by meta_gas_list(). |||| +\*||||||||||||||||||||||||||||||||||||||||*/ + +/datum/gas + var/id = "" + var/specific_heat = 0 + var/name = "" + var/gas_overlay = "" //icon_state in icons/effects/atmospherics.dmi + var/moles_visible = null + var/dangerous = FALSE //currently used by canisters + var/fusion_power = 0 //How much the gas accelerates a fusion reaction + var/rarity = 0 // relative rarity compared to other gases, used when setting up the reactions list. + var/list/breath_alert_info = list() + var/breath_reagent = null + var/breath_results = null + var/breath_reagent_dangerous = null + +/datum/gas/oxygen + id = "o2" + specific_heat = 20 + name = "Oxygen" + rarity = 900 + +/datum/gas/nitrogen + id = "n2" + specific_heat = 20 + breath_alert_info = list( + not_enough_alert = list( + alert_category = "not_enough_nitro", + alert_type = /atom/movable/screen/alert/not_enough_nitro + ), + too_much_alert = list( + alert_category = "too_much_nitro", + alert_type = /atom/movable/screen/alert/too_much_nitro + ) + ) + name = "Nitrogen" + rarity = 1000 + +/datum/gas/carbon_dioxide //what the fuck is this? + id = "co2" + specific_heat = 30 + name = "Carbon Dioxide" + breath_results = /datum/gas/oxygen + breath_alert_info = list( + not_enough_alert = list( + alert_category = "not_enough_co2", + alert_type = /atom/movable/screen/alert/not_enough_co2 + ), + too_much_alert = list( + alert_category = "too_much_co2", + alert_type = /atom/movable/screen/alert/too_much_co2 + ) + ) + fusion_power = 3 + rarity = 700 + +/datum/gas/plasma + id = "plasma" + specific_heat = 200 + name = "Plasma" + gas_overlay = "plasma" + moles_visible = MOLES_GAS_VISIBLE + dangerous = TRUE + rarity = 800 + +/datum/gas/water_vapor + id = "water_vapor" + specific_heat = 40 + name = "Water Vapor" + gas_overlay = "water_vapor" + moles_visible = MOLES_GAS_VISIBLE + fusion_power = 8 + breath_reagent = /datum/reagent/water + rarity = 500 + +/datum/gas/hypernoblium + id = "nob" + specific_heat = 2000 + name = "Hyper-noblium" + gas_overlay = "freon" + moles_visible = MOLES_GAS_VISIBLE + dangerous = TRUE + fusion_power = 10 + rarity = 50 + +/datum/gas/nitrous_oxide + id = "n2o" + specific_heat = 40 + name = "Nitrous Oxide" + gas_overlay = "nitrous_oxide" + moles_visible = MOLES_GAS_VISIBLE * 2 + dangerous = TRUE + rarity = 600 + +/datum/gas/nitryl + id = "no2" + specific_heat = 20 + name = "Nitryl" + gas_overlay = "nitryl" + moles_visible = MOLES_GAS_VISIBLE + fusion_power = 15 + dangerous = TRUE + rarity = 100 + +/datum/gas/tritium + id = "tritium" + specific_heat = 10 + name = "Tritium" + gas_overlay = "tritium" + moles_visible = MOLES_GAS_VISIBLE + dangerous = TRUE + fusion_power = 1 + rarity = 300 + +/datum/gas/bz + id = "bz" + specific_heat = 20 + name = "BZ" + dangerous = TRUE + fusion_power = 8 + rarity = 400 + +/datum/gas/stimulum + id = "stim" + specific_heat = 5 + name = "Stimulum" + fusion_power = 7 + rarity = 1 + +/datum/gas/pluoxium + id = "pluox" + specific_heat = 80 + name = "Pluoxium" + fusion_power = 10 + rarity = 200 + +/obj/effect/overlay/gas + icon = 'icons/effects/atmospherics.dmi' + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + anchored = TRUE // should only appear in vis_contents, but to be safe + layer = FLY_LAYER + appearance_flags = TILE_BOUND + vis_flags = NONE + +/obj/effect/overlay/gas/New(state, alph) + . = ..() + icon_state = state + alpha = alph diff --git a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm index cd8b88d60fb49..864700f5d7ca9 100644 --- a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm +++ b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm @@ -2,35 +2,94 @@ //it can be changed, but any changes will ultimately be undone before they can have any effect /datum/gas_mixture/immutable - var/initial_temperature = 0 + var/initial_temperature + gc_share = TRUE /datum/gas_mixture/immutable/New() ..() - set_temperature(initial_temperature) - populate() - mark_immutable() + garbage_collect() -/datum/gas_mixture/immutable/proc/populate() - return +/datum/gas_mixture/immutable/garbage_collect() + temperature = initial_temperature + temperature_archived = initial_temperature + gases.Cut() + +/datum/gas_mixture/immutable/archive() + return TRUE //nothing changes, so we do nothing and the archive is successful + +/datum/gas_mixture/immutable/merge() + return FALSE //we're immutable. + +/datum/gas_mixture/immutable/share(datum/gas_mixture/sharer, our_coeff, sharer_coeff) + . = ..() + sharer.temperature = initial_temperature + garbage_collect() + +/datum/gas_mixture/immutable/react() + return FALSE //we're immutable. + +/datum/gas_mixture/immutable/copy() + return new type //we're immutable, so we can just return a new instance. + +/datum/gas_mixture/immutable/copy_from() + return FALSE //we're immutable. + +/datum/gas_mixture/immutable/copy_from_ratio() + return FALSE //we're immutable. + +/datum/gas_mixture/immutable/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) + . = ..() + temperature = initial_temperature //used by space tiles /datum/gas_mixture/immutable/space initial_temperature = TCMB -/datum/gas_mixture/immutable/space/populate() - set_min_heat_capacity(HEAT_CAPACITY_VACUUM) +/datum/gas_mixture/immutable/space/heat_capacity() + return HEAT_CAPACITY_VACUUM + +/datum/gas_mixture/immutable/space/remove() + return copy() //we're always empty, so we can just return a copy. + +/datum/gas_mixture/immutable/space/remove_ratio() + return copy() //we're always empty, so we can just return a copy. //used by cloners /datum/gas_mixture/immutable/cloner initial_temperature = T20C -/datum/gas_mixture/immutable/cloner/populate() - set_moles(GAS_N2, MOLES_O2STANDARD + MOLES_N2STANDARD) - -//breathable planet surface +//planet side stuff /datum/gas_mixture/immutable/planetary - initial_temperature = T20C + var/list/initial_gas = list() + +/datum/gas_mixture/immutable/planetary/garbage_collect() + ..() + gases.Cut() + for(var/id in initial_gas) + ADD_GAS(id, gases) + gases[id][MOLES] = initial_gas[id][MOLES] + gases[id][ARCHIVE] = initial_gas[id][ARCHIVE] + +/datum/gas_mixture/immutable/planetary/proc/parse_string_immutable(gas_string) //I know I know, I need this tho + gas_string = SSair.preprocess_gas_string(gas_string) + + var/list/mix = initial_gas + var/list/gas = params2list(gas_string) + if(gas["TEMP"]) + initial_temperature = text2num(gas["TEMP"]) + temperature_archived = initial_temperature + temperature = initial_temperature + gas -= "TEMP" + mix.Cut() + for(var/id in gas) + var/path = id + if(!ispath(path)) + path = gas_id2path(path) //a lot of these strings can't have embedded expressions (especially for mappers), so support for IDs needs to stick around + ADD_GAS(path, mix) + mix[path][MOLES] = text2num(gas[id]) + mix[path][ARCHIVE] = mix[path][MOLES] -/datum/gas_mixture/immutable/planetary/populate() - set_moles(GAS_O2, MOLES_O2STANDARD) - set_moles(GAS_N2, MOLES_N2STANDARD) + for(var/id in mix) + ADD_GAS(id, gases) + gases[id][MOLES] = mix[id][MOLES] + gases[id][ARCHIVE] = mix[id][MOLES] diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 476cb163fc20c..c314eb1b73dbb 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -2,36 +2,55 @@ #define SET_REACTION_RESULTS(amount) air.reaction_results[type] = amount /proc/init_gas_reactions() - . = list() - - for(var/r in subtypesof(/datum/gas_reaction)) - var/datum/gas_reaction/reaction = r + var/list/priority_reactions = list() + + //Builds a list of gas id to reaction group + for(var/gas_id in GLOB.meta_gas_info) + priority_reactions[gas_id] = list( + PRIORITY_PRE_FORMATION = list(), + PRIORITY_FORMATION = list(), + PRIORITY_POST_FORMATION = list(), + PRIORITY_FIRE = list() + ) + + for(var/datum/gas_reaction/reaction as anything in subtypesof(/datum/gas_reaction)) if(initial(reaction.exclude)) continue - reaction = new r - . += reaction - sortTim(., GLOBAL_PROC_REF(cmp_gas_reactions)) - -/proc/cmp_gas_reactions(list/datum/gas_reaction/a, list/datum/gas_reaction/b) // compares lists of reactions by the maximum priority contained within the list - if (!length(a) || !length(b)) - return length(b) - length(a) - var/maxa - var/maxb - for (var/datum/gas_reaction/R in a) - if (R.priority > maxa) - maxa = R.priority - for (var/datum/gas_reaction/R in b) - if (R.priority > maxb) - maxb = R.priority - return maxb - maxa + reaction = new reaction + var/datum/gas/reaction_key + for (var/req in reaction.requirements) + if (ispath(req)) + var/datum/gas/req_gas = req + if (!reaction_key || initial(reaction_key.rarity) > initial(req_gas.rarity)) + reaction_key = req_gas + reaction.major_gas = reaction_key + priority_reactions[reaction_key][reaction.priority_group] += reaction + + //Culls empty gases + for(var/gas_id in GLOB.meta_gas_info) + var/passed = FALSE + for(var/list/priority_grouping in priority_reactions[gas_id]) + if(length(priority_grouping)) + passed = TRUE + break + if(passed) + continue + priority_reactions[gas_id] = null + + return priority_reactions /datum/gas_reaction - //regarding the requirements lists: the minimum or maximum requirements must be non-zero. - //when in doubt, use MINIMUM_MOLE_COUNT. - var/list/min_requirements - var/list/max_requirements + /** + * Regarding the requirements list: the minimum or maximum requirements must be non-zero. + * When in doubt, use MINIMUM_MOLE_COUNT. + * Another thing to note is that reactions will not fire if we have any requirements outside of gas id path or MIN_TEMP or MAX_TEMP. + * More complex implementations will require modifications to gas_mixture.react() + */ + var/list/requirements + var/major_gas //the highest rarity gas used in the reaction. var/exclude = FALSE //do it this way to allow for addition/removal of reactions midmatch in the future - var/priority = 100 //lower numbers are checked/react later than higher numbers. if two reactions have the same priority they may happen in either order + ///The priority group this reaction is a part of. You can think of these as processing in batches, put your reaction into the one that's most fitting + var/priority_group var/name = "reaction" var/id = "r" @@ -43,28 +62,20 @@ /datum/gas_reaction/proc/react(datum/gas_mixture/air, atom/location) return NO_REACTION -/datum/gas_reaction/nobliumsupression - priority = INFINITY - name = "Hyper-Noblium Reaction Suppression" - id = "nobstop" - /datum/gas_reaction/nobliumsupression/init_reqs() - min_requirements = list(GAS_HYPERNOB = REACTION_OPPRESSION_THRESHOLD) + requirements = list(/datum/gas/hypernoblium = REACTION_OPPRESSION_THRESHOLD) /datum/gas_reaction/nobliumsupression/react() return STOP_REACTIONS //water vapor: puts out fires? /datum/gas_reaction/water_vapor - priority = 1 + priority_group = PRIORITY_POST_FORMATION name = "Water Vapor" id = "vapor" /datum/gas_reaction/water_vapor/init_reqs() - min_requirements = list( - GAS_H2O = MOLES_GAS_VISIBLE, - "MAX_TEMP" = WATER_VAPOR_CONDENSATION_POINT, - ) + requirements = list(/datum/gas/water_vapor = MOLES_GAS_VISIBLE) /datum/gas_reaction/water_vapor/react(datum/gas_mixture/air, datum/holder) . = NO_REACTION @@ -73,7 +84,7 @@ var/turf/open/location = holder var/consumed = 0 - switch(air.return_temperature()) + switch(air.temperature) if(-INFINITY to WATER_VAPOR_DEPOSITION_POINT) if(location?.freeze_turf()) consumed = MOLES_GAS_VISIBLE @@ -82,132 +93,136 @@ consumed = MOLES_GAS_VISIBLE if(consumed) - air.adjust_moles(GAS_H2O, -consumed) + air.gases[/datum/gas/water_vapor][MOLES] -= consumed SET_REACTION_RESULTS(consumed) . = REACTING //tritium combustion: combustion of oxygen and tritium (treated as hydrocarbons). creates hotspots. exothermic /datum/gas_reaction/nitrous_decomp - priority = 0 + priority_group = PRIORITY_POST_FORMATION name = "Nitrous Oxide Decomposition" id = "nitrous_decomp" /datum/gas_reaction/nitrous_decomp/init_reqs() - min_requirements = list( - "TEMP" = N2O_DECOMPOSITION_MIN_ENERGY, - GAS_NITROUS = MINIMUM_MOLE_COUNT + requirements = list( + /datum/gas/nitrous_oxide = MINIMUM_MOLE_COUNT, + "MIN_TEMP" = N2O_DECOMPOSITION_MIN_ENERGY ) /datum/gas_reaction/nitrous_decomp/react(datum/gas_mixture/air, datum/holder) var/energy_released = 0 - var/old_heat_capacity = air.heat_capacity() //this speeds things up because accessing datum vars is slow - var/temperature = air.return_temperature() + var/old_heat_capacity = air.heat_capacity() + var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow + var/temperature = air.temperature var/burned_fuel = 0 - burned_fuel = max(0,0.00002*(temperature-(0.00001*(temperature**2))))*air.get_moles(GAS_NITROUS) - air.set_moles(GAS_NITROUS, air.get_moles(GAS_NITROUS) - burned_fuel) + burned_fuel = max(0,0.00002 * (temperature - (0.00001 * (temperature**2)))) * cached_gases[/datum/gas/nitrous_oxide][MOLES] + if(cached_gases[/datum/gas/nitrous_oxide][MOLES] - burned_fuel < 0) + return NO_REACTION + cached_gases[/datum/gas/nitrous_oxide][MOLES] -= burned_fuel if(burned_fuel) energy_released += (N2O_DECOMPOSITION_ENERGY_RELEASED * burned_fuel) - air.set_moles(GAS_O2, air.get_moles(GAS_O2) + burned_fuel/2) - air.set_moles(GAS_N2, air.get_moles(GAS_N2) + burned_fuel) + ADD_MOLES(/datum/gas/oxygen, air, burned_fuel * 0.5) + ADD_MOLES(/datum/gas/nitrogen, air, burned_fuel) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.set_temperature((temperature*old_heat_capacity + energy_released)/new_heat_capacity) + air.temperature = (temperature * old_heat_capacity + energy_released) / new_heat_capacity return REACTING return NO_REACTION + //tritium combustion: combustion of oxygen and tritium (treated as hydrocarbons). creates hotspots. exothermic /datum/gas_reaction/tritfire - priority = -1 //fire should ALWAYS be last, but tritium fires happen before plasma fires + priority_group = PRIORITY_FIRE name = "Tritium Combustion" id = "tritfire" /datum/gas_reaction/tritfire/init_reqs() - min_requirements = list( - "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST, - GAS_TRITIUM = MINIMUM_MOLE_COUNT, - GAS_O2 = MINIMUM_MOLE_COUNT + requirements = list( + /datum/gas/tritium = MINIMUM_MOLE_COUNT, + /datum/gas/oxygen = MINIMUM_MOLE_COUNT, + "MIN_TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST ) -/proc/fire_expose(turf/open/location, datum/gas_mixture/air, temperature) - if(istype(location) && temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - location.hotspot_expose(temperature, CELL_VOLUME) - for(var/I in location) - var/atom/movable/item = I - item.temperature_expose(air, temperature, CELL_VOLUME) - location.temperature_expose(air, temperature, CELL_VOLUME) - -/proc/radiation_burn(turf/open/location, energy_released) - if(istype(location) && prob(10)) - radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR) - /datum/gas_reaction/tritfire/react(datum/gas_mixture/air, datum/holder) var/energy_released = 0 var/old_heat_capacity = air.heat_capacity() - var/temperature = air.return_temperature() + var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow + var/temperature = air.temperature var/list/cached_results = air.reaction_results cached_results["fire"] = 0 var/turf/open/location = isturf(holder) ? holder : null var/burned_fuel = 0 - var/initial_trit = air.get_moles(GAS_TRITIUM)// Yogs - if(air.get_moles(GAS_O2) < initial_trit || MINIMUM_TRIT_OXYBURN_ENERGY > (temperature * old_heat_capacity))// Yogs -- Maybe a tiny performance boost? I'unno - burned_fuel = air.get_moles(GAS_O2)/TRITIUM_BURN_OXY_FACTOR - if(burned_fuel > initial_trit) burned_fuel = initial_trit //Yogs -- prevents negative moles of Tritium - air.adjust_moles(GAS_TRITIUM, -burned_fuel) - else - burned_fuel = initial_trit // Yogs -- Conservation of Mass fix - air.set_moles(GAS_TRITIUM, air.get_moles(GAS_TRITIUM) * (1 - 1/TRITIUM_BURN_TRIT_FACTOR)) // Yogs -- Maybe a tiny performance boost? I'unno - air.adjust_moles(GAS_O2, -air.get_moles(GAS_TRITIUM)) - energy_released += (FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel * (TRITIUM_BURN_TRIT_FACTOR - 1)) // Yogs -- Fixes low-energy tritium fires - if(burned_fuel) - energy_released += (FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel) - if(location && prob(10) && burned_fuel > TRITIUM_MINIMUM_RADIATION_ENERGY) //woah there let's not crash the server - radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR) + if(cached_gases[/datum/gas/oxygen][MOLES] < cached_gases[/datum/gas/tritium][MOLES] || MINIMUM_TRIT_OXYBURN_ENERGY > air.thermal_energy()) + burned_fuel = cached_gases[/datum/gas/oxygen][MOLES] / TRITIUM_BURN_OXY_FACTOR + cached_gases[/datum/gas/tritium][MOLES] -= burned_fuel - //oxygen+more-or-less hydrogen=H2O - air.adjust_moles(GAS_H2O, burned_fuel )// Yogs -- Conservation of Mass + ADD_MOLES(/datum/gas/water_vapor, air, burned_fuel/TRITIUM_BURN_OXY_FACTOR) + energy_released += (FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel) cached_results["fire"] += burned_fuel + else + burned_fuel = cached_gases[/datum/gas/tritium][MOLES] + + cached_gases[/datum/gas/tritium][MOLES] -= burned_fuel / TRITIUM_BURN_TRIT_FACTOR + cached_gases[/datum/gas/oxygen][MOLES] -= burned_fuel + + ADD_MOLES(/datum/gas/water_vapor, air, burned_fuel/TRITIUM_BURN_OXY_FACTOR) + + energy_released += (FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel) + cached_results["fire"] += burned_fuel * 10 + + if(burned_fuel) + if(location && prob(10) && burned_fuel > TRITIUM_MINIMUM_RADIATION_ENERGY) //woah there let's not crash the server + radiation_pulse(location, energy_released / TRITIUM_BURN_RADIOACTIVITY_FACTOR) + if(energy_released > 0) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.set_temperature((temperature*old_heat_capacity + energy_released)/new_heat_capacity) + air.temperature = (temperature * old_heat_capacity + energy_released) / new_heat_capacity //let the floor know a fire is happening if(istype(location)) - temperature = air.return_temperature() + temperature = air.temperature if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) location.hotspot_expose(temperature, CELL_VOLUME) - for(var/I in location) - var/atom/movable/item = I - item.temperature_expose(air, temperature, CELL_VOLUME) - location.temperature_expose(air, temperature, CELL_VOLUME) return cached_results["fire"] ? REACTING : NO_REACTION +/proc/fire_expose(turf/open/location, datum/gas_mixture/air, temperature) + if(istype(location) && temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + location.hotspot_expose(temperature, CELL_VOLUME) + +/proc/radiation_burn(turf/open/location, energy_released) + if(istype(location) && prob(10)) + radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR) + + + //plasma combustion: combustion of oxygen and plasma (treated as hydrocarbons). creates hotspots. exothermic /datum/gas_reaction/plasmafire - priority = -2 //fire should ALWAYS be last, but plasma fires happen after tritium fires + priority_group = PRIORITY_FIRE name = "Plasma Combustion" id = "plasmafire" /datum/gas_reaction/plasmafire/init_reqs() - min_requirements = list( - "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST, - GAS_PLASMA = MINIMUM_MOLE_COUNT, - GAS_O2 = MINIMUM_MOLE_COUNT + requirements = list( + /datum/gas/plasma = MINIMUM_MOLE_COUNT, + /datum/gas/oxygen = MINIMUM_MOLE_COUNT, + "MIN_TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST ) /datum/gas_reaction/plasmafire/react(datum/gas_mixture/air, datum/holder) var/energy_released = 0 var/old_heat_capacity = air.heat_capacity() - var/temperature = air.return_temperature() + var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow + var/temperature = air.temperature var/list/cached_results = air.reaction_results cached_results["fire"] = 0 var/turf/open/location = isturf(holder) ? holder : null @@ -223,122 +238,41 @@ if(temperature > PLASMA_UPPER_TEMPERATURE) temperature_scale = 1 else - temperature_scale = (temperature-PLASMA_MINIMUM_BURN_TEMPERATURE)/(PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE) + temperature_scale = (temperature - PLASMA_MINIMUM_BURN_TEMPERATURE) / (PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE) if(temperature_scale > 0) oxygen_burn_rate = OXYGEN_BURN_RATE_BASE - temperature_scale - if(air.get_moles(GAS_O2) / air.get_moles(GAS_PLASMA) > SUPER_SATURATION_THRESHOLD) //supersaturation. Form Tritium. + if(cached_gases[/datum/gas/oxygen][MOLES] / cached_gases[/datum/gas/plasma][MOLES] > SUPER_SATURATION_THRESHOLD) //supersaturation. Form Tritium. super_saturation = TRUE - if(air.get_moles(GAS_O2) > air.get_moles(GAS_PLASMA)*PLASMA_OXYGEN_FULLBURN) - plasma_burn_rate = (air.get_moles(GAS_PLASMA)*temperature_scale)/PLASMA_BURN_RATE_DELTA + if(cached_gases[/datum/gas/oxygen][MOLES] > cached_gases[/datum/gas/plasma][MOLES] * PLASMA_OXYGEN_FULLBURN) + plasma_burn_rate = (cached_gases[/datum/gas/plasma][MOLES] * temperature_scale) / PLASMA_BURN_RATE_DELTA else - plasma_burn_rate = (temperature_scale*(air.get_moles(GAS_O2)/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA + plasma_burn_rate = (temperature_scale * (cached_gases[/datum/gas/oxygen][MOLES] / PLASMA_OXYGEN_FULLBURN)) / PLASMA_BURN_RATE_DELTA if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY) - plasma_burn_rate = min(plasma_burn_rate,air.get_moles(GAS_PLASMA),air.get_moles(GAS_O2)/oxygen_burn_rate) //Ensures matter is conserved properly - air.set_moles(GAS_PLASMA, QUANTIZE(air.get_moles(GAS_PLASMA) - plasma_burn_rate)) - air.set_moles(GAS_O2, QUANTIZE(air.get_moles(GAS_O2) - (plasma_burn_rate * oxygen_burn_rate))) + plasma_burn_rate = min(plasma_burn_rate, cached_gases[/datum/gas/plasma][MOLES], cached_gases[/datum/gas/oxygen][MOLES] * INVERSE(oxygen_burn_rate)) //Ensures matter is conserved properly + cached_gases[/datum/gas/plasma][MOLES] = QUANTIZE(cached_gases[/datum/gas/plasma][MOLES] - plasma_burn_rate) + cached_gases[/datum/gas/oxygen][MOLES] = QUANTIZE(cached_gases[/datum/gas/oxygen][MOLES] - (plasma_burn_rate * oxygen_burn_rate)) if (super_saturation) - air.adjust_moles(GAS_TRITIUM, plasma_burn_rate) + ADD_MOLES(/datum/gas/tritium, air, plasma_burn_rate) else - air.adjust_moles(GAS_CO2, plasma_burn_rate) + ADD_MOLES(/datum/gas/carbon_dioxide, air, plasma_burn_rate*0.75) + ADD_MOLES(/datum/gas/water_vapor, air, plasma_burn_rate*0.25) energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate) - cached_results["fire"] += (plasma_burn_rate)*(1+oxygen_burn_rate) + cached_results["fire"] += (plasma_burn_rate) * (1 + oxygen_burn_rate) if(energy_released > 0) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.set_temperature((temperature*old_heat_capacity + energy_released)/new_heat_capacity) + air.temperature = (temperature * old_heat_capacity + energy_released) / new_heat_capacity //let the floor know a fire is happening if(istype(location)) - temperature = air.return_temperature() + temperature = air.temperature if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) location.hotspot_expose(temperature, CELL_VOLUME) - for(var/I in location) - var/atom/movable/item = I - item.temperature_expose(air, temperature, CELL_VOLUME) - location.temperature_expose(air, temperature, CELL_VOLUME) - - return cached_results["fire"] ? REACTING : NO_REACTION - -/datum/gas_reaction/genericfire - priority = -3 // very last reaction - name = "Combustion" - id = "genericfire" - -/datum/gas_reaction/genericfire/init_reqs() - var/lowest_fire_temp = INFINITY - var/list/fire_temperatures = GLOB.gas_data.fire_temperatures - for(var/gas in fire_temperatures) - lowest_fire_temp = min(lowest_fire_temp, fire_temperatures[gas]) - var/lowest_oxi_temp = INFINITY - var/list/oxidation_temperatures = GLOB.gas_data.oxidation_temperatures - for(var/gas in oxidation_temperatures) - lowest_oxi_temp = min(lowest_oxi_temp, oxidation_temperatures[gas]) - min_requirements = list( - "TEMP" = max(lowest_oxi_temp, lowest_fire_temp), - "FIRE_REAGENTS" = MINIMUM_MOLE_COUNT - ) -// no requirements, always runs -// bad idea? maybe -// this is overridden by auxmos but, hey, good idea to have it readable - -/datum/gas_reaction/genericfire/react(datum/gas_mixture/air, datum/holder) - var/temperature = air.return_temperature() - var/list/oxidation_temps = GLOB.gas_data.oxidation_temperatures - var/list/oxidation_rates = GLOB.gas_data.oxidation_rates - var/oxidation_power = 0 - var/list/burn_results = list() - var/list/fuels = list() - var/list/oxidizers = list() - var/list/fuel_rates = GLOB.gas_data.fire_burn_rates - var/list/fuel_temps = GLOB.gas_data.fire_temperatures - var/total_fuel = 0 - var/energy_released = 0 - for(var/G in air.get_gases()) - var/oxidation_temp = oxidation_temps[G] - if(oxidation_temp && oxidation_temp > temperature) - var/temperature_scale = max(0, 1-(temperature / oxidation_temp)) - var/amt = air.get_moles(G) * temperature_scale - oxidizers[G] = amt - oxidation_power += amt * oxidation_rates[G] - else - var/fuel_temp = fuel_temps[G] - if(fuel_temp && fuel_temp > temperature) - var/amt = (air.get_moles(G) / fuel_rates[G]) * max(0, 1-(temperature / fuel_temp)) - fuels[G] = amt // we have to calculate the actual amount we're using after we get all oxidation together - total_fuel += amt - if(oxidation_power <= 0 || total_fuel <= 0) - return NO_REACTION - var/oxidation_ratio = oxidation_power / total_fuel - if(oxidation_ratio > 1) - for(var/oxidizer in oxidizers) - oxidizers[oxidizer] /= oxidation_ratio - else if(oxidation_ratio < 1) - for(var/fuel in fuels) - fuels[fuel] *= oxidation_ratio - fuels += oxidizers - var/list/fire_products = GLOB.gas_data.fire_products - var/list/fire_enthalpies = GLOB.gas_data.enthalpies - for(var/fuel in fuels + oxidizers) - var/amt = fuels[fuel] - if(!burn_results[fuel]) - burn_results[fuel] = 0 - burn_results[fuel] -= amt - energy_released += amt * fire_enthalpies[fuel] - for(var/product in fire_products[fuel]) - if(!burn_results[product]) - burn_results[product] = 0 - burn_results[product] += amt - var/final_energy = air.thermal_energy() + energy_released - for(var/result in burn_results) - air.adjust_moles(result, burn_results[result]) - air.set_temperature(final_energy / air.heat_capacity()) - var/list/cached_results = air.reaction_results - cached_results["fire"] = min(total_fuel, oxidation_power) * 2 return cached_results["fire"] ? REACTING : NO_REACTION //fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again (and again, and again). Again! @@ -347,16 +281,16 @@ /datum/gas_reaction/fusion exclude = FALSE - priority = 2 + priority_group = PRIORITY_POST_FORMATION name = "Plasmic Fusion" id = "fusion" /datum/gas_reaction/fusion/init_reqs() - min_requirements = list( - "TEMP" = FUSION_TEMPERATURE_THRESHOLD, - GAS_TRITIUM = FUSION_TRITIUM_MOLES_USED, - GAS_PLASMA = FUSION_MOLE_THRESHOLD, - GAS_CO2 = FUSION_MOLE_THRESHOLD) + requirements = list( + "MIN_TEMP" = FUSION_TEMPERATURE_THRESHOLD, + /datum/gas/tritium = FUSION_TRITIUM_MOLES_USED, + /datum/gas/plasma = FUSION_MOLE_THRESHOLD, + /datum/gas/carbon_dioxide = FUSION_MOLE_THRESHOLD) /datum/gas_reaction/fusion/react(datum/gas_mixture/air, datum/holder) var/turf/open/location @@ -370,18 +304,18 @@ var/list/cached_scan_results = air.analyzer_results var/thermal_energy = air.thermal_energy() var/reaction_energy = 0 //Reaction energy can be negative or positive, for both exothermic and endothermic reactions. - var/initial_plasma = air.get_moles(GAS_PLASMA) - var/initial_carbon = air.get_moles(GAS_CO2) - var/scale_factor = max(air.return_volume() / FUSION_SCALE_DIVISOR, FUSION_MINIMAL_SCALE) - var/temperature_scale = log(10, air.return_temperature()) + var/initial_plasma = GET_MOLES(/datum/gas/plasma, air) + var/initial_carbon = GET_MOLES(/datum/gas/carbon_dioxide, air) + var/scale_factor = max(air.volume / FUSION_SCALE_DIVISOR, FUSION_MINIMAL_SCALE) + var/temperature_scale = log(10, air.temperature) //The size of the phase space hypertorus var/toroidal_size = TOROID_CALCULATED_THRESHOLD \ + (temperature_scale <= FUSION_BASE_TEMPSCALE ? \ (temperature_scale-FUSION_BASE_TEMPSCALE) / FUSION_BUFFER_DIVISOR \ : 4 ** (temperature_scale-FUSION_BASE_TEMPSCALE) / FUSION_SLOPE_DIVISOR) var/gas_power = 0 - for (var/gas_id in air.get_gases()) - gas_power += (GLOB.gas_data.fusion_powers[gas_id]*air.get_moles(gas_id)) + for (var/gas_id in air.gases) + gas_power += (GLOB.meta_gas_info[gas_id][META_GAS_FUSION_POWER]*GET_MOLES(gas_id, air)) var/instability = MODULUS((gas_power*INSTABILITY_GAS_POWER_FACTOR),toroidal_size) //Instability effects how chaotic the behavior of the reaction is cached_scan_results[id] = instability//used for analyzer feedback @@ -392,9 +326,11 @@ plasma = MODULUS(plasma - (instability*sin(TODEGREES(carbon))), toroidal_size) carbon = MODULUS(carbon - plasma, toroidal_size) - air.set_moles(GAS_PLASMA, plasma*scale_factor + FUSION_MOLE_THRESHOLD )//Scales the gases back up - air.set_moles(GAS_CO2, carbon*scale_factor + FUSION_MOLE_THRESHOLD) - var/delta_plasma = min(initial_plasma - air.get_moles(GAS_PLASMA), toroidal_size * scale_factor * 1.5) + SET_MOLES(/datum/gas/plasma, air, plasma*scale_factor + FUSION_MOLE_THRESHOLD) +//Scales the gases back up + SET_MOLES(/datum/gas/carbon_dioxide, air, carbon*scale_factor + FUSION_MOLE_THRESHOLD) + + var/delta_plasma = min(initial_plasma - air.gases[/datum/gas/plasma][MOLES], toroidal_size * scale_factor * 1.5) //Energy is gained or lost corresponding to the creation or destruction of mass. //Low instability prevents endothermality while higher instability acutally encourages it. @@ -414,169 +350,176 @@ thermal_energy = middle_energy * 10 ** log(FUSION_ENERGY_TRANSLATION_EXPONENT, (thermal_energy + bowdlerized_reaction_energy) / middle_energy) //The reason why you should set up a tritium production line. - air.adjust_moles(GAS_TRITIUM, -FUSION_TRITIUM_MOLES_USED) + REMOVE_MOLES(/datum/gas/tritium, air, FUSION_TRITIUM_MOLES_USED) //The decay of the tritium and the reaction's energy produces waste gases, different ones depending on whether the reaction is endo or exothermic var/standard_waste_gas_output = scale_factor * (FUSION_TRITIUM_CONVERSION_COEFFICIENT*FUSION_TRITIUM_MOLES_USED) - delta_plasma > 0 ? air.adjust_moles(GAS_H2O, standard_waste_gas_output) : air.adjust_moles(GAS_BZ, standard_waste_gas_output) - air.adjust_moles(GAS_O2, standard_waste_gas_output) //Oxygen is a bit touchy subject + if(delta_plasma > 0) + ADD_MOLES(/datum/gas/water_vapor, air, standard_waste_gas_output) + else + ADD_MOLES(/datum/gas/bz, air, standard_waste_gas_output) + ADD_MOLES(/datum/gas/oxygen, air, standard_waste_gas_output) //Oxygen is a bit touchy subject if(reaction_energy) if(location) - var/standard_energy = 400 * air.get_moles(GAS_PLASMA) * air.return_temperature() //Prevents putting meaningless waste gases to achieve high rads. + var/standard_energy = 400 * GET_MOLES(/datum/gas/plasma, air) * air.temperature //Prevents putting meaningless waste gases to achieve high rads. if(prob(PERCENT(((PARTICLE_CHANCE_CONSTANT)/(reaction_energy-PARTICLE_CHANCE_CONSTANT)) + 1))) //Asymptopically approaches 100% as the energy of the reaction goes up. location.fire_nuclear_particle(customize = TRUE, custompower = standard_energy) radiation_pulse(location, max(2000 * 3 ** (log(10,standard_energy) - FUSION_RAD_MIDPOINT), 0)) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.set_temperature(clamp(thermal_energy/new_heat_capacity, TCMB, INFINITY)) + air.temperature = (clamp(thermal_energy/new_heat_capacity, TCMB, INFINITY)) return REACTING else if(reaction_energy == 0 && instability <= FUSION_INSTABILITY_ENDOTHERMALITY) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.set_temperature(clamp(thermal_energy/new_heat_capacity, TCMB, INFINITY)) //THIS SHOULD STAY OR FUSION WILL EAT YOUR FACE + air.temperature = (clamp(thermal_energy/new_heat_capacity, TCMB, INFINITY)) //THIS SHOULD STAY OR FUSION WILL EAT YOUR FACE return REACTING -/datum/gas_reaction/nitrylformation //The formation of nitryl. Endothermic. Requires N2O as a catalyst. - priority = 3 + +/datum/gas_reaction/nitrylformation //The formation of nitryl. Endothermic. Requires bz. + priority_group = PRIORITY_FORMATION name = "Nitryl formation" id = "nitrylformation" /datum/gas_reaction/nitrylformation/init_reqs() - min_requirements = list( - GAS_O2 = 20, - GAS_N2 = 20, - GAS_PLUOXIUM = 5, //Gates Nitryl behind pluoxium to offset N2O burning up during formation - "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST*60 + requirements = list( + /datum/gas/oxygen = 10, + /datum/gas/nitrogen = 10, + /datum/gas/bz = 5, + "MIN_TEMP" = 1500, + "MAX_TEMP" = 10000 ) /datum/gas_reaction/nitrylformation/react(datum/gas_mixture/air) - var/temperature = air.return_temperature() + var/list/cached_gases = air.gases + var/temperature = air.temperature var/old_heat_capacity = air.heat_capacity() - var/heat_efficency = min(temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*60),air.get_moles(GAS_O2),air.get_moles(GAS_N2)) - var/energy_used = heat_efficency*NITRYL_FORMATION_ENERGY - if ((air.get_moles(GAS_O2) - heat_efficency < 0 )|| (air.get_moles(GAS_N2) - heat_efficency < 0)) //Shouldn't produce gas from nothing. + var/heat_efficiency = min(temperature / (FIRE_MINIMUM_TEMPERATURE_TO_EXIST * 8), cached_gases[/datum/gas/oxygen][MOLES], cached_gases[/datum/gas/nitrogen][MOLES], cached_gases[/datum/gas/bz][MOLES] * INVERSE(0.05)) + var/energy_used = heat_efficiency * NITRYL_FORMATION_ENERGY + if ((cached_gases[/datum/gas/oxygen][MOLES] - heat_efficiency < 0 ) || (cached_gases[/datum/gas/nitrogen][MOLES] - heat_efficiency < 0) || (cached_gases[/datum/gas/bz][MOLES] - heat_efficiency * 0.05 < 0)) //Shouldn't produce gas from nothing. return NO_REACTION - air.adjust_moles(GAS_O2, -heat_efficency) - air.adjust_moles(GAS_N2, -heat_efficency) - air.adjust_moles(GAS_NITRYL, heat_efficency*2) + + cached_gases[/datum/gas/oxygen][MOLES] -= heat_efficiency + cached_gases[/datum/gas/nitrogen][MOLES] -= heat_efficiency + cached_gases[/datum/gas/bz][MOLES] -= heat_efficiency * 0.05 //bz gets consumed to balance the nitryl production and not make it too common and/or easy + ADD_MOLES(/datum/gas/nitryl, air, heat_efficiency) if(energy_used > 0) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.set_temperature(max(((temperature*old_heat_capacity - energy_used)/new_heat_capacity),TCMB)) + air.temperature = max(((temperature * old_heat_capacity - energy_used) / new_heat_capacity), TCMB) //the air cools down when reacting return REACTING /datum/gas_reaction/bzformation //Formation of BZ by combining plasma and tritium at low pressures. Exothermic. - priority = 4 + priority_group = PRIORITY_FORMATION name = "BZ Gas formation" id = "bzformation" /datum/gas_reaction/bzformation/init_reqs() - min_requirements = list( - GAS_NITROUS = 10, - GAS_PLASMA = 10 + requirements = list( + /datum/gas/nitrous_oxide = 10, + /datum/gas/plasma = 10 ) - /datum/gas_reaction/bzformation/react(datum/gas_mixture/air) - var/temperature = air.return_temperature() + var/list/cached_gases = air.gases + var/temperature = air.temperature var/pressure = air.return_pressure() var/old_heat_capacity = air.heat_capacity() - var/reaction_efficency = min(1/((pressure/(0.5*ONE_ATMOSPHERE))*(max(air.get_moles(GAS_PLASMA)/air.get_moles(GAS_NITROUS),1))),air.get_moles(GAS_NITROUS),air.get_moles(GAS_PLASMA)/2) - var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED - if ((air.get_moles(GAS_NITROUS) - reaction_efficency < 0 )|| (air.get_moles(GAS_PLASMA) - (2*reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing. + var/reaction_efficency = min(1 / ((pressure / (0.1 * ONE_ATMOSPHERE)) * (max(cached_gases[/datum/gas/plasma][MOLES] / cached_gases[/datum/gas/nitrous_oxide][MOLES], 1))), cached_gases[/datum/gas/nitrous_oxide][MOLES], cached_gases[/datum/gas/plasma][MOLES] * INVERSE(2)) + var/energy_released = 2 * reaction_efficency * FIRE_CARBON_ENERGY_RELEASED + if ((cached_gases[/datum/gas/nitrous_oxide][MOLES] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma][MOLES] - (2 * reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing. return NO_REACTION - air.adjust_moles(GAS_BZ, reaction_efficency) - if(reaction_efficency == air.get_moles(GAS_NITROUS)) - air.adjust_moles(GAS_BZ, -min(pressure,1)) - air.adjust_moles(GAS_O2, min(pressure,1)) - air.adjust_moles(GAS_NITROUS, -reaction_efficency) - air.adjust_moles(GAS_PLASMA, -2*reaction_efficency) - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min((reaction_efficency**2)*BZ_RESEARCH_SCALE,BZ_RESEARCH_MAX_AMOUNT)) - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, min((reaction_efficency**2)*BZ_RESEARCH_SCALE,BZ_RESEARCH_MAX_AMOUNT)*0.5) + ADD_MOLES(/datum/gas/bz, air, reaction_efficency * 2.5) + if(reaction_efficency == cached_gases[/datum/gas/nitrous_oxide][MOLES]) + REMOVE_MOLES(/datum/gas/bz, air, min(pressure, 0.5)) + ADD_MOLES(/datum/gas/oxygen, air, min(pressure, 0.5)) + cached_gases[/datum/gas/nitrous_oxide][MOLES] -= reaction_efficency + cached_gases[/datum/gas/plasma][MOLES] -= 2 * reaction_efficency if(energy_released > 0) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.set_temperature(max(((temperature*old_heat_capacity + energy_released)/new_heat_capacity),TCMB)) + air.temperature = max(((temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) return REACTING /datum/gas_reaction/stimformation //Stimulum formation follows a strange pattern of how effective it will be at a given temperature, having some multiple peaks and some large dropoffs. Exo and endo thermic. - priority = 5 + priority_group = PRIORITY_FORMATION name = "Stimulum formation" id = "stimformation" /datum/gas_reaction/stimformation/init_reqs() - min_requirements = list( - GAS_TRITIUM = 30, - GAS_PLASMA = 10, - GAS_BZ = 20, - GAS_NITRYL = 30, - "TEMP" = STIMULUM_HEAT_SCALE/2) + requirements = list( + /datum/gas/tritium = 30, + /datum/gas/bz = 20, + /datum/gas/nitryl = 30, + "MIN_TEMP" = 1500) /datum/gas_reaction/stimformation/react(datum/gas_mixture/air) + var/list/cached_gases = air.gases var/old_heat_capacity = air.heat_capacity() - var/heat_scale = min(air.return_temperature()/STIMULUM_HEAT_SCALE,air.get_moles(GAS_PLASMA),air.get_moles(GAS_NITRYL)) - var/stim_energy_change = heat_scale + STIMULUM_FIRST_RISE*(heat_scale**2) - STIMULUM_FIRST_DROP*(heat_scale**3) + STIMULUM_SECOND_RISE*(heat_scale**4) - STIMULUM_ABSOLUTE_DROP*(heat_scale**5) - - if ((air.get_moles(GAS_PLASMA) - heat_scale < 0) || (air.get_moles(GAS_NITRYL) - heat_scale < 0) || (air.get_moles(GAS_TRITIUM) - heat_scale < 0)) //Shouldn't produce gas from nothing. + var/heat_scale = min(air.temperature/STIMULUM_HEAT_SCALE, cached_gases[/datum/gas/tritium][MOLES], cached_gases[/datum/gas/plasma][MOLES], cached_gases[/datum/gas/nitryl][MOLES]) + var/stim_energy_change = heat_scale + STIMULUM_FIRST_RISE * (heat_scale ** 2) - STIMULUM_FIRST_DROP * (heat_scale ** 3) + STIMULUM_SECOND_RISE * (heat_scale ** 4) - STIMULUM_ABSOLUTE_DROP * (heat_scale ** 5) + if ((cached_gases[/datum/gas/tritium][MOLES] - heat_scale < 0 ) || (cached_gases[/datum/gas/nitryl][MOLES] - heat_scale < 0)) //Shouldn't produce gas from nothing. return NO_REACTION - air.adjust_moles(GAS_STIMULUM, heat_scale/10) - air.adjust_moles(GAS_PLASMA, -heat_scale) - air.adjust_moles(GAS_NITRYL, -heat_scale) - air.adjust_moles(GAS_TRITIUM, -heat_scale) - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, STIMULUM_RESEARCH_AMOUNT*max(stim_energy_change,0)) - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, STIMULUM_RESEARCH_AMOUNT*max(stim_energy_change,0)*0.5) + cached_gases[/datum/gas/tritium][MOLES] -= heat_scale + cached_gases[/datum/gas/nitryl][MOLES] -= heat_scale + ADD_MOLES(/datum/gas/stimulum, air, heat_scale*0.75) + if(stim_energy_change) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.set_temperature(max(((air.return_temperature()*old_heat_capacity + stim_energy_change)/new_heat_capacity),TCMB)) + air.temperature = max(((air.temperature * old_heat_capacity + stim_energy_change) / new_heat_capacity), TCMB) return REACTING /datum/gas_reaction/nobliumformation //Hyper-Noblium formation is extrememly endothermic, but requires high temperatures to start. Due to its high mass, hyper-nobelium uses large amounts of nitrogen and tritium. BZ can be used as a catalyst to make it less endothermic. - priority = 6 + priority_group = PRIORITY_FORMATION name = "Hyper-Noblium condensation" id = "nobformation" /datum/gas_reaction/nobliumformation/init_reqs() - min_requirements = list( - GAS_N2 = 10, - GAS_TRITIUM = 5, - "TEMP" = 5000000) + requirements = list( + /datum/gas/nitrogen = 10, + /datum/gas/tritium = 5, + "MIN_TEMP" = TCMB, + "MAX_TEMP" = 15 + ) /datum/gas_reaction/nobliumformation/react(datum/gas_mixture/air) + var/list/cached_gases = air.gases + air.assert_gases(/datum/gas/hypernoblium, /datum/gas/bz) var/old_heat_capacity = air.heat_capacity() - var/nob_formed = min((air.get_moles(GAS_N2)+air.get_moles(GAS_TRITIUM))/100,air.get_moles(GAS_TRITIUM)/10,air.get_moles(GAS_N2)/20) - var/energy_taken = nob_formed*(NOBLIUM_FORMATION_ENERGY/(max(air.get_moles(GAS_BZ),1))) - if ((air.get_moles(GAS_TRITIUM) - 10*nob_formed < 0) || (air.get_moles(GAS_N2) - 20*nob_formed < 0)) + var/nob_formed = min((cached_gases[/datum/gas/nitrogen][MOLES] + cached_gases[/datum/gas/tritium][MOLES]) * 0.01, cached_gases[/datum/gas/tritium][MOLES] * INVERSE(5), cached_gases[/datum/gas/nitrogen][MOLES] * INVERSE(10)) + var/energy_produced = nob_formed * (NOBLIUM_FORMATION_ENERGY / (max(cached_gases[/datum/gas/bz][MOLES], 1))) + if ((cached_gases[/datum/gas/tritium][MOLES] - 5 * nob_formed < 0) || (cached_gases[/datum/gas/nitrogen][MOLES] - 10 * nob_formed < 0)) return NO_REACTION - air.adjust_moles(GAS_TRITIUM, -10*nob_formed) - air.adjust_moles(GAS_N2, -20*nob_formed) - air.adjust_moles(GAS_HYPERNOB, nob_formed) - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, nob_formed*NOBLIUM_RESEARCH_AMOUNT) - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, nob_formed*NOBLIUM_RESEARCH_AMOUNT*0.5) + + cached_gases[/datum/gas/tritium][MOLES] -= 5 * nob_formed + cached_gases[/datum/gas/nitrogen][MOLES] -= 10 * nob_formed + cached_gases[/datum/gas/hypernoblium][MOLES] += nob_formed if (nob_formed) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.set_temperature(max(((air.return_temperature()*old_heat_capacity - energy_taken)/new_heat_capacity),TCMB)) + air.temperature = max(((air.temperature * old_heat_capacity + energy_produced) / new_heat_capacity), TCMB) + return REACTING /datum/gas_reaction/stim_ball - priority = 7 + priority_group = PRIORITY_POST_FORMATION name ="Stimulum Energy Ball" id = "stimball" /datum/gas_reaction/stim_ball/init_reqs() - min_requirements = list( - GAS_PLUOXIUM = STIM_BALL_GAS_AMOUNT, - GAS_STIMULUM = STIM_BALL_GAS_AMOUNT, - GAS_NITRYL = MINIMUM_MOLE_COUNT, - GAS_PLASMA = MINIMUM_MOLE_COUNT, - "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST + requirements = list( + /datum/gas/pluoxium = STIM_BALL_GAS_AMOUNT, + /datum/gas/stimulum = STIM_BALL_GAS_AMOUNT, + /datum/gas/nitryl = MINIMUM_MOLE_COUNT, + /datum/gas/plasma = MINIMUM_MOLE_COUNT, + "MIN_TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST ) /datum/gas_reaction/stim_ball/react(datum/gas_mixture/air, datum/holder) @@ -587,20 +530,20 @@ location = get_turf(pick(pipenet.members)) else location = get_turf(holder) - var/ball_shot_angle = 180*cos(air.get_moles(GAS_H2O)/air.get_moles(GAS_NITRYL))+180 - var/stim_used = min(STIM_BALL_GAS_AMOUNT/air.get_moles(GAS_PLASMA),air.get_moles(GAS_STIMULUM)) - var/pluox_used = min(STIM_BALL_GAS_AMOUNT/air.get_moles(GAS_PLASMA),air.get_moles(GAS_PLUOXIUM)) + var/ball_shot_angle = 180*cos(GET_MOLES(/datum/gas/water_vapor, air)/GET_MOLES(/datum/gas/nitryl, air))+180 + var/stim_used = min(STIM_BALL_GAS_AMOUNT/GET_MOLES(/datum/gas/plasma, air),GET_MOLES(/datum/gas/stimulum, air)) + var/pluox_used = min(STIM_BALL_GAS_AMOUNT/GET_MOLES(/datum/gas/plasma, air),GET_MOLES(/datum/gas/pluoxium, air)) var/energy_released = stim_used*STIMULUM_HEAT_SCALE//Stimulum has a lot of stored energy, and breaking it up releases some of it location.fire_nuclear_particle(ball_shot_angle) - air.adjust_moles(GAS_CO2, 4*pluox_used) - air.adjust_moles(GAS_N2, 8*stim_used) - air.adjust_moles(GAS_PLUOXIUM, -pluox_used) - air.adjust_moles(GAS_STIMULUM, -stim_used) - air.adjust_moles(GAS_PLASMA, max(-air.get_moles(GAS_PLASMA)/2,-30)) + ADD_MOLES(/datum/gas/carbon_dioxide, air, 4*pluox_used) + ADD_MOLES(/datum/gas/nitrogen, air, 8*stim_used) + REMOVE_MOLES(/datum/gas/pluoxium, air, pluox_used) + REMOVE_MOLES(/datum/gas/stimulum, air, stim_used) + REMOVE_MOLES(/datum/gas/plasma, air, min(GET_MOLES(/datum/gas/plasma, air)/2,30)) if(energy_released) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.set_temperature(clamp((air.return_temperature()*old_heat_capacity + energy_released)/new_heat_capacity,TCMB,INFINITY)) + air.temperature = (clamp((air.return_temperature()*old_heat_capacity + energy_released)/new_heat_capacity,TCMB,INFINITY)) return REACTING #undef SET_REACTION_RESULTS diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 7d445ac6eed0a..55234ad76c216 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -93,54 +93,54 @@ var/list/TLV = list( // Breathable air. "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa. Values are min2, min1, max1, max2 "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), - GAS_O2 = new/datum/tlv(16, 19, 40, 50), // Partial pressure, kpa - GAS_N2 = new/datum/tlv(-1, -1, 1000, 1000), - GAS_CO2 = new/datum/tlv(-1, -1, 5, 10), - GAS_PLASMA = new/datum/tlv/dangerous, - GAS_NITROUS = new/datum/tlv/dangerous, - GAS_BZ = new/datum/tlv/dangerous, - GAS_HYPERNOB = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic - GAS_H2O = new/datum/tlv/dangerous, - GAS_TRITIUM = new/datum/tlv/dangerous, - GAS_STIMULUM = new/datum/tlv/dangerous, - GAS_NITRYL = new/datum/tlv/dangerous, - GAS_PLUOXIUM = new/datum/tlv(-1, -1, 5, 6), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires + /datum/gas/oxygen = new/datum/tlv(16, 19, 40, 50), // Partial pressure, kpa + /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000), + /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10), + /datum/gas/plasma = new/datum/tlv/dangerous, + /datum/gas/nitrous_oxide = new/datum/tlv/dangerous, + /datum/gas/bz = new/datum/tlv/dangerous, + /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic + /datum/gas/water_vapor = new/datum/tlv/dangerous, + /datum/gas/tritium = new/datum/tlv/dangerous, + /datum/gas/stimulum = new/datum/tlv/dangerous, + /datum/gas/nitryl = new/datum/tlv/dangerous, + /datum/gas/pluoxium = new/datum/tlv(-1, -1, 5, 6), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires ) /obj/machinery/airalarm/server // No checks here. TLV = list( "pressure" = new/datum/tlv/no_checks, "temperature" = new/datum/tlv/no_checks, - GAS_O2 = new/datum/tlv/no_checks, - GAS_N2 = new/datum/tlv/no_checks, - GAS_CO2 = new/datum/tlv/no_checks, - GAS_PLASMA = new/datum/tlv/no_checks, - GAS_NITROUS = new/datum/tlv/no_checks, - GAS_BZ = new/datum/tlv/no_checks, - GAS_HYPERNOB = new/datum/tlv/no_checks, - GAS_H2O = new/datum/tlv/no_checks, - GAS_TRITIUM = new/datum/tlv/no_checks, - GAS_STIMULUM = new/datum/tlv/no_checks, - GAS_NITRYL = new/datum/tlv/no_checks, - GAS_PLUOXIUM = new/datum/tlv/no_checks + /datum/gas/oxygen = new/datum/tlv/no_checks, + /datum/gas/nitrogen = new/datum/tlv/no_checks, + /datum/gas/carbon_dioxide = new/datum/tlv/no_checks, + /datum/gas/plasma = new/datum/tlv/no_checks, + /datum/gas/nitrous_oxide = new/datum/tlv/no_checks, + /datum/gas/bz = new/datum/tlv/no_checks, + /datum/gas/hypernoblium = new/datum/tlv/no_checks, + /datum/gas/water_vapor = new/datum/tlv/no_checks, + /datum/gas/tritium = new/datum/tlv/no_checks, + /datum/gas/stimulum = new/datum/tlv/no_checks, + /datum/gas/nitryl = new/datum/tlv/no_checks, + /datum/gas/pluoxium = new/datum/tlv/no_checks ) /obj/machinery/airalarm/kitchen_cold_room // Kitchen cold rooms start off at -20°C or 253.15 K. TLV = list( "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa "temperature" = new/datum/tlv(T0C-273.15, T0C-80, T0C-10, T0C+10), - GAS_O2 = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa - GAS_N2 = new/datum/tlv(-1, -1, 1000, 1000), - GAS_CO2 = new/datum/tlv(-1, -1, 5, 10), - GAS_PLASMA = new/datum/tlv/dangerous, - GAS_NITROUS = new/datum/tlv/dangerous, - GAS_BZ = new/datum/tlv/dangerous, - GAS_HYPERNOB = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic - GAS_H2O = new/datum/tlv/dangerous, - GAS_TRITIUM = new/datum/tlv/dangerous, - GAS_STIMULUM = new/datum/tlv/dangerous, - GAS_NITRYL = new/datum/tlv/dangerous, - GAS_PLUOXIUM = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires + /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa + /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000), + /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10), + /datum/gas/plasma = new/datum/tlv/dangerous, + /datum/gas/nitrous_oxide = new/datum/tlv/dangerous, + /datum/gas/bz = new/datum/tlv/dangerous, + /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic + /datum/gas/water_vapor = new/datum/tlv/dangerous, + /datum/gas/tritium = new/datum/tlv/dangerous, + /datum/gas/stimulum = new/datum/tlv/dangerous, + /datum/gas/nitryl = new/datum/tlv/dangerous, + /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires ) /obj/machinery/airalarm/unlocked @@ -275,15 +275,15 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/airalarm) )) var/total_moles = environment.total_moles() var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.return_temperature() / environment.return_volume() - for(var/gas_id in environment.get_gases()) + for(var/gas_id in environment.gases) if(!(gas_id in TLV)) // We're not interested in this gas, it seems. continue cur_tlv = TLV[gas_id] data["environment_data"] += list(list( - "name" = GLOB.gas_data.names[gas_id], - "value" = environment.get_moles(gas_id) / total_moles * 100, + "name" = GLOB.meta_gas_info[gas_id][META_GAS_NAME], + "value" = environment.gases[gas_id][MOLES] / total_moles * 100, "unit" = "%", - "danger_level" = cur_tlv.get_danger_level(environment.get_moles(gas_id) * partial_pressure) + "danger_level" = cur_tlv.get_danger_level(GET_MOLES(gas_id, environment) * partial_pressure) )) if(!locked || user.has_unlimited_silicon_privilege) @@ -350,11 +350,11 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/airalarm) thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max1", "selected" = selected.max1)) thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max2", "selected" = selected.max2)) - for(var/gas_id in GLOB.gas_data.names) + for(var/gas_id in subtypesof(/datum/gas)) if(!(gas_id in TLV)) // We're not interested in this gas, it seems. continue selected = TLV[gas_id] - thresholds += list(list("name" = GLOB.gas_data.names[gas_id], "settings" = list())) + thresholds += list(list("name" = GLOB.meta_gas_info[gas_id][META_GAS_NAME], "settings" = list())) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min2", "selected" = selected.min2)) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min1", "selected" = selected.min1)) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max1", "selected" = selected.max1)) @@ -499,7 +499,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/airalarm) for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, - "set_filters" = list(GAS_CO2, GAS_BZ), + "set_filters" = list(/datum/gas/carbon_dioxide, /datum/gas/bz), "scrubbing" = 1, "widenet" = 0 ), signal_source) @@ -514,16 +514,16 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/airalarm) send_signal(device_id, list( "power" = 1, "set_filters" = list( - GAS_CO2, - GAS_PLASMA, - GAS_H2O, - GAS_HYPERNOB, - GAS_NITROUS, - GAS_NITRYL, - GAS_TRITIUM, - GAS_BZ, - GAS_STIMULUM, - GAS_PLUOXIUM + /datum/gas/carbon_dioxide, + /datum/gas/plasma, + /datum/gas/water_vapor, + /datum/gas/hypernoblium, + /datum/gas/nitrous_oxide, + /datum/gas/nitryl, + /datum/gas/tritium, + /datum/gas/bz, + /datum/gas/stimulum, + /datum/gas/pluoxium ), "scrubbing" = 1, "widenet" = 1 @@ -551,7 +551,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/airalarm) for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, - "set_filters" = list(GAS_CO2, GAS_BZ), + "set_filters" = list(/datum/gas/carbon_dioxide, /datum/gas/bz), "scrubbing" = 1, "widenet" = 0 ), signal_source) @@ -679,11 +679,11 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/airalarm) var/temperature_dangerlevel = cur_tlv.get_danger_level(environment.return_temperature()) var/gas_dangerlevel = 0 - for(var/gas_id in environment.get_gases()) + for(var/gas_id in environment.gases) if(!(gas_id in TLV)) // We're not interested in this gas, it seems. continue cur_tlv = TLV[gas_id] - gas_dangerlevel = max(gas_dangerlevel, cur_tlv.get_danger_level(environment.get_moles(gas_id) * partial_pressure)) + gas_dangerlevel = max(gas_dangerlevel, cur_tlv.get_danger_level(GET_MOLES(gas_id, environment) * partial_pressure)) var/old_danger_level = danger_level danger_level = max(pressure_dangerlevel, temperature_dangerlevel, gas_dangerlevel) @@ -911,8 +911,8 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/airalarm) "Temperature" = "temperature" ) - for(var/gas_id in GLOB.gas_data.ids) - component_options[GLOB.gas_data.names[gas_id]] = gas_id + for(var/gas in subtypesof(/datum/gas)) + component_options[GLOB.meta_gas_info[gas][META_GAS_NAME]] = GLOB.meta_gas_info[gas][META_GAS_ID] air_alarm_options = add_option_port("Air Alarm Options", component_options) options_map = component_options @@ -938,7 +938,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/airalarm) pressure.set_output(round(environment.return_pressure())) temperature.set_output(round(environment.return_temperature())) if(ispath(options_map[current_option])) - gas_amount.set_output(round(environment.get_moles(current_option))) + gas_amount.set_output(round(GET_MOLES(current_option, environment))) return var/datum/tlv/settings = connected_alarm.TLV[options_map[current_option]] diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 68aeead0da8bd..2fb44d258e554 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -43,6 +43,9 @@ /// whether it can be painted var/paintable = FALSE + ///Is the thing being rebuilt by SSair or not. Prevents list blaot + var/rebuilding = FALSE + /obj/machinery/atmospherics/examine(mob/user) . = ..() if(is_type_in_list(src, GLOB.ventcrawl_machinery) && isliving(user)) @@ -61,14 +64,14 @@ ..() if(process) SSair.start_processing_machine(src) - SetInitDirections() + set_init_directions() /obj/machinery/atmospherics/Destroy() for(var/i in 1 to device_type) - nullifyNode(i) + nullify_node(i) SSair.stop_processing_machine(src) - SSair.pipenets_needing_rebuilt -= src + SSair.rebuild_queue -= src if(pipe_vision_img) qdel(pipe_vision_img) @@ -79,23 +82,34 @@ /obj/machinery/atmospherics/proc/destroy_network() return -/obj/machinery/atmospherics/proc/build_network() - // Called to build a network from this node +/// This should only be called by SSair as part of the rebuild queue. +/// Handles rebuilding pipelines after init or they've been changed. +/obj/machinery/atmospherics/proc/rebuild_pipes() + var/list/targets = get_rebuild_targets() + rebuilding = FALSE + for(var/datum/pipeline/build_off as anything in targets) + build_off.build_pipeline(src) //This'll add to the expansion queue + +/** + * Returns a list of new pipelines that need to be built up + */ +/obj/machinery/atmospherics/proc/get_rebuild_targets() return -/obj/machinery/atmospherics/proc/nullifyNode(i) - if(nodes[i]) - var/obj/machinery/atmospherics/N = nodes[i] - N.disconnect(src) - nodes[i] = null +/obj/machinery/atmospherics/proc/nullify_node(i) + if(!nodes[i]) + return + var/obj/machinery/atmospherics/node_machine = nodes[i] + node_machine.disconnect(src) + nodes[i] = null -/obj/machinery/atmospherics/proc/getNodeConnects() +/obj/machinery/atmospherics/proc/get_node_connects() var/list/node_connects = list() node_connects.len = device_type for(var/i in 1 to device_type) for(var/D in GLOB.cardinals) - if(D & GetInitDirections()) + if(D & get_init_directions()) if(D in node_connects) continue node_connects[i] = D @@ -110,9 +124,9 @@ setDir(EAST) //this is called just after the air controller sets up turfs -/obj/machinery/atmospherics/proc/atmosinit(list/node_connects) +/obj/machinery/atmospherics/proc/atmos_init(list/node_connects) if(!node_connects) //for pipes where order of nodes doesn't matter - node_connects = getNodeConnects() + node_connects = get_node_connects() for(var/i in 1 to device_type) for(var/obj/machinery/atmospherics/target in get_step(src,node_connects[i])) @@ -121,7 +135,7 @@ break update_icon() -/obj/machinery/atmospherics/proc/setPipingLayer(new_layer) +/obj/machinery/atmospherics/proc/set_piping_layer(new_layer) piping_layer = (pipe_flags & PIPING_DEFAULT_LAYER_ONLY) ? PIPING_LAYER_DEFAULT : new_layer update_icon() @@ -129,18 +143,18 @@ return connection_check(target, piping_layer) //Find a connecting /obj/machinery/atmospherics in specified direction -/obj/machinery/atmospherics/proc/findConnecting(direction, prompted_layer) +/obj/machinery/atmospherics/proc/find_connecting(direction, prompted_layer) for(var/obj/machinery/atmospherics/target in get_step_multiz(src, direction)) if(target.initialize_directions & get_dir(target,src) && !istype(target, /obj/machinery/atmospherics/pipe/multiz)) if(connection_check(target, prompted_layer)) return target /obj/machinery/atmospherics/proc/connection_check(obj/machinery/atmospherics/target, given_layer) - if(isConnectable(target, given_layer) && target.isConnectable(src, given_layer) && (target.initialize_directions & get_dir(target,src) || istype(target, /obj/machinery/atmospherics/pipe/multiz))) + if(is_connectable(target, given_layer) && target.is_connectable(src, given_layer) && (target.initialize_directions & get_dir(target,src) || istype(target, /obj/machinery/atmospherics/pipe/multiz))) return TRUE return FALSE -/obj/machinery/atmospherics/proc/isConnectable(obj/machinery/atmospherics/target, given_layer) +/obj/machinery/atmospherics/proc/is_connectable(obj/machinery/atmospherics/target, given_layer) if(isnull(given_layer)) given_layer = piping_layer if((target.piping_layer == given_layer) || (target.pipe_flags & PIPING_ALL_LAYER)) @@ -150,22 +164,22 @@ /obj/machinery/atmospherics/proc/pipeline_expansion() return nodes -/obj/machinery/atmospherics/proc/SetInitDirections() +/obj/machinery/atmospherics/proc/set_init_directions() return -/obj/machinery/atmospherics/proc/GetInitDirections() +/obj/machinery/atmospherics/proc/get_init_directions() return initialize_directions -/obj/machinery/atmospherics/proc/returnPipenet() +/obj/machinery/atmospherics/proc/return_pipenet() return -/obj/machinery/atmospherics/proc/returnPipenetAir() +/obj/machinery/atmospherics/proc/return_pipenet_airs() return -/obj/machinery/atmospherics/proc/setPipenet() +/obj/machinery/atmospherics/proc/set_pipenet() return -/obj/machinery/atmospherics/proc/replacePipenet() +/obj/machinery/atmospherics/proc/replace_pipenet() return /obj/machinery/atmospherics/proc/disconnect(obj/machinery/atmospherics/reference) @@ -180,7 +194,7 @@ if(istype(W, /obj/item/pipe)) //lets you autodrop var/obj/item/pipe/pipe = W if(user.dropItemToGround(pipe)) - pipe.setPipingLayer(piping_layer) //align it with us + pipe.set_piping_layer(piping_layer) //align it with us return TRUE else return ..() @@ -247,14 +261,14 @@ if(!(flags_1 & NODECONSTRUCT_1)) if(can_unwrench) var/obj/item/pipe/stored = new construction_type(loc, null, dir, src) - stored.setPipingLayer(piping_layer) + stored.set_piping_layer(piping_layer) if(!disassembled) stored.take_damage(stored.max_integrity * 0.5, sound_effect=FALSE) transfer_fingerprints_to(stored) . = stored ..() -/obj/machinery/atmospherics/proc/getpipeimage(iconset, iconstate, direction, col=rgb(255,255,255), piping_layer=3, trinary = FALSE) +/obj/machinery/atmospherics/proc/get_pipe_image(iconset, iconstate, direction, col=rgb(255,255,255), piping_layer=3, trinary = FALSE) //Add identifiers for the iconset if(iconsetids[iconset] == null) @@ -275,13 +289,13 @@ if(can_unwrench) add_atom_colour(obj_color, FIXED_COLOUR_PRIORITY) pipe_color = obj_color - setPipingLayer(set_layer) - atmosinit() + set_piping_layer(set_layer) + atmos_init() var/list/nodes = pipeline_expansion() for(var/obj/machinery/atmospherics/A in nodes) - A.atmosinit() - A.addMember(src) - build_network() + A.atmos_init() + A.add_member(src) + SSair.add_to_rebuild_queue(src) /obj/machinery/atmospherics/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) if(istype(arrived, /mob/living)) @@ -301,14 +315,14 @@ return if(user in buckled_mobs)// fixes buckle ventcrawl edgecase fuck bug return - var/obj/machinery/atmospherics/target_move = findConnecting(direction, user.ventcrawl_layer) + var/obj/machinery/atmospherics/target_move = find_connecting(direction, user.ventcrawl_layer) if(target_move) if(target_move.can_crawl_through()) if(is_type_in_typecache(target_move, GLOB.ventcrawl_machinery)) user.forceMove(target_move.loc) //handle entering and so on. user.visible_message("You hear something squeezing through the ducts...", "You climb out the ventilation system.") else - var/list/pipenetdiff = returnPipenets() ^ target_move.returnPipenets() + var/list/pipenetdiff = return_pipenets() ^ target_move.return_pipenets() if(pipenetdiff.len) user.update_pipe_vision(target_move) user.forceMove(target_move) @@ -334,7 +348,7 @@ /obj/machinery/atmospherics/proc/can_crawl_through() return TRUE -/obj/machinery/atmospherics/proc/returnPipenets() +/obj/machinery/atmospherics/proc/return_pipenets() return list() /obj/machinery/atmospherics/update_remote_sight(mob/user) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm b/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm index accec64dbd8c0..04cc3789b476a 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm @@ -6,14 +6,14 @@ device_type = BINARY layer = GAS_PUMP_LAYER -/obj/machinery/atmospherics/components/binary/SetInitDirections() +/obj/machinery/atmospherics/components/binary/set_init_directions() switch(dir) if(NORTH, SOUTH) initialize_directions = NORTH|SOUTH if(EAST, WEST) initialize_directions = EAST|WEST -/obj/machinery/atmospherics/components/binary/getNodeConnects() +/obj/machinery/atmospherics/components/binary/get_node_connects() return list(turn(dir, 180), dir) ///Used by binary devices to set what the offset will be for each layer diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index acfd081a60f73..21f2f5345672e 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -49,7 +49,7 @@ if(air2.return_temperature()>0) var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2 - var/transfer_moles = pressure_delta*air1.return_volume()/(air2.return_temperature() * R_IDEAL_GAS_EQUATION) + var/transfer_moles = (pressure_delta*air1.return_volume())/(air2.return_temperature() * R_IDEAL_GAS_EQUATION) last_pressure_delta = pressure_delta @@ -101,28 +101,28 @@ nullifyPipenet(parents[2]) if(anchored) - SetInitDirections() - atmosinit() + set_init_directions() + atmos_init() node1 = nodes[1] if(node1) - node1.atmosinit() - node1.addMember(src) + node1.atmos_init() + node1.add_member(src) node2 = nodes[2] if(node2) - node2.atmosinit() - node2.addMember(src) + node2.atmos_init() + node2.add_member(src) SSair.add_to_rebuild_queue(src) return TRUE -/obj/machinery/atmospherics/components/binary/circulator/SetInitDirections() +/obj/machinery/atmospherics/components/binary/circulator/set_init_directions() switch(dir) if(NORTH, SOUTH) initialize_directions = EAST|WEST if(EAST, WEST) initialize_directions = NORTH|SOUTH -/obj/machinery/atmospherics/components/binary/circulator/getNodeConnects() +/obj/machinery/atmospherics/components/binary/circulator/get_node_connects() if(flipped) return list(turn(dir, 270), turn(dir, 90)) return list(turn(dir, 90), turn(dir, 270)) @@ -163,7 +163,7 @@ generator.update_icon() generator = null -/obj/machinery/atmospherics/components/binary/circulator/setPipingLayer(new_layer) +/obj/machinery/atmospherics/components/binary/circulator/set_piping_layer(new_layer) ..() pixel_x = 0 pixel_y = 0 diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm index 298b46b58133d..3868afd9099ec 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm @@ -47,7 +47,7 @@ /obj/machinery/atmospherics/components/binary/dp_vent_pump/update_icon_nopipes() cut_overlays() if(showpipe) - var/image/cap = getpipeimage(icon, "dpvent_cap", dir, piping_layer = piping_layer) + var/image/cap = get_pipe_image(icon, "dpvent_cap", dir, piping_layer = piping_layer) add_overlay(cap) if(welded) @@ -81,16 +81,14 @@ if(pressure_delta > 0) if(air1.return_temperature() > 0) - var/transfer_moles = pressure_delta*environment.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION) + var/transfer_moles = (pressure_delta*environment.volume)/(air1.return_temperature() * R_IDEAL_GAS_EQUATION) loc.assume_air_moles(air1, transfer_moles) - air_update_turf() + air_update_turf(FALSE, FALSE) var/datum/pipeline/parent1 = parents[1] - if(!parent1) - return - parent1.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED + parent1.update = TRUE else //external -> output if(environment.return_pressure() > 0) @@ -103,10 +101,10 @@ if(moles_delta > 0) loc.transfer_air(air2, moles_delta) - air_update_turf() + air_update_turf(FALSE, FALSE) var/datum/pipeline/parent2 = parents[2] - parent2.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED + parent2.update = TRUE //Radio remote control @@ -133,7 +131,7 @@ )) radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) -/obj/machinery/atmospherics/components/binary/dp_vent_pump/atmosinit() +/obj/machinery/atmospherics/components/binary/dp_vent_pump/atmos_init() ..() if(frequency) set_frequency(frequency) @@ -221,8 +219,8 @@ ..() var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] - air1.set_volume(1000) - air2.set_volume(1000) + air1.volume = 1000 + air2.volume = 1000 // Mapping diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 5497bc81d6534..9b7f616ad9336 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -53,7 +53,7 @@ Passive gate is similar to the regular pump except: cut_overlays() icon_state = "passgate_off-[set_overlay_offset(piping_layer)]" if(on) - add_overlay(getpipeimage(icon, "passgate_on-[set_overlay_offset(piping_layer)]")) + add_overlay(get_pipe_image(icon, "passgate_on-[set_overlay_offset(piping_layer)]")) /obj/machinery/atmospherics/components/binary/passive_gate/process_atmos() ..() @@ -125,7 +125,7 @@ Passive gate is similar to the regular pump except: if(.) update_icon() -/obj/machinery/atmospherics/components/binary/passive_gate/atmosinit() +/obj/machinery/atmospherics/components/binary/passive_gate/atmos_init() ..() if(frequency) set_frequency(frequency) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm index c136cb3b746b5..b659fd39c72df 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm @@ -119,7 +119,7 @@ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() -/obj/machinery/atmospherics/components/binary/pressure_valve/atmosinit() +/obj/machinery/atmospherics/components/binary/pressure_valve/atmos_init() . = ..() if(frequency) set_frequency(frequency) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 7496fa99b06d6..3a0782e947471 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -62,19 +62,10 @@ // ..() if(!on || !is_operational) return - var/datum/gas_mixture/air1 = airs[1] - var/datum/gas_mixture/air2 = airs[2] - var/output_starting_pressure = air2.return_pressure() - if((target_pressure - output_starting_pressure) < 0.01) - //No need to pump gas if target is already reached! - return - //Calculate necessary moles to transfer using PV=nRT - if((air1.total_moles() > 0) && (air1.return_temperature()>0)) - var/pressure_delta = target_pressure - output_starting_pressure - var/transfer_moles = pressure_delta*air2.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION) - - air1.transfer_to(air2,transfer_moles) + var/datum/gas_mixture/input_air = airs[1] + var/datum/gas_mixture/output_air = airs[2] + if(input_air.pump_gas_to(output_air, target_pressure)) update_parents() /obj/machinery/atmospherics/components/binary/pump/proc/set_on(active) @@ -140,7 +131,7 @@ if(.) update_icon() -/obj/machinery/atmospherics/components/binary/pump/atmosinit() +/obj/machinery/atmospherics/components/binary/pump/atmos_init() ..() if(frequency) set_frequency(frequency) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm index 18da76771dc01..8ac870339f3a0 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm @@ -52,13 +52,14 @@ var/output_capacity = air_output.heat_capacity() var/cooling_heat_amount = (heat_transfer_rate * 0.01) * coolant_temperature_delta * (input_capacity * output_capacity / (input_capacity + output_capacity)) - remove_input.set_temperature(max(remove_input.return_temperature() - (cooling_heat_amount / input_capacity), TCMB)) - remove_output.set_temperature(max(remove_output.return_temperature() + (cooling_heat_amount / output_capacity), TCMB)) + remove_input.temperature = (max(remove_input.return_temperature() - (cooling_heat_amount / input_capacity), TCMB)) + remove_output.temperature = (max(remove_output.return_temperature() + (cooling_heat_amount / output_capacity), TCMB)) + update_parents() + air_input.merge(remove_input) air_output.merge(remove_output) - update_parents() /obj/machinery/atmospherics/components/binary/temperature_pump/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm index d751f7f9dad35..ba1d7403ea844 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm @@ -24,16 +24,6 @@ It's like a regular ol' straight pipe, but you can turn it on and off. var/switching = FALSE -/obj/machinery/atmospherics/components/binary/valve/Destroy() - //Should only happen on extreme circumstances - if(on) - //Let's give presumably now-severed pipenets a chance to scramble for what's happening at next SSair fire() - if(parents[1]) - parents[1].update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED - if(parents[2]) - parents[2].update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED - . = ..() - /obj/machinery/atmospherics/components/binary/valve/update_icon_nopipes(animation = FALSE) normalize_cardinal_directions() if(animation) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index 638527e13f1cf..84c0a789aa97c 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -54,7 +54,6 @@ icon_state = "volpump_[on && is_operational ? "on" : "off"]-[set_overlay_offset(piping_layer)]" /obj/machinery/atmospherics/components/binary/volume_pump/process_atmos() -// ..() if(!on || !is_operational) return @@ -72,15 +71,22 @@ if(overclocked && (output_starting_pressure-input_starting_pressure > 1000))//Overclocked pumps can only force gas a certain amount. return + + var/transfer_ratio = transfer_rate / air1.volume + + var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) + + if(!removed.total_moles()) + return + if(overclocked)//Some of the gas from the mixture leaks to the environment when overclocked var/turf/open/T = loc if(istype(T)) - var/datum/gas_mixture/leaked = air1.remove_ratio(VOLUME_PUMP_LEAK_AMOUNT) + var/datum/gas_mixture/leaked = removed.remove_ratio(VOLUME_PUMP_LEAK_AMOUNT) T.assume_air(leaked) - T.air_update_turf() + T.air_update_turf(FALSE, FALSE) - var/transfer_ratio = transfer_rate / air1.return_volume() - air1.transfer_ratio_to(air2,transfer_ratio) + air2.merge(removed) update_parents() @@ -125,7 +131,7 @@ data["max_rate"] = round(MAX_TRANSFER_RATE) return data -/obj/machinery/atmospherics/components/binary/volume_pump/atmosinit() +/obj/machinery/atmospherics/components/binary/volume_pump/atmos_init() ..() set_frequency(frequency) diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index 24b28222afd05..d90a5701fd6c2 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -3,12 +3,17 @@ /obj/machinery/atmospherics/components hide = FALSE - - var/welded = FALSE //Used on pumps and scrubbers + ///Is the component welded? + var/welded = FALSE + ///Should the component should show the pipe underneath it? var/showpipe = TRUE - var/shift_underlay_only = TRUE //Layering only shifts underlay? - + ///When the component is on a non default layer should we shift everything? Or just the underlay pipe + var/shift_underlay_only = TRUE + ///Stores the component pipeline var/list/datum/pipeline/parents + ///If this is queued for a rebuild this var signifies whether parents should be updated after it's done + var/update_parents_after_rebuild = FALSE + ///Stores the component gas mixture var/list/datum/gas_mixture/airs /obj/machinery/atmospherics/components/New() @@ -18,12 +23,9 @@ ..() for(var/i in 1 to device_type) - var/datum/gas_mixture/A = new(200) - airs[i] = A - -/obj/machinery/atmospherics/components/examine(mob/user) - . = ..() - . += "[src] is on layer [piping_layer]." + var/datum/gas_mixture/component_mixture = new + component_mixture.volume = 200 + airs[i] = component_mixture /obj/machinery/atmospherics/components/Initialize(mapload) . = ..() @@ -33,13 +35,18 @@ // Iconnery +/** + * Called by update_icon(), used individually by each component to determine the icon state without the pipe in consideration + */ /obj/machinery/atmospherics/components/proc/update_icon_nopipes() return -/obj/machinery/atmospherics/components/proc/hide_pipe(datum/source, underfloor_accessibility) - SIGNAL_HANDLER - showpipe = !!underfloor_accessibility - update_icon() +/** + * Called in Initialize(), set the showpipe var to true or false depending on the situation, calls update_icon() + */ +/obj/machinery/atmospherics/components/proc/hide_pipe(datum/source, covered) + showpipe = !covered + update_appearance() /obj/machinery/atmospherics/components/update_icon() update_icon_nopipes() @@ -49,16 +56,17 @@ plane = showpipe ? GAME_PLANE : FLOOR_PLANE if(!showpipe) - return + return ..() var/connected = 0 //Direction bitset for(var/i in 1 to device_type) //adds intact pieces - if(nodes[i]) - var/obj/machinery/atmospherics/node = nodes[i] - var/image/img = get_pipe_underlay("pipe_intact", get_dir(src, node), node.pipe_color) - underlays += img - connected |= img.dir + if(!nodes[i]) + continue + var/obj/machinery/atmospherics/node = nodes[i] + var/image/img = get_pipe_underlay("pipe_intact", get_dir(src, node), node.pipe_color) + underlays += img + connected |= img.dir for(var/direction in GLOB.cardinals) if((initialize_directions & direction) && !(connected & direction)) @@ -66,117 +74,148 @@ if(!shift_underlay_only) PIPING_LAYER_SHIFT(src, piping_layer) + return ..() +/** + * Called by update_icon() when showpipe is TRUE, set the image for the underlay pipe + * Arguments: + * * -state: icon_state of the selected pipe + * * -dir: direction of the pipe + * * -color: color of the pipe + */ /obj/machinery/atmospherics/components/proc/get_pipe_underlay(state, dir, color = null) if(color) - . = getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', state, dir, color, piping_layer = shift_underlay_only ? piping_layer : 3) + . = get_pipe_image('icons/obj/atmospherics/components/binary_devices.dmi', state, dir, color, piping_layer = shift_underlay_only ? piping_layer : 3) else - . = getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', state, dir, piping_layer = shift_underlay_only ? piping_layer : 3) + . = get_pipe_image('icons/obj/atmospherics/components/binary_devices.dmi', state, dir, piping_layer = shift_underlay_only ? piping_layer : 3) // Pipenet stuff; housekeeping -/obj/machinery/atmospherics/components/nullifyNode(i) - // Every node has a parent pipeline and an air associated with it, but we need to accomdate for edge cases like init dir cache building... +/obj/machinery/atmospherics/components/nullify_node(i) if(parents[i]) nullifyPipenet(parents[i]) - if(airs[i]) - QDEL_NULL(airs[i]) - ..() + QDEL_NULL(airs[i]) + return ..() /obj/machinery/atmospherics/components/on_construction() ..() update_parents() -/obj/machinery/atmospherics/components/build_network() - for(var/i in 1 to device_type) - if(QDELETED(parents[i])) - parents[i] = new /datum/pipeline() - var/datum/pipeline/P = parents[i] - P.build_pipeline(src) +/obj/machinery/atmospherics/components/rebuild_pipes() + . = ..() + if(update_parents_after_rebuild) + update_parents() +/obj/machinery/atmospherics/components/get_rebuild_targets() + var/list/to_return = list() + for(var/i in 1 to device_type) + if(parents[i]) + continue + parents[i] = new /datum/pipeline() + to_return += parents[i] + return to_return + +/** + * Called by nullify_node(), used to remove the pipeline the component is attached to + * Arguments: + * * -reference: the pipeline the component is attached to + */ /obj/machinery/atmospherics/components/proc/nullifyPipenet(datum/pipeline/reference) if(!reference) CRASH("nullifyPipenet(null) called by [type] on [COORD(src)]") - var/i = parents.Find(reference) - reference.other_airs -= airs[i] - reference.other_atmosmch -= src + + for (var/i in 1 to parents.len) + if (parents[i] == reference) + reference.other_airs -= airs[i] // Disconnects from the pipeline side + parents[i] = null // Disconnects from the machinery side. + + reference.other_atmos_machines -= src + /** * We explicitly qdel pipeline when this particular pipeline * is projected to have no member and cause GC problems. * We have to do this because components don't qdel pipelines - * while pipes must and will happily wreck and rebuild everything again - * every time they are qdeleted. + * while pipes must and will happily wreck and rebuild everything + * again every time they are qdeleted. */ - if(!(reference.other_atmosmch.len || reference.members.len || QDESTROYING(reference))) + + if(!length(reference.other_atmos_machines) && !length(reference.members)) + if(QDESTROYING(reference)) + CRASH("nullifyPipenet() called on qdeleting [reference]") qdel(reference) - parents[i] = null -// We should return every air sharing a parent -/obj/machinery/atmospherics/components/returnPipenetAir(datum/pipeline/reference) - for(var/i in 1 to device_type) - if(parents[i] == reference) - if(.) - if(!islist(.)) - . = list(.) - . += airs[i] - else - . = airs[i] +/obj/machinery/atmospherics/components/return_pipenet_airs(datum/pipeline/reference) + var/list/returned_air = list() + + for (var/i in 1 to parents.len) + if (parents[i] == reference) + returned_air += airs[i] + return returned_air /obj/machinery/atmospherics/components/pipeline_expansion(datum/pipeline/reference) if(reference) return list(nodes[parents.Find(reference)]) return ..() -/obj/machinery/atmospherics/components/setPipenet(datum/pipeline/reference, obj/machinery/atmospherics/A) - parents[nodes.Find(A)] = reference +/obj/machinery/atmospherics/components/set_pipenet(datum/pipeline/reference, obj/machinery/target_component) + parents[nodes.Find(target_component)] = reference -/obj/machinery/atmospherics/components/returnPipenet(obj/machinery/atmospherics/A = nodes[1]) //returns parents[1] if called without argument - return parents[nodes.Find(A)] +/obj/machinery/atmospherics/components/return_pipenet(obj/machinery/atmospherics/target_component = nodes[1]) //returns parents[1] if called without argument + return parents[nodes.Find(target_component)] -/obj/machinery/atmospherics/components/replacePipenet(datum/pipeline/Old, datum/pipeline/New) +/obj/machinery/atmospherics/components/replace_pipenet(datum/pipeline/Old, datum/pipeline/New) parents[parents.Find(Old)] = New -/obj/machinery/atmospherics/components/unsafe_pressure_release(var/mob/user, var/pressures) - ..() +/obj/machinery/atmospherics/components/unsafe_pressure_release(mob/user, pressures) + . = ..() var/turf/T = get_turf(src) - if(T) - //Remove the gas from airs and assume it - var/datum/gas_mixture/environment = T.return_air() - var/lost = null - var/times_lost = 0 - for(var/i in 1 to device_type) - var/datum/gas_mixture/air = airs[i] - lost += pressures*environment.return_volume()/(air.return_temperature() * R_IDEAL_GAS_EQUATION) - times_lost++ - var/shared_loss = lost/times_lost - - for(var/i in 1 to device_type) - var/datum/gas_mixture/air = airs[i] - T.assume_air_moles(air, shared_loss) - -/obj/machinery/atmospherics/components/proc/safe_input(var/title, var/text, var/default_set) - var/new_value = input(usr,text,title,default_set) as num - if(usr.canUseTopic(src)) - return new_value - return default_set + if(!T) + return + //Remove the gas from airs and assume it + var/datum/gas_mixture/environment = T.return_air() + var/lost = null + var/times_lost = 0 + for(var/i in 1 to device_type) + var/datum/gas_mixture/air = airs[i] + lost += pressures*environment.volume/(air.temperature * R_IDEAL_GAS_EQUATION) + times_lost++ + var/shared_loss = lost/times_lost + + var/datum/gas_mixture/to_release + for(var/i in 1 to device_type) + var/datum/gas_mixture/air = airs[i] + if(!to_release) + to_release = air.remove(shared_loss) + continue + to_release.merge(air.remove(shared_loss)) + T.assume_air(to_release) + air_update_turf(FALSE, FALSE) // Helpers +/** + * Called in most atmos processes and gas handling situations, update the parents pipelines of the devices connected to the source component + * This way gases won't get stuck + */ /obj/machinery/atmospherics/components/proc/update_parents() + if(!SSair.initialized) + return + if(rebuilding) + update_parents_after_rebuild = TRUE + return for(var/i in 1 to device_type) var/datum/pipeline/parent = parents[i] if(!parent) - //WARNING("Component is missing a pipenet! Rebuilding...") - //At pre-SSair_rebuild_pipenets times, not having a parent wasn't supposed to happen + WARNING("Component is missing a pipenet! Rebuilding...") SSair.add_to_rebuild_queue(src) - continue - parent.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED + else + parent.update = TRUE -/obj/machinery/atmospherics/components/returnPipenets() +/obj/machinery/atmospherics/components/return_pipenets() . = list() for(var/i in 1 to device_type) - . += returnPipenet(nodes[i]) + . += return_pipenet(nodes[i]) // UI Stuff diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 24ca6da28e61e..6fbcc524629fd 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -45,13 +45,13 @@ for(var/direction in GLOB.cardinals) if(!(direction & initialize_directions)) continue - var/obj/machinery/atmospherics/node = findConnecting(direction) + var/obj/machinery/atmospherics/node = find_connecting(direction) var/image/cap if(node) - cap = getpipeimage(icon, "cap", direction, node.pipe_color, piping_layer = piping_layer, trinary = TRUE) + cap = get_pipe_image(icon, "cap", direction, node.pipe_color, piping_layer = piping_layer, trinary = TRUE) else - cap = getpipeimage(icon, "cap", direction, piping_layer = piping_layer, trinary = TRUE) + cap = get_pipe_image(icon, "cap", direction, piping_layer = piping_layer, trinary = TRUE) add_overlay(cap) @@ -61,7 +61,6 @@ var/on_state = on && nodes[1] && nodes[2] && nodes[3] && is_operational icon_state = "filter_[on_state ? "on" : "off"]-[set_overlay_offset(piping_layer)][flipped ? "_f" : ""]" - /obj/machinery/atmospherics/components/trinary/filter/process_atmos() ..() if(!on || !(nodes[1] && nodes[2] && nodes[3]) || !is_operational) @@ -69,7 +68,7 @@ //Early return var/datum/gas_mixture/air1 = airs[1] - if(!air1 || air1.return_temperature() <= 0) + if(!air1 || air1.temperature <= 0) return var/datum/gas_mixture/air2 = airs[2] @@ -81,21 +80,42 @@ //No need to transfer if target is already full! return - var/transfer_ratio = transfer_rate / air1.return_volume() + var/transfer_ratio = transfer_rate / air1.volume //Actually transfer the gas if(transfer_ratio <= 0) return - if(filter_type && air2.return_pressure() <= 9000) - air1.scrub_into(air2, transfer_ratio, list(filter_type)) - if(air3.return_pressure() <= 9000) - air1.transfer_ratio_to(air3, transfer_ratio) + var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) + + if(!removed || !removed.total_moles()) + return + + var/filtering = TRUE + if(!ispath(filter_type)) + if(filter_type) + filter_type = gas_id2path(filter_type) //support for mappers so they don't need to type out paths + else + filtering = FALSE + + if(filtering && removed.gases[filter_type]) + var/datum/gas_mixture/filtered_out = new + + filtered_out.temperature = removed.temperature + SET_MOLES(filter_type, filtered_out, removed.gases[filter_type][MOLES]) + + removed.gases[filter_type][MOLES] = 0 + removed.garbage_collect() + + var/datum/gas_mixture/target = (air2.return_pressure() < MAX_OUTPUT_PRESSURE ? air2 : air1) //if there's no room for the filtered gas; just leave it in air1 + target.merge(filtered_out) + + air3.merge(removed) update_parents() -/obj/machinery/atmospherics/components/trinary/filter/atmosinit() +/obj/machinery/atmospherics/components/trinary/filter/atmos_init() set_frequency(frequency) return ..() @@ -117,8 +137,8 @@ data["filter_types"] = list() data["filter_types"] += list(list("name" = "Nothing", "id" = "", "selected" = !filter_type)) - for(var/id in GLOB.gas_data.ids) - data["filter_types"] += list(list("name" = GLOB.gas_data.names[id], "id" = id, "selected" = (id == filter_type))) + for(var/id in subtypesof(/datum/gas)) + data["filter_types"] += list(list("name" = GLOB.meta_gas_info[id][META_GAS_NAME], "id" = id, "selected" = (id == filter_type))) return data @@ -148,10 +168,10 @@ if("filter") filter_type = null var/filter_name = "nothing" - var/gas = params["mode"] - if(gas in GLOB.gas_data.names) + var/gas = gas_id2path(params["mode"]) + if(gas in subtypesof(/datum/gas)) filter_type = gas - filter_name = GLOB.gas_data.names[gas] + filter_name = GLOB.meta_gas_info[gas][META_GAS_NAME] investigate_log("was set to filter [filter_name] by [key_name(usr)]", INVESTIGATE_ATMOS) . = TRUE if(.) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index cbd612de38a2b..61fe5db3d25bb 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -39,13 +39,13 @@ for(var/direction in GLOB.cardinals) if(!(direction & initialize_directions)) continue - var/obj/machinery/atmospherics/node = findConnecting(direction) + var/obj/machinery/atmospherics/node = find_connecting(direction) var/image/cap if(node) - cap = getpipeimage(icon, "cap", direction, node.pipe_color, piping_layer = piping_layer, trinary = TRUE) + cap = get_pipe_image(icon, "cap", direction, node.pipe_color, piping_layer = piping_layer, trinary = TRUE) else - cap = getpipeimage(icon, "cap", direction, piping_layer = piping_layer, trinary = TRUE) + cap = get_pipe_image(icon, "cap", direction, piping_layer = piping_layer, trinary = TRUE) add_overlay(cap) @@ -58,7 +58,7 @@ /obj/machinery/atmospherics/components/trinary/mixer/New() ..() var/datum/gas_mixture/air3 = airs[3] - air3.set_volume(300) + air3.volume = 300 airs[3] = air3 /obj/machinery/atmospherics/components/trinary/mixer/process_atmos() @@ -116,15 +116,15 @@ if(transfer_moles1) air1.transfer_to(air3, transfer_moles1) var/datum/pipeline/parent1 = parents[1] - parent1.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED + parent1.update = TRUE if(transfer_moles2) air2.transfer_to(air3, transfer_moles2) var/datum/pipeline/parent2 = parents[2] - parent2.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED + parent2.update = TRUE var/datum/pipeline/parent3 = parents[3] - parent3.update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED + parent3.update = TRUE /obj/machinery/atmospherics/components/trinary/mixer/ui_state(mob/user) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm index 01b89560d683e..d96b7244eb47d 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm @@ -9,7 +9,7 @@ var/flipped = FALSE -/obj/machinery/atmospherics/components/trinary/SetInitDirections() +/obj/machinery/atmospherics/components/trinary/set_init_directions() switch(dir) if(NORTH) initialize_directions = EAST|NORTH|SOUTH @@ -24,7 +24,7 @@ Housekeeping and pipe network stuff */ -/obj/machinery/atmospherics/components/trinary/getNodeConnects() +/obj/machinery/atmospherics/components/trinary/get_node_connects() //Mixer: //1 and 2 is input diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 3ef275765c9ce..4154d0214abfc 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -1,6 +1,9 @@ #define CRYOMOBS 'icons/obj/cryo_mobs.dmi' #define CRYO_MULTIPLY_FACTOR 1.5 // Multiply factor is used with efficiency to multiply Tx quantity and how much extra is transfered to occupant magically. #define CRYO_TX_QTY 0.4 // Tx quantity is how much volume should be removed from the cell's beaker - multiplied by delta_time +#define CRYO_MIN_GAS_MOLES 5 +#define MAX_TEMPERATURE 4000 + /obj/machinery/atmospherics/components/unary/cryo_cell name = "cryo cell" @@ -223,7 +226,7 @@ beaker.reagents.trans_to(occupant, (CRYO_TX_QTY / (efficiency * CRYO_MULTIPLY_FACTOR)) * delta_time, efficiency * CRYO_MULTIPLY_FACTOR, method = VAPOR) // Transfer reagents. use_power(1000 * efficiency) - return 1 + return TRUE /obj/machinery/atmospherics/components/unary/cryo_cell/process_atmos() ..() @@ -233,7 +236,7 @@ var/datum/gas_mixture/air1 = airs[1] - if(!nodes[1] || !airs[1] || air1.get_moles(GAS_O2) < 5) // Turn off if the machine won't work due to not having enough moles to operate. + if(!nodes[1] || !airs[1] || GET_MOLES(/datum/gas/oxygen, air1) < 5) // Turn off if the machine won't work due to not having enough moles to operate. on = FALSE update_icon() var/msg = "Aborting. Not enough gas present to operate." @@ -254,10 +257,10 @@ var/heat = ((1 - cold_protection) * 0.1 + conduction_coefficient) * temperature_delta * (air_heat_capacity * heat_capacity / (air_heat_capacity + heat_capacity)) - air1.set_temperature(max(air1.return_temperature() - heat / air_heat_capacity, TCMB)) + air1.temperature = max(air1.return_temperature() - heat / air_heat_capacity, TCMB) mob_occupant.adjust_bodytemperature(heat / heat_capacity, TCMB) - air1.set_moles(GAS_O2, max(0,air1.get_moles(GAS_O2) - 0.5 / efficiency)) // Magically consume gas? Why not, we run on cryo magic. + SET_MOLES(/datum/gas/oxygen, air1, max(0,GET_MOLES(/datum/gas/oxygen, air1) - 0.5 / efficiency)) // Magically consume gas? Why not, we run on cryo magic. update_parents() @@ -467,19 +470,21 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/default_change_direction_wrench(mob/user, obj/item/wrench/W) . = ..() if(.) - SetInitDirections() + set_init_directions() var/obj/machinery/atmospherics/node = nodes[1] if(node) node.disconnect(src) nodes[1] = null nullifyPipenet(parents[1]) - atmosinit() + atmos_init() node = nodes[1] if(node) - node.atmosinit() - node.addMember(src) + node.atmos_init() + node.add_member(src) SSair.add_to_rebuild_queue(src) #undef CRYOMOBS #undef CRYO_MULTIPLY_FACTOR #undef CRYO_TX_QTY +#undef CRYO_MIN_GAS_MOLES +#undef MAX_TEMPERATURE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm index 0021cebdc802a..5068730358e5d 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm @@ -32,7 +32,7 @@ icon_state = "he0" PIPING_LAYER_SHIFT(src, piping_layer) -/obj/machinery/atmospherics/components/unary/heat_exchanger/atmosinit() +/obj/machinery/atmospherics/components/unary/heat_exchanger/atmos_init() var/obj/machinery/atmospherics/components/unary/heat_exchanger/partner = partner_ref?.resolve() if(!partner) partner_ref = null @@ -72,8 +72,8 @@ var/combined_energy = partner_air_contents.return_temperature()*other_air_heat_capacity + air_heat_capacity*air_contents.return_temperature() var/new_temperature = combined_energy/combined_heat_capacity - air_contents.set_temperature(new_temperature) - partner_air_contents.set_temperature(new_temperature) + air_contents.temperature = (new_temperature) + partner_air_contents.temperature = (new_temperature) if(abs(old_temperature-air_contents.return_temperature()) > 1) update_parents() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index a30950c10d879..c882258260265 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -50,7 +50,7 @@ cut_overlays() if(showpipe) // everything is already shifted so don't shift the cap - add_overlay(getpipeimage(icon, "inje_cap", initialize_directions)) + add_overlay(get_pipe_image(icon, "inje_cap", initialize_directions)) if(!nodes[1] || !on || !is_operational) icon_state = "inje_off" @@ -70,7 +70,7 @@ if(air_contents != null) if(air_contents.return_temperature() > 0) loc.assume_air_ratio(air_contents, volume_rate / air_contents.return_volume()) - air_update_turf() + air_update_turf(FALSE, FALSE) update_parents() @@ -110,7 +110,7 @@ )) radio_connection.post_signal(src, signal) -/obj/machinery/atmospherics/components/unary/outlet_injector/atmosinit() +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos_init() set_frequency(frequency) broadcast_status() ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm index 1fa5221e38eac..a07c6b078d8a9 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm @@ -15,30 +15,20 @@ /obj/machinery/atmospherics/components/unary/passive_vent/update_icon_nopipes() cut_overlays() if(showpipe) - var/image/cap = getpipeimage(icon, "vent_cap", initialize_directions) + var/image/cap = get_pipe_image(icon, "vent_cap", initialize_directions) add_overlay(cap) icon_state = "passive_vent" /obj/machinery/atmospherics/components/unary/passive_vent/process_atmos() - ..() - if(isclosedturf(loc)) + var/turf/location = get_turf(loc) + if(isclosedturf(location)) return - var/active = FALSE - var/datum/gas_mixture/external = loc.return_air() + var/datum/gas_mixture/external = location.return_air() var/datum/gas_mixture/internal = airs[1] - var/external_pressure = external.return_pressure() - var/internal_pressure = internal.return_pressure() - var/pressure_delta = abs(external_pressure - internal_pressure) - if(pressure_delta > 0.5) - equalize_all_gases_in_list(list(internal,external)) - active = TRUE - - active = internal.temperature_share(external, OPEN_HEAT_TRANSFER_COEFFICIENT) || active - - if(active) - air_update_turf() + if(internal.equalize(external)) + air_update_turf(FALSE, FALSE) update_parents() /obj/machinery/atmospherics/components/unary/passive_vent/can_crawl_through() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm index 2fc2804e60a60..c753fe6cd9fa7 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm @@ -21,7 +21,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/New() ..() var/datum/gas_mixture/air_contents = airs[1] - air_contents.set_volume(0) + air_contents.volume = 0 /obj/machinery/atmospherics/components/unary/portables_connector/Destroy() if(connected_device) @@ -31,7 +31,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/update_icon_nopipes() icon_state = "connector" if(showpipe) - var/image/cap = getpipeimage(icon, "connector_cap", initialize_directions) + var/image/cap = get_pipe_image(icon, "connector_cap", initialize_directions) add_overlay(cap) /obj/machinery/atmospherics/components/unary/portables_connector/process_atmos() @@ -48,13 +48,6 @@ /obj/machinery/atmospherics/components/unary/portables_connector/portableConnectorReturnAir() return connected_device.portableConnectorReturnAir() -/obj/machinery/atmospherics/components/unary/portables_connector/build_network() - . = ..() - if(connect_to) - var/obj/machinery/portable_atmospherics/PA = connect_to - if(PA) - PA.connect(src) - /obj/proc/portableConnectorReturnAir() return diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm index 53cf63376ccdc..9c98b571d630f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm @@ -17,12 +17,13 @@ /obj/machinery/atmospherics/components/unary/tank/New() ..() var/datum/gas_mixture/air_contents = airs[1] - air_contents.set_volume(volume) - air_contents.set_temperature(T20C) + air_contents.volume = volume + air_contents.temperature = (T20C) if(gas_type) - air_contents.set_moles(gas_type, AIR_CONTENTS) - name = "[name] ([GLOB.gas_data.names[gas_type]])" - setPipingLayer(piping_layer) + SET_MOLES(gas_type, air_contents, AIR_CONTENTS) + + name = "[name] ([GLOB.meta_gas_info[gas_type][META_GAS_NAME]])" + set_piping_layer(piping_layer) /obj/machinery/atmospherics/components/unary/tank/air @@ -32,22 +33,23 @@ /obj/machinery/atmospherics/components/unary/tank/air/New() ..() var/datum/gas_mixture/air_contents = airs[1] - air_contents.set_moles(GAS_O2, AIR_CONTENTS * 0.2) - air_contents.set_moles(GAS_N2, AIR_CONTENTS * 0.8) + SET_MOLES(/datum/gas/oxygen, air_contents, 6*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + SET_MOLES(/datum/gas/nitrogen, air_contents, 6*ONE_ATMOSPHERE*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) + /obj/machinery/atmospherics/components/unary/tank/carbon_dioxide - gas_type = GAS_CO2 + gas_type = /datum/gas/carbon_dioxide /obj/machinery/atmospherics/components/unary/tank/plasma icon_state = "orange" - gas_type = GAS_PLASMA + gas_type = /datum/gas/plasma /obj/machinery/atmospherics/components/unary/tank/oxygen icon_state = "blue" - gas_type = GAS_O2 + gas_type = /datum/gas/oxygen /obj/machinery/atmospherics/components/unary/tank/nitrogen icon_state = "red" - gas_type = GAS_N2 + gas_type = /datum/gas/nitrogen #undef AIR_CONTENTS diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 582a53629a376..3d9acf41968af 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -82,12 +82,12 @@ else icon_state = icon_state_off - add_overlay(getpipeimage(icon, "pipe", dir, , piping_layer)) + add_overlay(get_pipe_image(icon, "pipe", dir, , piping_layer)) /obj/machinery/atmospherics/components/unary/thermomachine/update_icon_nopipes() cut_overlays() if(showpipe) - add_overlay(getpipeimage(icon, "scrub_cap", initialize_directions)) + add_overlay(get_pipe_image(icon, "scrub_cap", initialize_directions)) /obj/machinery/atmospherics/components/unary/thermomachine/examine(mob/user) . = ..() @@ -119,7 +119,7 @@ if(combined_heat_capacity > 0) var/combined_energy = heat_capacity * target_temperature + air_heat_capacity * air_contents.return_temperature() - air_contents.set_temperature(combined_energy/combined_heat_capacity) + air_contents.temperature = (combined_energy/combined_heat_capacity) var/temperature_delta= abs(old_temperature - air_contents.return_temperature()) if(temperature_delta > 1) @@ -142,7 +142,7 @@ /obj/machinery/atmospherics/components/unary/thermomachine/default_change_direction_wrench(mob/user, obj/item/I) if(!..()) return FALSE - SetInitDirections() + set_init_directions() var/obj/machinery/atmospherics/node = nodes[1] if(node) node.disconnect(src) @@ -151,11 +151,11 @@ if(parents[1]) nullifyPipenet(parents[1]) - atmosinit() + atmos_init() node = nodes[1] if(node) - node.atmosinit() - node.addMember(src) + node.atmos_init() + node.add_member(src) SSair.add_to_rebuild_queue(src) return TRUE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm index 8f31f8b58ef73..b2956b70067ba 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm @@ -12,7 +12,7 @@ pipe_interference_group = "atmos-[piping_layer]"\ ) -/obj/machinery/atmospherics/components/unary/SetInitDirections() +/obj/machinery/atmospherics/components/unary/set_init_directions() initialize_directions = dir /obj/machinery/atmospherics/components/unary/on_construction() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index b52996392bdea..c271dbd3b68d3 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -57,7 +57,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/update_icon_nopipes() cut_overlays() if(showpipe) - var/image/cap = getpipeimage(icon, "vent_cap", initialize_directions) + var/image/cap = get_pipe_image(icon, "vent_cap", initialize_directions) add_overlay(cap) else PIPING_LAYER_SHIFT(src, PIPING_LAYER_DEFAULT) @@ -118,10 +118,10 @@ if(pressure_delta > 0) if(air_contents.return_temperature() > 0 && air_contents.return_volume() > 0) - var/transfer_moles = pressure_delta*environment.return_volume()/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION) + var/transfer_moles = (pressure_delta*environment.return_volume())/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION) loc.assume_air_moles(air_contents, transfer_moles) - air_update_turf() + air_update_turf(FALSE, FALSE) else // external -> internal if(environment.return_pressure() > 0) @@ -134,7 +134,7 @@ if(moles_delta > 0) loc.transfer_air(air_contents, moles_delta) - air_update_turf() + air_update_turf(FALSE, FALSE) update_parents() //Radio remote control @@ -172,7 +172,7 @@ radio_connection.post_signal(src, signal, radio_filter_out) -/obj/machinery/atmospherics/components/unary/vent_pump/atmosinit() +/obj/machinery/atmospherics/components/unary/vent_pump/atmos_init() //some vents work his own spesial way radio_filter_in = frequency==FREQ_ATMOS_CONTROL?(RADIO_FROM_AIRALARM):null radio_filter_out = frequency==FREQ_ATMOS_CONTROL?(RADIO_TO_AIRALARM):null @@ -303,7 +303,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/New() ..() var/datum/gas_mixture/air_contents = airs[1] - air_contents.set_volume(1000) + air_contents.volume = 1000 // mapping diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 78f7434100d7f..6e7c272ee8449 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -19,7 +19,7 @@ var/scrubbing = SCRUBBING //0 = siphoning, 1 = scrubbing - var/filter_types = list(GAS_CO2, GAS_BZ) + var/filter_types = list(/datum/gas/carbon_dioxide, /datum/gas/bz) var/volume_rate = 200 var/widenet = 0 //is this scrubber acting on the 3x3 area around it. var/list/turf/adjacent_turfs = list() @@ -66,7 +66,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/update_icon_nopipes() cut_overlays() if(showpipe) - var/image/cap = getpipeimage(icon, "scrub_cap", initialize_directions) + var/image/cap = get_pipe_image(icon, "scrub_cap", initialize_directions) add_overlay(cap) else PIPING_LAYER_SHIFT(src, PIPING_LAYER_DEFAULT) @@ -97,8 +97,8 @@ return FALSE var/list/f_types = list() - for(var/id in GLOB.gas_data.ids) - f_types += list(list("gas_id" = id, "gas_name" = GLOB.gas_data.names[id], "enabled" = (id in filter_types))) + for(var/id in subtypesof(/datum/gas)) + f_types += list(list("gas_id" = id, "gas_name" = GLOB.meta_gas_info[id][META_GAS_NAME], "enabled" = (id in filter_types))) var/datum/signal/signal = new(list( "tag" = id_tag, @@ -122,7 +122,7 @@ return TRUE -/obj/machinery/atmospherics/components/unary/vent_scrubber/atmosinit() +/obj/machinery/atmospherics/components/unary/vent_scrubber/atmos_init() radio_filter_in = frequency==initial(frequency)?(RADIO_FROM_AIRALARM):null radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null if(frequency) @@ -144,7 +144,7 @@ scrub(tile) return TRUE -/obj/machinery/atmospherics/components/unary/vent_scrubber/proc/scrub(var/turf/open/tile) +/obj/machinery/atmospherics/components/unary/vent_scrubber/proc/scrub(var/turf/tile) if(!istype(tile)) return FALSE var/datum/gas_mixture/environment = tile.return_air() @@ -155,11 +155,11 @@ if(scrubbing & SCRUBBING) environment.scrub_into(air_contents, volume_rate/environment.return_volume(), filter_types) - tile.air_update_turf() + tile.air_update_turf(FALSE, FALSE) else //Just siphoning all air environment.transfer_ratio_to(air_contents, volume_rate/environment.return_volume()) - tile.air_update_turf() + tile.air_update_turf(FALSE, FALSE) update_parents() @@ -178,7 +178,7 @@ adjacent_turfs.Cut() var/turf/T = get_turf(src) if(istype(T)) - adjacent_turfs = T.GetAtmosAdjacentTurfs(alldir = 1) + adjacent_turfs = T.get_atmos_adjacent_turfs(alldir = 1) /obj/machinery/atmospherics/components/unary/vent_scrubber/receive_signal(datum/signal/signal) if(!is_operational || !signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) @@ -290,10 +290,10 @@ icon_state = "scrub_map_on-4" /obj/machinery/atmospherics/components/unary/vent_scrubber/on/lavaland - filter_types = list(GAS_CO2, GAS_PLASMA, GAS_H2O, GAS_BZ) + filter_types = list(/datum/gas/carbon_dioxide, /datum/gas/plasma, /datum/gas/water_vapor, /datum/gas/bz) /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4/lavaland - filter_types = list(GAS_CO2, GAS_PLASMA, GAS_H2O, GAS_BZ) + filter_types = list(/datum/gas/carbon_dioxide, /datum/gas/plasma, /datum/gas/water_vapor, /datum/gas/bz) #undef SIPHONING #undef SCRUBBING diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 94b347f1be75e..0a94e55813383 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -3,135 +3,178 @@ var/list/datum/gas_mixture/other_airs var/list/obj/machinery/atmospherics/pipe/members - var/list/obj/machinery/atmospherics/components/other_atmosmch + var/list/obj/machinery/atmospherics/components/other_atmos_machines + + ///Should we equalize air amoung all our members? var/update = TRUE + ///Is this pipeline being reconstructed? + var/building = FALSE /datum/pipeline/New() other_airs = list() members = list() - other_atmosmch = list() + other_atmos_machines = list() SSair.networks += src /datum/pipeline/Destroy() SSair.networks -= src - if(air && air.return_volume()) + if(building) + SSair.remove_from_expansion(src) + if(air?.volume) temporarily_store_air() - for(var/obj/machinery/atmospherics/pipe/P in members) - P.parent = null - for(var/obj/machinery/atmospherics/components/C in other_atmosmch) - C.nullifyPipenet(src) + for(var/obj/machinery/atmospherics/pipe/considered_pipe in members) + considered_pipe.parent = null + if(QDELETED(considered_pipe)) + continue + SSair.add_to_rebuild_queue(considered_pipe) + for(var/obj/machinery/atmospherics/components/considered_component in other_atmos_machines) + considered_component.nullifyPipenet(src) return ..() /datum/pipeline/process() - if(update) - update = FALSE - reconcile_air() + if(!update || building) + return + + reconcile_air() update = air.react(src) +///Preps a pipeline for rebuilding, insterts it into the rebuild queue /datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/base) + building = TRUE var/volume = 0 if(istype(base, /obj/machinery/atmospherics/pipe)) - var/obj/machinery/atmospherics/pipe/E = base - volume = E.volume - members += E - if(E.air_temporary) - air = E.air_temporary - E.air_temporary = null + var/obj/machinery/atmospherics/pipe/considered_pipe = base + volume = considered_pipe.volume + members += considered_pipe + if(considered_pipe.air_temporary) + air = considered_pipe.air_temporary + considered_pipe.air_temporary = null else - addMachineryMember(base) + add_machinery_member(base) + + if(!air) + air = new + + air.volume = volume + SSair.add_to_expansion(src, base) + +///Has the same effect as build_pipeline(), but this doesn't queue its work, so overrun abounds. It's useful for the pregame +/datum/pipeline/proc/build_pipeline_blocking(obj/machinery/atmospherics/base) + var/volume = 0 + if(istype(base, /obj/machinery/atmospherics/pipe)) + var/obj/machinery/atmospherics/pipe/considered_pipe = base + volume = considered_pipe.volume + members += considered_pipe + if(considered_pipe.air_temporary) + air = considered_pipe.air_temporary + considered_pipe.air_temporary = null + else + add_machinery_member(base) + if(!air) air = new var/list/possible_expansions = list(base) - while(possible_expansions.len>0) + while(possible_expansions.len) for(var/obj/machinery/atmospherics/borderline in possible_expansions) - var/list/result = borderline.pipeline_expansion(src) - - if(result.len>0) - for(var/obj/machinery/atmospherics/P in result) - if(istype(P, /obj/machinery/atmospherics/pipe)) - var/obj/machinery/atmospherics/pipe/item = P - if(!members.Find(item)) - - if(item.parent) - var/static/pipenetwarnings = 10 - if(pipenetwarnings > 0) - log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) Nearby: ([item.x], [item.y], [item.z]).") - pipenetwarnings -= 1 - if(pipenetwarnings == 0) - log_mapping("build_pipeline(): further messages about pipenets will be suppressed") - members += item - possible_expansions += item - - volume += item.volume - item.parent = src - - if(item.air_temporary) - air.merge(item.air_temporary) - item.air_temporary = null - else - P.setPipenet(src, borderline) - addMachineryMember(P) + if(!result?.len) + possible_expansions -= borderline + continue + for(var/obj/machinery/atmospherics/considered_device in result) + if(!istype(considered_device, /obj/machinery/atmospherics/pipe)) + considered_device.set_pipenet(src, borderline) + add_machinery_member(considered_device) + continue + var/obj/machinery/atmospherics/pipe/item = considered_device + if(members.Find(item)) + continue + if(item.parent) + var/static/pipenetwarnings = 10 + if(pipenetwarnings > 0) + log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) around [AREACOORD(item)].") + pipenetwarnings-- + if(pipenetwarnings == 0) + log_mapping("build_pipeline(): further messages about pipenets will be suppressed") + + members += item + possible_expansions += item + + volume += item.volume + item.parent = src + + if(item.air_temporary) + air.merge(item.air_temporary) + item.air_temporary = null possible_expansions -= borderline - air.set_volume(volume) - -/datum/pipeline/proc/addMachineryMember(obj/machinery/atmospherics/components/C) - other_atmosmch |= C - var/datum/gas_mixture/G = C.returnPipenetAir(src) - if(!G) - stack_trace("addMachineryMember: Null gasmix added to pipeline datum from [C] which is of type [C.type]. Nearby: ([C.x], [C.y], [C.z])") - other_airs |= G - -/datum/pipeline/proc/addMember(obj/machinery/atmospherics/A, obj/machinery/atmospherics/N) - if(istype(A, /obj/machinery/atmospherics/pipe)) - var/obj/machinery/atmospherics/pipe/P = A - if(P.parent) - merge(P.parent) - P.parent = src - var/list/adjacent = P.pipeline_expansion() - for(var/obj/machinery/atmospherics/pipe/I in adjacent) - if(I.parent == src) - continue - var/datum/pipeline/E = I.parent - merge(E) - if(!members.Find(P)) - members += P - air.set_volume(air.return_volume() + P.volume) + air.volume = volume + + /** + * For a machine to properly "connect" to a pipeline and share gases, + * the pipeline needs to acknowledge a gas mixture as it's member. + * This is currently handled by the other_airs list in the pipeline datum. + * + * Other_airs itself is populated by gas mixtures through the parents list that each machineries have. + * This parents list is populated when a machinery calls update_parents and is then added into the queue by the controller. + */ + +/datum/pipeline/proc/add_machinery_member(obj/machinery/atmospherics/components/considered_component) + other_atmos_machines |= considered_component + var/list/returned_airs = considered_component.return_pipenet_airs(src) + if (!length(returned_airs) || (null in returned_airs)) + stack_trace("add_machinery_member: Nonexistent (empty list) or null machinery gasmix added to pipeline datum from [considered_component] \ + which is of type [considered_component.type]. Nearby: ([considered_component.x], [considered_component.y], [considered_component.z])") + other_airs |= returned_airs + +/datum/pipeline/proc/add_member(obj/machinery/atmospherics/reference_device, obj/machinery/atmospherics/device_to_add) + if(!istype(reference_device, /obj/machinery/atmospherics/pipe)) + reference_device.set_pipenet(src, device_to_add) + add_machinery_member(reference_device) else - A.setPipenet(src, N) - addMachineryMember(A) - -/datum/pipeline/proc/merge(datum/pipeline/E) - if(E == src) + var/obj/machinery/atmospherics/pipe/reference_pipe = reference_device + if(reference_pipe.parent) + merge(reference_pipe.parent) + reference_pipe.parent = src + var/list/adjacent = reference_pipe.pipeline_expansion() + for(var/obj/machinery/atmospherics/pipe/adjacent_pipe in adjacent) + if(adjacent_pipe.parent == src) + continue + var/datum/pipeline/parent_pipeline = adjacent_pipe.parent + merge(parent_pipeline) + if(!members.Find(reference_pipe)) + members += reference_pipe + air.volume += reference_pipe.volume + +/datum/pipeline/proc/merge(datum/pipeline/parent_pipeline) + if(parent_pipeline == src) return - air.set_volume(air.return_volume() + E.air.return_volume()) - members.Add(E.members) - for(var/obj/machinery/atmospherics/pipe/S in E.members) - S.parent = src - air.merge(E.air) - for(var/obj/machinery/atmospherics/components/C in E.other_atmosmch) - C.replacePipenet(E, src) - other_atmosmch.Add(E.other_atmosmch) - other_airs.Add(E.other_airs) - E.members.Cut() - E.other_atmosmch.Cut() + air.volume += parent_pipeline.air.volume + members.Add(parent_pipeline.members) + for(var/obj/machinery/atmospherics/pipe/reference_pipe in parent_pipeline.members) + reference_pipe.parent = src + air.merge(parent_pipeline.air) + for(var/obj/machinery/atmospherics/components/reference_component in parent_pipeline.other_atmos_machines) + reference_component.replace_pipenet(parent_pipeline, src) + other_atmos_machines |= parent_pipeline.other_atmos_machines + other_airs |= parent_pipeline.other_airs + parent_pipeline.members.Cut() + parent_pipeline.other_atmos_machines.Cut() update = TRUE - qdel(E) + qdel(parent_pipeline) -/obj/machinery/atmospherics/proc/addMember(obj/machinery/atmospherics/A) +/obj/machinery/atmospherics/proc/add_member(obj/machinery/atmospherics/considered_device) return -/obj/machinery/atmospherics/pipe/addMember(obj/machinery/atmospherics/A) - parent.addMember(A, src) +/obj/machinery/atmospherics/pipe/add_member(obj/machinery/atmospherics/considered_device) + parent.add_member(considered_device, src) -/obj/machinery/atmospherics/components/addMember(obj/machinery/atmospherics/A) - var/datum/pipeline/P = returnPipenet(A) - if(!P) - CRASH("null.addMember() called by [type] on [COORD(src)]") - P.addMember(A, src) +/obj/machinery/atmospherics/components/add_member(obj/machinery/atmospherics/considered_device) + var/datum/pipeline/device_pipeline = return_pipenet(considered_device) + if(!device_pipeline) + CRASH("null.add_member() called by [type] on [COORD(src)]") + device_pipeline.add_member(considered_device, src) /datum/pipeline/proc/temporarily_store_air() @@ -139,16 +182,14 @@ for(var/obj/machinery/atmospherics/pipe/member in members) member.air_temporary = new - member.air_temporary.set_volume(member.volume) - member.air_temporary.copy_from(air) + member.air_temporary.volume = member.volume + member.air_temporary.copy_from_ratio(air, member.volume / air.volume) - member.air_temporary.multiply(member.volume/air.return_volume()) - - member.air_temporary.set_temperature(air.return_temperature()) + member.air_temporary.temperature = air.temperature /datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity) var/total_heat_capacity = air.heat_capacity() - var/partial_heat_capacity = total_heat_capacity*(share_volume/air.return_volume()) + var/partial_heat_capacity = total_heat_capacity * (share_volume / air.volume) var/target_temperature var/target_heat_capacity @@ -158,71 +199,100 @@ target_temperature = modeled_location.GetTemperature() target_heat_capacity = modeled_location.GetHeatCapacity() + if(modeled_location.blocks_air) - var/delta_temperature = 0 - var/sharer_heat_capacity = 0 + if((modeled_location.heat_capacity > 0) && (partial_heat_capacity > 0)) + var/delta_temperature = air.temperature - target_temperature - delta_temperature = (air.return_temperature() - target_temperature) - sharer_heat_capacity = target_heat_capacity + var/heat = thermal_conductivity * delta_temperature * (partial_heat_capacity * target_heat_capacity / (partial_heat_capacity + target_heat_capacity)) - var/self_temperature_delta = 0 - var/sharer_temperature_delta = 0 + air.temperature -= heat/total_heat_capacity + modeled_location.TakeTemperature(heat / target_heat_capacity) - if((sharer_heat_capacity>0) && (partial_heat_capacity>0)) - var/heat = thermal_conductivity*delta_temperature* \ - (partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity)) - - self_temperature_delta = -heat/total_heat_capacity - sharer_temperature_delta = heat/sharer_heat_capacity else - return 1 + var/delta_temperature = 0 + var/sharer_heat_capacity = 0 - air.set_temperature(air.return_temperature() + self_temperature_delta) - modeled_location.TakeTemperature(sharer_temperature_delta) + delta_temperature = (air.temperature - target_temperature) + sharer_heat_capacity = target_heat_capacity + var/self_temperature_delta = 0 + var/sharer_temperature_delta = 0 + + if((sharer_heat_capacity <= 0) || (partial_heat_capacity <= 0)) + return TRUE + var/heat = thermal_conductivity * delta_temperature * (partial_heat_capacity * sharer_heat_capacity / (partial_heat_capacity + sharer_heat_capacity)) + + self_temperature_delta = - heat / total_heat_capacity + sharer_temperature_delta = heat / sharer_heat_capacity + + air.temperature += self_temperature_delta + modeled_location.TakeTemperature(sharer_temperature_delta) - else - if((target.heat_capacity>0) && (partial_heat_capacity>0)) - var/delta_temperature = air.return_temperature() - target.return_temperature() + else + if((target.heat_capacity > 0) && (partial_heat_capacity > 0)) + var/delta_temperature = air.temperature - target.temperature + //Temp share things, see superconduction for more like this var/heat = thermal_conductivity*delta_temperature* \ (partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity)) - air.set_temperature(air.return_temperature() - heat/total_heat_capacity) + air.temperature -= heat / total_heat_capacity update = TRUE /datum/pipeline/proc/return_air() . = other_airs + air - if(null in .) - stack_trace("[src]([REF(src)]) has one or more null gas mixtures, which may cause bugs. Null mixtures will not be considered in reconcile_air().") - list_clear_nulls(.) - -/datum/pipeline/proc/empty() - for(var/datum/gas_mixture/GM in get_all_connected_airs()) - GM.clear() - -/datum/pipeline/proc/get_all_connected_airs() - var/list/datum/gas_mixture/GL = list() - var/list/datum/pipeline/PL = list() - PL += src - - for(var/i = 1; i <= PL.len; i++) //can't do a for-each here because we may add to the list within the loop - var/datum/pipeline/P = PL[i] - if(!P) - continue - GL += P.return_air() - for(var/atmosmch in P.other_atmosmch) - if (istype(atmosmch, /obj/machinery/atmospherics/components/binary/valve)) - var/obj/machinery/atmospherics/components/binary/valve/V = atmosmch - if(V.on) - PL |= V.parents[1] - PL |= V.parents[2] - else if (istype(atmosmch, /obj/machinery/atmospherics/components/unary/portables_connector)) - var/obj/machinery/atmospherics/components/unary/portables_connector/C = atmosmch - if(C.connected_device) - GL += C.portableConnectorReturnAir() - return GL + if(list_clear_nulls(.)) + stack_trace("[src] has one or more null gas mixtures, which may cause bugs. Null mixtures will not be considered in reconcile_air().") /datum/pipeline/proc/reconcile_air() - var/list/datum/gas_mixture/GL = get_all_connected_airs() - equalize_all_gases_in_list(GL) + var/list/datum/gas_mixture/gas_mixture_list = list() + var/list/datum/pipeline/pipeline_list = list() + pipeline_list += src + + for(var/i = 1; i <= pipeline_list.len; i++) //can't do a for-each here because we may add to the list within the loop + var/datum/pipeline/pipeline = pipeline_list[i] + if(!pipeline) + continue + gas_mixture_list += pipeline.other_airs + gas_mixture_list += pipeline.air + var/total_thermal_energy = 0 + var/total_heat_capacity = 0 + var/datum/gas_mixture/total_gas_mixture = new(0) + + + var/volume_sum = 0 + + var/static/process_id = 0 + process_id = (process_id + 1) % (SHORT_REAL_LIMIT - 1) + + for(var/datum/gas_mixture/gas_mixture as anything in gas_mixture_list) + // Ensure we never walk the same mix twice + if(gas_mixture.pipeline_cycle == process_id) + gas_mixture_list -= gas_mixture + continue + gas_mixture.pipeline_cycle = process_id + volume_sum += gas_mixture.volume + + // This is sort of a combined merge + heat_capacity calculation + + var/list/giver_gases = gas_mixture.gases + var/heat_capacity = 0 + //gas transfer + for(var/giver_id in giver_gases) + var/giver_gas_data = giver_gases[giver_id] + + ADD_MOLES(giver_id, total_gas_mixture, giver_gas_data[MOLES]) + heat_capacity += giver_gas_data[MOLES] * giver_gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] + + total_heat_capacity += heat_capacity + total_thermal_energy += gas_mixture.temperature * heat_capacity + + total_gas_mixture.temperature = total_heat_capacity ? (total_thermal_energy / total_heat_capacity) : 0 + total_gas_mixture.volume = volume_sum + total_gas_mixture.garbage_collect() + + if(total_gas_mixture.volume > 0) + //Update individual gas_mixtures by volume ratio + for(var/datum/gas_mixture/gas_mixture as anything in gas_mixture_list) + gas_mixture.copy_from_ratio(total_gas_mixture, gas_mixture.volume / volume_sum) diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index c025855411842..ff97cb2c1a05e 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -134,8 +134,9 @@ if(!isopenturf(O)) return FALSE var/datum/gas_mixture/merger = new - merger.set_moles(spawn_id, spawn_mol * delta_time) - merger.set_temperature(spawn_temp) + SET_MOLES(spawn_id, merger, spawn_mol * delta_time) + + merger.temperature = (spawn_temp) O.assume_air(merger) /obj/machinery/atmospherics/miner/attack_ai(mob/living/silicon/user) @@ -146,62 +147,62 @@ /obj/machinery/atmospherics/miner/n2o name = "\improper N2O Gas Miner" overlay_color = "#FFCCCC" - spawn_id = GAS_NITROUS + spawn_id = /datum/gas/nitrous_oxide /obj/machinery/atmospherics/miner/nitrogen name = "\improper N2 Gas Miner" overlay_color = "#CCFFCC" - spawn_id = GAS_N2 + spawn_id = /datum/gas/nitrogen /obj/machinery/atmospherics/miner/oxygen name = "\improper O2 Gas Miner" overlay_color = "#007FFF" - spawn_id = GAS_O2 + spawn_id = /datum/gas/oxygen /obj/machinery/atmospherics/miner/plasma name = "\improper Plasma Gas Miner" overlay_color = "#FF0000" - spawn_id = GAS_PLASMA + spawn_id = /datum/gas/plasma /obj/machinery/atmospherics/miner/carbon_dioxide name = "\improper CO2 Gas Miner" overlay_color = "#CDCDCD" - spawn_id = GAS_CO2 + spawn_id = /datum/gas/carbon_dioxide /obj/machinery/atmospherics/miner/bz name = "\improper BZ Gas Miner" overlay_color = "#FAFF00" - spawn_id = GAS_BZ + spawn_id = /datum/gas/bz /obj/machinery/atmospherics/miner/water_vapor name = "\improper Water Vapor Gas Miner" overlay_color = "#99928E" - spawn_id = GAS_H2O + spawn_id = /datum/gas/water_vapor /obj/machinery/atmospherics/miner/tritium name = "\improper Tritium Gas Miner" overlay_color = "#1ae000" - spawn_id = GAS_TRITIUM + spawn_id = /datum/gas/tritium /obj/machinery/atmospherics/miner/hypernoblium name = "\improper Hypernoblium Gas Miner" overlay_color = "#00a6e7" - spawn_id = GAS_HYPERNOB + spawn_id = /datum/gas/hypernoblium /obj/machinery/atmospherics/miner/nitryl name = "\improper Nitryl Gas Miner" overlay_color = "#5e4000" - spawn_id = GAS_NITRYL + spawn_id = /datum/gas/nitryl /obj/machinery/atmospherics/miner/stimulum name = "\improper Stimulum Gas Miner" overlay_color = "#c9c9c9" - spawn_id = GAS_STIMULUM + spawn_id = /datum/gas/stimulum /obj/machinery/atmospherics/miner/pluoxium name = "\improper Pluoxium Gas Miner" overlay_color = "#c5c9b1" - spawn_id = GAS_PLUOXIUM + spawn_id = /datum/gas/pluoxium /obj/machinery/atmospherics/miner/station power_draw = GASMINER_POWER_FULLSCALE @@ -211,37 +212,37 @@ /obj/machinery/atmospherics/miner/station/n2o name = "\improper N2O Gas Miner" overlay_color = "#FFCCCC" - spawn_id = GAS_NITROUS + spawn_id = /datum/gas/nitrous_oxide /obj/machinery/atmospherics/miner/station/nitrogen name = "\improper N2 Gas Miner" overlay_color = "#CCFFCC" - spawn_id = GAS_N2 + spawn_id = /datum/gas/nitrogen /obj/machinery/atmospherics/miner/station/oxygen name = "\improper O2 Gas Miner" overlay_color = "#007FFF" - spawn_id = GAS_O2 + spawn_id = /datum/gas/oxygen /obj/machinery/atmospherics/miner/station/plasma name = "\improper Plasma Gas Miner" overlay_color = "#FF0000" - spawn_id = GAS_PLASMA + spawn_id = /datum/gas/plasma /obj/machinery/atmospherics/miner/station/carbon_dioxide name = "\improper CO2 Gas Miner" overlay_color = "#CDCDCD" - spawn_id = GAS_CO2 + spawn_id = /datum/gas/carbon_dioxide /obj/machinery/atmospherics/miner/station/bz name = "\improper BZ Gas Miner" overlay_color = "#FAFF00" - spawn_id = GAS_BZ + spawn_id = /datum/gas/bz /obj/machinery/atmospherics/miner/station/water_vapor name = "\improper Water Vapor Gas Miner" overlay_color = "#99928E" - spawn_id = GAS_H2O + spawn_id = /datum/gas/water_vapor #undef GASMINER_POWER_NONE diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index b0070488a00af..ded1ea2febe32 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -14,7 +14,7 @@ add_atom_colour("#404040", FIXED_COLOUR_PRIORITY) -/obj/machinery/atmospherics/pipe/heat_exchanging/isConnectable(obj/machinery/atmospherics/pipe/heat_exchanging/target, given_layer, HE_type_check = TRUE) +/obj/machinery/atmospherics/pipe/heat_exchanging/is_connectable(obj/machinery/atmospherics/pipe/heat_exchanging/target, given_layer, HE_type_check = TRUE) if(istype(target, /obj/machinery/atmospherics/pipe/heat_exchanging) != HE_type_check) return FALSE . = ..() @@ -25,7 +25,7 @@ var/turf/T = loc if(istype(T)) - if(isclosedturf(T)) + if(T.blocks_air) environment_temperature = T.return_temperature() else var/turf/open/OT = T @@ -47,7 +47,7 @@ for(var/m in buckled_mobs) var/mob/living/L = m L.bodytemperature = avg_temp - pipe_air.set_temperature(avg_temp) + pipe_air.temperature = (avg_temp) /obj/machinery/atmospherics/pipe/heat_exchanging/process(delta_time) if(!parent) diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm index a5b736806f0fb..502a27a038f42 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm @@ -15,17 +15,17 @@ construction_type = /obj/item/pipe/directional pipe_state = "junction" -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/SetInitDirections() +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/set_init_directions() switch(dir) if(NORTH, SOUTH) initialize_directions = SOUTH|NORTH if(EAST, WEST) initialize_directions = WEST|EAST -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/getNodeConnects() +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/get_node_connects() return list(turn(dir, 180), dir) -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/isConnectable(obj/machinery/atmospherics/target, given_layer, he_type_check) +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/is_connectable(obj/machinery/atmospherics/target, given_layer, he_type_check) if(dir == get_dir(target, src)) return ..(target, given_layer, FALSE) //we want a normal pipe instead return ..(target, given_layer, TRUE) diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm index f02e1a4b75a61..c59c3c743312f 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm @@ -22,7 +22,7 @@ center = mutable_appearance(icon, "manifold_center") return ..() -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/SetInitDirections() +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/set_init_directions() initialize_directions = ALL_CARDINALS initialize_directions &= ~dir @@ -35,7 +35,7 @@ //Add non-broken pieces for(var/i in 1 to device_type) if(nodes[i]) - add_overlay( getpipeimage(icon, "pipe-[piping_layer]", get_dir(src, nodes[i])) ) + add_overlay( get_pipe_image(icon, "pipe-[piping_layer]", get_dir(src, nodes[i])) ) update_layer() diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold4w.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold4w.dm index 18b4b1923f302..a321f7967e464 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold4w.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold4w.dm @@ -21,7 +21,7 @@ center = mutable_appearance(icon, "manifold4w_center") return ..() -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w/SetInitDirections() +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w/set_init_directions() initialize_directions = initial(initialize_directions) /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w/update_icon() @@ -33,7 +33,7 @@ //Add non-broken pieces for(var/i in 1 to device_type) if(nodes[i]) - add_overlay( getpipeimage(icon, "pipe-[piping_layer]", get_dir(src, nodes[i])) ) + add_overlay( get_pipe_image(icon, "pipe-[piping_layer]", get_dir(src, nodes[i])) ) update_layer() diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm index 7a5d9e5e6d1ef..7c43cd771af20 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm @@ -14,7 +14,7 @@ construction_type = /obj/item/pipe/binary/bendable pipe_state = "he" -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/SetInitDirections() +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/set_init_directions() if(dir in GLOB.diagonals) initialize_directions = dir return diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index d0473acdaab3d..81712e63d29ef 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -68,21 +68,21 @@ var/image/I if(p_color) - I = getpipeimage(icon, "pipe", p_dir, p_color, piping_layer = p_layer) + I = get_pipe_image(icon, "pipe", p_dir, p_color, piping_layer = p_layer) else - I = getpipeimage(icon, "pipe", p_dir, piping_layer = p_layer) + I = get_pipe_image(icon, "pipe", p_dir, piping_layer = p_layer) I.layer = layer - 0.01 add_overlay(I) -/obj/machinery/atmospherics/pipe/layer_manifold/SetInitDirections() +/obj/machinery/atmospherics/pipe/layer_manifold/set_init_directions() switch(dir) if(NORTH, SOUTH) initialize_directions = NORTH|SOUTH if(EAST, WEST) initialize_directions = EAST|WEST -/obj/machinery/atmospherics/pipe/layer_manifold/isConnectable(obj/machinery/atmospherics/target, given_layer) +/obj/machinery/atmospherics/pipe/layer_manifold/is_connectable(obj/machinery/atmospherics/target, given_layer) if(!given_layer) return TRUE . = ..() @@ -92,8 +92,8 @@ back_nodes = list() var/list/new_nodes = list() for(var/iter in PIPING_LAYER_MIN to PIPING_LAYER_MAX) - var/obj/machinery/atmospherics/foundfront = findConnecting(dir, iter) - var/obj/machinery/atmospherics/foundback = findConnecting(turn(dir, 180), iter) + var/obj/machinery/atmospherics/foundfront = find_connecting(dir, iter) + var/obj/machinery/atmospherics/foundback = find_connecting(turn(dir, 180), iter) front_nodes += foundfront back_nodes += foundback if(foundfront && !QDELETED(foundfront)) @@ -103,11 +103,11 @@ update_appearance() return new_nodes -/obj/machinery/atmospherics/pipe/layer_manifold/atmosinit() +/obj/machinery/atmospherics/pipe/layer_manifold/atmos_init() normalize_cardinal_directions() findAllConnections() -/obj/machinery/atmospherics/pipe/layer_manifold/setPipingLayer() +/obj/machinery/atmospherics/pipe/layer_manifold/set_piping_layer() piping_layer = PIPING_LAYER_DEFAULT /obj/machinery/atmospherics/pipe/layer_manifold/pipeline_expansion() diff --git a/code/modules/atmospherics/machinery/pipes/manifold.dm b/code/modules/atmospherics/machinery/pipes/manifold.dm index 93353618e61ef..67e9670839caf 100644 --- a/code/modules/atmospherics/machinery/pipes/manifold.dm +++ b/code/modules/atmospherics/machinery/pipes/manifold.dm @@ -31,7 +31,7 @@ center = mutable_appearance(icon, "manifold_center") return ..() -/obj/machinery/atmospherics/pipe/manifold/SetInitDirections() +/obj/machinery/atmospherics/pipe/manifold/set_init_directions() initialize_directions = NORTH|SOUTH|EAST|WEST initialize_directions &= ~dir @@ -45,6 +45,6 @@ //Add non-broken pieces for(var/i in 1 to device_type) if(nodes[i]) - add_overlay( getpipeimage(icon, "pipe-[piping_layer]", get_dir(src, nodes[i])) ) + add_overlay( get_pipe_image(icon, "pipe-[piping_layer]", get_dir(src, nodes[i])) ) update_layer() diff --git a/code/modules/atmospherics/machinery/pipes/manifold4w.dm b/code/modules/atmospherics/machinery/pipes/manifold4w.dm index 48e47d5405805..f764e70ee3ca3 100644 --- a/code/modules/atmospherics/machinery/pipes/manifold4w.dm +++ b/code/modules/atmospherics/machinery/pipes/manifold4w.dm @@ -26,7 +26,7 @@ center = mutable_appearance(icon, "manifold4w_center") return ..() -/obj/machinery/atmospherics/pipe/manifold4w/SetInitDirections() +/obj/machinery/atmospherics/pipe/manifold4w/set_init_directions() initialize_directions = initial(initialize_directions) /obj/machinery/atmospherics/pipe/manifold4w/update_icon() @@ -39,6 +39,6 @@ //Add non-broken pieces for(var/i in 1 to device_type) if(nodes[i]) - add_overlay( getpipeimage(icon, "pipe-[piping_layer]", get_dir(src, nodes[i])) ) + add_overlay( get_pipe_image(icon, "pipe-[piping_layer]", get_dir(src, nodes[i])) ) update_layer() diff --git a/code/modules/atmospherics/machinery/pipes/multiz.dm b/code/modules/atmospherics/machinery/pipes/multiz.dm index 699e4ab965f8a..3c0aeb6e915a0 100644 --- a/code/modules/atmospherics/machinery/pipes/multiz.dm +++ b/code/modules/atmospherics/machinery/pipes/multiz.dm @@ -32,7 +32,7 @@ pipe = mutable_appearance(icon, "pipe-[piping_layer]") return ..() -/obj/machinery/atmospherics/pipe/multiz/SetInitDirections() +/obj/machinery/atmospherics/pipe/multiz/set_init_directions() initialize_directions = dir /obj/machinery/atmospherics/pipe/multiz/update_icon() diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index 1258f5504392b..20b83d60681e7 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -1,10 +1,12 @@ /obj/machinery/atmospherics/pipe + damage_deflection = 12 var/datum/gas_mixture/air_temporary //used when reconstructing a pipeline that broke var/volume = 0 use_power = NO_POWER_USE can_unwrench = 1 var/datum/pipeline/parent = null + paintable = TRUE //Buckling @@ -28,13 +30,9 @@ . = ..() if(hide) - AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) - -/obj/machinery/atmospherics/pipe/examine(mob/user) - . = ..() - . += "[src] is on layer [piping_layer]." + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) //if changing this, change the subtypes RemoveElements too, because thats how bespoke works -/obj/machinery/atmospherics/pipe/nullifyNode(i) +/obj/machinery/atmospherics/pipe/nullify_node(i) var/obj/machinery/atmospherics/oldN = nodes[i] ..() if(oldN) @@ -43,31 +41,33 @@ /obj/machinery/atmospherics/pipe/destroy_network() QDEL_NULL(parent) -/obj/machinery/atmospherics/pipe/build_network() - if(QDELETED(parent)) - parent = new - parent.build_pipeline(src) +/obj/machinery/atmospherics/pipe/get_rebuild_targets() + if(!QDELETED(parent)) + return + parent = new + return list(parent) /obj/machinery/atmospherics/pipe/proc/releaseAirToTurf() if(air_temporary) var/turf/T = loc T.assume_air(air_temporary) - air_update_turf() + air_update_turf(FALSE, FALSE) /obj/machinery/atmospherics/pipe/return_air() - if(parent) - return parent.air + if(air_temporary) + return air_temporary + return parent.air /obj/machinery/atmospherics/pipe/return_analyzable_air() - if(parent) - return parent.air + if(air_temporary) + return air_temporary + return parent.air /obj/machinery/atmospherics/pipe/remove_air(amount) + if(air_temporary) + return air_temporary.remove(amount) return parent.air.remove(amount) -/obj/machinery/atmospherics/pipe/remove_air_ratio(ratio) - return parent.air.remove_ratio(ratio) - /obj/machinery/atmospherics/pipe/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/pipe_meter)) var/obj/item/pipe_meter/meter = W @@ -76,11 +76,10 @@ else return ..() -/obj/machinery/atmospherics/pipe/returnPipenet() - if(parent) - return parent.air +/obj/machinery/atmospherics/pipe/return_pipenet() + return parent -/obj/machinery/atmospherics/pipe/setPipenet(datum/pipeline/P) +/obj/machinery/atmospherics/pipe/set_pipenet(datum/pipeline/P) parent = P /obj/machinery/atmospherics/pipe/Destroy() @@ -97,20 +96,19 @@ qdel(meter) . = ..() +/obj/machinery/atmospherics/pipe/update_icon() + . = ..() + update_layer() + /obj/machinery/atmospherics/pipe/proc/update_node_icon() for(var/i in 1 to device_type) if(nodes[i]) var/obj/machinery/atmospherics/N = nodes[i] N.update_icon() -/obj/machinery/atmospherics/pipe/returnPipenets() +/obj/machinery/atmospherics/pipe/return_pipenets() . = list(parent) -/obj/machinery/atmospherics/pipe/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == MELEE && damage_amount < 12) - return 0 - . = ..() - /obj/machinery/atmospherics/pipe/paint(paint_color) if(paintable) add_atom_colour(paint_color, FIXED_COLOUR_PRIORITY) diff --git a/code/modules/atmospherics/machinery/pipes/simple.dm b/code/modules/atmospherics/machinery/pipes/simple.dm index da6fab8c66d0d..fc954093311a6 100644 --- a/code/modules/atmospherics/machinery/pipes/simple.dm +++ b/code/modules/atmospherics/machinery/pipes/simple.dm @@ -22,7 +22,7 @@ pipe_interference_group = "atmos-[piping_layer]"\ ) -/obj/machinery/atmospherics/pipe/simple/SetInitDirections() +/obj/machinery/atmospherics/pipe/simple/set_init_directions() if(dir in GLOB.diagonals) initialize_directions = dir return diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 587ed2f6e1529..afe96b3f00e28 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -58,6 +58,10 @@ . = ..() AddComponent(/datum/component/usb_port, list(/obj/item/circuit_component/canister_valve)) +/obj/machinery/portable_atmospherics/canister/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + /obj/item/circuit_component/canister_valve display_name = "Canister Valve" desc = "The interface for communicating with a canister's valve." @@ -96,11 +100,12 @@ logmsg = "Valve was toggled by [parent.get_creator_admin()]'s circuit, starting a transfer into \the [attached_can.holding || "air"].
" if(!attached_can.holding) var/list/danger = list() - for(var/id in attached_can.air_contents.get_gases()) - if(!(GLOB.gas_data.flags[id] & GAS_FLAG_DANGEROUS)) + var/datum/gas_mixture/attached_can_air = attached_can.return_air() + for(var/id in attached_can_air.gases) + if(!(GLOB.meta_gas_info[id][META_GAS_DANGER])) continue - if(attached_can.air_contents.get_moles(id) > (GLOB.gas_data.visibility[id] || MOLES_GAS_VISIBLE)) //if moles_visible is undefined, default to default visibility - danger[GLOB.gas_data.names[id]] = attached_can.air_contents.get_moles(id) //ex. "plasma" = 20 + if(attached_can_air.gases[id][MOLES] > (GLOB.meta_gas_info[id][META_GAS_MOLES_VISIBLE] || MOLES_GAS_VISIBLE)) //if moles_visible is undefined, default to default visibility + danger[GLOB.meta_gas_info[id][META_GAS_NAME]] = attached_can_air.gases[id][MOLES] //ex. "plasma" = 20 if(danger.len && attached_can.valve_open) message_admins("[parent.get_creator_admin()]'s circuit opened a canister that contains the following at [ADMIN_VERBOSEJMP(attached_can)]:") @@ -131,84 +136,84 @@ /obj/machinery/portable_atmospherics/canister/bz name = "\improper BZ canister" desc = "BZ, a powerful hallucinogenic nerve agent." - gas_type = GAS_BZ + gas_type = /datum/gas/bz greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#9b5d7f#d0d2a0" /obj/machinery/portable_atmospherics/canister/carbon_dioxide name = "co2 canister" desc = "Carbon dioxide. What the fuck is carbon dioxide?" - gas_type = GAS_CO2 + gas_type = /datum/gas/carbon_dioxide greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#4e4c48" /obj/machinery/portable_atmospherics/canister/nitrogen name = "n2 canister" desc = "Nitrogen gas. Reportedly useful for something." - gas_type = GAS_N2 + gas_type = /datum/gas/nitrogen greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#d41010" /obj/machinery/portable_atmospherics/canister/nitrous_oxide name = "n2o canister" desc = "Nitrous oxide gas. Known to cause drowsiness." - gas_type = GAS_NITROUS + gas_type = /datum/gas/nitrous_oxide greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#c63e3b#f7d5d3" /obj/machinery/portable_atmospherics/canister/nitryl name = "nitryl canister" desc = "Nitryl gas. Feels great 'til the acid eats your lungs." - gas_type = GAS_NITRYL + gas_type = /datum/gas/nitryl greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#7b4732" /obj/machinery/portable_atmospherics/canister/nob name = "hyper-noblium canister" desc = "Hyper-Noblium. More noble than all other gases." - gas_type = GAS_HYPERNOB + gas_type = /datum/gas/hypernoblium greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#6399fc#b2b2b2" /obj/machinery/portable_atmospherics/canister/oxygen name = "o2 canister" desc = "Oxygen. Necessary for human life." - gas_type = GAS_O2 + gas_type = /datum/gas/oxygen greyscale_config = /datum/greyscale_config/canister/stripe greyscale_colors = "#2786e5#e8fefe" /obj/machinery/portable_atmospherics/canister/pluoxium name = "pluoxium canister" desc = "Pluoxium. Like oxygen, but more bang for your buck." - gas_type = GAS_PLUOXIUM + gas_type = /datum/gas/pluoxium greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#2786e5" /obj/machinery/portable_atmospherics/canister/stimulum name = "stimulum canister" desc = "Stimulum. High energy gas, high energy people." - gas_type = GAS_STIMULUM + gas_type = /datum/gas/stimulum greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#9b5d7f" /obj/machinery/portable_atmospherics/canister/plasma name = "plasma canister" desc = "Plasma gas. The reason YOU are here. Highly toxic." - gas_type = GAS_PLASMA + gas_type = /datum/gas/plasma greyscale_config = /datum/greyscale_config/canister/hazard greyscale_colors = "#f64300#000000" /obj/machinery/portable_atmospherics/canister/tritium name = "tritium canister" desc = "Tritium. Inhalation might cause irradiation." - gas_type = GAS_TRITIUM + gas_type = /datum/gas/tritium greyscale_config = /datum/greyscale_config/canister/hazard greyscale_colors = "#3fcd40#000000" /obj/machinery/portable_atmospherics/canister/water_vapor name = "water vapor canister" desc = "Water Vapor. We get it, you vape." - gas_type = GAS_H2O + gas_type = /datum/gas/water_vapor filled = 1 greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#4c4e4d#f7d5d3" @@ -244,7 +249,7 @@ /obj/machinery/portable_atmospherics/canister/proto/default/oxygen name = "prototype canister" desc = "A prototype canister for a prototype bike, what could go wrong?" - gas_type = GAS_O2 + gas_type = /datum/gas/oxygen filled = 1 release_pressure = ONE_ATMOSPHERE*2 @@ -270,16 +275,18 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/portable_atmospherics/canister) /obj/machinery/portable_atmospherics/canister/proc/create_gas() if(gas_type) + air_contents.add_gas(gas_type) if(starter_temp) - air_contents.set_temperature(starter_temp) - if(!air_contents.return_volume()) - CRASH("Auxtools is failing somehow! Gas with pointer [air_contents._extools_pointer_gasmixture] is not valid.") - air_contents.set_moles(gas_type, (maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) + air_contents.temperature = (starter_temp) + air_contents.gases[gas_type][MOLES] = (maximum_pressure * filled* air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) + SSair.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/air/create_gas() - air_contents.set_temperature(starter_temp) - air_contents.set_moles(GAS_O2, (O2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) - air_contents.set_moles(GAS_N2, (N2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) + air_contents.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen) + air_contents.temperature = (starter_temp) + air_contents.gases[/datum/gas/oxygen][MOLES] = (O2STANDARD * maximum_pressure * filled * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) + air_contents.gases[/datum/gas/nitrogen][MOLES] = (N2STANDARD * maximum_pressure * filled * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) + SSair.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/update_icon() . = ..() @@ -312,10 +319,11 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/portable_atmospherics/canister) if(update == last_update) return -/obj/machinery/portable_atmospherics/canister/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > temperature_resistance) - take_damage(5, BURN, 0) +/obj/machinery/portable_atmospherics/canister/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > temperature_resistance +/obj/machinery/portable_atmospherics/canister/atmos_expose(datum/gas_mixture/air, exposed_temperature) + take_damage(5, BURN, 0) /obj/machinery/portable_atmospherics/canister/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) @@ -352,7 +360,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/portable_atmospherics/canister) disconnect() var/turf/T = get_turf(src) T.assume_air(air_contents) - air_update_turf() + air_update_turf(FALSE, FALSE) set_machine_stat(machine_stat | BROKEN) density = FALSE @@ -378,7 +386,6 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/portable_atmospherics/canister) user.investigate_log("started a transfer into [holding].", INVESTIGATE_ATMOS) /obj/machinery/portable_atmospherics/canister/process_atmos() - ..() if(machine_stat & BROKEN) return PROCESS_KILL if(timing && valve_timer < world.time) @@ -388,12 +395,14 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/portable_atmospherics/canister) // Handle gas transfer. if(valve_open) var/turf/T = get_turf(src) - var/datum/gas_mixture/target_air = holding ? holding.air_contents : T.return_air() + var/datum/gas_mixture/target_air = holding ? holding.return_air() : T.return_air() if(air_contents.release_gas_to(target_air, release_pressure) && !holding) - air_update_turf() + air_update_turf(FALSE, FALSE) update_icon() + return ..() + /obj/machinery/portable_atmospherics/canister/ui_status(mob/user) . = ..() if(. > UI_UPDATE && !allowed(user)) @@ -431,9 +440,10 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/portable_atmospherics/canister) data["hasHoldingTank"] = holding ? 1 : 0 if (holding) + var/datum/gas_mixture/holding_mix = holding.return_air() data["holdingTank"] = list() data["holdingTank"]["name"] = holding.name - data["holdingTank"]["tankPressure"] = round(holding.air_contents.return_pressure()) + data["holdingTank"]["tankPressure"] = round(holding_mix.return_pressure()) return data /obj/machinery/portable_atmospherics/canister/ui_act(action, params) @@ -515,6 +525,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/portable_atmospherics/canister) if("eject") if(holding) if(valve_open) + SSair.start_processing_machine(src) message_admins("[ADMIN_LOOKUPFLW(usr)] removed [holding] from [src] with valve still open at [ADMIN_VERBOSEJMP(src)] releasing contents into the air.") usr.investigate_log(" removed the [holding], leaving the valve open and transferring into the air.", INVESTIGATE_ATMOS) replace_tank(usr, FALSE) @@ -530,11 +541,11 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/portable_atmospherics/canister) logmsg = "Valve was opened by [key_name(user)], starting a transfer into \the [holding || "air"].
" if(!holding) var/list/danger = list() - for(var/id in air_contents.get_gases()) - if(!(GLOB.gas_data.flags[id] & GAS_FLAG_DANGEROUS)) + for(var/id in air_contents.gases) + if(!(GLOB.meta_gas_info[id][META_GAS_DANGER])) continue - if(air_contents.get_moles(id) > (GLOB.gas_data.visibility[id] || MOLES_GAS_VISIBLE)) //if moles_visible is undefined, default to default visibility - danger[GLOB.gas_data.names[id]] = air_contents.get_moles(id) //ex. "plasma" = 20 + if(air_contents.gases[id][MOLES] > (GLOB.meta_gas_info[id][META_GAS_MOLES_VISIBLE] || MOLES_GAS_VISIBLE)) //if moles_visible is undefined, default to default visibility + danger[GLOB.meta_gas_info[id][META_GAS_NAME]] = air_contents.gases[id][MOLES] //ex. "plasma" = 20 if(danger.len && user) message_admins("[ADMIN_LOOKUPFLW(user)] opened a canister that contains the following at [ADMIN_VERBOSEJMP(src)]:") diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 36f8f066a4066..281189dcf0f38 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -7,24 +7,28 @@ anchored = FALSE interacts_with_air = TRUE + ///Stores the gas mixture of the portable component. Don't access this directly, use return_air() so you support the temporary processing it provides var/datum/gas_mixture/air_contents + var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port var/obj/item/tank/holding var/volume = 0 var/maximum_pressure = 90 * ONE_ATMOSPHERE + ///Used to track if anything of note has happen while running process_atmos() + var/excited = TRUE + /obj/machinery/portable_atmospherics/Initialize(mapload) . = ..() air_contents = new(volume) - air_contents.set_temperature(T20C) + air_contents.temperature = (T20C) SSair.start_processing_machine(src) /obj/machinery/portable_atmospherics/Destroy() SSair.stop_processing_machine(src) disconnect() - qdel(air_contents) - air_contents = null + QDEL_NULL(air_contents) return ..() /obj/machinery/portable_atmospherics/ex_act(severity, target) @@ -35,7 +39,7 @@ //This explosion will destroy the can, release its air. var/turf/T = get_turf(src) T.assume_air(air_contents) - T.air_update_turf() + T.air_update_turf(FALSE, FALSE) return ..() @@ -44,10 +48,14 @@ return atmosanalyzer_scan(user, holding, TRUE) /obj/machinery/portable_atmospherics/process_atmos() - if(!connected_port && air_contents != null && src != null) // Pipe network handles reactions if connected. - air_contents.react(src) + if(!connected_port) // Pipe network handles reactions if connected, and we can't stop processing if there's a port effecting our mix + excited = (excited | air_contents.react(src)) + if(!excited) + return PROCESS_KILL + excited = FALSE /obj/machinery/portable_atmospherics/return_air() + SSair.start_processing_machine(src) return air_contents /obj/machinery/portable_atmospherics/return_analyzable_air() @@ -65,12 +73,14 @@ //Perform the connection connected_port = new_port connected_port.connected_device = src - connected_port.parents[1].update = PIPENET_UPDATE_STATUS_RECONCILE_NEEDED + var/datum/pipeline/connected_port_parent = connected_port.parents[1] + connected_port_parent.reconcile_air() set_anchored(TRUE) //Prevent movement pixel_x = new_port.pixel_x pixel_y = new_port.pixel_y + SSair.start_processing_machine(src) update_appearance() return TRUE @@ -88,6 +98,7 @@ pixel_x = 0 pixel_y = 0 + SSair.start_processing_machine(src) update_appearance() return TRUE @@ -116,6 +127,8 @@ holding = null if(new_tank) holding = new_tank + + SSair.start_processing_machine(src) update_appearance() return TRUE diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 68ce64d522f1d..58305430917a0 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -86,7 +86,7 @@ /obj/machinery/portable_atmospherics/pump/Destroy() var/turf/T = get_turf(src) T.assume_air(air_contents) - air_update_turf() + air_update_turf(FALSE, FALSE) QDEL_NULL(pump) return ..() @@ -100,23 +100,27 @@ add_overlay("siphon-connector") /obj/machinery/portable_atmospherics/pump/process_atmos() - ..() if(!on) pump.airs[1] = null pump.airs[2] = null return var/turf/T = get_turf(src) + var/datum/gas_mixture/temp_air_contents = return_air() + var/datum/gas_mixture/temp_holding_air_contents = holding.return_air() if(direction == PUMP_OUT) // Hook up the internal pump. - pump.airs[1] = holding ? holding.air_contents : air_contents - pump.airs[2] = holding ? air_contents : T.return_air() + pump.airs[1] = holding ? temp_holding_air_contents : temp_air_contents + pump.airs[2] = holding ? temp_air_contents : T.return_air() else - pump.airs[1] = holding ? air_contents : T.return_air() - pump.airs[2] = holding ? holding.air_contents : air_contents + pump.airs[1] = holding ? temp_air_contents : T.return_air() + pump.airs[2] = holding ? temp_holding_air_contents : temp_air_contents pump.process_atmos() // Pump gas. if(!holding) - air_update_turf() // Update the environment if needed. + air_update_turf(FALSE, FALSE) // Update the environment if needed. + + return ..() + /obj/machinery/portable_atmospherics/pump/emp_act(severity) . = ..() @@ -125,6 +129,8 @@ if(is_operational) if(prob(50 / severity)) on = !on + if(on) + SSair.start_processing_machine(src) if(prob(100 / severity)) direction = PUMP_OUT pump.target_pressure = rand(0, 100 * ONE_ATMOSPHERE) @@ -166,7 +172,8 @@ if(holding) data["holding"] = list() data["holding"]["name"] = holding.name - data["holding"]["pressure"] = round(holding.air_contents.return_pressure()) + var/datum/gas_mixture/holding_mix = holding.return_air() + data["holding"]["pressure"] = round(holding_mix.return_pressure()) else data["holding"] = null return data @@ -177,9 +184,11 @@ switch(action) if("power") on = !on + if(on) + SSair.start_processing_machine(src) if(on && !holding) - var/plasma = air_contents.get_moles(GAS_PLASMA) - var/n2o = air_contents.get_moles(GAS_NITROUS) + var/plasma = GET_MOLES(/datum/gas/plasma, air_contents) + var/n2o = GET_MOLES(/datum/gas/nitrous_oxide, air_contents) if(n2o || plasma) message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [ADMIN_VERBOSEJMP(src)]") log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [AREACOORD(src)]") diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index fdfd77d663e06..f09a12286e6c6 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -7,16 +7,16 @@ var/on = FALSE - var/volume_rate = 1000 + var/volume_rate = 500 var/overpressure_m = 80 volume = 1000 - var/list/scrubbing = list(GAS_PLASMA, GAS_CO2, GAS_NITROUS, GAS_BZ, GAS_NITRYL, GAS_TRITIUM, GAS_HYPERNOB, GAS_H2O) + var/list/scrubbing = list(/datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz, /datum/gas/nitryl, /datum/gas/tritium, /datum/gas/hypernoblium, /datum/gas/water_vapor) /obj/machinery/portable_atmospherics/scrubber/Destroy() var/turf/T = get_turf(src) T.assume_air(air_contents) - air_update_turf() + air_update_turf(FALSE, FALSE) return ..() /obj/machinery/portable_atmospherics/scrubber/update_icon() @@ -29,23 +29,24 @@ add_overlay("scrubber-connector") /obj/machinery/portable_atmospherics/scrubber/process_atmos() - ..() + . = ..() if(!on) return if(holding) - scrub(holding.air_contents) + scrub(holding.return_air()) else var/turf/T = get_turf(src) scrub(T.return_air()) + /obj/machinery/portable_atmospherics/scrubber/proc/scrub(var/datum/gas_mixture/mixture) if(air_contents.return_pressure() >= overpressure_m * ONE_ATMOSPHERE) return mixture.scrub_into(air_contents, volume_rate / mixture.return_volume(), scrubbing) if(!holding) - air_update_turf() + air_update_turf(FALSE, FALSE) /obj/machinery/portable_atmospherics/scrubber/emp_act(severity) . = ..() @@ -54,6 +55,8 @@ if(is_operational) if(prob(50 / severity)) on = !on + if(on) + SSair.start_processing_machine(src) update_appearance() @@ -75,13 +78,14 @@ data["id_tag"] = -1 //must be defined in order to reuse code between portable and vent scrubbers data["filter_types"] = list() - for(var/id in GLOB.gas_data.ids) - data["filter_types"] += list(list("gas_id" = id, "gas_name" = GLOB.gas_data.names[id], "enabled" = (id in scrubbing))) + for(var/gas_type in subtypesof(/datum/gas)) + data["filter_types"] += list(list("gas_id" = GLOB.meta_gas_info[gas_type][META_GAS_ID], "gas_name" = GLOB.meta_gas_info[gas_type][META_GAS_NAME], "enabled" = (gas_type in scrubbing))) if(holding) data["holding"] = list() data["holding"]["name"] = holding.name - data["holding"]["pressure"] = round(holding.air_contents.return_pressure()) + var/datum/gas_mixture/holding_mix = holding.return_air() + data["holding"]["pressure"] = round(holding_mix.return_pressure()) else data["holding"] = null return data @@ -102,6 +106,8 @@ switch(action) if("power") on = !on + if(on) + SSair.start_processing_machine(src) . = TRUE if("eject") if(holding) @@ -137,15 +143,19 @@ on = FALSE update_icon() use_power = on ? ACTIVE_POWER_USE : IDLE_POWER_USE + if(!on) - return + return ..() + + excited = TRUE - ..() if(!holding) var/turf/T = get_turf(src) - for(var/turf/AT in T.GetAtmosAdjacentTurfs(alldir = TRUE)) + for(var/turf/AT in T.get_atmos_adjacent_turfs(alldir = TRUE)) scrub(AT.return_air()) + return ..() + /obj/machinery/portable_atmospherics/scrubber/huge/attackby(obj/item/W, mob/user) if(default_unfasten_wrench(user, W)) if(!movable) diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 07f9fb9f889e9..2c4c53d79dda1 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -140,7 +140,7 @@ /turf/open/floor/iron/dark/snowdin initial_gas_mix = FROZEN_ATMOS planetary_atmos = 1 - initial_temperature = 180 + temperature = 180 /turf/open/lava/plasma name = "liquid plasma" diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm index 2f4902309fa3c..4d28ae30967d5 100644 --- a/code/modules/cargo/bounties/engineering.dm +++ b/code/modules/cargo/bounties/engineering.dm @@ -4,23 +4,26 @@ reward = 7500 wanted_types = list(/obj/item/tank) var/moles_required = 20 // A full tank is 28 moles, but CentCom ignores that fact. - var/gas_type = GAS_PLUOXIUM + var/gas_type = /datum/gas/pluoxium /datum/bounty/item/engineering/gas/applies_to(obj/O) if(!..()) return FALSE var/obj/item/tank/T = O - return T.air_contents.get_moles(gas_type) >= moles_required + var/datum/gas_mixture/our_mix = T.return_air() + if(!our_mix.gases[gas_type]) + return FALSE + return our_mix.gases[gas_type][MOLES] >= moles_required /datum/bounty/item/engineering/gas/nitryl_tank name = "Full Tank of Nitryl" description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started." - gas_type = GAS_NITRYL + gas_type = /datum/gas/nitryl /datum/bounty/item/engineering/gas/tritium_tank name = "Full Tank of Tritium" description = "Station 49 is looking to kickstart their research program. Ship them a tank full of Tritium." - gas_type = GAS_TRITIUM + gas_type = /datum/gas/tritium /datum/bounty/item/engineering/energy_ball name = "Contained Tesla Ball" diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index c5e80f845a7e9..a94f351d1404d 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -129,10 +129,13 @@ /datum/export/large/gas_canister/get_cost(obj/O) var/obj/machinery/portable_atmospherics/canister/C = O var/worth = 10 - - worth += C.air_contents.get_moles(GAS_BZ)*4 - worth += C.air_contents.get_moles(GAS_STIMULUM)*100 - worth += C.air_contents.get_moles(GAS_HYPERNOB)*1000 - worth += C.air_contents.get_moles(GAS_TRITIUM)*5 - worth += C.air_contents.get_moles(GAS_PLUOXIUM)*5 + var/datum/gas_mixture/canister_mix = C.return_air() + var/canister_gas = canister_mix.gases + worth += canister_gas[/datum/gas/bz][MOLES]*4 + worth += canister_gas[/datum/gas/stimulum][MOLES]*100 + worth += canister_gas[/datum/gas/hypernoblium][MOLES]*1000 + worth += canister_gas[/datum/gas/tritium][MOLES]*5 + worth += canister_gas[/datum/gas/pluoxium][MOLES]*5 + + canister_mix.garbage_collect() return worth diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 7c4b3eaf3b1f3..22525f5ce9cb9 100755 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -231,11 +231,17 @@ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = -10, ACID = 0, STAMINA = 0, BLEED = 0) //It's made of plasma. Of course it's flammable. custom_materials = list(/datum/material/plasma=1000) -/obj/item/clothing/accessory/medal/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - atmos_spawn_air("plasma=20;TEMP=[exposed_temperature]") - visible_message(" \The [src] bursts into flame!","Your [src] bursts into flame!") - qdel(src) +/obj/item/clothing/accessory/medal/plasma/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + +/obj/item/clothing/accessory/medal/plasma/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 300 + +/obj/item/clothing/accessory/medal/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature) + atmos_spawn_air("plasma=20;TEMP=[exposed_temperature]") + visible_message("\The [src] bursts into flame!", "Your [src] bursts into flame!") + qdel(src) /obj/item/clothing/accessory/medal/plasma/nobel_science name = "nobel sciences award" diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index 16ddd69d6fa23..799e31cc8d820 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -55,7 +55,7 @@ continue//no parent vent //Stops Aliens getting stuck in small networks. //See: Security, Virology - if(temp_vent_parent.other_atmosmch.len > 20) + if(temp_vent_parent.other_atmos_machines.len > 20) vents += temp_vent if(!vents.len) diff --git a/code/modules/events/mimite_infestation.dm b/code/modules/events/mimite_infestation.dm index dd99e6047d6c0..d04c1618a1856 100644 --- a/code/modules/events/mimite_infestation.dm +++ b/code/modules/events/mimite_infestation.dm @@ -35,7 +35,7 @@ if(!temp_vent_parent) continue//no parent vent //Stops mimites getting stuck in small networks. - if(temp_vent_parent.other_atmosmch.len > 20) + if(temp_vent_parent.other_atmos_machines.len > 20) vents += temp_vent if(!vents.len) message_admins("An event attempted to spawn mimites but no suitable vents were found. Shutting down.") diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index b1e12c936440e..0f0f0e18fc1b9 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -24,6 +24,10 @@ new /datum/spacevine_controller(T, list(pick(subtypesof(/datum/spacevine_mutation))), rand(10,100), rand(1,6)) //spawn a controller at turf with randomized stats and a single random mutation message_admins("Event spacevine has been spawned in [ADMIN_VERBOSEJMP(T)].") +/obj/structure/spacevine/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + /datum/spacevine_mutation var/name = "" var/severity = 1 @@ -213,7 +217,7 @@ var/turf/open/floor/T = holder.loc if(istype(T)) var/datum/gas_mixture/GM = T.air - GM.set_moles(GAS_O2, max(GM.get_moles(GAS_O2) - severity * holder.energy, 0)) + SET_MOLES(/datum/gas/oxygen, GM, max(GET_MOLES(/datum/gas/oxygen, GM) - severity * holder.energy, 0)) /datum/spacevine_mutation/nitro_eater name = "nitrogen consuming" @@ -225,7 +229,7 @@ var/turf/open/floor/T = holder.loc if(istype(T)) var/datum/gas_mixture/GM = T.air - GM.set_moles(GAS_N2, max(GM.get_moles(GAS_N2) - severity * holder.energy, 0)) + SET_MOLES(/datum/gas/nitrogen, GM, max(GET_MOLES(/datum/gas/nitrogen, GM) - severity * holder.energy, 0)) /datum/spacevine_mutation/carbondioxide_eater name = "CO2 consuming" @@ -237,7 +241,7 @@ var/turf/open/floor/T = holder.loc if(istype(T)) var/datum/gas_mixture/GM = T.air - GM.set_moles(GAS_CO2, max(GM.get_moles(GAS_CO2) - severity * holder.energy, 0)) + REMOVE_MOLES(/datum/gas/carbon_dioxide, GM, severity * holder.energy - GET_MOLES(/datum/gas/carbon_dioxide, GM)) /datum/spacevine_mutation/plasma_eater name = "toxins consuming" @@ -249,7 +253,7 @@ var/turf/open/floor/T = holder.loc if(istype(T)) var/datum/gas_mixture/GM = T.air - GM.set_moles(GAS_PLASMA, max(GM.get_moles(GAS_PLASMA) - severity * holder.energy, 0)) + SET_MOLES(/datum/gas/plasma, GM, max(GET_MOLES(/datum/gas/plasma, GM) - severity * holder.energy, 0)) /datum/spacevine_mutation/thorns name = "thorny" @@ -569,10 +573,14 @@ if(!i && prob(100/severity)) qdel(src) -/obj/structure/spacevine/temperature_expose(null, temp, volume) +/obj/structure/spacevine/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return TRUE + +/obj/structure/spacevine/atmos_expose(datum/gas_mixture/air, exposed_temperature) var/override = 0 + var/volume = air.return_volume() for(var/datum/spacevine_mutation/SM in mutations) - override += SM.process_temperature(src, temp, volume) + override += SM.process_temperature(src, exposed_temperature, volume) if(!override) qdel(src) diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index a2715faac6365..1f43ff59f8410 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -30,7 +30,7 @@ if(!temp_vent_parent) continue// no parent vent - if(length(temp_vent_parent.other_atmosmch) > 20) + if(length(temp_vent_parent.other_atmos_machines) > 20) vents += temp_vent // Makes sure the vent network's big enough if(!length(vents)) diff --git a/code/modules/events/supermatter_surge.dm b/code/modules/events/supermatter_surge.dm index 0b1335ea5a3e5..16ba4719c47a2 100644 --- a/code/modules/events/supermatter_surge.dm +++ b/code/modules/events/supermatter_surge.dm @@ -42,12 +42,14 @@ // primarily so the supermatter doesn't tesla the instant these happen supermatter.matter_power += power * power_proportion var/datum/gas_mixture/gas_puff = new - var/selected_gas = pick(4;GAS_CO2, 4;GAS_H2O, 1;GAS_BZ) - gas_puff.set_moles(selected_gas, 500) - gas_puff.set_temperature(500) + var/selected_gas = pick(4;/datum/gas/carbon_dioxide, 4;/datum/gas/water_vapor, 1;/datum/gas/bz) + gas_puff.gases[selected_gas][MOLES] = 500 + + gas_puff.temperature = (500) var/energy_ratio = (power * 500 * (1-power_proportion)) / gas_puff.thermal_energy() if(energy_ratio < 1) // energy output we want is lower than current energy, reduce the amount of gas we puff out - gas_puff.set_moles(GAS_H2O, energy_ratio * 500) + gas_puff.gases[/datum/gas/water_vapor][MOLES] = energy_ratio * 500 + else // energy output we want is higher than current energy, increase its actual heat - gas_puff.set_temperature(energy_ratio * 500) + gas_puff.temperature = (energy_ratio * 500) supermatter.assume_air(gas_puff) diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index 631d64185c887..380d23eb28bcb 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -51,7 +51,7 @@ GLOBAL_LIST_EMPTY(all_wormholes) // So we can pick wormholes to teleport to CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/portal/wormhole) -/obj/effect/portal/wormhole/Initialize(mapload, _creator, _lifespan = 0, obj/effect/portal/_linked, automatic_link = FALSE, turf/hard_target_override, atmos_link_override) +/obj/effect/portal/wormhole/Initialize(mapload, _creator, _lifespan = 0, obj/effect/portal/_linked, automatic_link = FALSE, turf/hard_target_override) . = ..() GLOB.all_wormholes += src diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index bd5b63e37aeae..52d8f56baadae 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -203,7 +203,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/hallucination/simple) for(var/turf/FT in flood_turfs) for(var/dir in GLOB.cardinals) var/turf/T = get_step(FT, dir) - if((T in flood_turfs) || !FT.CanAtmosPass(T)) + if((T in flood_turfs) || !FT.can_atmos_pass(T)) continue var/image/new_plasma = image(image_icon,T,image_state,FLY_LAYER) new_plasma.alpha = 50 diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index a80e470ddd88b..399126f99401a 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -142,6 +142,6 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( if(toupdate.len) for(var/turf/T1 in toupdate) - CALCULATE_ADJACENT_TURFS(T1) + CALCULATE_ADJACENT_TURFS(T1, KILL_EXCITED) return copiedobjs diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm index c136791e98066..6c5b06c9e46db 100644 --- a/code/modules/holodeck/holo_effect.dm +++ b/code/modules/holodeck/holo_effect.dm @@ -66,7 +66,7 @@ var/datum/effect_system/spark_spread/s = new s.set_up(3, 1, T) s.start() - T.set_temperature(5000) + T.temperature = (5000) T.hotspot_expose(50000,50000,1) /obj/effect/holodeck_effect/random_book diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 4f885592a0b24..736244a1018ee 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -246,7 +246,7 @@ if(isopenturf(loc)) var/turf/open/O = loc if(O.air) - if(O.air.get_moles(GAS_O2) > 13) + if(GET_MOLES(/datum/gas/oxygen, O.air) > 13) return TRUE return FALSE diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index f7719b3c233ba..2563893c7c38b 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -106,7 +106,7 @@ ) ) for(var/turf/affected_turf as anything in template_and_bordering_turfs) - affected_turf.air_update_turf(TRUE) + affected_turf.air_update_turf(TRUE, TRUE) affected_turf.levelupdate() /datum/map_template/proc/load_new_z(orbital_body_type, list/level_traits = list(ZTRAIT_AWAY = TRUE)) @@ -150,7 +150,7 @@ locate(min(T.x+width, world.maxx), min(T.y+height, world.maxy), T.z)) for(var/L in border) var/turf/turf_to_disable = L - turf_to_disable.ImmediateDisableAdjacency() + turf_to_disable.immediate_disable_adjacency() // Accept cached maps, but don't save them automatically - we don't want // ruins clogging up memory for the whole round. diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index f3ab4495cb86c..ae218b2380f09 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -543,7 +543,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) /** internal code variables - not for mappers **/ /// used to skip a direction on a turf var/skip_direction - /// there are a few stuff that "CanAtmosPass()" is not reliable + /// there are a few stuff that "can_atmos_pass()" is not reliable var/static/list/unliable_atmos_blockers @@ -567,7 +567,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) if(isspaceturf(each_turf) || isopenspace(each_turf)) continue - if(!each_turf.CanAtmosPass(my_turf)) + if(!each_turf.can_atmos_pass(my_turf)) for(var/atom/movable/movable_content as anything in each_turf.contents) if(is_type_in_typecache(movable_content, unliable_atmos_blockers)) unliable_atmos_blocking = TRUE @@ -604,7 +604,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) // puts a directional window for each direction. for(var/turf/each_turf in nearby_turfs) - if(!each_turf.CanAtmosPass(my_turf) || isspaceturf(each_turf) || isopenspace(each_turf)) + if(!each_turf.can_atmos_pass(my_turf) || isspaceturf(each_turf) || isopenspace(each_turf)) continue var/obj/d_glass = new window_type(each_turf) diff --git a/code/modules/mining/coins.dm b/code/modules/mining/coins.dm index 337d0e6b225a4..f48a20e79d946 100644 --- a/code/modules/mining/coins.dm +++ b/code/modules/mining/coins.dm @@ -119,9 +119,11 @@ /obj/item/coin/plasma custom_materials = list(/datum/material/plasma = 400) -/obj/item/coin/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - plasma_ignition(0) +/obj/item/coin/plasma/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 300 + +/obj/item/coin/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature) + plasma_ignition(0) /obj/item/coin/plasma/bullet_act(obj/projectile/Proj) diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index ff5b9ac353ce1..fd097fbd9bb4f 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -28,6 +28,7 @@ /obj/item/survivalcapsule/Destroy() template = null // without this, capsules would be one use. per round. + air_update_turf(TRUE, FALSE) . = ..() /obj/item/survivalcapsule/examine(mob/user) @@ -296,7 +297,7 @@ density = TRUE var/buildstacktype = /obj/item/stack/sheet/iron var/buildstackamount = 5 - CanAtmosPass = ATMOS_PASS_NO + can_atmos_pass = ATMOS_PASS_NO /obj/structure/fans/deconstruct() if(!(flags_1 & NODECONSTRUCT_1)) @@ -324,7 +325,7 @@ /obj/structure/fans/Initialize(mapload) . = ..() - air_update_turf(1) + air_update_turf(TRUE, TRUE) //Inivisible, indestructible fans /obj/structure/fans/tiny/invisible diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index ede9e50ccb3c2..29465cdfc405a 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -15,20 +15,20 @@ var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.return_temperature())/BREATH_VOLUME //Partial pressure of the toxins in our breath - var/toxins_pp = (breath.get_moles(GAS_PLASMA)/breath.total_moles())*breath_pressure + var/toxins_pp = (GET_MOLES(/datum/gas/plasma, breath)/breath.total_moles())*breath_pressure if(toxins_pp > tox_detect_threshold) // Detect toxins in air - adjustPlasma(breath.get_moles(GAS_PLASMA)*250) + adjustPlasma(GET_MOLES(/datum/gas/plasma, breath)*250) throw_alert("alien_tox", /atom/movable/screen/alert/alien_tox) - toxins_used = breath.get_moles(GAS_PLASMA) + toxins_used = GET_MOLES(/datum/gas/plasma, breath) else clear_alert("alien_tox") //Breathe in toxins and out oxygen - breath.adjust_moles(GAS_PLASMA, -toxins_used) - breath.adjust_moles(GAS_O2, toxins_used) + breath.gases[/datum/gas/plasma][MOLES] += -toxins_used + breath.gases[/datum/gas/oxygen][MOLES] += toxins_used //BREATH TEMPERATURE handle_breath_temperature(breath) @@ -50,7 +50,7 @@ breath = loc.remove_air_ratio(breath_ratio) if(breath) - breath.set_volume(BREATH_VOLUME) + breath.volume = BREATH_VOLUME check_breath(breath) /mob/living/carbon/alien/handle_status_effects(delta_time) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index f14ccc217ffdd..3233cfd6de0c8 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -28,6 +28,10 @@ var/strength = 5 var/attached = 0 +/obj/item/clothing/mask/facehugger/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + /obj/item/clothing/mask/facehugger/Initialize(mapload) . = ..() var/static/list/loc_connections = list( @@ -95,9 +99,12 @@ . += "It looks like the proboscis has been removed." -/obj/item/clothing/mask/facehugger/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - Die() +/obj/item/clothing/mask/facehugger/atmos_expose(datum/gas_mixture/air, exposed_temperature) + Die() + + +/obj/item/clothing/mask/facehugger/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return (exposed_temperature > 300) /obj/item/clothing/mask/facehugger/equipped(mob/M) . = ..() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 527cdc8687b31..6d748249978a0 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -113,8 +113,9 @@ var/list/tab_data = ..() var/obj/item/tank/target_tank = internal || external if(target_tank) + var/datum/gas_mixture/target_tank_air = target_tank.return_air() tab_data["Internal Atmosphere Info"] = GENERATE_STAT_TEXT("[target_tank.name]") - tab_data["Tank Pressure"] = GENERATE_STAT_TEXT("[target_tank.air_contents.return_pressure()]") + tab_data["Tank Pressure"] = GENERATE_STAT_TEXT("[target_tank_air.return_pressure()]") tab_data["Distribution Pressure"] = GENERATE_STAT_TEXT("[target_tank.distribute_pressure]") if(istype(wear_suit, /obj/item/clothing/suit/space)) var/obj/item/clothing/suit/space/S = wear_suit diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index ff02f8efca6fb..1fd4ce7f0d1de 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -104,14 +104,14 @@ if(P.starting) var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/turf/curloc = get_turf(src) + var/turf/current_location = get_turf(src) // redirect the projectile P.original = locate(new_x, new_y, P.z) - P.starting = curloc + P.starting = current_location P.firer = src - P.yo = new_y - curloc.y - P.xo = new_x - curloc.x + P.yo = new_y - current_location.y + P.xo = new_x - current_location.x var/new_angle_s = P.Angle + rand(120,240) while(new_angle_s > 180) // Translate to regular projectile degrees new_angle_s -= 360 diff --git a/code/modules/mob/living/carbon/human/species_types/oozelings.dm b/code/modules/mob/living/carbon/human/species_types/oozelings.dm index 35dc8f5afb36d..bbfc68d8af4a7 100644 --- a/code/modules/mob/living/carbon/human/species_types/oozelings.dm +++ b/code/modules/mob/living/carbon/human/species_types/oozelings.dm @@ -88,11 +88,11 @@ if(!atmos_sealed) var/datum/gas_mixture/environment = H.loc.return_air() if(environment?.total_moles()) - if(environment.get_moles(GAS_H2O) >= 1) + if(GET_MOLES(/datum/gas/water_vapor, environment) >= 1) H.blood_volume -= 15 if(prob(50)) to_chat(H, "Your ooze melts away rapidly in the water vapor!") - if(H.blood_volume <= 672 && environment.get_moles(GAS_PLASMA) >= 1) + if(H.blood_volume <= 672 && GET_MOLES(/datum/gas/plasma, environment) >= 1) H.blood_volume += 15 if(H.blood_volume < BLOOD_VOLUME_OKAY && prob(5)) to_chat(H, "You feel drained!") diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index d6bf487d66f31..240c98f239200 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -54,7 +54,7 @@ var/datum/gas_mixture/environment = H.loc.return_air() if(environment) if(environment.total_moles()) - if(environment.get_moles(GAS_O2) >= 1) //Same threshold that extinguishes fire + if(GET_MOLES(/datum/gas/oxygen, environment) >= 1) //Same threshold that extinguishes fire H.adjust_fire_stacks(0.5) if(!H.on_fire && H.fire_stacks > 0) H.visible_message("[H]'s body reacts with the atmosphere and bursts into flames!","Your body reacts with the atmosphere and bursts into flame!") diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 34808b2f345d9..500774b613e32 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -130,23 +130,23 @@ breath = loc_as_obj.handle_internal_lifeform(src, BREATH_VOLUME) else if(isturf(loc)) //Breathe from loc as turf - var/breath_ratio = 0 + var/breath_moles = 0 if(environment) - breath_ratio = BREATH_VOLUME/environment.return_volume() + breath_moles = environment.total_moles()*BREATH_PERCENTAGE - breath = loc.remove_air_ratio(breath_ratio) + breath = loc.remove_air(breath_moles) else //Breathe from loc as obj again - if(istype(loc, /obj/)) + if(isobj(loc)) var/obj/loc_as_obj = loc loc_as_obj.handle_internal_lifeform(src,0) if(breath) - breath.set_volume(BREATH_VOLUME) + breath.volume = BREATH_VOLUME check_breath(breath) if(breath) loc.assume_air(breath) - air_update_turf() + air_update_turf(FALSE, FALSE) /mob/living/carbon/proc/has_smoke_protection() if(HAS_TRAIT(src, TRAIT_NOBREATH)) @@ -183,9 +183,9 @@ var/oxygen_used = 0 var/moles = breath.total_moles() var/breath_pressure = (moles*R_IDEAL_GAS_EQUATION*breath.return_temperature())/BREATH_VOLUME - var/O2_partialpressure = ((breath.get_moles(GAS_O2)/moles)*breath_pressure) + (((breath.get_moles(GAS_PLUOXIUM)*8)/moles)*breath_pressure) - var/Toxins_partialpressure = (breath.get_moles(GAS_PLASMA)/moles)*breath_pressure - var/CO2_partialpressure = (breath.get_moles(GAS_CO2)/moles)*breath_pressure + var/O2_partialpressure = ((GET_MOLES(/datum/gas/oxygen, breath)/moles)*breath_pressure) + (((GET_MOLES(/datum/gas/pluoxium, breath)*8)/moles)*breath_pressure) + var/Toxins_partialpressure = (GET_MOLES(/datum/gas/plasma, breath)/moles)*breath_pressure + var/CO2_partialpressure = (GET_MOLES(/datum/gas/carbon_dioxide, breath)/moles)*breath_pressure //OXYGEN @@ -196,7 +196,7 @@ var/ratio = 1 - O2_partialpressure/safe_oxy_min adjustOxyLoss(min(5*ratio, 3)) failed_last_breath = 1 - oxygen_used = breath.get_moles(GAS_O2)*ratio + oxygen_used = GET_MOLES(/datum/gas/oxygen, breath)*ratio else adjustOxyLoss(3) failed_last_breath = 1 @@ -206,11 +206,11 @@ failed_last_breath = 0 if(health >= crit_threshold) adjustOxyLoss(-5) - oxygen_used = breath.get_moles(GAS_O2) + oxygen_used = GET_MOLES(/datum/gas/oxygen, breath) clear_alert("not_enough_oxy") - breath.adjust_moles(GAS_O2, -oxygen_used) - breath.adjust_moles(GAS_CO2, oxygen_used) + ADD_MOLES(/datum/gas/carbon_dioxide, breath, oxygen_used) + REMOVE_MOLES(/datum/gas/oxygen, breath, oxygen_used) //CARBON DIOXIDE if(CO2_partialpressure > safe_co2_max) @@ -229,15 +229,15 @@ //TOXINS/PLASMA if(Toxins_partialpressure > safe_tox_max) - var/ratio = (breath.get_moles(GAS_PLASMA)/safe_tox_max) * 10 + var/ratio = (GET_MOLES(/datum/gas/plasma, breath)/safe_tox_max) * 10 adjustToxLoss(clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) throw_alert("too_much_tox", /atom/movable/screen/alert/too_much_tox) else clear_alert("too_much_tox") //NITROUS OXIDE - if(breath.get_moles(GAS_NITROUS)) - var/SA_partialpressure = (breath.get_moles(GAS_NITROUS)/breath.total_moles())*breath_pressure + if(GET_MOLES(/datum/gas/nitrous_oxide, breath)) + var/SA_partialpressure = (GET_MOLES(/datum/gas/nitrous_oxide, breath)/breath.total_moles())*breath_pressure if(SA_partialpressure > SA_para_min) Unconscious(60) if(SA_partialpressure > SA_sleep_min) @@ -250,21 +250,21 @@ SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "chemical_euphoria") //BZ (Facepunch port of their Agent B) - if(breath.get_moles(GAS_BZ)) - var/bz_partialpressure = (breath.get_moles(GAS_BZ)/breath.total_moles())*breath_pressure + if(GET_MOLES(/datum/gas/bz, breath)) + var/bz_partialpressure = (GET_MOLES(/datum/gas/bz, breath)/breath.total_moles())*breath_pressure if(bz_partialpressure > 1) hallucination += 10 else if(bz_partialpressure > 0.01) hallucination += 5 //TRITIUM - if(breath.get_moles(GAS_TRITIUM)) - var/tritium_partialpressure = (breath.get_moles(GAS_TRITIUM)/breath.total_moles())*breath_pressure + if(GET_MOLES(/datum/gas/tritium, breath)) + var/tritium_partialpressure = (GET_MOLES(/datum/gas/tritium, breath)/breath.total_moles())*breath_pressure radiation += tritium_partialpressure/10 //NITRYL - if(breath.get_moles(GAS_NITRYL)) - var/nitryl_partialpressure = (breath.get_moles(GAS_NITRYL)/breath.total_moles())*breath_pressure + if(GET_MOLES(/datum/gas/nitryl, breath)) + var/nitryl_partialpressure = (GET_MOLES(/datum/gas/nitryl, breath)/breath.total_moles())*breath_pressure adjustFireLoss(nitryl_partialpressure/4) //BREATH TEMPERATURE @@ -275,7 +275,7 @@ //Fourth and final link in a breath chain /mob/living/carbon/proc/handle_breath_temperature(datum/gas_mixture/breath) // The air you breathe out should match your body temperature - breath.set_temperature(bodytemperature) + breath.temperature = bodytemperature /// Attempts to take a breath from the external or internal air tank. /mob/living/carbon/proc/get_breath_from_internal(volume_needed) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index b98d460e29a1f..d21f0ad94481e 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -93,7 +93,7 @@ ExtinguishMob() return TRUE //mob was put out, on_fire = FALSE via ExtinguishMob(), no need to update everything down the chain. var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment - if(G.get_moles(GAS_O2) < 1) + if(GET_MOLES(/datum/gas/oxygen, G) < 1) ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire return TRUE var/turf/location = get_turf(src) diff --git a/code/modules/mob/living/simple_animal/bot/atmosbot.dm b/code/modules/mob/living/simple_animal/bot/atmosbot.dm index 3aaf937247caa..45d771a616458 100644 --- a/code/modules/mob/living/simple_animal/bot/atmosbot.dm +++ b/code/modules/mob/living/simple_animal/bot/atmosbot.dm @@ -52,16 +52,16 @@ var/last_barrier_tick //Gasses var/list/gasses = list( - GAS_BZ = 1, - GAS_CO2 = 1, - GAS_HYPERNOB = 1, - GAS_NITROUS = 1, - GAS_NITRYL = 1, - GAS_PLASMA = 1, - GAS_PLUOXIUM = 0, - GAS_STIMULUM = 0, - GAS_TRITIUM = 1, - GAS_H2O = 0, + /datum/gas/bz = 1, + /datum/gas/carbon_dioxide = 1, + /datum/gas/hypernoblium = 1, + /datum/gas/nitrous_oxide = 1, + /datum/gas/nitryl = 1, + /datum/gas/plasma = 1, + /datum/gas/pluoxium = 0, + /datum/gas/stimulum = 0, + /datum/gas/tritium = 1, + /datum/gas/water_vapor = 0, ) // Have we spoken our alert yet? var/has_spoken = FALSE @@ -200,7 +200,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/mob/living/simple_animal/bot/atmosbot) /mob/living/simple_animal/bot/atmosbot/proc/change_temperature() var/turf/T = get_turf(src) var/datum/gas_mixture/environment = T.return_air() - environment.set_temperature(ideal_temperature) + environment.temperature = (ideal_temperature) /mob/living/simple_animal/bot/atmosbot/proc/vent_air() //Just start pumping out air @@ -216,11 +216,11 @@ CREATION_TEST_IGNORE_SUBTYPES(/mob/living/simple_animal/bot/atmosbot) if(pressure_delta > 0) var/transfer_moles = pressure_delta*environment.return_volume()/(T20C * R_IDEAL_GAS_EQUATION) if(emagged == 2) - environment.adjust_moles(GAS_CO2, transfer_moles) + environment.gases[/datum/gas/carbon_dioxide][MOLES] += transfer_moles else - environment.adjust_moles(GAS_N2, transfer_moles * 0.7885) - environment.adjust_moles(GAS_O2, transfer_moles * 0.2115) - air_update_turf() + environment.gases[/datum/gas/nitrogen][MOLES] += transfer_moles * 0.7885 + environment.gases[/datum/gas/oxygen][MOLES] += transfer_moles * 0.2115 + air_update_turf(FALSE, FALSE) new /obj/effect/temp_visual/vent_wind(get_turf(src)) /mob/living/simple_animal/bot/atmosbot/proc/scrub_toxins() @@ -231,8 +231,8 @@ CREATION_TEST_IGNORE_SUBTYPES(/mob/living/simple_animal/bot/atmosbot) var/datum/gas_mixture/environment = T.return_air() for(var/G in gasses) if(gasses[G]) - var/moles_in_atmos = environment.get_moles(G) - environment.adjust_moles(G, -min(moles_in_atmos, ATMOSBOT_MAX_SCRUB_CHANGE)) + var/moles_in_atmos = GET_MOLES(G, environment) + REMOVE_MOLES(G, environment, min(moles_in_atmos, ATMOSBOT_MAX_SCRUB_CHANGE)) /mob/living/simple_animal/bot/atmosbot/proc/deploy_holobarrier() if(deployed_holobarrier) @@ -249,11 +249,11 @@ CREATION_TEST_IGNORE_SUBTYPES(/mob/living/simple_animal/bot/atmosbot) //Toxins in the air if(emagged != 2) for(var/G in gasses) - if(gasses[G] && gas_mix.get_moles(G) > 0.2) + if(gasses[G] && GET_MOLES(G, gas_mix) > 0.2) return ATMOSBOT_HIGH_TOXINS //Too little oxygen or too little pressure var/partial_pressure = R_IDEAL_GAS_EQUATION * gas_mix.return_temperature() / gas_mix.return_volume() - var/oxygen_moles = gas_mix.get_moles(GAS_O2) * partial_pressure + var/oxygen_moles = GET_MOLES(/datum/gas/oxygen, gas_mix) * partial_pressure if(oxygen_moles < 20 || gas_mix.return_pressure() < WARNING_LOW_PRESSURE) return ATMOSBOT_LOW_OXYGEN //Check temperature @@ -267,7 +267,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/mob/living/simple_animal/bot/atmosbot) for(var/obj/structure/holosign/barrier/atmos/A in target_turf) blocked = TRUE break - if(!target_turf.CanAtmosPass(target_turf) || blocked) + if(!target_turf.can_atmos_pass(target_turf) || blocked) //Pressumable from being inside a holobarrier, move somewhere nearby var/turf/open/floor/floor_turf = pick(view(3, src)) if(floor_turf && istype(floor_turf)) @@ -278,7 +278,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/mob/living/simple_animal/bot/atmosbot) /mob/living/simple_animal/bot/atmosbot/proc/return_nearest_breach() var/turf/origin = get_turf(src) - if(isclosedturf(origin)) + if(origin.blocks_air) return null var/room_limit = ATMOSBOT_MAX_AREA_SCAN @@ -294,7 +294,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/mob/living/simple_animal/bot/atmosbot) for(var/obj/structure/holosign/barrier/atmos/A in checking_turf) blocked = TRUE break - if(blocked || !checking_turf.CanAtmosPass(checking_turf)) + if(blocked || !checking_turf.can_atmos_pass(checking_turf)) continue var/datum/gas_mixture/current_air = checking_turf.return_air() if (!current_air) @@ -303,7 +303,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/mob/living/simple_animal/bot/atmosbot) //Add adjacent turfs for(var/direction in list(NORTH, SOUTH, EAST, WEST)) var/turf/adjacent_turf = get_step(checking_turf, direction) - if((adjacent_turf in checked_turfs) || !adjacent_turf.CanAtmosPass(adjacent_turf)) + if(adjacent_turf in checked_turfs || !adjacent_turf.can_atmos_pass(adjacent_turf)) continue var/datum/gas_mixture/checking_air = checking_turf.return_air() if (!checking_air) @@ -329,7 +329,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/mob/living/simple_animal/bot/atmosbot) dat += "Gas Scrubbing Controls
" for(var/gas_id in gasses) var/gas_enabled = gasses[gas_id] - dat += "[GLOB.gas_data.names[gas_id]]: [gas_enabled?"Scrubbing":"Not Scrubbing"]
" + dat += "[GLOB.meta_gas_info[gas_id][META_GAS_NAME]]: [gas_enabled?"Scrubbing":"Not Scrubbing"]
" dat += "Patrol Station: [auto_patrol ? "Yes" : "No"]
" return dat diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index f4b33a44b3aed..d6731288f70a2 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -462,7 +462,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r var/turf/T = get_turf(src) if(!T) return - var/list/adjacent = T.GetAtmosAdjacentTurfs(1) + var/list/adjacent = T.get_atmos_adjacent_turfs(1) var/atom/final_result var/static/list/turf_typecache = typecacheof(/turf) if(shuffle) //If we were on the same tile as another bot, let's randomize our choices so we dont both go the same way diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm index 3dad5161e63a0..32f488e9d80cc 100644 --- a/code/modules/mob/living/simple_animal/bot/firebot.dm +++ b/code/modules/mob/living/simple_animal/bot/firebot.dm @@ -33,7 +33,7 @@ var/speech_cooldown = 0 var/detected_cooldown = 0 - var/foam_cooldown = 0 + COOLDOWN_DECLARE(foam_cooldown) var/extinguish_people = TRUE var/extinguish_fires = TRUE @@ -49,6 +49,12 @@ create_extinguisher() +/mob/living/simple_animal/bot/firebot/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + + + /mob/living/simple_animal/bot/firebot/bot_reset() create_extinguisher() @@ -274,11 +280,13 @@ return result -/mob/living/simple_animal/bot/firebot/temperature_expose(datum/gas_mixture/air, temperature, volume) - if((temperature > T0C + 200 || temperature < BODYTEMP_COLD_DAMAGE_LIMIT) && foam_cooldown + FOAM_INTERVAL < world.time) +/mob/living/simple_animal/bot/firebot/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return (exposed_temperature > T0C + 200 || exposed_temperature < BODYTEMP_COLD_DAMAGE_LIMIT) + +/mob/living/simple_animal/bot/firebot/atmos_expose(datum/gas_mixture/air, exposed_temperature) + if(COOLDOWN_FINISHED(src, foam_cooldown)) new /obj/effect/particle_effect/foam/firefighting(loc) - foam_cooldown = world.time - ..() + COOLDOWN_START(src, foam_cooldown, FOAM_INTERVAL) /mob/living/simple_animal/bot/firebot/proc/spray_water(atom/target, mob/user) if(stationary_mode) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index e1cec92197e64..bc9f8155a92f5 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -180,14 +180,14 @@ if(P.starting) var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) - var/turf/curloc = get_turf(src) + var/turf/current_location = get_turf(src) // redirect the projectile P.original = locate(new_x, new_y, P.z) - P.starting = curloc + P.starting = current_location P.firer = src - P.yo = new_y - curloc.y - P.xo = new_x - curloc.x + P.yo = new_y - current_location.y + P.xo = new_x - current_location.x var/new_angle_s = P.Angle + rand(120,240) while(new_angle_s > 180) // Translate to regular projectile degrees new_angle_s -= 360 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index f2b9417323fca..0dbb19c5a1032 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -453,7 +453,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/temp_visual/lava_warning) anchored = TRUE opacity = FALSE density = TRUE - CanAtmosPass = ATMOS_PASS_DENSITY + can_atmos_pass = ATMOS_PASS_DENSITY duration = 82 color = COLOR_DARK_ORANGE diff --git a/code/modules/mob/living/simple_animal/hostile/mimite.dm b/code/modules/mob/living/simple_animal/hostile/mimite.dm index 32cdcec0884fc..8c45a86264468 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimite.dm @@ -253,7 +253,7 @@ if(get_dist(src, entry_vent) <= 3) var/list/vents = list() var/datum/pipeline/entry_vent_parent = entry_vent.parents[1] - for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in entry_vent_parent.other_atmosmch) + for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in entry_vent_parent.other_atmos_machines) vents.Add(temp_vent) if(!vents.len) entry_vent = null diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index 22ee2359b6f9c..723004162cb95 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -57,7 +57,7 @@ . = ..() if(banana_time && banana_time < world.time) var/turf/T = get_turf(src) - var/list/adjacent = T.GetAtmosAdjacentTurfs(1) + var/list/adjacent = T.get_atmos_adjacent_turfs(1) new banana_type(pick(adjacent)) banana_time = world.time + rand(30,60) diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 64213374437fe..f70c499368058 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -49,11 +49,11 @@ if(isopenturf(loc)) var/turf/open/T = src.loc if(T.air) - var/co2 = T.air.get_moles(GAS_CO2) + var/co2 = GET_MOLES(/datum/gas/carbon_dioxide, T.air) if(co2 > 0) if(prob(25)) var/amt = min(co2, 9) - T.air.adjust_moles(GAS_CO2, -amt) + T.air.gases[/datum/gas/carbon_dioxide][MOLES] += -amt T.atmos_spawn_air("o2=[amt];TEMP=293.15") /mob/living/simple_animal/hostile/tree/festivus diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 67f9136df2696..931e1638a7de5 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -279,10 +279,10 @@ if(isturf(loc) && isopenturf(loc)) var/turf/open/ST = loc if(ST.air) - var/tox = ST.air.get_moles(GAS_PLASMA) - var/oxy = ST.air.get_moles(GAS_O2) - var/n2 = ST.air.get_moles(GAS_N2) - var/co2 = ST.air.get_moles(GAS_CO2) + var/tox = GET_MOLES(/datum/gas/plasma, ST.air) + var/oxy = GET_MOLES(/datum/gas/oxygen, ST.air) + var/n2 = GET_MOLES(/datum/gas/nitrogen, ST.air) + var/co2 = GET_MOLES(/datum/gas/carbon_dioxide, ST.air) if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"]) . = FALSE diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index a043bcf72665a..8399b94e9d435 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -95,13 +95,13 @@ adjustBruteLoss(round(sqrt(bodytemperature)) * 2) if(stat != DEAD) - var/bz_percentage = environment.total_moles() ? (environment.get_moles(GAS_BZ) / environment.total_moles()) : 0 + var/bz_percentage = environment.total_moles() ? (GET_MOLES(/datum/gas/bz, environment) / environment.total_moles()) : 0 var/stasis = (bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis if(transformeffects & SLIME_EFFECT_DARK_PURPLE) var/amt = is_adult ? 30 : 15 - var/plas_amt = min(amt,environment.get_moles(GAS_PLASMA)) - environment.adjust_moles(GAS_PLASMA, -plas_amt) - environment.adjust_moles(GAS_O2, plas_amt) + var/plas_amt = min(amt,GET_MOLES(/datum/gas/plasma, environment)) + REMOVE_MOLES(/datum/gas/plasma, environment, plas_amt) + ADD_MOLES(/datum/gas/oxygen, environment, plas_amt) adjustBruteLoss(plas_amt ? -2 : 0) switch(stat) diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index 34a30f59b160a..9851fb8b6ce59 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -48,7 +48,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list( if(vent_found) var/datum/pipeline/vent_found_parent = vent_found.parents[1] - if(vent_found_parent && (vent_found_parent.members.len || vent_found_parent.other_atmosmch)) + if(vent_found_parent && (vent_found_parent.members.len || vent_found_parent.other_atmos_machines)) visible_message("[src] begins climbing into the ventilation system." ,"You begin climbing into the ventilation system.") if(!do_after(src, 25, target = vent_found)) @@ -86,9 +86,9 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list( return var/list/totalMembers = list() - for(var/datum/pipeline/P in starting_machine.returnPipenets()) + for(var/datum/pipeline/P in starting_machine.return_pipenets()) totalMembers += P.members - totalMembers += P.other_atmosmch + totalMembers += P.other_atmos_machines if(!totalMembers.len) return diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 72668dea9e1d4..ac4ea401aa206 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -137,9 +137,9 @@ var/t = "Coordinates: [x],[y] \n" t += "Temperature: [environment.return_temperature()] \n" - for(var/id in environment.get_gases()) - if(environment.get_moles(id)) - t+="[GLOB.gas_data.names[id]]: [environment.get_moles(id)] \n" + for(var/id in environment.gases) + if(environment.gases[id][MOLES]) + t+="[GLOB.meta_gas_info[id][META_GAS_NAME]]: [environment.gases[id][MOLES]] \n" to_chat(usr, t) diff --git a/code/modules/modular_computers/file_system/programs/atmosscan.dm b/code/modules/modular_computers/file_system/programs/atmosscan.dm index 10b2f2e7efc7d..23d8a53028585 100644 --- a/code/modules/modular_computers/file_system/programs/atmosscan.dm +++ b/code/modules/modular_computers/file_system/programs/atmosscan.dm @@ -30,10 +30,10 @@ data["AirTempC"] = round(environment.return_temperature() - T0C) data["AirTempK"] = round(environment.return_temperature()) if (total_moles) - for(var/id in environment.get_gases()) - var/gas_level = environment.get_moles(id)/total_moles + for(var/id in environment.gases) + var/gas_level = GET_MOLES(id, environment)/total_moles if(gas_level > 0) - airlist += list(list("name" = "[GLOB.gas_data.names[id]]", "percentage" = round(gas_level*100, 0.01))) + airlist += list(list("name" = "[GLOB.meta_gas_info[id][META_GAS_NAME]]", "percentage" = round(gas_level*100, 0.01))) data["AirData"] = airlist else data["AirPressure"] = 0 diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index 2019fceb2c707..84d83d736a104 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -190,6 +190,18 @@ . = ..() +/obj/machinery/power/apc/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + +/obj/machinery/power/apc/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return (exposed_temperature > 2000) + +/obj/machinery/power/apc/atmos_expose(datum/gas_mixture/air, exposed_temperature) + take_damage(min(exposed_temperature/100, 10), BURN) + + + /obj/machinery/power/apc/handle_atom_del(atom/A) if(A == cell) cell = null diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index bbcc96bd490b9..d4bcf7ddd43f9 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -80,8 +80,8 @@ var/heat = energy_transfer*(1-efficiency) lastgen += energy_transfer*efficiency - hot_air.set_temperature(hot_air.return_temperature() - energy_transfer/hot_air_heat_capacity) - cold_air.set_temperature(cold_air.return_temperature() + heat/cold_air_heat_capacity) + hot_air.temperature = (hot_air.return_temperature() - energy_transfer/hot_air_heat_capacity) + cold_air.temperature = (cold_air.return_temperature() + heat/cold_air_heat_capacity) //add_avail(lastgen) This is done in process now // update icon overlays only if displayed level has changed diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index d761ec5a1d4e3..28f9437bc6601 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -127,6 +127,10 @@ if(nightshift_enabled) update(FALSE, TRUE, TRUE) +/obj/machinery/light/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + /obj/machinery/light/Destroy() var/area/A = get_area(src) if(A) @@ -160,7 +164,7 @@ if(on && turning_on) return - + var/area/local_area = get_area(src) if(emergency_mode || (local_area?.fire)) . += mutable_appearance(overlayicon, "[base_state]_emergency") @@ -632,7 +636,10 @@ // called when on fire -/obj/machinery/light/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/machinery/light/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 673 + +/obj/machinery/light/atmos_expose(datum/gas_mixture/air, exposed_temperature) if(prob(max(0, exposed_temperature - 673))) //0% at <400C, 100% at >500C break_light_tube() diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index f0dd2565fb238..94fc101353a50 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -49,29 +49,30 @@ /obj/machinery/power/rad_collector/process(delta_time) if(!loaded_tank) return + var/datum/gas_mixture/loaded_tank_air = loaded_tank.return_air() if(!bitcoinmining) - if(loaded_tank.air_contents.get_moles(GAS_PLASMA) < 0.0001) + if(GET_MOLES(/datum/gas/plasma, loaded_tank.air_contents) < 0.0001) investigate_log("out of fuel.", INVESTIGATE_ENGINES) playsound(src, 'sound/machines/ding.ogg', 50, 1) var/msg = "Plasma depleted, recommend replacing tank." radio.talk_into(src, msg, RADIO_CHANNEL_ENGINEERING) eject() else - var/gasdrained = min(powerproduction_drain*drainratio*delta_time,loaded_tank.air_contents.get_moles(GAS_PLASMA)) - loaded_tank.air_contents.adjust_moles(GAS_PLASMA, -gasdrained) - loaded_tank.air_contents.adjust_moles(GAS_TRITIUM, gasdrained) + var/gasdrained = min(powerproduction_drain*drainratio*delta_time,GET_MOLES(/datum/gas/plasma, loaded_tank.air_contents)) + REMOVE_MOLES(/datum/gas/plasma, loaded_tank.air_contents, gasdrained) + ADD_MOLES(/datum/gas/tritium, loaded_tank.air_contents, gasdrained) var/power_produced = RAD_COLLECTOR_OUTPUT add_avail(power_produced) stored_energy-=power_produced else if(is_station_level(z) && SSresearch.science_tech) - if(!loaded_tank.air_contents.get_moles(GAS_TRITIUM) || !loaded_tank.air_contents.get_moles(GAS_O2)) + if(!GET_MOLES(/datum/gas/tritium, loaded_tank.air_contents) || !GET_MOLES(/datum/gas/oxygen, loaded_tank.air_contents)) playsound(src, 'sound/machines/ding.ogg', 50, 1) eject() else var/gasdrained = bitcoinproduction_drain*drainratio*delta_time - loaded_tank.air_contents.adjust_moles(GAS_TRITIUM, -gasdrained) - loaded_tank.air_contents.adjust_moles(GAS_O2, -gasdrained) - loaded_tank.air_contents.adjust_moles(GAS_CO2, gasdrained*2) + loaded_tank_air.gases[/datum/gas/tritium][MOLES] += -gasdrained + loaded_tank_air.gases[/datum/gas/oxygen][MOLES] += -gasdrained + loaded_tank_air.gases[/datum/gas/carbon_dioxide][MOLES] += gasdrained*2 var/bitcoins_mined = RAD_COLLECTOR_OUTPUT var/datum/bank_account/D = SSeconomy.get_budget_account(ACCOUNT_ENG_ID) if(D) @@ -86,7 +87,9 @@ toggle_power() user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \ "You turn the [src.name] [active? "on":"off"].") - var/fuel = loaded_tank?.air_contents.get_moles(GAS_PLASMA) + var/fuel = 0 + if(loaded_tank) + fuel = GET_MOLES(/datum/gas/plasma, loaded_tank.air_contents) investigate_log("turned [active?"on":"off"] by [key_name(user)]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].", INVESTIGATE_ENGINES) return else diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index fdeda81ddd307..bf8b25f1295b5 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -28,6 +28,7 @@ /obj/machinery/field/containment/Destroy() FG1?.fields -= src FG2?.fields -= src + air_update_turf(TRUE, FALSE) return ..() /obj/machinery/field/containment/proc/block_singularity() diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index d12d02585111d..57185bb495479 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -182,6 +182,8 @@ field_generator power level display /obj/machinery/field/generator/proc/turn_off() active = FG_OFFLINE + air_update_turf(TRUE, FALSE) + can_atmos_pass = ATMOS_PASS_YES spawn(1) cleanup() while (warming_up>0 && !active) @@ -251,8 +253,8 @@ field_generator power level display turn_off() return move_resist = INFINITY - CanAtmosPass = ATMOS_PASS_NO - air_update_turf(TRUE) + can_atmos_pass = ATMOS_PASS_NO + air_update_turf(TRUE, TRUE) addtimer(CALLBACK(src, PROC_REF(setup_field), 1), 1) addtimer(CALLBACK(src, PROC_REF(setup_field), 2), 2) addtimer(CALLBACK(src, PROC_REF(setup_field), 4), 3) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 66d887c438d3e..2128aee802bc6 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -222,14 +222,14 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/list/gasdata = list() if(air.total_moles()) data["SM_moles"] = air.total_moles() - for(var/gasid in air.get_gases()) + for(var/gasid in air.gases) gasdata.Add(list(list( - "name"= GLOB.gas_data.names[gasid], - "amount" = round(100*air.get_moles(gasid)/air.total_moles(),0.01)))) + "name"= GLOB.meta_gas_info[gasid][META_GAS_NAME], + "amount" = round(100*GET_MOLES(gasid, air)/air.total_moles(),0.01)))) else - for(var/gasid in air.get_gases()) + for(var/gasid in air.gases) gasdata.Add(list(list( - "name"= GLOB.gas_data.names[gasid], + "name"= air.gases[gasid][GAS_META][META_GAS_NAME], "amount" = 0))) data["gases"] = gasdata return data @@ -457,15 +457,15 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Can cause an overestimation of mol count, should stabalize things though. //Prevents huge bursts of gas/heat when a large amount of something is introduced //They range between 0 and 1 - plasmacomp += clamp(max(removed.get_moles(GAS_PLASMA)/combined_gas, 0) - plasmacomp, -1, gas_change_rate) - o2comp += clamp(max(removed.get_moles(GAS_O2)/combined_gas, 0) - o2comp, -1, gas_change_rate) - co2comp += clamp(max(removed.get_moles(GAS_CO2)/combined_gas, 0) - co2comp, -1, gas_change_rate) - pluoxiumcomp += clamp(max(removed.get_moles(GAS_PLUOXIUM)/combined_gas, 0) - pluoxiumcomp, -1, gas_change_rate) - tritiumcomp += clamp(max(removed.get_moles(GAS_TRITIUM)/combined_gas, 0) - tritiumcomp, -1, gas_change_rate) - bzcomp += clamp(max(removed.get_moles(GAS_BZ)/combined_gas, 0) - bzcomp, -1, gas_change_rate) + plasmacomp += clamp(max(GET_MOLES(/datum/gas/plasma, removed)/combined_gas, 0) - plasmacomp, -1, gas_change_rate) + o2comp += clamp(max(GET_MOLES(/datum/gas/oxygen, removed)/combined_gas, 0) - o2comp, -1, gas_change_rate) + co2comp += clamp(max(GET_MOLES(/datum/gas/carbon_dioxide, removed)/combined_gas, 0) - co2comp, -1, gas_change_rate) + pluoxiumcomp += clamp(max(GET_MOLES(/datum/gas/pluoxium, removed)/combined_gas, 0) - pluoxiumcomp, -1, gas_change_rate) + tritiumcomp += clamp(max(GET_MOLES(/datum/gas/tritium, removed)/combined_gas, 0) - tritiumcomp, -1, gas_change_rate) + bzcomp += clamp(max(GET_MOLES(/datum/gas/bz, removed)/combined_gas, 0) - bzcomp, -1, gas_change_rate) - n2ocomp += clamp(max(removed.get_moles(GAS_NITROUS)/combined_gas, 0) - n2ocomp, -1, gas_change_rate) - n2comp += clamp(max(removed.get_moles(GAS_N2)/combined_gas, 0) - n2comp, -1, gas_change_rate) + n2ocomp += clamp(max(GET_MOLES(/datum/gas/nitrous_oxide, removed)/combined_gas, 0) - n2ocomp, -1, gas_change_rate) + n2comp += clamp(max(GET_MOLES(/datum/gas/nitrogen, removed)/combined_gas, 0) - n2comp, -1, gas_change_rate) gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp + tritiumcomp + bzcomp - pluoxiumcomp - n2comp, 0), 1) @@ -516,18 +516,18 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Also keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock //is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall. - removed.set_temperature(removed.return_temperature() + ((device_energy * dynamic_heat_modifier) / THERMAL_RELEASE_MODIFIER)) + removed.temperature = (removed.return_temperature() + ((device_energy * dynamic_heat_modifier) / THERMAL_RELEASE_MODIFIER)) - removed.set_temperature(max(0, min(removed.return_temperature(), 2500 * dynamic_heat_modifier))) + removed.temperature = (max(0, min(removed.return_temperature(), 2500 * dynamic_heat_modifier))) //Calculate how much gas to release - removed.adjust_moles(GAS_PLASMA, max((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER, 0)) + removed.gases[/datum/gas/plasma][MOLES] += max((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER, 0) - removed.adjust_moles(GAS_O2, max(((device_energy + removed.return_temperature() * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0)) + removed.gases[/datum/gas/oxygen][MOLES] += max(((device_energy + removed.return_temperature() * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0) if(produces_gas) env.merge(removed) - air_update_turf() + air_update_turf(FALSE, FALSE) for(var/mob/living/carbon/human/l in viewers(HALLUCINATION_RANGE(power), src)) // If they can see it without mesons on. Bad on them. if(HAS_TRAIT(l, TRAIT_MADNESS_IMMUNE) || (l.mind && HAS_TRAIT(l.mind, TRAIT_MADNESS_IMMUNE))) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 85f1e7f1e998f..f9e0b5d6da812 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -29,7 +29,7 @@ icon_state = "compressor" density = TRUE resistance_flags = FIRE_PROOF - CanAtmosPass = ATMOS_PASS_DENSITY + can_atmos_pass = ATMOS_PASS_DENSITY circuit = /obj/item/circuitboard/machine/power_compressor var/obj/machinery/power/turbine/turbine var/datum/gas_mixture/gas_contained @@ -54,7 +54,7 @@ icon_state = "turbine" density = TRUE resistance_flags = FIRE_PROOF - CanAtmosPass = ATMOS_PASS_DENSITY + can_atmos_pass = ATMOS_PASS_DENSITY circuit = /obj/item/circuitboard/machine/power_turbine diff --git a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm index 18607b919aba4..64279d6ddccc4 100644 --- a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm +++ b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm @@ -12,11 +12,8 @@ var/list/map = mother.map for(var/turf/open/T in map) if(T.air) - if(T.initial_gas_mix) - T.air.parse_gas_string(T.initial_gas_mix) - T.set_temperature(T.air.return_temperature()) - else - T.air.copy_from_turf(T) + T.air = T.create_gas_mixture() + SSair.add_to_active(T, TRUE) /datum/mapGeneratorModule/bottomLayer/massdelete spawnableAtoms = list() diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index b3f6c491ccfcf..4819a42f9cc32 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -41,8 +41,8 @@ qdel(reagents) /obj/item/ammo_casing/proc/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread) - var/turf/curloc = get_turf(user) - if (!istype(targloc) || !istype(curloc) || !BB) + var/turf/current_location = get_turf(user) + if (!istype(targloc) || !istype(current_location) || !BB) return FALSE var/firing_dir @@ -52,7 +52,7 @@ new firing_effect_type(get_turf(src), firing_dir) var/direct_target - if(targloc == curloc) + if(targloc == current_location) if(target) //if the target is right on our location we'll skip the travelling code in the proj's fire() direct_target = target if(!direct_target) diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index a403dd09a0e98..3d90d6b3cc89b 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -192,12 +192,12 @@ P.color = rgb(255 * percent,255 * ((100 - percent) / 100),0) else P.color = rgb(0, 255, 0) - var/turf/curloc = get_turf(src) + var/turf/current_location = get_turf(src) var/turf/targloc = get_turf(aiming_target) if(!istype(targloc)) - if(!istype(curloc)) + if(!istype(current_location)) return - targloc = get_turf_in_angle(lastangle, curloc, 10) + targloc = get_turf_in_angle(lastangle, current_location, 10) P.preparePixelProjectile(targloc, current_user, aiming_params, 0) P.fire(lastangle) @@ -382,12 +382,12 @@ HS_BB.gun = host /obj/item/ammo_casing/energy/beam_rifle/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread) - var/turf/curloc = get_turf(user) - if(!istype(curloc) || !BB) + var/turf/current_location = get_turf(user) + if(!istype(current_location) || !BB) return FALSE var/obj/item/gun/energy/beam_rifle/gun = loc if(!targloc && gun) - targloc = get_turf_in_angle(gun.lastangle, curloc, 10) + targloc = get_turf_in_angle(gun.lastangle, current_location, 10) else if(!targloc) return FALSE var/firing_dir diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 3548c8a5bf47b..39299755326d7 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -817,7 +817,7 @@ //Spread is FORCED! /obj/projectile/proc/preparePixelProjectile(atom/target, atom/source, params, spread = 0) - var/turf/curloc = get_turf(source) + var/turf/current_location = get_turf(source) var/turf/targloc = get_turf(target) trajectory_ignore_forcemove = TRUE forceMove(get_turf(source)) @@ -825,8 +825,8 @@ starting = get_turf(source) original = target if(targloc || !params) - yo = targloc.y - curloc.y - xo = targloc.x - curloc.x + yo = targloc.y - current_location.y + xo = targloc.x - current_location.x setAngle(get_angle(src, targloc) + spread) if(isliving(source) && params) @@ -836,8 +836,8 @@ setAngle(calculated[1] + spread) else if(targloc) - yo = targloc.y - curloc.y - xo = targloc.x - curloc.x + yo = targloc.y - current_location.y + xo = targloc.x - current_location.x setAngle(get_angle(src, targloc) + spread) else stack_trace("WARNING: Projectile [type] fired without either mouse parameters, or a target atom to aim at!") diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm index 431754b4fce67..13f36942604eb 100644 --- a/code/modules/reagents/chem_splash.dm +++ b/code/modules/reagents/chem_splash.dm @@ -45,7 +45,7 @@ for(var/turf/T as() in turflist) if(accessible[T]) continue - for(var/thing in T.GetAtmosAdjacentTurfs(alldir = TRUE)) + for(var/thing in T.get_atmos_adjacent_turfs(alldir = TRUE)) var/turf/NT = thing if(!(NT in accessible)) continue diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index edc67bc114664..6c6d04ed95ecd 100755 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -299,7 +299,7 @@ if(isopenturf(T)) var/turf/open/OT = T OT.MakeSlippery(wet_setting=TURF_WET_ICE, min_wet_time=100, wet_time_to_add=reac_volume SECONDS) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure. - OT.air.set_temperature(OT.air.return_temperature() - MOLES_CELLSTANDARD*100*reac_volume/OT.air.heat_capacity()) // reduces environment temperature by 5K per unit. + OT.air.temperature = (OT.air.return_temperature() - MOLES_CELLSTANDARD*100*reac_volume/OT.air.heat_capacity()) // reduces environment temperature by 5K per unit. /datum/reagent/consumable/condensedcapsaicin name = "Condensed Capsaicin" @@ -478,7 +478,7 @@ var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T) if(hotspot) var/datum/gas_mixture/lowertemp = T.return_air() - lowertemp.set_temperature(max( min(lowertemp.return_temperature()-2000,lowertemp.return_temperature() / 2) ,TCMB)) + lowertemp.temperature = (max( min(lowertemp.return_temperature()-2000,lowertemp.return_temperature() / 2) ,TCMB)) lowertemp.react(src) qdel(hotspot) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 33bc534df3190..4f64034ad72a6 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -187,7 +187,7 @@ if(hotspot && !isspaceturf(T)) if(T.air) var/datum/gas_mixture/G = T.air - G.set_temperature(max(min(G.return_temperature()-(CT*1000),G.return_temperature()/CT),TCMB)) + G.temperature = (max(min(G.return_temperature()-(CT*1000),G.return_temperature()/CT),TCMB)) G.react(src) qdel(hotspot) var/obj/effect/acid/A = (locate(/obj/effect/acid) in T) diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index c22f01d136836..e1f43eadab69e 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -322,7 +322,7 @@ if(T.air) var/datum/gas_mixture/G = T.air if(G.return_temperature() > T20C) - G.set_temperature(max(G.return_temperature()/2,T20C)) + G.temperature = (max(G.return_temperature()/2,T20C)) G.react(src) qdel(hotspot) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 97516887556a5..0df742c43aacd 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -142,8 +142,8 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/item/reagent_containers) reagents.expose_temperature(1000) return ..() -/obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - reagents.expose_temperature(exposed_temperature) +/obj/item/reagent_containers/fire_act(temperature, volume) + reagents.expose_temperature(temperature) /obj/item/reagent_containers/on_reagent_change(changetype) update_icon() diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 41809a81de167..5ba3459cfd571 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -396,16 +396,16 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/disposal) var/atom/L = loc //recharging from loc turf var/datum/gas_mixture/env = L.return_air() + if(!env.temperature) + return var/pressure_delta = (SEND_PRESSURE*1.01) - air_contents.return_pressure() - if(env.return_temperature() > 0) - var/transfer_moles = 0.05 * delta_time * pressure_delta * air_contents.return_volume() / (env.return_temperature() * R_IDEAL_GAS_EQUATION) - - //Actually transfer the gas - var/datum/gas_mixture/removed = env.remove(transfer_moles) - air_contents.merge(removed) - air_update_turf() + var/transfer_moles = 0.05 * delta_time * (pressure_delta*air_contents.volume)/(env.temperature * R_IDEAL_GAS_EQUATION) + //Actually transfer the gas + var/datum/gas_mixture/removed = env.remove(transfer_moles) + air_contents.merge(removed) + air_update_turf(FALSE, FALSE) //if full enough, switch to ready mode if(air_contents.return_pressure() >= SEND_PRESSURE) diff --git a/code/modules/recycling/disposal/holder.dm b/code/modules/recycling/disposal/holder.dm index 3f03a8aee8502..880786c48d8c5 100644 --- a/code/modules/recycling/disposal/holder.dm +++ b/code/modules/recycling/disposal/holder.dm @@ -29,7 +29,7 @@ /obj/structure/disposalholder/proc/init(obj/machinery/disposal/D) if(!istype(D)) return //Why check for things that don't exist? - gas = D.air_contents// transfer gas resv. into holder object + gas = D.return_air()// transfer gas resv. into holder object //Check for any living mobs trigger hasmob. //hasmob effects whether the package goes to cargo or its tagged destination. @@ -148,7 +148,7 @@ // called to vent all gas in holder to a location /obj/structure/disposalholder/proc/vent_gas(turf/T) T.assume_air(gas) - T.air_update_turf() + T.air_update_turf(FALSE, FALSE) /obj/structure/disposalholder/AllowDrop() return TRUE diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 8fee94597f33f..26990b87c8098 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -129,7 +129,7 @@ Slimecrossing Items desc = "A mass of solidified slime gel - completely impenetrable, but it's melting away!" icon = 'icons/obj/slimecrossing.dmi' icon_state = "slimebarrier_thick" - CanAtmosPass = ATMOS_PASS_NO + can_atmos_pass = ATMOS_PASS_NO opacity = TRUE timeleft = 100 diff --git a/code/modules/research/xenobiology/crossbreeding/_structures.dm b/code/modules/research/xenobiology/crossbreeding/_structures.dm index ab787839b0cb7..be302939c25e0 100644 --- a/code/modules/research/xenobiology/crossbreeding/_structures.dm +++ b/code/modules/research/xenobiology/crossbreeding/_structures.dm @@ -149,8 +149,8 @@ GLOBAL_LIST_EMPTY(bluespace_slime_crystals) if(!istype(T)) return var/datum/gas_mixture/gas = T.return_air() - gas.set_temperature(T0C + 200) - T.air_update_turf() + gas.temperature = (T0C + 200) + T.air_update_turf(FALSE, FALSE) /obj/structure/slime_crystal/purple colour = "purple" @@ -191,7 +191,7 @@ GLOBAL_LIST_EMPTY(bluespace_slime_crystals) continue var/datum/gas_mixture/gas = T.return_air() gas.parse_gas_string(OPENTURF_DEFAULT_ATMOS) - T.air_update_turf() + T.air_update_turf(FALSE, FALSE) /obj/structure/slime_crystal/metal colour = "metal" @@ -236,8 +236,8 @@ GLOBAL_LIST_EMPTY(bluespace_slime_crystals) var/turf/open/open_turf = T var/datum/gas_mixture/air = open_turf.return_air() - if(air.get_moles(GAS_PLASMA) > 15) - air.adjust_moles(GAS_PLASMA, -15) + if(GET_MOLES(/datum/gas/plasma, air) > 15) + REMOVE_MOLES(/datum/gas/plasma, air, 15) new /obj/item/stack/sheet/mineral/plasma(open_turf) /obj/structure/slime_crystal/darkpurple/Destroy() diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 9a1e4d432f6ce..57a1ac0fb826f 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -106,9 +106,10 @@ Chilling extracts: for(var/turf/open/T in A) var/datum/gas_mixture/G = T.air if(istype(G)) - G.set_moles(GAS_PLASMA, 0) + G.gases[/datum/gas/plasma][MOLES] = 0 + filtered = TRUE - T.air_update_turf() + T.air_update_turf(FALSE, FALSE) if(filtered) user.visible_message("Cracks spread throughout [src], and some air is sucked in!") else diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 65859a5902198..8b7e3302645d0 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -33,7 +33,7 @@ All ShuttleMove procs go here if(M.pulledby) M.pulledby.stop_pulling() M.stop_pulling() - M.visible_message("[shuttle] slams into [M]!") + M.visible_message("") SSblackbox.record_feedback("tally", "shuttle_gib", 1, M.type) M.gib() @@ -73,13 +73,10 @@ All ShuttleMove procs go here if(isopenturf(src)) var/turf/open/after_src_terf = src - update_air_ref(isspaceturf(src) ? 0 : (after_src_terf.planetary_atmos ? 1 : 2)) - else - update_air_ref(-1) //Air stuff - newT.air_update_turf(TRUE) - air_update_turf(TRUE) + newT.air_update_turf(TRUE, FALSE) + air_update_turf(TRUE, TRUE) return TRUE @@ -119,8 +116,8 @@ All ShuttleMove procs go here return TRUE /turf/proc/lateShuttleMove(turf/oldT) - air_update_turf(TRUE) - oldT.air_update_turf(TRUE) + air_update_turf(TRUE, blocks_air) + oldT.air_update_turf(TRUE, oldT.blocks_air) ///////////////////////////////////////////////////////////////////////////////////// @@ -258,20 +255,20 @@ All ShuttleMove procs go here break if(!connected) - nullifyNode(i) + nullify_node(i) if(!nodes[i]) missing_nodes = TRUE if(missing_nodes) - atmosinit() + atmos_init() for(var/obj/machinery/atmospherics/A in pipeline_expansion()) - A.atmosinit() - if(A.returnPipenet()) - A.addMember(src) + A.atmos_init() + if(A.return_pipenet()) + A.add_member(src) SSair.add_to_rebuild_queue(src) else - // atmosinit() calls update_icon(), so we don't need to call it + // atmos_init() calls update_icon(), so we don't need to call it update_icon() /obj/machinery/navbeacon/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) diff --git a/code/modules/shuttle/shuttle_rotate.dm b/code/modules/shuttle/shuttle_rotate.dm index dcfbdaf5794fe..9250197db416d 100644 --- a/code/modules/shuttle/shuttle_rotate.dm +++ b/code/modules/shuttle/shuttle_rotate.dm @@ -81,13 +81,13 @@ If ever any of these procs are useful for non-shuttles, rename it to proc/rotate /************************************Machine rotate procs************************************/ /obj/machinery/atmospherics/shuttleRotate(rotation, params) - var/list/real_node_connect = getNodeConnects() + var/list/real_node_connect = get_node_connects() for(var/i in 1 to device_type) real_node_connect[i] = angle2dir(rotation+dir2angle(real_node_connect[i])) . = ..() - SetInitDirections() - var/list/supposed_node_connect = getNodeConnects() + set_init_directions() + var/list/supposed_node_connect = get_node_connects() var/list/nodes_copy = nodes.Copy() for(var/i in 1 to device_type) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/alien_artifact.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/alien_artifact.dm index bbd87d275020d..b7f90c6f83f9d 100644 --- a/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/alien_artifact.dm +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/loot/alien_artifact.dm @@ -200,7 +200,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/atom/movable/proximity_monitor_holder) /datum/artifact_effect/airfreeze/Initialize(atom/source) . = ..() - source.CanAtmosPass = ATMOS_PASS_NO + source.can_atmos_pass = ATMOS_PASS_NO /datum/artifact_effect/airfreeze/register_signals(source) RegisterSignal(source, COMSIG_MOVABLE_MOVED, PROC_REF(updateAir)) @@ -208,10 +208,10 @@ CREATION_TEST_IGNORE_SUBTYPES(/atom/movable/proximity_monitor_holder) /datum/artifact_effect/airfreeze/proc/updateAir(atom/source, atom/oldLoc) if(isturf(oldLoc)) var/turf/oldTurf = oldLoc - oldTurf.air_update_turf(TRUE) + oldTurf.air_update_turf(TRUE, TRUE) if(isturf(source.loc)) var/turf/newTurf = source.loc - newTurf.air_update_turf(TRUE) + newTurf.air_update_turf(TRUE, TRUE) //=================== // Atmos Stabilizer @@ -418,10 +418,10 @@ GLOBAL_LIST_EMPTY(destabliization_exits) var/datum/gas_mixture/air = T.return_air() var/input_id = initial(input.id) var/output_id = initial(output.id) - var/moles = min(air.get_moles(input_id), 5) + var/moles = min(GET_MOLES(input_id, air), 5) if(moles) - air.adjust_moles(input_id, -moles) - air.adjust_moles(output_id, moles) + air.gases[input_id][MOLES] += -moles + air.gases[output_id][MOLES] += moles //=================== // Recharger diff --git a/code/modules/shuttle/super_cruise/shuttle_components/plasma_refiner.dm b/code/modules/shuttle/super_cruise/shuttle_components/plasma_refiner.dm index 96603f6d019e0..2f82e12346140 100644 --- a/code/modules/shuttle/super_cruise/shuttle_components/plasma_refiner.dm +++ b/code/modules/shuttle/super_cruise/shuttle_components/plasma_refiner.dm @@ -20,7 +20,7 @@ if(!air_contents) return qdel(stack) - air_contents.adjust_moles(GAS_PLASMA, moles_created) + air_contents.gases[/datum/gas/plasma][MOLES] += moles_created say("[moles_created] moles of plasma refined.") return @@ -35,12 +35,12 @@ /obj/machinery/atmospherics/components/unary/plasma_refiner/AltClick(mob/living/user) var/datum/gas_mixture/air_contents = airs[1] - var/plasmoles = air_contents.get_moles(GAS_PLASMA) + var/plasmoles = GET_MOLES(/datum/gas/plasma, air_contents) if(!air_contents) return if(plasmoles >= 100) var/obj/item/stack/sheet/mineral/plasma/P = new(src.loc, 1) - air_contents.adjust_moles(GAS_PLASMA, -100) + air_contents.gases[/datum/gas/plasma][MOLES] += -100 say("100 moles of plasma consumed. A sheet of [P.name] has been created.") else say("Insufficient plasma. At least 100 moles of plasma are required. There are currently [plasmoles] moles of plasma.") @@ -56,16 +56,16 @@ /obj/machinery/atmospherics/components/unary/plasma_refiner/default_change_direction_wrench(mob/user, obj/item/I) . = ..() if(.) - SetInitDirections() + set_init_directions() var/obj/machinery/atmospherics/node = nodes[1] if(node) node.disconnect(src) nodes[1] = null if(parents[1]) nullifyPipenet(parents[1]) - atmosinit() + atmos_init() node = nodes[1] if(node) - node.atmosinit() - node.addMember(src) + node.atmos_init() + node.add_member(src) SSair.add_to_rebuild_queue(src) diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 90dffe1eb6a6d..980f92adc54eb 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -263,7 +263,7 @@ to_chat(H, "You feel resistant to airborne toxins.") if(locate(/obj/item/organ/lungs) in H.internal_organs) var/obj/item/organ/lungs/L = H.internal_organs_slot[ORGAN_SLOT_LUNGS] - L.gas_max -= GAS_PLASMA + L.gas_max -= /datum/gas/plasma ADD_TRAIT(H, TRAIT_VIRUSIMMUNE, "dna_vault") if(VAULT_NOBREATH) to_chat(H, "Your lungs feel great.") diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 5edb0bbf147ad..26bf330da7da2 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -198,8 +198,9 @@ // Priority 3: use internals tank. var/obj/item/tank/I = owner.internal - if(I && I.air_contents && I.air_contents.total_moles() >= num && use_fuel) - T.assume_air_moles(I.air_contents, num) + var/datum/gas_mixture/I_air = I.return_air() + if(I && I_air && I_air.total_moles() >= num && use_fuel) + T.assume_air_moles(I_air, num) toggle(silent = TRUE) return 0 diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index d816c0bb7a5df..36be848415ccc 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -23,6 +23,7 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/salbutamol = 5) //Breath damage + //These thresholds are checked against what amounts to total_mix_pressure * (gas_type_mols/total_mols) var/breathing_class = BREATH_OXY // can be a gas instead of a breathing class var/safe_breath_min = 16 @@ -32,8 +33,8 @@ var/safe_damage_type = OXY var/list/gas_min = list() var/list/gas_max = list( - GAS_CO2 = 30, // Yes it's an arbitrary value who cares? - GAS_PLASMA = MOLES_GAS_VISIBLE + /datum/gas/carbon_dioxide = 30, // Yes it's an arbitrary value who cares? + /datum/breathing_class/plasma = MOLES_GAS_VISIBLE ) var/list/gas_damage = list( "default" = list( @@ -41,7 +42,7 @@ max = MAX_TOXIC_GAS_DAMAGE, damage_type = OXY ), - GAS_PLASMA = list( + /datum/gas/plasma = list( min = MIN_TOXIC_GAS_DAMAGE, max = MAX_TOXIC_GAS_DAMAGE, damage_type = TOX @@ -146,13 +147,12 @@ var/alert_category var/alert_type if(ispath(breathing_class)) - var/datum/breathing_class/class = GLOB.gas_data.breathing_classes[breathing_class] + var/datum/breathing_class/class = GLOB.breathing_class_info[breathing_class] alert_category = class.low_alert_category alert_type = class.low_alert_datum else - var/list/breath_alert_info = GLOB.gas_data.breath_alert_info - if(breathing_class in breath_alert_info) - var/list/alert = breath_alert_info[breathing_class]["not_enough_alert"] + var/list/alert = GLOB.meta_gas_info[breathing_class][META_GAS_BREATH_ALERT_INFO]?["not_enough_alert"] + if(alert) alert_category = alert["alert_category"] alert_type = alert["alert_type"] throw_alert_for(H, alert_category, alert_type) @@ -160,15 +160,13 @@ #define PP_MOLES(X) ((X / total_moles) * pressure) - #define PP(air, gas) PP_MOLES(air.get_moles(gas)) + #define PP(air, gas) PP_MOLES(GET_MOLES(gas, air)) var/gas_breathed = 0 var/pressure = breath.return_pressure() var/total_moles = breath.total_moles() - var/list/breath_alert_info = GLOB.gas_data.breath_alert_info - var/list/breath_results = GLOB.gas_data.breath_results - var/list/breathing_classes = GLOB.gas_data.breathing_classes + var/list/breathing_classes = GLOB.breathing_class_info var/list/mole_adjustments = list() for(var/entry in gas_min) var/required_pp = 0 @@ -176,14 +174,16 @@ var/safe_min = gas_min[entry] var/alert_category = null var/alert_type = null - if(ispath(entry)) - var/datum/breathing_class/class = breathing_classes[entry] + var/datum/breathing_class/class = breathing_classes[entry] + if(class) var/list/gases = class.gases var/list/products = class.products alert_category = class.low_alert_category alert_type = class.low_alert_datum for(var/gas in gases) - var/moles = breath.get_moles(gas) + if (!(gas in breath.gases)) + continue + var/moles = breath.gases[gas][MOLES] var/multiplier = gases[gas] mole_adjustments[gas] = (gas in mole_adjustments) ? mole_adjustments[gas] - moles : -moles required_pp += PP_MOLES(moles) * multiplier @@ -193,14 +193,14 @@ for(var/product in products) mole_adjustments[product] = (product in mole_adjustments) ? mole_adjustments[product] + to_add : to_add else - required_moles = breath.get_moles(entry) + required_moles = GET_MOLES(entry, breath) required_pp = PP_MOLES(required_moles) - if(entry in breath_alert_info) - var/list/alert = breath_alert_info[entry]["not_enough_alert"] + var/list/alert = GLOB.meta_gas_info[entry][META_GAS_BREATH_ALERT_INFO]?["not_enough_alert"] + if(alert) alert_category = alert["alert_category"] alert_type = alert["alert_type"] mole_adjustments[entry] = -required_moles - mole_adjustments[breath_results[entry]] = required_moles + mole_adjustments[GLOB.meta_gas_info[entry][META_GAS_BREATH_RESULTS]] = required_moles if(required_pp < safe_min) var/multiplier = handle_too_little_breath(H, required_pp, safe_min, required_moles) if(required_moles > 0) @@ -213,28 +213,26 @@ if(H.health >= H.crit_threshold) H.adjustOxyLoss(-breathModifier) clear_alert_for(H, alert_category) - var/list/danger_reagents = GLOB.gas_data.breath_reagents_dangerous for(var/entry in gas_max) var/found_pp = 0 - var/datum/breathing_class/breathing_class = entry + var/datum/breathing_class/breathing_class = breathing_classes[entry] var/datum/reagent/danger_reagent = null var/alert_category = null var/alert_type = null - if(ispath(breathing_class)) - breathing_class = breathing_classes[breathing_class] + if(breathing_class) alert_category = breathing_class.high_alert_category alert_type = breathing_class.high_alert_datum danger_reagent = breathing_class.danger_reagent found_pp = breathing_class.get_effective_pp(breath) else - danger_reagent = danger_reagents[entry] - if(entry in breath_alert_info) - var/list/alert = breath_alert_info[entry]["too_much_alert"] + danger_reagent = GLOB.meta_gas_info[entry][META_GAS_BREATH_REAGENT_DANGEROUS] + var/list/alert = GLOB.meta_gas_info[entry][META_GAS_BREATH_ALERT_INFO]?["too_much_alert"] + if(alert) alert_category = alert["alert_category"] alert_type = alert["alert_type"] found_pp = PP(breath, entry) if(found_pp > gas_max[entry]) - if(istype(danger_reagent)) + if(danger_reagent && istype(danger_reagent)) H.reagents.add_reagent(danger_reagent,1) var/list/damage_info = (entry in gas_damage) ? gas_damage[entry] : gas_damage["default"] var/dam = found_pp / gas_max[entry] * 10 @@ -242,22 +240,21 @@ throw_alert_for(H, alert_category, alert_type) else clear_alert_for(H, alert_category) - var/list/breath_reagents = GLOB.gas_data.breath_reagents - for(var/gas in breath.get_gases()) - if(gas in breath_reagents) - var/datum/reagent/R = breath_reagents[gas] - //H.reagents.add_reagent(R, breath.get_moles(gas) * R.molarity) // See next line - H.reagents.add_reagent(R, breath.get_moles(gas) * 2) // 2 represents molarity of O2, we don't have citadel molarity - mole_adjustments[gas] = (gas in mole_adjustments) ? mole_adjustments[gas] - breath.get_moles(gas) : -breath.get_moles(gas) + for(var/gas in breath.gases) + var/datum/reagent/R = GLOB.meta_gas_info[gas][META_GAS_BREATH_REAGENT] + if(R) + //H.reagents.add_reagent(R, breath.gases[gas][MOLES] * R.molarity) // See next line + H.reagents.add_reagent(R, breath.gases[gas][MOLES] * 2) // 2 represents molarity of O2, we don't have citadel molarity + mole_adjustments[gas] = (gas in mole_adjustments) ? mole_adjustments[gas] - breath.gases[gas][MOLES] : -breath.gases[gas][MOLES] for(var/gas in mole_adjustments) - breath.adjust_moles(gas, mole_adjustments[gas]) + ADJUST_MOLES(gas, breath, mole_adjustments[gas]) if(breath) // If there's some other shit in the air lets deal with it here. // N2O - var/SA_pp = PP(breath, GAS_NITROUS) + var/SA_pp = PP(breath, /datum/gas/nitrous_oxide) if(SA_pp > SA_para_min) // Enough to make us stunned for a bit H.Unconscious(60) // 60 gives them one second to wake up and run away a bit! if(SA_pp > SA_sleep_min) // Enough to make us sleep as well @@ -271,7 +268,7 @@ // BZ - var/bz_pp = PP(breath, GAS_BZ) + var/bz_pp = PP(breath, /datum/gas/bz) if(bz_pp > BZ_brain_damage_min) H.hallucination += 10 H.reagents.add_reagent(/datum/reagent/metabolite/bz,5) @@ -283,7 +280,7 @@ H.reagents.add_reagent(/datum/reagent/metabolite/bz,1) // Nitryl - var/nitryl_pp = PP(breath,GAS_NITRYL) + var/nitryl_pp = PP(breath,/datum/gas/nitryl) if (prob(nitryl_pp)) to_chat(H, "Your mouth feels like it's burning!") if (nitryl_pp >40) @@ -294,18 +291,18 @@ H.silent = max(H.silent, 3) else H.adjustFireLoss(nitryl_pp/4) - gas_breathed = PP(breath,GAS_NITRYL) + gas_breathed = PP(breath,/datum/gas/nitryl) if (gas_breathed > gas_stimulation_min) H.reagents.add_reagent(/datum/reagent/nitryl,1) - breath.adjust_moles(GAS_NITRYL, -gas_breathed) + REMOVE_MOLES(/datum/gas/nitryl, breath, gas_breathed) // Stimulum - gas_breathed = PP(breath,GAS_STIMULUM) + gas_breathed = PP(breath,/datum/gas/stimulum) if (gas_breathed > gas_stimulation_min) var/existing = H.reagents.get_reagent_amount(/datum/reagent/stimulum) H.reagents.add_reagent(/datum/reagent/stimulum, max(0, 5 - existing)) - breath.adjust_moles(GAS_STIMULUM, -gas_breathed) + REMOVE_MOLES(/datum/gas/stimulum, breath, gas_breathed) handle_breath_temperature(breath, H) return TRUE @@ -354,7 +351,7 @@ to_chat(H, "You feel [hot_message] in your [name]!") // The air you breathe out should match your body temperature - breath.set_temperature(H.bodytemperature) + breath.temperature = H.bodytemperature /obj/item/organ/lungs/on_life() ..() @@ -378,7 +375,7 @@ /obj/item/organ/lungs/plasmaman/populate_gas_info() ..() - gas_max -= GAS_PLASMA + gas_max -= /datum/breathing_class/plasma /obj/item/organ/lungs/slime name = "vacuole" @@ -408,8 +405,8 @@ safe_breath_min = 4 safe_breath_max = 250 gas_max = list( - GAS_PLASMA = 30, - GAS_CO2 = 30 + /datum/gas/plasma = 30, + /datum/gas/carbon_dioxide = 30 ) maxHealth = 2 * STANDARD_ORGAN_THRESHOLD @@ -430,8 +427,8 @@ safe_breath_min = 4 safe_breath_max = 20 gas_max = list( - GAS_CO2 = 45, - GAS_PLASMA = MOLES_GAS_VISIBLE + /datum/gas/carbon_dioxide = 45, + /datum/gas/plasma = MOLES_GAS_VISIBLE ) #undef PP #undef PP_MOLES diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 0d573e3d42245..5ec3805c1d5b0 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -21,6 +21,9 @@ #include "component_tests.dm" #include "connect_loc.dm" #include "crafting_tests.dm" +#include "breath.dm" +#include "gas_transfer.dm" + /* #include "create_and_destroy.dm" */ diff --git a/code/modules/unit_tests/breath.dm b/code/modules/unit_tests/breath.dm new file mode 100644 index 0000000000000..6aa9e19e57766 --- /dev/null +++ b/code/modules/unit_tests/breath.dm @@ -0,0 +1,36 @@ +/// Tests to make sure humans can breath in normal situations +/// Built to prevent regression on an issue surrounding QUANTIZE() and BREATH_VOLUME +/// See the comment on BREATH_VOLUME for more details +/datum/unit_test/breath_sanity + +/datum/unit_test/breath_sanity/Run() + var/mob/living/carbon/human/consistent/lab_rat = allocate(/mob/living/carbon/human/consistent) + var/obj/item/clothing/mask/breath/tube = allocate(/obj/item/clothing/mask/breath) + var/obj/item/tank/internals/emergency_oxygen/source = allocate(/obj/item/tank/internals/emergency_oxygen) + + lab_rat.equip_to_slot_if_possible(tube, ITEM_SLOT_MASK) + lab_rat.equip_to_slot_if_possible(source, ITEM_SLOT_HANDS) + source.toggle_internals(lab_rat) + + lab_rat.breathe() + + TEST_ASSERT(!lab_rat.has_alert("not_enough_oxy"), "Humans can't get a full breath from standard o2 tanks") + lab_rat.clear_alert("not_enough_oxy") + + //Prep the mob + lab_rat.forceMove(run_loc_floor_bottom_left) + source.toggle_internals(lab_rat) + TEST_ASSERT(!lab_rat.internal, "toggle_internals() failed to toggle internals") + + var/turf/open/to_fill = run_loc_floor_bottom_left + //Prep the floor + to_fill.initial_gas_mix = OPENTURF_DEFAULT_ATMOS + to_fill.air = new + to_fill.air.copy_from_turf(to_fill) + + lab_rat.breathe() + + TEST_ASSERT(!lab_rat.has_alert("not_enough_oxy"), "Humans can't get a full breath from the standard initial_gas_mix on a turf") + + + diff --git a/code/modules/unit_tests/gas_transfer.dm b/code/modules/unit_tests/gas_transfer.dm new file mode 100644 index 0000000000000..565fd62a79bd7 --- /dev/null +++ b/code/modules/unit_tests/gas_transfer.dm @@ -0,0 +1,31 @@ +/// Test to make sure the pressure pumping proc used by things like portable pumps, pressure pumps, etc actually work. +/datum/unit_test/atmospheric_gas_transfer + +/datum/unit_test/atmospheric_gas_transfer/Run() + for (var/tempNmoles in list(1e4, 1e6, 1e8, 1e10, 1e12)) + var/datum/gas_mixture/first_mix = allocate(/datum/gas_mixture) + var/datum/gas_mixture/second_mix = allocate(/datum/gas_mixture) + + first_mix.volume = 200 + second_mix.volume = 200 + + SET_MOLES(/datum/gas/hypernoblium, first_mix, tempNmoles) + SET_MOLES(/datum/gas/tritium, second_mix, 200) + + first_mix.temperature = tempNmoles + second_mix.temperature = T20C + + var/initial_pressure = second_mix.return_pressure() + // A constant value would be nicer but there will be cases when even MOLAR_ACCURACY amounts would far exceed the pressure so we need to scale it somewhat. + var/additional_pressure = (tempNmoles / 1000) + 500 + + /* ERROR MARGIN CALCULATION + * We calculate how much would the pressure change if MOLAR_ACCURACY amount of hothotgas is imparted on the cold mix. + * This number gets really big for very high temperatures so it's somewhat meaningless, but our main goal is to ensure the code doesn't break. + */ + var/error_margin = first_mix.gas_pressure_minimum_transfer(second_mix) - initial_pressure + + first_mix.pump_gas_to(second_mix, (initial_pressure + additional_pressure)) + var/margin = abs(second_mix.return_pressure() - (initial_pressure+additional_pressure)) + + TEST_ASSERT(margin<=error_margin, "Gas pressure pumping test failed for [tempNmoles]. Expected pressure = [initial_pressure+additional_pressure] +/- [error_margin]. Got [second_mix.return_pressure()].") diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index 07201cd298103..76c8097ee26ba 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -198,10 +198,10 @@ radio.name = "[src] radio" cabin_air = new - cabin_air.set_temperature(T20C) - cabin_air.set_volume(200) - cabin_air.set_moles(GAS_O2, O2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) - cabin_air.set_moles(GAS_N2, N2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) + cabin_air.temperature = T20C + cabin_air.volume = 200 + SET_MOLES(/datum/gas/oxygen, cabin_air, O2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) + SET_MOLES(/datum/gas/nitrogen, cabin_air, N2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) add_cell() add_scanmod() @@ -220,6 +220,10 @@ become_hearing_sensitive(trait_source = ROUNDSTART_TRAIT) +/obj/mecha/ComponentInitialize() + . = ..() + AddElement(/datum/element/atmos_sensitive) + //separate proc so that the ejection mechanism can be easily triggered by other things, such as admins /obj/vehicle/sealed/mecha/proc/Eject() for(var/mob/living/occupant as anything in occupants) @@ -398,9 +402,9 @@ if(int_tank_air.return_pressure() > internal_tank.maximum_pressure && !(internal_damage & MECHA_INT_TANK_BREACH)) set_internal_damage(MECHA_INT_TANK_BREACH) if(int_tank_air && int_tank_air.return_volume() > 0) //heat the air_contents - int_tank_air.set_temperature(min(6000+T0C, int_tank_air.return_temperature()+rand(5,7.5)*delta_time)) + int_tank_air.temperature = (min(6000+T0C, int_tank_air.return_temperature()+rand(10,15))) if(cabin_air && cabin_air.return_volume()>0) - cabin_air.set_temperature(min(6000+T0C, cabin_air.return_temperature()+rand(5,7.5)*delta_time)) + cabin_air.temperature = (min(6000+T0C, cabin_air.return_temperature()+rand(10,15))) if(cabin_air.return_temperature() > max_temperature/2) take_damage(delta_time*2/round(max_temperature/cabin_air.return_temperature(),0.1), BURN, 0, 0) @@ -417,7 +421,7 @@ if(!(internal_damage & MECHA_INT_TEMP_CONTROL)) if(cabin_air && cabin_air.return_volume() > 0) var/delta = cabin_air.return_temperature() - T20C - cabin_air.set_temperature(cabin_air.return_temperature() - clamp(round(delta / 8, 0.1), -5, 5) * delta_time) + cabin_air.temperature = (cabin_air.return_temperature() - clamp(round(delta / 8, 0.1), -5, 5) * delta_time) if(internal_tank) var/datum/gas_mixture/tank_air = internal_tank.return_air() diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index b399a8220b70c..f920a2369270e 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -551,9 +551,9 @@ return FALSE var/moles = chassis.internal_tank.air_contents.total_moles() if(moles < move_cost) - chassis.internal_tank.air_contents.remove(moles) + chassis.internal_tank.remove_air(moles) return FALSE - chassis.internal_tank.air_contents.remove(move_cost) + chassis.internal_tank.remove_air(move_cost) generate_effect(movement_dir) return TRUE diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index bd3e0023e5a58..b4948593838f8 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -176,10 +176,13 @@ addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/vehicle/sealed/mecha, restore_equipment)), 3 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) equipment_disabled = 1 -/obj/vehicle/sealed/mecha/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature>max_temperature) - log_message("Exposed to dangerous temperature.", LOG_MECHA, color="red") - take_damage(5, BURN, 0, 1) +/obj/vehicle/sealed/mecha/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature>max_temperature + +/obj/vehicle/sealed/mecha/atmos_expose(datum/gas_mixture/air, exposed_temperature) + log_message("Exposed to dangerous temperature.", LOG_MECHA, color="red") + take_damage(5, BURN, 0, 1) + /obj/vehicle/sealed/mecha/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/xenoarchaeology/traits/xenoartifact_majors.dm b/code/modules/xenoarchaeology/traits/xenoartifact_majors.dm index 6c579cfac01d0..e9cc4e6963536 100644 --- a/code/modules/xenoarchaeology/traits/xenoartifact_majors.dm +++ b/code/modules/xenoarchaeology/traits/xenoartifact_majors.dm @@ -448,10 +448,10 @@ var/datum/gas_mixture/air = T.return_air() var/input_id = initial(input.id) var/output_id = initial(output.id) - var/moles = min(air.get_moles(input_id), 5) + var/moles = min(GET_MOLES(input_id, air), 5) if(moles) - air.adjust_moles(input_id, -moles) - air.adjust_moles(output_id, moles) + air.gases[input_id][MOLES] += -moles + air.gases[output_id][MOLES] += moles ///============ /// Destabilizing, teleports the victim to that weird place from the exploration meme. diff --git a/code/modules/xenoarchaeology/traits/xenoartifact_malfunctions.dm b/code/modules/xenoarchaeology/traits/xenoartifact_malfunctions.dm index 8c9847a3b6a27..75326b6194e60 100644 --- a/code/modules/xenoarchaeology/traits/xenoartifact_malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/xenoartifact_malfunctions.dm @@ -233,7 +233,7 @@ ///What gasses we've S U C K E D var/datum/gas_mixture/air_contents ///Gasses we can suck. Currently everything but, it's here if we need to blacklist in the future - var/list/scrubbing = list(GAS_PLASMA, GAS_CO2, GAS_NITROUS, GAS_BZ, GAS_NITRYL, GAS_TRITIUM, GAS_HYPERNOB, GAS_H2O, GAS_O2, GAS_N2, GAS_STIMULUM, GAS_PLUOXIUM) + var/list/scrubbing = list(/datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz, /datum/gas/nitryl, /datum/gas/tritium, /datum/gas/hypernoblium, /datum/gas/water_vapor, /datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/stimulum, /datum/gas/pluoxium) ///Adjust for balance - I'm sure this will have no ramifications var/volume = 1000000 var/volume_rate = 200000 @@ -242,7 +242,7 @@ /datum/xenoartifact_trait/malfunction/absorbant/on_init(obj/item/xenoartifact/X) air_contents = new(volume) - air_contents.set_temperature(T20C) + air_contents.temperature = (T20C) parent = X /datum/xenoartifact_trait/malfunction/absorbant/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) @@ -250,14 +250,14 @@ var/turf/T = get_turf(X) var/datum/gas_mixture/mixture = T.return_air() mixture.scrub_into(air_contents, volume_rate / mixture.return_volume(), scrubbing) - X.air_update_turf() + X.air_update_turf(FALSE, FALSE) //Throw sucked gas into our tile when we die /datum/xenoartifact_trait/malfunction/absorbant/Destroy() . = ..() var/turf/T = get_turf(parent) T.assume_air(air_contents) - parent.air_update_turf() + parent.air_update_turf(FALSE, FALSE) //============ // Hallucination, shows a random hallucination to the target once diff --git a/dependencies.sh b/dependencies.sh index e55e8c7eb78e2..37b98e20e9ac9 100755 --- a/dependencies.sh +++ b/dependencies.sh @@ -20,9 +20,6 @@ export NODE_VERSION_PRECISE=18.14.2 # SpacemanDMM git tag export SPACEMAN_DMM_VERSION=suite-1.7.1 -#auxmos version -export AUXMOS_VERSION=2.2.2 - # Python version for mapmerge and other tools export PYTHON_VERSION=3.11.2 diff --git a/tools/Runtime Condenser/Output.txt b/tools/Runtime Condenser/Output.txt index e349edb7db7ab..27d5a53418321 100644 --- a/tools/Runtime Condenser/Output.txt +++ b/tools/Runtime Condenser/Output.txt @@ -177,7 +177,7 @@ proc name: show (/datum/html_interface/proc/show) The following runtime has occurred 1 time(s). -runtime error: Cannot execute null.GetAtmosAdjacentTurfs(). +runtime error: Cannot execute null.get_atmos_adjacent_turfs(). proc name: spread smoke (/obj/effect/particle_effect/smoke/proc/spread_smoke) source file: effects_smoke.dm,74 usr: null diff --git a/tools/ci/install_auxmos.sh b/tools/ci/install_auxmos.sh deleted file mode 100644 index 591bcf612f19a..0000000000000 --- a/tools/ci/install_auxmos.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -source dependencies.sh - -mkdir -p ~/.byond/bin -wget -O ~/.byond/bin/libauxmos.so "https://github.com/BeeStation/auxmos/releases/download/${AUXMOS_VERSION}/libauxmos.so" -chmod +x ~/.byond/bin/libauxmos.so -ldd ~/.byond/bin/libauxmos.so diff --git a/tools/tgs4_scripts/PreCompile.sh b/tools/tgs4_scripts/PreCompile.sh index ed588b5d33d78..5fa7810d6d1f1 100755 --- a/tools/tgs4_scripts/PreCompile.sh +++ b/tools/tgs4_scripts/PreCompile.sh @@ -70,25 +70,6 @@ cd .. # I left a few potentially extraneous ones in momentarily due to an inability to test on a linux host at the moment. apt-get install -y cmake build-essential gcc-multilib g++-multilib cmake wget -# update auxmos -if [ ! -d "auxmos" ]; then - echo "Cloning Auxmos..." - git clone https://github.com/BeeStation/auxmos - cd auxmos -else - echo "Fetching Auxmos..." - cd auxmos - git fetch -fi - -echo "Deploying Auxmos..." -git checkout "$AUXMOS_VERSION" -if [ -d "build" ]; then - rm -R build -fi -#note, if FUSION is ever fixed this needs changed to "all_reaction_hooks" -cargo rustc --target=i686-unknown-linux-gnu --release --features trit_fire_hook,plasma_fire_hook,generic_fire_hook -- -C target-cpu=native -mv -f target/i686-unknown-linux-gnu/release/libauxmos.so "$1/libauxmos.so" cd ../../.. # install or update youtube-dl when not present, or if it is present with pip3,