diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm new file mode 100644 index 0000000000..085a64bf97 --- /dev/null +++ b/_maps/map_files/debug/multiz.dmm @@ -0,0 +1,10403 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space/basic, +/area/space) +"ab" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) +"ac" = ( +/turf/open/space, +/area/space/nearstation) +"ad" = ( +/turf/closed/wall/r_wall, +/area/maintenance/department/bridge) +"ae" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space, +/area/space/nearstation) +"af" = ( +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"ag" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"ah" = ( +/turf/closed/wall/r_wall, +/area/engine/atmos) +"ai" = ( +/obj/machinery/power/rtg/advanced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aj" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) +"ak" = ( +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"al" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/structure/closet/secure_closet/atmospherics, +/turf/open/floor/plating, +/area/engine/atmos) +"am" = ( +/obj/machinery/atmospherics/components/unary/tank/air, +/turf/open/floor/plating, +/area/engine/atmos) +"an" = ( +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) +"ao" = ( +/obj/machinery/power/rtg/advanced, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"ap" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aq" = ( +/obj/machinery/computer/monitor, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ar" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/turf/open/floor/plasteel, +/area/engine/engineering) +"as" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space, +/area/space/nearstation) +"at" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/power/terminal{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"au" = ( +/turf/open/openspace, +/area/space) +"av" = ( +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"aw" = ( +/turf/open/floor/plating, +/area/engine/atmos) +"ax" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"ay" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, +/area/engine/atmos) +"az" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/engine/atmos) +"aA" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aB" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space, +/area/space/nearstation) +"aC" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space, +/area/space/nearstation) +"aD" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aE" = ( +/obj/structure/fans/tiny, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aF" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aH" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aI" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/gravity_generator) +"aJ" = ( +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/engine/gravity_generator) +"aK" = ( +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/engine/gravity_generator) +"aL" = ( +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/engine/gravity_generator) +"aM" = ( +/obj/machinery/suit_storage_unit/ce, +/turf/open/floor/plating, +/area/engine/atmos) +"aN" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plasteel{ + dir = 2 + }, +/area/engine/atmos) +"aO" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + on = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"aP" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"aQ" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aR" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aS" = ( +/obj/structure/table, +/obj/item/flashlight{ + pixel_y = 5 + }, +/obj/item/airlock_painter, +/turf/open/floor/plating, +/area/engine/engineering) +"aT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aV" = ( +/obj/machinery/power/rtg/advanced, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aX" = ( +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/machinery/light, +/obj/structure/table, +/obj/item/analyzer, +/obj/item/wrench, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/engine/atmos) +"aY" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aZ" = ( +/obj/structure/tank_dispenser{ + pixel_x = -1 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"ba" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/engine/atmos) +"bb" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plasteel{ + dir = 2 + }, +/area/engine/atmos) +"bc" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + on = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bd" = ( +/obj/structure/table, +/obj/item/weldingtool/experimental, +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/engine/engineering) +"be" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/engine/atmos) +"bf" = ( +/obj/structure/closet/secure_closet/engineering_chief, +/turf/open/floor/plating, +/area/engine/engineering) +"bg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/power/apc{ + dir = 8; + name = "Gravity Generator APC"; + pixel_x = -25 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bi" = ( +/obj/machinery/gravity_generator/main/station, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/engine/gravity_generator) +"bj" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bk" = ( +/obj/machinery/door/airlock, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"bl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/engine/atmos) +"bm" = ( +/obj/machinery/atmospherics/components/binary/valve/on{ + icon_state = "mvalve_map-2"; + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"bn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/light, +/turf/open/floor/plating, +/area/engine/atmos) +"bo" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/table, +/obj/item/screwdriver/power, +/obj/item/crowbar/power, +/turf/open/floor/plating, +/area/engine/engineering) +"bp" = ( +/obj/machinery/light, +/obj/item/storage/box/lights/mixed, +/obj/item/lightreplacer, +/turf/open/floor/plating, +/area/engine/engineering) +"bq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"br" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bs" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"bt" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bu" = ( +/turf/closed/wall/r_wall, +/area/bridge) +"bv" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/bridge) +"bw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"bx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"by" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/entry) +"bz" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"bA" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"bB" = ( +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/structure/closet/jcloset, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bC" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bD" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/structure/closet/secure_closet/captains, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/bridge) +"bE" = ( +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bF" = ( +/obj/structure/closet/secure_closet/CMO, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bG" = ( +/obj/structure/table, +/obj/item/ammo_box/c10mm, +/obj/item/gun/ballistic/automatic/pistol, +/turf/open/floor/plasteel, +/area/bridge) +"bH" = ( +/obj/structure/table, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/construction/rcd, +/turf/open/floor/plasteel, +/area/bridge) +"bI" = ( +/obj/structure/table, +/turf/open/floor/plasteel, +/area/bridge) +"bJ" = ( +/obj/structure/table, +/obj/item/card/id/captains_spare, +/turf/open/floor/plasteel, +/area/bridge) +"bK" = ( +/obj/structure/table, +/obj/item/storage/backpack/holding, +/turf/open/floor/plasteel, +/area/bridge) +"bL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bM" = ( +/obj/structure/closet/secure_closet/hop, +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/bridge) +"bN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bO" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/bridge) +"bP" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/bridge) +"bR" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/bridge) +"bS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/bridge) +"bT" = ( +/obj/machinery/computer/arcade, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bU" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/structure/closet/firecloset/full, +/obj/structure/cable, +/turf/open/floor/plasteel{ + dir = 9 + }, +/area/hallway/secondary/entry) +"bV" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/entry) +"bW" = ( +/obj/structure/closet/secure_closet/hos, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/entry) +"bX" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/entry) +"bY" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"bZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ca" = ( +/obj/machinery/door/airlock, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/bridge) +"cb" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ce" = ( +/obj/machinery/door/airlock/glass, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"cf" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ch" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ci" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/hallway/primary/central) +"cj" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"ck" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"cl" = ( +/obj/structure/cable, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"cn" = ( +/obj/machinery/door/airlock, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"co" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cp" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel{ + dir = 10 + }, +/area/bridge) +"cq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"cr" = ( +/obj/machinery/light, +/turf/open/floor/plasteel{ + dir = 6 + }, +/area/bridge) +"cs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"ct" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cu" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/bridge) +"cw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cy" = ( +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cz" = ( +/obj/machinery/door/airlock/glass, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/construction) +"cA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/construction) +"cC" = ( +/obj/machinery/door/airlock/glass, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cD" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/construction) +"cE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/construction) +"cF" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/construction) +"cG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/hallway/secondary/entry) +"cH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cI" = ( +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cJ" = ( +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel{ + dir = 10 + }, +/area/hallway/secondary/entry) +"cK" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/rods/fifty, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"cL" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"cM" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/item/storage/firstaid/regular, +/obj/item/healthanalyzer, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"cN" = ( +/turf/closed/wall/r_wall, +/area/construction) +"cO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/construction) +"cP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/construction) +"cQ" = ( +/obj/machinery/door/airlock/glass, +/turf/open/floor/plasteel, +/area/construction) +"cR" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/construction) +"cS" = ( +/turf/closed/wall/r_wall, +/area/storage/primary) +"cT" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/storage/primary) +"cV" = ( +/obj/machinery/door/airlock/glass, +/turf/open/floor/plasteel, +/area/storage/primary) +"cW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cX" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cY" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/construction) +"cZ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/ladder, +/turf/open/floor/plasteel, +/area/construction) +"da" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"db" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/construction) +"de" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"df" = ( +/obj/machinery/power/apc/auto_name/north, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/construction) +"dg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/construction) +"dh" = ( +/obj/machinery/power/deck_relay, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/construction) +"di" = ( +/obj/machinery/power/apc/auto_name/north, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"dj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"dk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dl" = ( +/turf/open/floor/plating, +/area/storage/primary) +"dm" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction) +"dn" = ( +/obj/machinery/power/deck_relay, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"do" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/construction) +"dp" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/storage/primary) +"dq" = ( +/obj/machinery/power/apc/auto_name/north, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/engine/storage) +"dr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/storage) +"ds" = ( +/obj/machinery/power/deck_relay, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/engine/storage) +"dx" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/storage/primary) +"dy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction) +"dz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/construction) +"dA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dB" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/storage/primary) +"dC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dG" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"dH" = ( +/obj/effect/landmark/start, +/turf/open/floor/plasteel, +/area/storage/primary) +"dI" = ( +/obj/effect/landmark/latejoin, +/turf/open/floor/plasteel, +/area/storage/primary) +"dJ" = ( +/turf/open/floor/plasteel, +/area/storage/primary) +"dL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/construction) +"dM" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction) +"dN" = ( +/obj/structure/table, +/turf/open/floor/plasteel, +/area/storage/primary) +"dO" = ( +/obj/structure/table, +/obj/machinery/light, +/obj/item/twohanded/fireaxe, +/obj/item/extinguisher, +/turf/open/floor/plasteel, +/area/storage/primary) +"dP" = ( +/obj/structure/table, +/obj/item/lightreplacer, +/turf/open/floor/plasteel, +/area/storage/primary) +"dQ" = ( +/obj/structure/table, +/obj/item/storage/box/lights/mixed, +/obj/item/storage/box/lights/tubes, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/storage/primary) +"dR" = ( +/obj/structure/table, +/obj/item/flashlight{ + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dS" = ( +/turf/open/floor/plasteel, +/area/engine/storage) +"dV" = ( +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"dW" = ( +/turf/open/floor/plasteel, +/area/engine/engineering) +"dX" = ( +/turf/open/floor/plasteel{ + dir = 2 + }, +/area/hallway/secondary/service) +"dY" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eb" = ( +/turf/open/floor/plasteel, +/area/bridge) +"ec" = ( +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/bridge) +"ed" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"ee" = ( +/turf/open/floor/plasteel{ + dir = 9 + }, +/area/hallway/secondary/service) +"ej" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"em" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/service) +"en" = ( +/turf/open/floor/plasteel{ + dir = 10 + }, +/area/hallway/secondary/service) +"eo" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"es" = ( +/obj/effect/turf_decal/stripes/asteroid/corner, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eu" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"ey" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"ez" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/service) +"eC" = ( +/turf/open/openspace, +/area/maintenance/department/bridge) +"eD" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eE" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"eF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"eH" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eI" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eJ" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eL" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eM" = ( +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 4 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eN" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eO" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eV" = ( +/obj/structure/ladder, +/turf/open/floor/plasteel, +/area/engine/storage) +"fa" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"fo" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/machinery/door/airlock/external/glass, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/engine/storage) +"gK" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + icon_state = "connector_map-2"; + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/plating, +/area/construction) +"gW" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"hi" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + icon_state = "inje_map-2"; + dir = 4 + }, +/turf/open/floor/plating, +/area/construction) +"hm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/construction) +"ho" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/storage) +"ij" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/ce, +/turf/open/floor/plasteel, +/area/construction) +"ip" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/space) +"iu" = ( +/turf/open/openspace, +/area/hallway/secondary/service) +"iK" = ( +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/service) +"jb" = ( +/obj/machinery/atmospherics/pipe/simple/multiz, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"jA" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 8 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage) +"jT" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/construction) +"jV" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 6 + }, +/turf/open/floor/plating, +/area/engine/storage) +"kg" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"lu" = ( +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"mZ" = ( +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/hallway/secondary/service) +"nx" = ( +/turf/open/openspace, +/area/space/nearstation) +"nz" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"od" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage) +"oh" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"on" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"oA" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"oJ" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"qo" = ( +/turf/open/openspace, +/area/engine/storage) +"qR" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 9 + }, +/turf/open/floor/plating, +/area/engine/storage) +"rd" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/openspace, +/area/engine/storage) +"sh" = ( +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/service) +"sm" = ( +/obj/structure/stairs, +/turf/open/floor/plating, +/area/construction) +"sE" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/storage) +"td" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/storage) +"vt" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"vF" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/table, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/construction/rcd/combat/admin, +/turf/open/floor/plasteel, +/area/construction) +"xr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel, +/area/construction) +"xB" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/storage) +"xI" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"zC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/construction) +"zZ" = ( +/obj/structure/disposalpipe/trunk{ + icon_state = "pipe-t"; + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plating, +/area/construction) +"AG" = ( +/turf/closed/wall/r_wall, +/area/engine/storage) +"AI" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/tank/jetpack/oxygen/captain, +/obj/item/storage/belt/utility/chief/full, +/obj/item/clothing/gloves/color/yellow{ + pixel_y = 10 + }, +/turf/open/floor/plasteel, +/area/construction) +"Bk" = ( +/obj/structure/grille, +/turf/open/openspace, +/area/space/nearstation) +"Bm" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"CK" = ( +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"Dm" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"DG" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/storage) +"DK" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage) +"Eb" = ( +/obj/effect/turf_decal/stripes/white/line, +/turf/open/floor/plating, +/area/engine/storage) +"EF" = ( +/obj/machinery/atmospherics/components/binary/valve, +/turf/open/floor/plating, +/area/construction) +"EH" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/storage) +"Fd" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"FL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/hidden{ + icon_state = "pipe11-2"; + dir = 4 + }, +/turf/open/floor/plating, +/area/construction) +"FY" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/construction) +"Hk" = ( +/obj/machinery/atmospherics/pipe/simple/multiz, +/turf/open/floor/plating, +/area/construction) +"IC" = ( +/obj/machinery/atmospherics/components/binary/valve, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"IN" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/turf/open/floor/plasteel, +/area/engine/storage) +"Jt" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"JH" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/storage) +"Kd" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"Kw" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"KM" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"LE" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"LW" = ( +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"ME" = ( +/obj/machinery/light, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"Ob" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/openspace, +/area/space/nearstation) +"Og" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/engine/storage) +"Pu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/storage) +"Pz" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/storage) +"Qo" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + icon_state = "pipe-down"; + dir = 1 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"Qw" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"St" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table, +/turf/open/floor/plasteel, +/area/construction) +"Tf" = ( +/turf/open/floor/plating, +/area/construction) +"TH" = ( +/turf/open/floor/plating, +/area/engine/storage) +"TY" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/service) +"Um" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"UH" = ( +/obj/machinery/atmospherics/pipe/simple/multiz, +/turf/open/floor/plating, +/area/engine/storage) +"Vn" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"VB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/construction) +"WN" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"XN" = ( +/turf/open/floor/plating, +/area/hallway/secondary/service) +"Zc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"ZH" = ( +/obj/structure/disposalpipe/trunk/multiz, +/turf/open/floor/plating, +/area/construction) +"ZQ" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 5 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage) + +(1,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 +"} +(2,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 +"} +(3,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 +"} +(4,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 +"} +(5,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 +"} +(6,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 +"} +(7,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 +"} +(8,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 +"} +(9,1,1) = {" +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 +aa +aa +aa +aa +aa +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +bY +bY +bY +bY +bY +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +af +af +af +af +af +af +af +bz +af +af +af +af +af +bz +af +af +af +af +af +bz +af +af +af +af +af +af +af +bz +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +ah +ah +ah +ah +ah +ah +bA +bZ +bZ +bZ +bZ +bZ +bA +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(14,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +al +aw +aM +aZ +aX +bA +bB +bE +bE +bE +bE +bE +bE +cN +cD +dm +dy +dy +dy +dy +dy +dy +dy +dy +dm +dM +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(15,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +Dm +ah +am +ax +aw +ba +be +bj +bt +bN +bN +bN +bC +bN +bN +cP +cE +Tf +Tf +ZH +FY +zZ +Tf +Tf +cR +cR +cR +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(16,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +am +ay +aN +bb +bl +ah +bx +bL +bL +bL +cg +bL +bL +cz +cF +Tf +Tf +Tf +Tf +Tf +Tf +Tf +cR +Tf +cR +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(17,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +am +ay +aO +bc +bm +ah +bE +bE +bE +bE +ch +bE +bE +cQ +cY +Tf +cN +df +Tf +Tf +Tf +Tf +cR +hi +cR +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +am +az +aP +aP +bn +ah +bF +bE +co +bE +ch +bE +bE +cN +cY +Tf +Tf +dg +Tf +Tf +Tf +Tf +cR +FL +cR +dL +cN +ME +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +ah +ah +ah +ah +ah +ah +bu +bu +bv +bu +bu +ci +bL +bL +cB +cO +dd +dd +dh +Tf +Tf +Tf +Tf +Tf +gK +Tf +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ag +ag +ag +ag +ag +ag +bu +bD +bO +cp +cv +cj +bE +bE +cR +cY +Tf +cN +jT +Tf +Tf +Tf +Tf +Tf +Tf +Tf +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(21,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ai +an +ai +an +ai +ag +bv +bG +bQ +eb +bv +ck +bN +bN +zC +hm +EF +VB +Hk +Tf +Tf +Tf +Tf +Tf +sm +Tf +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(22,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ao +as +aB +as +aV +ag +bv +bI +bQ +eb +bu +cm +bE +bE +cN +cY +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +ij +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(23,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ag +ag +aC +ag +ag +ag +bv +bJ +bR +bS +ca +cq +bE +bE +cQ +cY +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +St +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ac +ac +ag +aC +ag +ac +ac +bv +bK +eb +eb +bu +cm +bE +bE +cQ +cY +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +xr +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ac +ac +aj +aD +aj +ac +ac +bv +bH +eb +eb +bv +cm +bE +bE +cN +cZ +do +dz +dz +dz +dz +dz +dz +dz +dz +AI +vF +cN +ME +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(26,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ac +ac +aj +aE +aj +ac +ac +bu +bM +ec +cr +bu +cm +bE +bE +cS +cS +cS +dJ +dJ +dJ +dJ +dJ +dJ +dJ +dJ +cS +cS +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +aj +aj +aF +aj +aj +aj +bu +bu +bv +bu +bu +cs +bE +bE +cS +cT +on +dA +dl +dl +dl +dl +dl +dl +dl +dp +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(28,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +aj +ap +aG +aS +bd +bo +bw +bN +bN +ct +bN +cu +bN +bN +cU +cW +dJ +dB +dl +dl +dl +dl +dl +dl +dl +dl +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +aj +aq +aH +aR +aW +aW +bk +bL +bL +bL +cb +cw +bE +bE +cS +cX +dJ +dB +dl +dD +dc +dc +dA +dl +dD +dc +dc +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +aj +ar +dW +aG +bf +bp +aj +bP +bE +bE +cc +cA +bE +bE +cS +cX +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +Dm +ak +ak +ak +aT +ak +ak +bs +bL +bE +bE +cc +cA +bE +bE +cS +da +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dO +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +aA +aQ +aU +bg +bq +ak +bL +bE +bE +cd +cx +bL +bL +cC +db +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(33,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +at +bh +bh +bh +br +ak +bL +bE +bE +cc +cA +bE +bE +cV +dJ +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(34,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +aI +aI +dV +aI +aI +ak +bT +bE +co +cc +cA +bE +bE +cV +dJ +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dP +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(35,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +dV +dV +dV +dV +dV +by +by +by +by +ce +cG +by +by +by +de +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dQ +cS +ME +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(36,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +dV +aJ +aK +aL +dV +by +bU +cl +cl +cf +cH +cI +cJ +by +dJ +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dR +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(37,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +Dm +ak +dV +aK +dV +bi +dV +by +bV +eo +eo +eo +eo +eo +cK +by +dJ +dJ +dB +dl +dF +dk +dk +dC +dl +dF +dk +dk +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +dV +aL +aK +aJ +dV +by +bW +eo +eo +eo +eo +eo +cL +by +dJ +dJ +dB +dl +dl +dl +dl +dl +dl +dl +dl +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +dV +dV +aY +dV +dV +by +bX +eo +eo +cy +eo +eo +cM +by +dk +Bm +dC +dl +dl +dl +dl +dl +dl +dl +dx +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +ak +ak +ak +ak +ak +by +by +cn +by +oh +by +cn +by +by +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(41,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +oA +af +af +af +af +oA +af +af +af +by +LW +by +af +af +af +oA +af +af +af +af +oA +af +af +af +af +oA +af +af +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(42,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +by +Kd +by +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(43,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(44,1,1) = {" +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 +aa +aa +aa +aa +aa +aa +aa +aa +"} +(45,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 +"} +(46,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 +"} +(47,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 +"} +(48,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 +"} +(49,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 +"} +(50,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 +"} +(51,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 +"} +(52,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 +"} + +(1,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(6,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(7,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(8,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(9,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(10,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(11,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +bY +bY +bY +bY +bY +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(12,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +af +af +af +af +af +af +af +bz +af +af +af +af +af +bz +af +af +af +af +bz +af +af +af +af +bz +af +af +af +af +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(13,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +TY +TY +TY +TY +TY +TY +TY +XN +XN +XN +XN +XN +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(14,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +Dm +TY +XN +XN +eE +XN +dY +dY +WN +dY +dY +dY +dY +dY +WN +dY +es +eI +eI +kg +eI +eI +eI +eI +kg +eI +eI +eM +TY +ME +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(15,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +XN +XN +XN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eu +CK +gW +Qo +XN +XN +XN +XN +eF +eF +eF +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(16,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +XN +XN +dX +dX +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eu +XN +XN +XN +XN +XN +XN +XN +eF +iu +eF +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(17,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +XN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eu +XN +TY +di +XN +XN +XN +XN +eF +iu +eF +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(18,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +dY +dY +dY +eN +dY +dY +dY +dY +dY +eu +XN +XN +dj +XN +XN +XN +XN +eF +eF +eF +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(19,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +ad +TY +eF +ed +ed +eF +TY +TY +TY +eF +TY +TY +mZ +dY +dY +dY +eu +XN +XN +dn +XN +XN +XN +XN +XN +XN +XN +Kw +TY +ME +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(20,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Ob +nx +nx +nx +nx +nx +nx +nx +TY +dY +dY +WN +TY +em +dY +dY +dY +eu +XN +TY +Fd +XN +XN +XN +XN +XN +XN +XN +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(21,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eF +dY +dY +dY +eF +sh +dY +dY +dY +eu +XN +XN +jb +LE +IC +jb +XN +XN +iu +XN +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(22,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eO +dY +dY +dY +dY +sh +dY +dY +dY +eu +XN +XN +XN +Zc +XN +XN +XN +XN +XN +XN +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(23,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eO +dY +dY +dY +dY +sh +dY +dY +dY +eu +XN +XN +XN +XN +XN +XN +XN +XN +av +XN +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(24,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eO +dY +dY +dY +dY +sh +dY +dY +dY +eu +XN +XN +XN +XN +XN +XN +XN +XN +XN +XN +Kw +TY +ME +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(25,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eF +dY +dY +dY +eF +sh +dY +dY +eN +ey +eJ +eJ +eJ +eJ +eJ +eJ +eJ +eJ +eJ +eH +lu +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(26,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +TY +dY +dY +eN +TY +sh +dY +dY +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +TY +TY +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(27,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +ad +TY +eF +eD +eD +eF +TY +TY +TY +eF +TY +TY +sh +dY +dY +WN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +WN +dY +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(28,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +dY +dY +dY +WN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(29,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +TY +ME +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(30,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +eN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +eF +eF +eF +eF +eF +eF +eF +eF +TY +KM +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(31,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(32,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +Dm +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(33,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(34,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +TY +dY +dY +eN +dY +dY +dY +dY +eN +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(35,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +TY +TY +TY +TY +dY +TY +TY +TY +TY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(36,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +sh +iK +mZ +xI +TY +ee +iK +ez +iK +iK +iK +en +TY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(37,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +iK +dY +iK +dY +TY +sh +dY +dY +dY +dY +dY +dY +TY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(38,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +Dm +TY +dY +mZ +iK +sh +dY +TY +sh +dY +dY +dY +dY +dY +dY +TY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(39,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +eN +dY +dY +TY +sh +dY +dY +iK +dY +dY +dY +TY +dY +eN +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(40,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +TY +TY +TY +TY +TY +TY +TY +XN +XN +XN +XN +XN +TY +TY +TY +TY +TY +TY +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(41,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +oA +af +af +af +af +oA +af +af +af +af +af +af +oA +af +af +af +oA +af +oJ +eC +eC +eC +eC +eC +eC +eC +eC +eC +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(42,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +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 +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(43,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(44,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(45,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(46,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(47,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(48,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(49,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(50,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(51,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(52,1,2) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} + +(1,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(6,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(7,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(8,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(9,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(10,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(11,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(12,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +rd +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(13,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(14,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(15,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +jV +td +td +td +td +td +td +jA +jA +ZQ +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(16,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xB +DG +TH +TH +TH +TH +TH +DK +qo +od +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(17,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xB +AG +dq +TH +TH +TH +TH +DK +qo +od +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(18,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xB +TH +dr +TH +TH +TH +TH +DK +DK +od +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(19,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +AG +AG +AG +AG +AG +AG +AG +AG +vt +Um +Um +Um +Um +Um +Um +Um +Um +xB +TH +ds +TH +TH +TH +TH +TH +Pz +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(20,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +AG +Og +TH +TH +TH +TH +TH +TH +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(21,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +Pz +TH +TH +TH +UH +JH +ho +TH +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(22,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +TH +TH +TH +TH +TH +Pu +TH +TH +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(23,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +TH +TH +TH +TH +TH +TH +TH +qo +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(24,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +EH +sE +sE +sE +sE +sE +sE +sE +sE +qR +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(25,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +nz +eV +dS +IN +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(26,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +dG +fo +dS +dS +dS +dS +dS +dS +dS +AG +dS +dS +IN +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(27,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +AG +AG +AG +AG +AG +AG +AG +AG +fa +Qw +Qw +Qw +Qw +Qw +Qw +ej +Qw +Qw +Vn +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(28,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(29,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(30,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(31,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(32,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(33,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(34,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(35,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(36,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(37,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(38,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(39,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(40,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(41,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(42,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(43,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(44,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(45,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(46,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(47,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(48,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(49,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(50,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(51,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(52,1,3) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/multiz_debug.dm b/_maps/multiz_debug.dm new file mode 100644 index 0000000000..0521fef59d --- /dev/null +++ b/_maps/multiz_debug.dm @@ -0,0 +1 @@ +#define FORCE_MAP "_maps/multiz_debug.json" \ No newline at end of file diff --git a/_maps/multiz_debug.json b/_maps/multiz_debug.json new file mode 100644 index 0000000000..7e39981e23 --- /dev/null +++ b/_maps/multiz_debug.json @@ -0,0 +1,6 @@ +{ + "map_name": "MultiZ Debug", + "map_path": "map_files/debug", + "map_file": "multiz.dmm", + "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Down": -1}] + } diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 928837979c..baf29240c3 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -143,7 +143,9 @@ #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 ) ) //LAVALAND #define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland @@ -249,6 +251,13 @@ out_var += cached_gases[total_moles_id];\ } +#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 + //Unomos - So for whatever reason, garbage collection actually drastically decreases the cost of atmos later in the round. Turning this into a define yields massively improved performance. #define GAS_GARBAGE_COLLECT(GASGASGAS)\ var/list/CACHE_GAS = GASGASGAS;\ diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index d8de580609..bf30b547fe 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -78,6 +78,10 @@ #define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" //from base of atom/attack_hand(): (mob/user) #define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" //from base of atom/attack_paw(): (mob/user) #define COMPONENT_NO_ATTACK_HAND 1 //works on all 3. +//This signal return value bitflags can be found in __DEFINES/misc.dm +#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact" //called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels) + + ///////////////// #define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area) @@ -99,6 +103,7 @@ // /turf signals #define COMSIG_TURF_CHANGE "turf_change" //from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps) #define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity" //from base of atom/has_gravity(): (atom/asker, list/forced_gravities) +#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new" //from base of turf/New(): (turf/source, direction) // /atom/movable signals #define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 4a68a8bee1..dc573bc28e 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -9,6 +9,16 @@ //Turfs //#define isturf(A) (istype(A, /turf)) This is actually a byond built-in. Added here for completeness sake. +GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( + /turf/open/space, + /turf/open/chasm, + /turf/open/lava, + /turf/open/water, + /turf/open/openspace + ))) + +#define isgroundlessturf(A) (is_type_in_typecache(A, GLOB.turfs_without_ground)) + #define isopenturf(A) (istype(A, /turf/open)) #define isindestructiblefloor(A) (istype(A, /turf/open/indestructible)) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 5e903997e4..e0a22667ac 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -9,6 +9,7 @@ #define FLOOR_PLANE -2 #define GAME_PLANE -1 #define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals + #define SPACE_LAYER 1.8 //#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define #define MID_TURF_LAYER 2.02 @@ -83,25 +84,28 @@ #define ABOVE_LIGHTING_PLANE 16 #define ABOVE_LIGHTING_LAYER 16 -#define BYOND_LIGHTING_PLANE 17 -#define BYOND_LIGHTING_LAYER 17 +#define FLOOR_OPENSPACE_PLANE 17 +#define OPENSPACE_LAYER 17 -#define CAMERA_STATIC_PLANE 18 -#define CAMERA_STATIC_LAYER 18 +#define BYOND_LIGHTING_PLANE 18 +#define BYOND_LIGHTING_LAYER 18 + +#define CAMERA_STATIC_PLANE 19 +#define CAMERA_STATIC_LAYER 19 //HUD layer defines -#define FULLSCREEN_PLANE 19 -#define FLASH_LAYER 19 -#define FULLSCREEN_LAYER 19.1 -#define UI_DAMAGE_LAYER 19.2 -#define BLIND_LAYER 19.3 -#define CRIT_LAYER 19.4 -#define CURSE_LAYER 19.5 +#define FULLSCREEN_PLANE 20 +#define FLASH_LAYER 20 +#define FULLSCREEN_LAYER 20.1 +#define UI_DAMAGE_LAYER 20.2 +#define BLIND_LAYER 20.3 +#define CRIT_LAYER 20.4 +#define CURSE_LAYER 20.5 -#define HUD_PLANE 20 -#define HUD_LAYER 20 -#define ABOVE_HUD_PLANE 21 -#define ABOVE_HUD_LAYER 21 +#define HUD_PLANE 21 +#define HUD_LAYER 21 +#define ABOVE_HUD_PLANE 22 +#define ABOVE_HUD_LAYER 22 -#define SPLASHSCREEN_LAYER 22 -#define SPLASHSCREEN_PLANE 22 +#define SPLASHSCREEN_LAYER 23 +#define SPLASHSCREEN_PLANE 23 diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 1c8edd52ab..1b42217fe1 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -37,6 +37,7 @@ require only minor tweaks. #define ZTRAIT_AWAY "Away Mission" #define ZTRAIT_SPACE_RUINS "Space Ruins" #define ZTRAIT_LAVA_RUINS "Lava Ruins" +#define ZTRAIT_ISOLATED_RUINS "Isolated Ruins" //Placing ruins on z levels with this trait will use turf reservation instead of usual placement. // prevents certain turfs from being stripped by a singularity #define ZTRAIT_PLANET "Planet" @@ -89,10 +90,10 @@ require only minor tweaks. #define PLACEMENT_TRIES 100 //How many times we try to fit the ruin somewhere until giving up (really should just swap to some packing algo) #define PLACE_DEFAULT "random" -#define PLACE_SAME_Z "same" -#define PLACE_SPACE_RUIN "space" -#define PLACE_LAVA_RUIN "lavaland" - - +#define PLACE_SAME_Z "same" //On same z level as original ruin +#define PLACE_SPACE_RUIN "space" //On space ruin z level(s) +#define PLACE_LAVA_RUIN "lavaland" //On lavaland ruin z levels(s) +#define PLACE_BELOW "below" //On z levl below - centered on same tile +#define PLACE_ISOLATED "isolated" //On isolated ruin z level //Map type stuff. -#define MAP_TYPE_STATION "station" +#define MAP_TYPE_STATION "station" \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index bd322c9b2d..b0dc536106 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -514,6 +514,11 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S #define VOMIT_TOXIC 1 #define VOMIT_PURPLE 2 +// possible bitflag return values of intercept_zImpact(atom/movable/AM, levels = 1) calls +#define FALL_INTERCEPTED (1<<0) //Stops the movable from falling further and crashing on the ground +#define FALL_NO_MESSAGE (1<<1) //Used to suppress the "[A] falls through [old_turf]" messages where it'd make little sense at all, like going downstairs. +#define FALL_STOP_INTERCEPTING (1<<2) //Used in situations where halting the whole "intercept" loop would be better, like supermatter dusting (and thus deleting) the atom. + //Misc text define. Does 4 spaces. Used as a makeshift tabulator. #define FOURSPACES "    " diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 1885dd2621..d3e724aefb 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -11,6 +11,7 @@ #define USES_TGUI (1<<7) //put on things that use tgui on ui_interact instead of custom/old UI. #define FROZEN (1<<8) #define SHOVABLE_ONTO (1<<9) //called on turf.shove_act() to consider whether an object should have a niche effect (defined in their own shove_act()) when someone is pushed onto it, or do a sanity CanPass() check. +#define BLOCK_Z_FALL (1<<10) // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 5e6b63f5b6..c194e578c9 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -26,10 +26,6 @@ #define TIMER_ID_NULL -1 -//For servers that can't do with any additional lag, set this to none in flightpacks.dm in subsystem/processing. -#define FLIGHTSUIT_PROCESSING_NONE 0 -#define FLIGHTSUIT_PROCESSING_FULL 1 - #define INITIALIZATION_INSSATOMS 0 //New should not call Initialize #define INITIALIZATION_INNEW_MAPLOAD 2 //New should call Initialize(TRUE) #define INITIALIZATION_INNEW_REGULAR 1 //New should call Initialize(FALSE) @@ -112,10 +108,10 @@ #define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_PARALLAX 65 #define FIRE_PRIORITY_NPC 80 -#define FIRE_PRIORITY_FLIGHTPACKS 80 #define FIRE_PRIORITY_MOBS 100 #define FIRE_PRIORITY_TGUI 110 #define FIRE_PRIORITY_TICKER 200 +#define FIRE_PRIORITY_ATMOS_ADJACENCY 300 #define FIRE_PRIORITY_CHAT 400 #define FIRE_PRIORITY_OVERLAYS 500 #define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost. diff --git a/code/__DEFINES/turf_flags.dm b/code/__DEFINES/turf_flags.dm index 5ceb6f2e2e..8604a92c01 100644 --- a/code/__DEFINES/turf_flags.dm +++ b/code/__DEFINES/turf_flags.dm @@ -3,3 +3,4 @@ #define CHANGETURF_FORCEOP 4 #define CHANGETURF_SKIP 8 // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE #define CHANGETURF_INHERIT_AIR 16 // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR +#define CHANGETURF_RECALC_ADJACENT 32 //Immediately recalc adjacent atmos turfs instead of queuing. \ No newline at end of file diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index 0cb61949a0..f0479cd8aa 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -1,6 +1,16 @@ GLOBAL_LIST_INIT(cardinals, list(NORTH, SOUTH, EAST, WEST)) -GLOBAL_LIST_INIT(alldirs, list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) +GLOBAL_LIST_INIT(cardinals_multiz, list(NORTH, SOUTH, EAST, WEST, UP, DOWN)) GLOBAL_LIST_INIT(diagonals, list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) +GLOBAL_LIST_INIT(corners_multiz, list(UP|NORTHEAST, UP|NORTHWEST, UP|SOUTHEAST, UP|SOUTHWEST, DOWN|NORTHEAST, DOWN|NORTHWEST, DOWN|SOUTHEAST, DOWN|SOUTHWEST)) +GLOBAL_LIST_INIT(diagonals_multiz, list( + NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, + UP|NORTH, UP|SOUTH, UP|EAST, UP|WEST, UP|NORTHEAST, UP|NORTHWEST, UP|SOUTHEAST, UP|SOUTHWEST, + DOWN|NORTH, DOWN|SOUTH, DOWN|EAST, DOWN|WEST, DOWN|NORTHEAST, DOWN|NORTHWEST, DOWN|SOUTHEAST, DOWN|SOUTHWEST)) +GLOBAL_LIST_INIT(alldirs_multiz, list( + NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, + UP, UP|NORTH, UP|SOUTH, UP|EAST, UP|WEST, UP|NORTHEAST, UP|NORTHWEST, UP|SOUTHEAST, UP|SOUTHWEST, + DOWN, DOWN|NORTH, DOWN|SOUTH, DOWN|EAST, DOWN|WEST, DOWN|NORTHEAST, DOWN|NORTHWEST, DOWN|SOUTHEAST, DOWN|SOUTHWEST)) +GLOBAL_LIST_INIT(alldirs, list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) GLOBAL_LIST_EMPTY(landmarks_list) //list of all landmarks created GLOBAL_LIST_EMPTY(start_landmarks_list) //list of all spawn points created diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index 8ee837a202..b2bc05924c 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -16,6 +16,28 @@ //Trust me, you need one. Period. If you don't think you do, you're doing something extremely wrong. /obj/screen/plane_master/proc/backdrop(mob/mymob) +/obj/screen/plane_master/openspace + name = "open space plane master" + plane = FLOOR_OPENSPACE_PLANE + appearance_flags = PLANE_MASTER + blend_mode = BLEND_MULTIPLY + alpha = 255 + +/obj/screen/plane_master/openspace/backdrop(mob/mymob) + filters = list() + filters += filter(type = "drop_shadow", color = "#04080FAA", size = -10) + filters += filter(type = "drop_shadow", color = "#04080FAA", size = -15) + filters += filter(type = "drop_shadow", color = "#04080FAA", size = -20) + +/obj/screen/plane_master/proc/outline(_size, _color) + filters += filter(type = "outline", size = _size, color = _color) + +/obj/screen/plane_master/proc/shadow(_size, _offset = 0, _x = 0, _y = 0, _color = "#04080FAA") + filters += filter(type = "drop_shadow", x = _x, y = _y, color = _color, size = _size, offset = _offset) + +/obj/screen/plane_master/proc/clear_filters() + filters = list() + /obj/screen/plane_master/floor name = "floor plane master" plane = FLOOR_PLANE diff --git a/code/controllers/subsystem/adjacent_air.dm b/code/controllers/subsystem/adjacent_air.dm new file mode 100644 index 0000000000..8395eda708 --- /dev/null +++ b/code/controllers/subsystem/adjacent_air.dm @@ -0,0 +1,35 @@ +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() + +/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 ..() + +/datum/controller/subsystem/adjacent_air/fire(resumed = FALSE, mc_check = TRUE) + + 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 \ No newline at end of file diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index dec6cf8466..ceb2fae998 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -14,6 +14,7 @@ SUBSYSTEM_DEF(mapping) var/list/ruins_templates = list() var/list/space_ruins_templates = list() var/list/lava_ruins_templates = list() + var/datum/space_level/isolated_ruins_z //Created on demand during ruin loading. var/list/shuttle_templates = list() var/list/shelter_templates = list() @@ -25,6 +26,7 @@ SUBSYSTEM_DEF(mapping) var/list/datum/turf_reservations //list of turf reservations var/list/used_turfs = list() //list of turf = datum/turf_reservation + var/list/reservation_ready = list() var/clearing_reserved_turfs = FALSE // Z-manager stuff @@ -95,7 +97,7 @@ SUBSYSTEM_DEF(mapping) // Set up Z-level transitions. setup_map_transitions() generate_station_area_list() - initialize_reserved_level() + initialize_reserved_level(transit.z_value) return ..() /* Nuke threats, for making the blue tiles on the station go RED @@ -442,7 +444,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) GLOB.the_gateway.wait = world.time /datum/controller/subsystem/mapping/proc/RequestBlockReservation(width, height, z, type = /datum/turf_reservation, turf_type_override, border_type_override) - UNTIL(initialized && !clearing_reserved_turfs) + UNTIL(reservation_ready["[z]"] && !clearing_reserved_turfs) var/datum/turf_reservation/reserve = new type if(turf_type_override) reserve.turf_type = turf_type_override @@ -454,8 +456,9 @@ GLOBAL_LIST_EMPTY(the_station_areas) return reserve //If we didn't return at this point, theres a good chance we ran out of room on the exisiting reserved z levels, so lets try a new one num_of_res_levels += 1 - var/newReserved = add_new_zlevel("Transit/Reserved [num_of_res_levels]", list(ZTRAIT_RESERVED = TRUE)) - if(reserve.Reserve(width, height, newReserved)) + var/datum/space_level/newReserved = add_new_zlevel("Transit/Reserved [num_of_res_levels]", list(ZTRAIT_RESERVED = TRUE)) + initialize_reserved_level(newReserved.z_value) + if(reserve.Reserve(width, height, newReserved.z_value)) return reserve else if(!level_trait(z, ZTRAIT_RESERVED)) @@ -467,19 +470,22 @@ GLOBAL_LIST_EMPTY(the_station_areas) QDEL_NULL(reserve) //This is not for wiping reserved levels, use wipe_reservations() for that. -/datum/controller/subsystem/mapping/proc/initialize_reserved_level() +/datum/controller/subsystem/mapping/proc/initialize_reserved_level(z) UNTIL(!clearing_reserved_turfs) //regardless, lets add a check just in case. clearing_reserved_turfs = TRUE //This operation will likely clear any existing reservations, so lets make sure nothing tries to make one while we're doing it. - for(var/i in levels_by_trait(ZTRAIT_RESERVED)) - var/turf/A = get_turf(locate(SHUTTLE_TRANSIT_BORDER,SHUTTLE_TRANSIT_BORDER,i)) - var/turf/B = get_turf(locate(world.maxx - SHUTTLE_TRANSIT_BORDER,world.maxy - SHUTTLE_TRANSIT_BORDER,i)) - var/block = block(A, B) - for(var/t in block) - // No need to empty() these, because it's world init and they're - // already /turf/open/space/basic. - var/turf/T = t - T.flags_1 |= UNUSED_RESERVATION_TURF_1 - unused_turfs["[i]"] = block + if(!level_trait(z,ZTRAIT_RESERVED)) + clearing_reserved_turfs = FALSE + CRASH("Invalid z level prepared for reservations.") + var/turf/A = get_turf(locate(SHUTTLE_TRANSIT_BORDER,SHUTTLE_TRANSIT_BORDER,z)) + var/turf/B = get_turf(locate(world.maxx - SHUTTLE_TRANSIT_BORDER,world.maxy - SHUTTLE_TRANSIT_BORDER,z)) + var/block = block(A, B) + for(var/t in block) + // No need to empty() these, because it's world init and they're + // already /turf/open/space/basic. + var/turf/T = t + T.flags_1 |= UNUSED_RESERVATION_TURF_1 + unused_turfs["[z]"] = block + reservation_ready["[z]"] = TRUE clearing_reserved_turfs = FALSE /datum/controller/subsystem/mapping/proc/reserve_turfs(list/turfs) @@ -513,3 +519,9 @@ GLOBAL_LIST_EMPTY(the_station_areas) for(var/B in areas) var/area/A = B A.reg_in_areas_in_z() + +/datum/controller/subsystem/mapping/proc/get_isolated_ruin_z() + if(!isolated_ruins_z) + isolated_ruins_z = add_new_zlevel("Isolated Ruins/Reserved", list(ZTRAIT_RESERVED = TRUE, ZTRAIT_ISOLATED_RUINS = TRUE)) + initialize_reserved_level(isolated_ruins_z.z_value) + return isolated_ruins_z.z_value \ No newline at end of file diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 4b91944ec8..48da15f67e 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -147,6 +147,11 @@ SUBSYSTEM_DEF(throwing) if (callback) callback.Invoke() + if(!thrownthing.zfalling) // I don't think you can zfall while thrown but hey, just in case. + var/turf/T = get_turf(thrownthing) + if(T && thrownthing.has_gravity(T)) + T.zFall(thrownthing) + qdel(src) /datum/thrownthing/proc/hit_atom(atom/A) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 64ff2437d3..e8651ba93d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -186,6 +186,10 @@ else M.forceMove(src) +//common name +/atom/proc/update_multiz(prune_on_fail = FALSE) + return FALSE + /atom/proc/assume_air(datum/gas_mixture/giver) qdel(giver) return null @@ -832,4 +836,7 @@ Proc for attack log creation, because really why not if(filter_data && filter_data[name]) filter_data -= name update_filters() - return TRUE \ No newline at end of file + return TRUE + +/atom/proc/intercept_zImpact(atom/movable/AM, levels = 1) + . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels) \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0957db5fcb..ef20b6e35e 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -34,6 +34,51 @@ var/datum/component/orbiter/orbiting var/can_be_z_moved = TRUE + var/zfalling = FALSE + +/atom/movable/proc/can_zFall(turf/source, levels = 1, turf/target, direction) + if(!direction) + direction = DOWN + if(!source) + source = get_turf(src) + if(!source) + return FALSE + if(!target) + target = get_step_multiz(source, direction) + if(!target) + return FALSE + return !(movement_type & FLYING) && has_gravity(source) && !throwing + +/atom/movable/proc/onZImpact(turf/T, levels) + var/atom/highest = T + for(var/i in T.contents) + var/atom/A = i + if(!A.density) + continue + if(isobj(A) || ismob(A)) + if(A.layer > highest.layer) + highest = A + INVOKE_ASYNC(src, .proc/SpinAnimation, 5, 2) + throw_impact(highest) + return TRUE + +//For physical constraints to travelling up/down. +/atom/movable/proc/can_zTravel(turf/destination, direction) + var/turf/T = get_turf(src) + if(!T) + return FALSE + if(!direction) + if(!destination) + return FALSE + direction = get_dir(T, destination) + if(direction != UP && direction != DOWN) + return FALSE + if(!destination) + destination = get_step_multiz(src, direction) + if(!destination) + return FALSE + return T.zPassOut(src, direction, destination) && destination.zPassIn(src, direction, T) + /atom/movable/vv_edit_var(var_name, var_value) var/static/list/banned_edits = list("step_x", "step_y", "step_size") var/static/list/careful_edits = list("bound_x", "bound_y", "bound_width", "bound_height") diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index b6a3c7cfef..2fa7277d8b 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -15,7 +15,7 @@ qdel(src) /obj/effect/decal/proc/NeverShouldHaveComeHere(turf/T) - return isspaceturf(T) || isclosedturf(T) || islava(T) || istype(T, /turf/open/water) || ischasm(T) + return isclosedturf(T) || isgroundlessturf(T) /obj/effect/decal/ex_act(severity, target) qdel(src) diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 410923fe25..d48013d472 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -57,6 +57,9 @@ /obj/effect/abstract/singularity_act() return +/obj/effect/abstract/has_gravity(turf/T) + return FALSE + /obj/effect/dummy/singularity_pull() return diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index d6f304653d..a6ba6424b1 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -100,6 +100,7 @@ number_of_rods = 2 smooth = SMOOTH_TRUE canSmoothWith = null + obj_flags = CAN_BE_HIT | BLOCK_Z_FALL /obj/structure/lattice/catwalk/deconstruction_hints(mob/user) to_chat(user, "The supporting rods look like they could be cut.") diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm new file mode 100644 index 0000000000..bd657fe1e8 --- /dev/null +++ b/code/game/objects/structures/stairs.dm @@ -0,0 +1,130 @@ +#define STAIR_TERMINATOR_AUTOMATIC 0 +#define STAIR_TERMINATOR_NO 1 +#define STAIR_TERMINATOR_YES 2 + +// dir determines the direction of travel to go upwards (due to lack of sprites, currently only 1 and 2 make sense) +// stairs require /turf/open/openspace as the tile above them to work +// multiple stair objects can be chained together; the Z level transition will happen on the final stair object in the chain + +/obj/structure/stairs + name = "stairs" + icon = 'icons/obj/stairs.dmi' + icon_state = "stairs" + anchored = TRUE + + var/force_open_above = FALSE // replaces the turf above this stair obj with /turf/open/openspace + var/terminator_mode = STAIR_TERMINATOR_AUTOMATIC + var/turf/listeningTo + +/obj/structure/stairs/Initialize(mapload) + if(force_open_above) + force_open_above() + build_signal_listener() + update_surrounding() + return ..() + +/obj/structure/stairs/Destroy() + listeningTo = null + return ..() + +/obj/structure/stairs/Move() //Look this should never happen but... + . = ..() + if(force_open_above) + build_signal_listener() + update_surrounding() + +/obj/structure/stairs/proc/update_surrounding() + update_icon() + for(var/i in GLOB.cardinals) + var/turf/T = get_step(get_turf(src), i) + var/obj/structure/stairs/S = locate() in T + if(S) + S.update_icon() + +/obj/structure/stairs/Uncross(atom/movable/AM, turf/newloc) + if(!newloc || !AM) + return ..() + if(!isobserver(AM) && isTerminator() && (get_dir(src, newloc) == dir)) + stair_ascend(AM) + return FALSE + return ..() + +/obj/structure/stairs/Cross(atom/movable/AM) + if(isTerminator() && (get_dir(src, AM) == dir)) + return FALSE + return ..() + +/obj/structure/stairs/update_icon() + if(isTerminator()) + icon_state = "stairs_t" + else + icon_state = "stairs" + +/obj/structure/stairs/proc/stair_ascend(atom/movable/AM) + var/turf/checking = get_step_multiz(get_turf(src), UP) + if(!istype(checking)) + return + if(!checking.zPassIn(AM, UP, get_turf(src))) + return + var/turf/target = get_step_multiz(get_turf(src), (dir|UP)) + if(istype(target) && !target.can_zFall(AM, null, get_step_multiz(target, DOWN))) //Don't throw them into a tile that will just dump them back down. + if(isliving(AM)) + var/mob/living/L = AM + var/pulling = L.pulling + if(pulling) + L.pulling.forceMove(target) + L.forceMove(target) + L.start_pulling(pulling) + else + AM.forceMove(target) + +/obj/structure/stairs/vv_edit_var(var_name, var_value) + . = ..() + if(!.) + return + if(var_name != NAMEOF(src, force_open_above)) + return + if(!var_value) + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_TURF_MULTIZ_NEW) + listeningTo = null + else + build_signal_listener() + force_open_above() + +/obj/structure/stairs/proc/build_signal_listener() + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_TURF_MULTIZ_NEW) + var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) + RegisterSignal(T, COMSIG_TURF_MULTIZ_NEW, .proc/on_multiz_new) + listeningTo = T + +/obj/structure/stairs/proc/force_open_above() + var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) + if(T && !istype(T)) + T.ChangeTurf(/turf/open/openspace) + +/obj/structure/stairs/proc/on_multiz_new(turf/source, dir) + if(dir == UP) + var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) + if(T && !istype(T)) + T.ChangeTurf(/turf/open/openspace) + +/obj/structure/stairs/intercept_zImpact(atom/movable/AM, levels = 1) + . = ..() + if(isTerminator()) + . |= FALL_INTERCEPTED | FALL_NO_MESSAGE + +/obj/structure/stairs/proc/isTerminator() //If this is the last stair in a chain and should move mobs up + if(terminator_mode != STAIR_TERMINATOR_AUTOMATIC) + return (terminator_mode == STAIR_TERMINATOR_YES) + var/turf/T = get_turf(src) + if(!T) + return FALSE + var/turf/them = get_step(T, dir) + if(!them) + return FALSE + for(var/obj/structure/stairs/S in them) + if(S.dir == dir) + return FALSE + return TRUE diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index f1c5080c8f..6a055bbd35 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -15,7 +15,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(turf_type) var/turf/newT = ChangeTurf(turf_type, baseturf_type, flags) SSair.remove_from_active(newT) - newT.CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(newT) SSair.add_to_active(newT,1) /turf/proc/copyTurf(turf/T) @@ -140,6 +140,8 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( newTurf.air = stashed_air SSair.add_to_active(newTurf) else + if(ispath(path,/turf/closed)) + flags |= CHANGETURF_RECALC_ADJACENT return ..() // Take off the top layer turf and replace it with the next baseturf down @@ -263,7 +265,10 @@ 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() levelupdate() - CalculateAdjacentTurfs() + if(flags & CHANGETURF_RECALC_ADJACENT) + ImmediateCalculateAdjacentTurfs() + else + CALCULATE_ADJACENT_TURFS(src) //update firedoor adjacency var/list/turfs_to_check = get_adjacent_open_turfs(src) | src diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 96c43c4106..efee9cfa5a 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -16,6 +16,22 @@ if(wet) AddComponent(/datum/component/wet_floor, wet, INFINITY, 0, INFINITY, TRUE) +//direction is direction of travel of A +/turf/open/zPassIn(atom/movable/A, direction, turf/source) + return (direction == DOWN) + +//direction is direction of travel of A +/turf/open/zPassOut(atom/movable/A, direction, turf/destination) + return (direction == UP) + +//direction is direction of travel of air +/turf/open/zAirIn(direction, turf/source) + return (direction == DOWN) + +//direction is direction of travel of air +/turf/open/zAirOut(direction, turf/source) + return (direction == UP) + /turf/open/MouseDrop_T(atom/dropping, mob/user) . = ..() if(dropping == user && isliving(user)) @@ -184,43 +200,14 @@ update_visuals() current_cycle = times_fired - - //cache some vars - var/list/atmos_adjacent_turfs = src.atmos_adjacent_turfs - - for(var/direction in GLOB.cardinals) - var/turf/open/enemy_tile = get_step(src, direction) - if(!istype(enemy_tile)) - if (atmos_adjacent_turfs) - atmos_adjacent_turfs -= enemy_tile - continue + ImmediateCalculateAdjacentTurfs() + for(var/i in atmos_adjacent_turfs) + var/turf/open/enemy_tile = i var/datum/gas_mixture/enemy_air = enemy_tile.return_air() - - //only check this turf, if it didn't check us when it was initalized - if(enemy_tile.current_cycle < times_fired) - if(CANATMOSPASS(src, enemy_tile)) - LAZYINITLIST(atmos_adjacent_turfs) - LAZYINITLIST(enemy_tile.atmos_adjacent_turfs) - atmos_adjacent_turfs[enemy_tile] = TRUE - enemy_tile.atmos_adjacent_turfs[src] = TRUE - else - if (atmos_adjacent_turfs) - atmos_adjacent_turfs -= enemy_tile - if (enemy_tile.atmos_adjacent_turfs) - enemy_tile.atmos_adjacent_turfs -= src - UNSETEMPTY(enemy_tile.atmos_adjacent_turfs) - continue - else - if (!atmos_adjacent_turfs || !atmos_adjacent_turfs[enemy_tile]) - continue - if(!excited && air.compare(enemy_air)) //testing("Active turf found. Return value of compare(): [is_active]") excited = TRUE SSair.active_turfs |= src - UNSETEMPTY(atmos_adjacent_turfs) - if (atmos_adjacent_turfs) - src.atmos_adjacent_turfs = atmos_adjacent_turfs /turf/open/proc/GetHeatCapacity() . = air.heat_capacity() diff --git a/code/game/turfs/openspace/openspace.dm b/code/game/turfs/openspace/openspace.dm new file mode 100644 index 0000000000..e68aabcd08 --- /dev/null +++ b/code/game/turfs/openspace/openspace.dm @@ -0,0 +1,134 @@ +/turf/open/openspace + name = "open space" + desc = "Watch your step!" + icon_state = "grey" + baseturfs = /turf/open/openspace + CanAtmosPassVertical = ATMOS_PASS_YES + //mouse_opacity = MOUSE_OPACITY_TRANSPARENT + var/can_cover_up = TRUE + var/can_build_on = TRUE + +/turf/open/openspace/debug/update_multiz() + ..() + return TRUE + +/turf/open/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker + . = ..() + plane = FLOOR_OPENSPACE_PLANE + layer = OPENSPACE_LAYER + return INITIALIZE_HINT_LATELOAD + +/turf/open/openspace/LateInitialize() + update_multiz(TRUE, TRUE) + +/turf/open/openspace/Destroy() + vis_contents.len = 0 + return ..() + +/turf/open/openspace/update_multiz(prune_on_fail = FALSE, init = FALSE) + . = ..() + var/turf/T = below() + if(!T) + vis_contents.len = 0 + if(prune_on_fail) + ChangeTurf(/turf/open/floor/plating) + return FALSE + if(init) + vis_contents += T + return TRUE + +/turf/open/openspace/multiz_turf_del(turf/T, dir) + if(dir != DOWN) + return + update_multiz() + +/turf/open/openspace/multiz_turf_new(turf/T, dir) + if(dir != DOWN) + return + update_multiz() + +/turf/open/openspace/zAirIn() + return TRUE + +/turf/open/openspace/zAirOut() + return TRUE + +/turf/open/openspace/zPassIn(atom/movable/A, direction, turf/source) + return TRUE + +/turf/open/openspace/zPassOut(atom/movable/A, direction, turf/destination) + if(A.anchored) + return FALSE + for(var/obj/O in contents) + if(O.obj_flags & BLOCK_Z_FALL) + return FALSE + return TRUE + +/turf/open/openspace/proc/CanCoverUp() + return can_cover_up + +/turf/open/openspace/proc/CanBuildHere() + return can_build_on + +/turf/open/openspace/attackby(obj/item/C, mob/user, params) + ..() + if(!CanBuildHere()) + return + if(istype(C, /obj/item/stack/rods)) + var/obj/item/stack/rods/R = C + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + var/obj/structure/lattice/catwalk/W = locate(/obj/structure/lattice/catwalk, src) + if(W) + to_chat(user, "There is already a catwalk here!") + return + if(L) + if(R.use(1)) + to_chat(user, "You construct a catwalk.") + playsound(src, 'sound/weapons/genhit.ogg', 50, 1) + new/obj/structure/lattice/catwalk(src) + else + to_chat(user, "You need two rods to build a catwalk!") + return + if(R.use(1)) + to_chat(user, "You construct a lattice.") + playsound(src, 'sound/weapons/genhit.ogg', 50, 1) + ReplaceWithLattice() + else + to_chat(user, "You need one rod to build a lattice.") + return + if(istype(C, /obj/item/stack/tile/plasteel)) + if(!CanCoverUp()) + return + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + var/obj/item/stack/tile/plasteel/S = C + if(S.use(1)) + qdel(L) + playsound(src, 'sound/weapons/genhit.ogg', 50, 1) + to_chat(user, "You build a floor.") + PlaceOnTop(/turf/open/floor/plating) + else + to_chat(user, "You need one floor tile to build a floor!") + else + to_chat(user, "The plating is going to need some support! Place metal rods first.") + +/turf/open/openspace/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + if(!CanBuildHere()) + return FALSE + + switch(the_rcd.mode) + if(RCD_FLOORWALL) + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 1) + else + return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) + return FALSE + +/turf/open/openspace/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_FLOORWALL) + to_chat(user, "You build a floor.") + PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + return TRUE + return FALSE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index ebf6f6626c..d618e457b0 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -39,7 +39,7 @@ return FALSE . = ..() -/turf/Initialize() +/turf/Initialize(mapload) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 @@ -62,12 +62,21 @@ add_overlay(/obj/effect/fullbright) if(requires_activation) - CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(src) SSair.add_to_active(src) if (light_power && light_range) update_light() + var/turf/T = SSmapping.get_turf_above(src) + if(T) + T.multiz_turf_new(src, DOWN) + SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, DOWN) + T = SSmapping.get_turf_below(src) + if(T) + T.multiz_turf_new(src, UP) + SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, UP) + if (opacity) has_opaque_atom = TRUE @@ -76,13 +85,19 @@ return INITIALIZE_HINT_NORMAL /turf/proc/Initalize_Atmos(times_fired) - CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(src) /turf/Destroy(force) . = QDEL_HINT_IWILLGC if(!changing_turf) stack_trace("Incorrect turf deletion") changing_turf = FALSE + var/turf/T = SSmapping.get_turf_above(src) + if(T) + T.multiz_turf_del(src, DOWN) + T = SSmapping.get_turf_below(src) + if(T) + T.multiz_turf_del(src, UP) if(force) ..() //this will completely wipe turf state @@ -105,6 +120,60 @@ return user.Move_Pulled(src) +/turf/proc/multiz_turf_del(turf/T, dir) + +/turf/proc/multiz_turf_new(turf/T, dir) + +//zPassIn doesn't necessarily pass an atom! +//direction is direction of travel of air +/turf/proc/zPassIn(atom/movable/A, direction, turf/source) + return FALSE + +//direction is direction of travel of air +/turf/proc/zPassOut(atom/movable/A, direction, turf/destination) + return FALSE + +//direction is direction of travel of air +/turf/proc/zAirIn(direction, turf/source) + return FALSE + +//direction is direction of travel of air +/turf/proc/zAirOut(direction, turf/source) + return FALSE + +/turf/proc/zImpact(atom/movable/A, levels = 1, turf/prev_turf) + var/flags = NONE + var/mov_name = A.name + for(var/i in contents) + var/atom/thing = i + flags |= thing.intercept_zImpact(A, levels) + if(flags & FALL_STOP_INTERCEPTING) + break + if(prev_turf && !(flags & FALL_NO_MESSAGE)) + prev_turf.visible_message("[mov_name] falls through [prev_turf]!") + if(flags & FALL_INTERCEPTED) + return + if(zFall(A, ++levels)) + return FALSE + A.visible_message("[A] crashes into [src]!") + A.onZImpact(src, levels) + return TRUE + +/turf/proc/can_zFall(atom/movable/A, levels = 1, turf/target) + return zPassOut(A, DOWN, target) && target.zPassIn(A, DOWN, src) + +/turf/proc/zFall(atom/movable/A, levels = 1, force = FALSE) + var/turf/target = get_step_multiz(src, DOWN) + if(!target || (!isobj(A) && !ismob(A))) + return FALSE + if(!force && (!can_zFall(A, levels, target) || !A.can_zFall(src, levels, target, DOWN))) + return FALSE + A.zfalling = TRUE + A.forceMove(target) + A.zfalling = FALSE + target.zImpact(A, levels, src) + return TRUE + /turf/proc/handleRCL(obj/item/twohanded/rcl/C, mob/user) if(C.loaded) for(var/obj/structure/cable/LC in src) @@ -196,6 +265,9 @@ if(O.obj_flags & FROZEN) O.make_unfrozen() + if(!AM.zfalling) + zFall(AM) + /turf/proc/is_plasteel_floor() return FALSE diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index a051b45fb6..760e4e22da 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -1,4 +1,6 @@ /atom/var/CanAtmosPass = ATMOS_PASS_YES +/atom/var/CanAtmosPassVertical = ATMOS_PASS_YES + /atom/proc/CanAtmosPass(turf/T) switch (CanAtmosPass) if (ATMOS_PASS_PROC) @@ -8,42 +10,47 @@ else return CanAtmosPass -/turf/closed/CanAtmosPass = ATMOS_PASS_NO +/turf/CanAtmosPass = ATMOS_PASS_NO +/turf/CanAtmosPassVertical = ATMOS_PASS_NO /turf/open/CanAtmosPass = ATMOS_PASS_PROC -/turf/open/CanAtmosPass(turf/T) - var/R - if(blocks_air || T.blocks_air) - R = 1 +/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 = dir_inverse_multiz(dir) + var/R = FALSE + if(vertical && !(zAirOut(dir, T) && T.zAirIn(dir, src))) + R = TRUE + if(blocks_air || T.blocks_air) + R = TRUE + if (T == src) + return !R for(var/obj/O in contents+T.contents) var/turf/other = (O.loc == src ? T : src) - if(!CANATMOSPASS(O, other)) - R = 1 + if(!(vertical? (CANVERTICALATMOSPASS(O, other)) : (CANATMOSPASS(O, other)))) + R = TRUE if(O.BlockSuperconductivity()) //the direction and open/closed are already checked on CanAtmosPass() so there are no arguments - var/D = get_dir(src, T) - atmos_supeconductivity |= D - D = get_dir(T, src) - T.atmos_supeconductivity |= D - return 0 //no need to keep going, we got all we asked + atmos_supeconductivity |= dir + T.atmos_supeconductivity |= opp + return FALSE //no need to keep going, we got all we asked - atmos_supeconductivity &= ~get_dir(src, T) - T.atmos_supeconductivity &= ~get_dir(T, src) + atmos_supeconductivity &= ~dir + T.atmos_supeconductivity &= ~opp return !R - - /atom/movable/proc/BlockSuperconductivity() // objects that block air and don't let superconductivity act. Only firelocks atm. - return 0 + return FALSE -/turf/proc/CalculateAdjacentTurfs() - var/list/atmos_adjacent_turfs = src.atmos_adjacent_turfs - for(var/direction in GLOB.cardinals) - var/turf/T = get_step(src, direction) - if(!T) +/turf/proc/ImmediateCalculateAdjacentTurfs() + var/canpass = CANATMOSPASS(src, src) + var/canvpass = CANVERTICALATMOSPASS(src, src) + for(var/direction in GLOB.cardinals_multiz) + var/turf/T = get_step_multiz(src, direction) + if(!isopenturf(T)) continue - if( !(blocks_air || T.blocks_air) && CANATMOSPASS(T, src) ) + if(!(blocks_air || T.blocks_air) && ((direction & (UP|DOWN))? (canvpass && CANVERTICALATMOSPASS(T, src)) : (canpass && CANATMOSPASS(T, src))) ) LAZYINITLIST(atmos_adjacent_turfs) LAZYINITLIST(T.atmos_adjacent_turfs) atmos_adjacent_turfs[T] = TRUE @@ -72,11 +79,13 @@ var/turf/curloc = src - for (var/direction in GLOB.diagonals) + for (var/direction in GLOB.diagonals_multiz) var/matchingDirections = 0 - var/turf/S = get_step(curloc, direction) + var/turf/S = get_step_multiz(curloc, direction) + if(!S) + continue - for (var/checkDirection in GLOB.cardinals) + for (var/checkDirection in GLOB.cardinals_multiz) var/turf/checkTurf = get_step(S, checkDirection) if(!S.atmos_adjacent_turfs || !S.atmos_adjacent_turfs[checkTurf]) continue @@ -98,7 +107,7 @@ /turf/air_update_turf(command = 0) if(command) - CalculateAdjacentTurfs() + ImmediateCalculateAdjacentTurfs() SSair.add_to_active(src,command) /atom/movable/proc/move_update_air(turf/T) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index ea555c9489..9dba780b3f 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -42,8 +42,7 @@ /turf/open/Destroy() if(active_hotspot) - qdel(active_hotspot) - active_hotspot = null + QDEL_NULL(active_hotspot) // Adds the adjacent turfs to the current atmos processing for(var/T in atmos_adjacent_turfs) SSair.add_to_active(T) diff --git a/code/modules/atmospherics/multiz.dm b/code/modules/atmospherics/multiz.dm new file mode 100644 index 0000000000..2b3a9af1c7 --- /dev/null +++ b/code/modules/atmospherics/multiz.dm @@ -0,0 +1,29 @@ +obj/machinery/atmospherics/pipe/simple/multiz ///This is an atmospherics pipe which can relay air up a deck (Z+1). It currently only supports being on pipe layer 1 + name = "multi deck pipe adapter" + desc = "An adapter which allows pipes to connect to other pipenets on different decks." + icon_state = "multiz_pipe" + icon = 'icons/obj/atmos.dmi' + +/obj/machinery/atmospherics/pipe/simple/multiz/update_icon() + . = ..() + cut_overlays() //This adds the overlay showing it's a multiz pipe. This should go above turfs and such + var/image/multiz_overlay_node = new(src) //If we have a firing state, light em up! + multiz_overlay_node.icon = 'icons/obj/atmos.dmi' + multiz_overlay_node.icon_state = "multiz_pipe" + multiz_overlay_node.layer = HIGH_OBJ_LAYER + add_overlay(multiz_overlay_node) + +///Attempts to locate a multiz pipe that's above us, if it finds one it merges us into its pipenet +/obj/machinery/atmospherics/pipe/simple/multiz/pipeline_expansion() + icon = 'icons/obj/atmos.dmi' //Just to refresh. + var/turf/T = get_turf(src) + var/obj/machinery/atmospherics/pipe/simple/multiz/above = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_above(T)) + var/obj/machinery/atmospherics/pipe/simple/multiz/below = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_below(T)) + if(below) + below.pipeline_expansion() //If we've got one below us, force it to add us on facebook + if(above) + nodes += above + above.nodes += src //Two way travel :) + return ..() + else + return ..() \ No newline at end of file diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index 5068ce09f5..8fa0825628 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -123,7 +123,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( if(toupdate.len) for(var/turf/T1 in toupdate) - T1.CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(T1) SSair.add_to_active(T1,1) diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index 416e2bc0c9..d88c7543f0 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -1,10 +1,12 @@ -/datum/map_template/ruin/proc/try_to_place(z,allowed_areas) - var/sanity = PLACEMENT_TRIES +/datum/map_template/ruin/proc/try_to_place(z,allowed_areas,turf/forced_turf) + var/sanity = forced_turf ? 1 : PLACEMENT_TRIES + if(SSmapping.level_trait(z,ZTRAIT_ISOLATED_RUINS)) + return place_on_isolated_level(z) while(sanity > 0) sanity-- var/width_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(width / 2) var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(height / 2) - var/turf/central_turf = locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z) + var/turf/central_turf = forced_turf ? forced_turf : locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z) var/valid = TRUE for(var/turf/check in get_affected_turfs(central_turf,1)) @@ -24,7 +26,7 @@ qdel(monster) for(var/obj/structure/flora/ash/plant in T) qdel(plant) - + load(central_turf,centered = TRUE) loaded++ @@ -32,9 +34,20 @@ T.flags_1 |= NO_RUINS_1 new /obj/effect/landmark/ruin(central_turf, src) - return TRUE - return FALSE + return central_turf +/datum/map_template/ruin/proc/place_on_isolated_level(z) + var/datum/turf_reservation/reservation = SSmapping.RequestBlockReservation(width, height, z) //Make the new level creation work with different traits. + if(!reservation) + return + var/turf/placement = locate(reservation.bottom_left_coords[1],reservation.bottom_left_coords[2],reservation.bottom_left_coords[3]) + load(placement) + loaded++ + for(var/turf/T in get_affected_turfs(placement)) + T.flags_1 |= NO_RUINS_1 + var/turf/center = locate(placement.x + round(width/2),placement.y + round(height/2),placement.z) + new /obj/effect/landmark/ruin(center, src) + return center /proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins) if(!z_levels || !z_levels.len) @@ -49,9 +62,8 @@ var/list/ruins = potentialRuins.Copy() - var/list/forced_ruins = list() //These go first on the z level associated (same random one by default) + var/list/forced_ruins = list() //These go first on the z level associated (same random one by default) or if the assoc value is a turf to the specified turf. var/list/ruins_availible = list() //we can try these in the current pass - var/forced_z //If set we won't pick z level and use this one instead. //Set up the starting ruin list for(var/key in ruins) @@ -67,34 +79,55 @@ while(budget > 0 && (ruins_availible.len || forced_ruins.len)) var/datum/map_template/ruin/current_pick var/forced = FALSE + var/forced_z //If set we won't pick z level and use this one instead. + var/forced_turf //If set we place the ruin centered on the given turf if(forced_ruins.len) //We have something we need to load right now, so just pick it for(var/ruin in forced_ruins) current_pick = ruin - if(forced_ruins[ruin] > 0) //Load into designated z + if(isturf(forced_ruins[ruin])) + var/turf/T = forced_ruins[ruin] + forced_z = T.z //In case of chained ruins + forced_turf = T + else if(forced_ruins[ruin] > 0) //Load into designated z forced_z = forced_ruins[ruin] forced = TRUE break else //Otherwise just pick random one current_pick = pickweight(ruins_availible) - var/placement_tries = PLACEMENT_TRIES + var/placement_tries = forced_turf ? 1 : PLACEMENT_TRIES //Only try once if we target specific turf var/failed_to_place = TRUE - var/z_placed = 0 - while(placement_tries > 0) - placement_tries-- - z_placed = pick(z_levels) - if(!current_pick.try_to_place(forced_z ? forced_z : z_placed,whitelist)) - continue - else - failed_to_place = FALSE - break + var/target_z = 0 + var/turf/placed_turf //Where the ruin ended up if we succeeded + outer: + while(placement_tries > 0) + placement_tries-- + target_z = pick(z_levels) + if(forced_z) + target_z = forced_z + if(current_pick.always_spawn_with) //If the ruin has part below, make sure that z exists. + for(var/v in current_pick.always_spawn_with) + if(current_pick.always_spawn_with[v] == PLACE_BELOW) + var/turf/T = locate(1,1,target_z) + if(!SSmapping.get_turf_below(T)) + if(forced_z) + continue outer + else + break outer + + placed_turf = current_pick.try_to_place(target_z,whitelist,forced_turf) + if(!placed_turf) + continue + else + failed_to_place = FALSE + break //That's done remove from priority even if it failed if(forced) //TODO : handle forced ruins with multiple variants forced_ruins -= current_pick forced = FALSE - + if(failed_to_place) for(var/datum/map_template/ruin/R in ruins_availible) if(R.id == current_pick.id) @@ -118,18 +151,21 @@ if(istype(linked,v)) switch(current_pick.always_spawn_with[v]) if(PLACE_SAME_Z) - forced_ruins[linked] = forced_z ? forced_z : z_placed //I guess you might want a chain somehow + forced_ruins[linked] = target_z //I guess you might want a chain somehow if(PLACE_LAVA_RUIN) forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_LAVA_RUINS)) if(PLACE_SPACE_RUIN) forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_SPACE_RUINS)) if(PLACE_DEFAULT) forced_ruins[linked] = -1 - forced_z = 0 + if(PLACE_BELOW) + forced_ruins[linked] = SSmapping.get_turf_below(placed_turf) + if(PLACE_ISOLATED) + forced_ruins[linked] = SSmapping.get_isolated_ruin_z() //Update the availible list for(var/datum/map_template/ruin/R in ruins_availible) if(R.cost > budget) ruins_availible -= R - + log_world("Ruin loader finished with [budget] left to spend.") diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm new file mode 100644 index 0000000000..f6db12420a --- /dev/null +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -0,0 +1,47 @@ +/proc/get_step_multiz(ref, dir) + if(dir & UP) + dir &= ~UP + return get_step(SSmapping.get_turf_above(get_turf(ref)), dir) + if(dir & DOWN) + dir &= ~DOWN + return get_step(SSmapping.get_turf_below(get_turf(ref)), dir) + return get_step(ref, dir) + +/proc/get_dir_multiz(turf/us, turf/them) + us = get_turf(us) + them = get_turf(them) + if(!us || !them) + return NONE + if(us.z == them.z) + return get_dir(us, them) + else + var/turf/T = us.above() + var/dir = NONE + if(T && (T.z == them.z)) + dir = UP + else + T = us.below() + if(T && (T.z == them.z)) + dir = DOWN + else + return get_dir(us, them) + return (dir | get_dir(us, them)) + +/turf/proc/above() + return get_step_multiz(src, UP) + +/turf/proc/below() + return get_step_multiz(src, DOWN) + +/proc/dir_inverse_multiz(dir) + var/holder = dir & (UP|DOWN) + if((holder == NONE) || (holder == (UP|DOWN))) + return turn(dir, 180) + dir &= ~(UP|DOWN) + dir = turn(dir, 180) + if(holder == UP) + holder = DOWN + else + holder = UP + dir |= holder + return dir \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index d84d9ecdb5..b323f13362 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -19,6 +19,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) see_in_dark = 100 invisibility = INVISIBILITY_OBSERVER hud_type = /datum/hud/ghost + movement_type = GROUND | FLYING var/can_reenter_corpse var/reenter_round_timeout = 0 // used to prevent people from coming back through ghost roles/midround antags as they suicide/cryo for a duration set by CONFIG_GET(number/suicide_reenter_round_timer) and CONFIG_GET(number/roundstart_suicide_time_limit) var/datum/hud/living/carbon/hud = null // hud diff --git a/code/modules/mob/dead/observer/observer_movement.dm b/code/modules/mob/dead/observer/observer_movement.dm new file mode 100644 index 0000000000..b84bed2a3f --- /dev/null +++ b/code/modules/mob/dead/observer/observer_movement.dm @@ -0,0 +1,2 @@ +/mob/dead/observer/canZMove(direction, turf/target) + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6c72abdfd5..6ced2a05a1 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -40,6 +40,16 @@ QDEL_LIST(diseases) return ..() +/mob/living/onZImpact(turf/T, levels) + if(!isgroundlessturf(T)) + ZImpactDamage(T, levels) + return ..() + +/mob/living/proc/ZImpactDamage(turf/T, levels) + visible_message("[src] crashes into [T] with a sickening noise!") + adjustBruteLoss((levels * 5) ** 1.5) + Knockdown(levels * 50) + /mob/living/proc/OpenCraftingMenu() return diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 1ee563bc1f..93bb9d1f8d 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -32,4 +32,7 @@ if(drag_slowdown && L.lying && !L.buckled && grab_state < GRAB_AGGRESSIVE) add_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING, multiplicative_slowdown = PULL_PRONE_SLOWDOWN) return - remove_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING) \ No newline at end of file + remove_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING) + +/mob/living/canZMove(dir, turf/target) + return can_zTravel(target, dir) && (movement_type & FLYING) \ No newline at end of file diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 82e2b11f8e..2c8935c786 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -370,3 +370,35 @@ if(hud_used && hud_used.static_inventory) for(var/obj/screen/mov_intent/selector in hud_used.static_inventory) selector.update_icon(src) + +/mob/verb/up() + set name = "Move Upwards" + set category = "IC" + + if(zMove(UP, TRUE)) + to_chat(src, "You move upwards.") + +/mob/verb/down() + set name = "Move Down" + set category = "IC" + + if(zMove(DOWN, TRUE)) + to_chat(src, "You move down.") + +/mob/proc/zMove(dir, feedback = FALSE) + if(dir != UP && dir != DOWN) + return FALSE + var/turf/target = get_step_multiz(src, dir) + if(!target) + if(feedback) + to_chat(src, "There's nothing in that direction!") + return FALSE + if(!canZMove(dir, target)) + if(feedback) + to_chat(src, "You couldn't move there!") + return FALSE + forceMove(target) + return TRUE + +/mob/proc/canZMove(direction, turf/target) + return FALSE \ No newline at end of file diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 4d8cdaa778..f2d95c2bd0 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -117,7 +117,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne use_power = IDLE_POWER_USE interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE var/on = TRUE - var/breaker = 1 + var/breaker = TRUE var/list/parts = list() var/obj/middle = null var/charging_state = POWER_IDLE @@ -166,7 +166,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne M.set_broken() middle.cut_overlays() charge_count = 0 - breaker = 0 + breaker = FALSE set_power() set_state(0) investigate_log("has broken down.", INVESTIGATE_GRAVITY) @@ -176,7 +176,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne for(var/obj/machinery/gravity_generator/M in parts) if(M.stat & BROKEN) M.set_fix() - broken_state = 0 + broken_state = FALSE update_icon() set_power() @@ -273,11 +273,11 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne // Set the charging state based on power/breaker. /obj/machinery/gravity_generator/main/proc/set_power() - var/new_state = 0 + var/new_state = FALSE if(stat & (NOPOWER|BROKEN) || !breaker) - new_state = 0 + new_state = FALSE else if(breaker) - new_state = 1 + new_state = TRUE charging_state = new_state ? POWER_UP : POWER_DOWN // Startup sequence animation. investigate_log("is now [charging_state == POWER_UP ? "charging" : "discharging"].", INVESTIGATE_GRAVITY) @@ -292,13 +292,13 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne var/alert = FALSE if(SSticker.IsRoundInProgress()) if(on) // If we turned on and the game is live. - if(gravity_in_level() == 0) - alert = 1 + if(gravity_in_level() == FALSE) + alert = TRUE investigate_log("was brought online and is now producing gravity for this level.", INVESTIGATE_GRAVITY) message_admins("The gravity generator was brought online [ADMIN_VERBOSEJMP(src)]") else - if(gravity_in_level() == 1) - alert = 1 + if(gravity_in_level() == TRUE) + alert = TRUE investigate_log("was brought offline and there is now no gravity for this level.", INVESTIGATE_GRAVITY) message_admins("The gravity generator was brought offline with no backup generator. [ADMIN_VERBOSEJMP(src)]") @@ -361,7 +361,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne var/sound/alert_sound = sound('sound/effects/alert.ogg') for(var/i in GLOB.mob_list) var/mob/M = i - if(M.z != z) + if(M.z != z && !(SSmapping.level_trait(z, ZTRAITS_STATION) && SSmapping.level_trait(M.z, ZTRAITS_STATION))) continue M.update_gravity(M.mob_has_gravity()) if(M.client) @@ -371,20 +371,28 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne /obj/machinery/gravity_generator/main/proc/gravity_in_level() var/turf/T = get_turf(src) if(!T) - return 0 + return FALSE if(GLOB.gravity_generators["[T.z]"]) return length(GLOB.gravity_generators["[T.z]"]) - return 0 + return FALSE /obj/machinery/gravity_generator/main/proc/update_list() var/turf/T = get_turf(src.loc) if(T) - if(!GLOB.gravity_generators["[T.z]"]) - GLOB.gravity_generators["[T.z]"] = list() - if(on) - GLOB.gravity_generators["[T.z]"] |= src + var/list/z_list = list() + // Multi-Z, station gravity generator generates gravity on all ZTRAIT_STATION z-levels. + if(SSmapping.level_trait(T.z, ZTRAIT_STATION)) + for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) + z_list += z else - GLOB.gravity_generators["[T.z]"] -= src + z_list += T.z + for(var/z in z_list) + if(!GLOB.gravity_generators["[z]"]) + GLOB.gravity_generators["[z]"] = list() + if(on) + GLOB.gravity_generators["[z]"] |= src + else + GLOB.gravity_generators["[z]"] -= src /obj/machinery/gravity_generator/main/proc/change_setting(value) if(value != setting) diff --git a/code/modules/power/multiz.dm b/code/modules/power/multiz.dm new file mode 100644 index 0000000000..9d8abf9066 --- /dev/null +++ b/code/modules/power/multiz.dm @@ -0,0 +1,80 @@ +/obj/machinery/power/deck_relay //This bridges powernets + name = "Multi-deck power adapter" + desc = "A huge bundle of double insulated cabling which seems to run up into the ceiling." + icon = 'icons/obj/power.dmi' + icon_state = "cablerelay-off" + var/obj/machinery/power/deck_relay/below ///The relay that's below us (for bridging powernets) + var/obj/machinery/power/deck_relay/above ///The relay that's above us (for bridging powernets) + anchored = TRUE + density = FALSE + +/obj/machinery/power/deck_relay/attackby(obj/item/I,mob/user) + if(default_unfasten_wrench(user, I)) + return FALSE + . = ..() + +/obj/machinery/power/deck_relay/process() + if(!anchored) + icon_state = "cablerelay-off" + if(above) //Lose connections + above.below = null + if(below) + below.above = null + return + refresh() //Sometimes the powernets get lost, so we need to keep checking. + if(powernet && (powernet.avail <= 0)) // is it powered? + icon_state = "cablerelay-off" + else + icon_state = "cablerelay-on" + if(!below || QDELETED(below) || !above || QDELETED(above)) + icon_state = "cablerelay-off" + find_relays() + +///Allows you to scan the relay with a multitool to see stats. +/obj/machinery/power/deck_relay/multitool_act(mob/user, obj/item/I) + if(powernet && (powernet.avail > 0)) // is it powered? + to_chat(user, "Total power: [DisplayPower(powernet.avail)]\nLoad: [DisplayPower(powernet.load)]\nExcess power: [DisplayPower(surplus())]") + if(!powernet || below.powernet != powernet) + icon_state = "cablerelay-off" + to_chat(user, "Powernet connection lost. Attempting to re-establish. Ensure the relays below this one are connected too.") + find_relays() + addtimer(CALLBACK(src, .proc/refresh), 20) //Wait a bit so we can find the one below, then get powering + return TRUE + +/obj/machinery/power/deck_relay/Initialize() + . = ..() + addtimer(CALLBACK(src, .proc/find_relays), 30) + addtimer(CALLBACK(src, .proc/refresh), 50) //Wait a bit so we can find the one below, then get powering + +///Handles re-acquiring + merging powernets found by find_relays() +/obj/machinery/power/deck_relay/proc/refresh() + if(above) + above.merge(src) + if(below) + below.merge(src) + +/obj/machinery/power/deck_relay/proc/merge(var/obj/machinery/power/deck_relay/DR) + if(!DR) + return + var/turf/merge_from = get_turf(DR) + var/turf/merge_to = get_turf(src) + var/obj/structure/cable/C = merge_from.get_cable_node() + var/obj/structure/cable/XR = merge_to.get_cable_node() + if(C && XR) + merge_powernets(XR.powernet,C.powernet)//Bridge the powernets. + +///Locates relays that are above and below this object +/obj/machinery/power/deck_relay/proc/find_relays() + var/turf/T = get_turf(src) + if(!T || !istype(T)) + return FALSE + below = null //in case we're re-establishing + var/obj/structure/cable/C = T.get_cable_node() //check if we have a node cable on the machine turf, the first found is picked + if(C && C.powernet) + C.powernet.add_machine(src) //Nice we're in. + powernet = C.powernet + below = locate(/obj/machinery/power/deck_relay) in(SSmapping.get_turf_below(T)) + above = locate(/obj/machinery/power/deck_relay) in(SSmapping.get_turf_above(T)) + if(below || above) + icon_state = "cablerelay-on" + return TRUE \ No newline at end of file diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index e6fa1e0ee4..4cbb88fe6b 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -313,7 +313,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) playsound(T, 'sound/effects/supermatter.ogg', 50, 1) 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.") - T.CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(T) /obj/machinery/power/supermatter_crystal/process_atmos() var/turf/T = loc @@ -650,6 +650,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) Consume(AM) +/obj/machinery/power/supermatter_crystal/intercept_zImpact(atom/movable/AM, levels) + . = ..() + Bumped(AM) + . |= FALL_STOP_INTERCEPTING | FALL_INTERCEPTED + /obj/machinery/power/supermatter_crystal/proc/Consume(atom/movable/AM) if(isliving(AM)) var/mob/living/user = AM diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 3894bcdf65..f6ab9fa9ff 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -138,7 +138,7 @@ return TRUE /datum/reagent/consumable/cooking_oil/reaction_turf(turf/open/T, reac_volume) - if(!istype(T)) + if(!istype(T) || isgroundlessturf(T)) return if(reac_volume >= 5) T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = reac_volume * 1.5 SECONDS) diff --git a/code/modules/recycling/disposal/multiz.dm b/code/modules/recycling/disposal/multiz.dm new file mode 100644 index 0000000000..3dcab94ca5 --- /dev/null +++ b/code/modules/recycling/disposal/multiz.dm @@ -0,0 +1,49 @@ +#define MULTIZ_PIPE_UP 1 ///Defines for determining which way a multiz disposal element should travel +#define MULTIZ_PIPE_DOWN 2 ///Defines for determining which way a multiz disposal element should travel + + +/obj/structure/disposalpipe/trunk/multiz + name = "Disposal trunk that goes up" + icon_state = "pipe-up" + var/multiz_dir = MULTIZ_PIPE_UP ///Set the multiz direction of your trunk. 1 = up, 2 = down + +/obj/structure/disposalpipe/trunk/multiz/down + name = "Disposal trunk that goes down" + icon_state = "pipe-down" + multiz_dir = MULTIZ_PIPE_DOWN + +/obj/structure/disposalpipe/trunk/multiz/transfer(obj/structure/disposalholder/H) + if(H.dir == DOWN) //Since we're a trunk, you can still place a chute / bin over us. If theyve entered from there, treat this as a normal trunk + return ..() + // otherwise, go to the linked object + if(multiz_dir) //Are we a trunk that goes up? Or down? + var/turf/T = null + if(multiz_dir == MULTIZ_PIPE_UP) + T = SSmapping.get_turf_above(get_turf(src)) //Get the turf above us + if(multiz_dir == MULTIZ_PIPE_DOWN) + T = SSmapping.get_turf_below(get_turf(src)) + if(!T) + expel(H) + return //Nothing located. + var/obj/structure/disposalpipe/trunk/multiz/pipe = locate(/obj/structure/disposalpipe/trunk/multiz) in T + if(pipe) + var/obj/structure/disposalholder/destination = new(pipe) //For future reference, the disposal holder is the thing that carries mobs + destination.init(pipe) //This instantiates it + destination.merge(H) //This takes the contents of H (Our disposal holder that's travelling into us) and puts them into the destination holder + destination.active = TRUE //Active allows it to process and move + destination.setDir(DOWN) //This tells the trunk above us NOT to loop it back down to us, or else you get an infinite loop + destination.move() + return null //Which removes the disposalholder + else + var/obj/structure/disposaloutlet/O = linked + if(istype(O)) + O.expel(H) // expel at outlet + else + var/obj/machinery/disposal/D = linked + D.expel(H) // expel at disposal + + // Returning null without expelling holder makes the holder expell itself + return null + +#undef MULTIZ_PIPE_UP +#undef MULTIZ_PIPE_DOWN \ No newline at end of file diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 307e714316..225ca1f824 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -33,6 +33,9 @@ else return QDEL_HINT_LETMELIVE +/obj/docking_port/has_gravity(turf/T) + return FALSE + /obj/docking_port/take_damage() return diff --git a/config/maps.txt b/config/maps.txt index 87e86a0800..6792cb9468 100644 --- a/config/maps.txt +++ b/config/maps.txt @@ -37,4 +37,7 @@ map deltastation endmap map runtimestation +endmap + +map multiz_debug endmap \ No newline at end of file diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi index ee42e95dd2..644c32fe30 100644 Binary files a/icons/obj/atmos.dmi and b/icons/obj/atmos.dmi differ diff --git a/icons/obj/atmospherics/pipes/disposal.dmi b/icons/obj/atmospherics/pipes/disposal.dmi index a705b35c5a..f8f16ba86f 100644 Binary files a/icons/obj/atmospherics/pipes/disposal.dmi and b/icons/obj/atmospherics/pipes/disposal.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index dc6d4547b4..1da5a66546 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/stairs.dmi b/icons/obj/stairs.dmi new file mode 100644 index 0000000000..615e88f684 Binary files /dev/null and b/icons/obj/stairs.dmi differ diff --git a/tgstation.dme b/tgstation.dme index f139437d9e..a8a6544634 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -228,6 +228,7 @@ #include "code\controllers\configuration\entries\game_options.dm" #include "code\controllers\configuration\entries\general.dm" #include "code\controllers\subsystem\acid.dm" +#include "code\controllers\subsystem\adjacent_air.dm" #include "code\controllers\subsystem\air.dm" #include "code\controllers\subsystem\air_turfs.dm" #include "code\controllers\subsystem\assets.dm" @@ -1036,6 +1037,7 @@ #include "code\game\objects\structures\safe.dm" #include "code\game\objects\structures\showcase.dm" #include "code\game\objects\structures\spirit_board.dm" +#include "code\game\objects\structures\stairs.dm" #include "code\game\objects\structures\statues.dm" #include "code\game\objects\structures\table_frames.dm" #include "code\game\objects\structures\tables_racks.dm" @@ -1090,6 +1092,7 @@ #include "code\game\turfs\closed.dm" #include "code\game\turfs\open.dm" #include "code\game\turfs\turf.dm" +#include "code\game\turfs\openspace\openspace.dm" #include "code\game\turfs\simulated\chasm.dm" #include "code\game\turfs\simulated\dirtystation.dm" #include "code\game\turfs\simulated\floor.dm" @@ -1372,6 +1375,7 @@ #include "code\modules\assembly\signaler.dm" #include "code\modules\assembly\timer.dm" #include "code\modules\assembly\voice.dm" +#include "code\modules\atmospherics\multiz.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" @@ -1927,6 +1931,7 @@ #include "code\modules\mapping\reader.dm" #include "code\modules\mapping\ruins.dm" #include "code\modules\mapping\verify.dm" +#include "code\modules\mapping\space_management\multiz_helpers.dm" #include "code\modules\mapping\space_management\space_level.dm" #include "code\modules\mapping\space_management\space_reservation.dm" #include "code\modules\mapping\space_management\space_transition.dm" @@ -2012,6 +2017,7 @@ #include "code\modules\mob\dead\observer\logout.dm" #include "code\modules\mob\dead\observer\notificationprefs.dm" #include "code\modules\mob\dead\observer\observer.dm" +#include "code\modules\mob\dead\observer\observer_movement.dm" #include "code\modules\mob\dead\observer\say.dm" #include "code\modules\mob\living\blood.dm" #include "code\modules\mob\living\bloodcrawl.dm" @@ -2409,6 +2415,7 @@ #include "code\modules\power\gravitygenerator.dm" #include "code\modules\power\lighting.dm" #include "code\modules\power\monitor.dm" +#include "code\modules\power\multiz.dm" #include "code\modules\power\port_gen.dm" #include "code\modules\power\power.dm" #include "code\modules\power\powernet.dm" @@ -2617,6 +2624,7 @@ #include "code\modules\recycling\disposal\construction.dm" #include "code\modules\recycling\disposal\eject.dm" #include "code\modules\recycling\disposal\holder.dm" +#include "code\modules\recycling\disposal\multiz.dm" #include "code\modules\recycling\disposal\outlet.dm" #include "code\modules\recycling\disposal\pipe.dm" #include "code\modules\recycling\disposal\pipe_sorting.dm"