diff --git a/_maps/RandomRuins/StationRuins/BoxStation/engine_reactor.dmm b/_maps/RandomRuins/StationRuins/BoxStation/engine_reactor.dmm new file mode 100644 index 0000000000000..3434cc5d0a89d --- /dev/null +++ b/_maps/RandomRuins/StationRuins/BoxStation/engine_reactor.dmm @@ -0,0 +1,2509 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ae" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall, +/area/engine/engineering) +"aV" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"bl" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/engine, +/area/engine/engineering) +"bp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"bB" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/space/nearstation) +"bO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/closet/firecloset, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Engineering Reactor Control Room"; + dir = 4; + network = list("ss13","engine") + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"bZ" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 1 + }, +/turf/open/floor/carpet/royalblack, +/area/engine/engineering) +"cd" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped{ + filter_type = list(/datum/gas/pluonium) + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cg" = ( +/turf/closed/wall/r_wall, +/area/space/nearstation) +"cp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/airlock/engineering{ + name = "AI Satellite Access"; + req_one_access_txt = "10;17;32" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cA" = ( +/obj/effect/turf_decal/pool{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"df" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/closet/radiation, +/obj/item/clothing/glasses/meson/engine, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/item/sealant, +/obj/machinery/camera{ + c_tag = "Engineering West Clean Room"; + network = list("ss13","engine") + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"dH" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) +"dL" = ( +/obj/machinery/atmospherics/components/trinary/mixer/t_mixer{ + dir = 2 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dV" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ej" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"et" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/engine, +/area/engine/engineering) +"ez" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/space/nearstation) +"eG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"eT" = ( +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4; + name = "Cooling Loop Bypass" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"fO" = ( +/obj/machinery/atmospherics/pipe/manifold/brown/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"gB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"gI" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"hw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Reactor Clean Room"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"hV" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 25 + }, +/turf/open/floor/noslip, +/area/engine/engineering) +"is" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"iu" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"iB" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plating, +/area/engine/engineering) +"iV" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "Waste To Storage" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"iZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/engine, +/area/engine/engineering) +"jb" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"jx" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"jz" = ( +/turf/open/indestructible/sound/pool{ + id = 1 + }, +/area/engine/engineering) +"jF" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating, +/area/engine/engineering) +"jY" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/space/nearstation) +"kg" = ( +/obj/machinery/atmospherics/components/binary/pump, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kq" = ( +/obj/item/fuel_rod, +/turf/open/indestructible/sound/pool{ + id = 1 + }, +/area/engine/engineering) +"kM" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kZ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"le" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lR" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"md" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"nf" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/emcloset/anchored, +/obj/machinery/advanced_airlock_controller{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plating, +/area/engine/engineering) +"nm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"np" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"nH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 2; + external_pressure_bound = 0; + frequency = 1445; + id_tag = "o2_out"; + initialize_directions = 1; + internal_pressure_bound = 4000; + pressure_checks = 2; + pressure_resistance = 10; + pump_direction = 0 + }, +/turf/open/floor/engine/o2, +/area/engine/engineering) +"nL" = ( +/obj/machinery/light/small, +/obj/machinery/firealarm{ + dir = 8; + pixel_y = -28 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/turf/open/floor/noslip, +/area/engine/engineering) +"nP" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = 27 + }, +/turf/open/floor/noslip, +/area/engine/engineering) +"nR" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/turf/open/floor/carpet/royalblack, +/area/engine/engineering) +"oz" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oD" = ( +/obj/structure/rack, +/obj/item/shovel, +/obj/item/clothing/mask/gas{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas{ + pixel_x = -3; + pixel_y = -3 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oF" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"pd" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 6 + }, +/turf/open/floor/carpet/royalblack, +/area/engine/engineering) +"pk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"pv" = ( +/obj/machinery/firealarm{ + pixel_y = 28 + }, +/obj/machinery/camera{ + c_tag = "Engineering Reactor Maintenance"; + network = list("ss13","engine") + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"py" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/turf/open/floor/noslip, +/area/engine/engineering) +"pU" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 5 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"pZ" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qk" = ( +/obj/machinery/shower{ + dir = 4 + }, +/turf/open/floor/noslip, +/area/engine/engineering) +"ql" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"qH" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qV" = ( +/turf/closed/wall, +/area/engine/engineering) +"qY" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ra" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/turf/open/floor/plasteel, +/area/engine/engineering) +"rd" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Reactor to Cooling Loop" + }, +/obj/effect/turf_decal/pool{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ri" = ( +/obj/structure/grille, +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"rN" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Cooling Loop to Reactor" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"rW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"rZ" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + name = "Input Gas Connector Port" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"sb" = ( +/obj/machinery/light, +/turf/open/floor/engine, +/area/engine/engineering) +"tc" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/turf/open/floor/plating, +/area/engine/engineering) +"tZ" = ( +/obj/machinery/computer/station_alert, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"ug" = ( +/obj/structure/pool_ladder, +/turf/open/indestructible/sound/pool/end, +/area/engine/engineering) +"ul" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uK" = ( +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4; + name = "Waste to Space" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Reactor Clean Room"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vl" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"vm" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vp" = ( +/obj/item/radio/intercom{ + pixel_x = 26 + }, +/obj/structure/closet/radiation, +/obj/item/clothing/glasses/meson/engine, +/obj/item/sealant, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"vs" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vP" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -26 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"vT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wg" = ( +/obj/structure/closet/radiation, +/obj/item/clothing/glasses/meson/engine, +/obj/structure/sign/warning/radiation{ + pixel_y = 32 + }, +/obj/item/clothing/glasses/meson/engine, +/obj/item/sealant, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"wo" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wr" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_y = -28 + }, +/turf/open/floor/noslip, +/area/engine/engineering) +"ws" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"wH" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/pool{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wV" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Atmospherics to Moderator" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"xm" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"xA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"xE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"xN" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/turf/open/floor/engine, +/area/engine/engineering) +"yn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"yt" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "reactorcore"; + name = "Core Access"; + req_access_txt = "10" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"yw" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"yC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"zj" = ( +/obj/item/fuel_rod, +/obj/machinery/pool_filter, +/turf/open/indestructible/sound/pool/end, +/area/engine/engineering) +"zS" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"zY" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 8 + }, +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"Az" = ( +/obj/structure/sign/warning/radiation/rad_area, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"AK" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/space/nearstation) +"Bh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Bn" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Bq" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"BT" = ( +/obj/machinery/computer/atmos_control/tank/toxin_tank{ + frequency = 1445 + }, +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Cd" = ( +/obj/effect/turf_decal/delivery, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Ck" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"Cx" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"CA" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plating, +/area/engine/engineering) +"CI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/engine, +/area/engine/engineering) +"CL" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Tank to Cooling" + }, +/obj/machinery/airalarm/directional/west{ + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"CT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"CV" = ( +/obj/item/reagent_containers/food/snacks/pizzaslice/meat, +/obj/structure/table, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Dv" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/obj/item/sealant, +/turf/open/floor/plasteel, +/area/engine/engineering) +"En" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Engineering Reactor Core"; + dir = 4; + network = list("ss13","engine") + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Fd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Fl" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Fp" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/space/nearstation) +"FF" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"FM" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"FU" = ( +/obj/machinery/door/airlock/engineering{ + name = "Reactor Core"; + req_one_access_txt = "10;24" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Gc" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Gz" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, +/obj/effect/turf_decal/pool/corner, +/turf/open/floor/plasteel, +/area/engine/engineering) +"GY" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/carpet/royalblack, +/area/engine/engineering) +"Hd" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Hi" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"Hj" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -25 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"HI" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"HQ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"If" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Im" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Jb" = ( +/obj/machinery/modular_computer/console/preset/engineering, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Je" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Control Room"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Jj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/turf_decal/pool, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Jx" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"JS" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "reactorcore"; + name = "Reactor Core Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"JW" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "reactorvent"; + name = "Core Vent"; + req_access_txt = "10" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Kt" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/space/nearstation) +"Kx" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1; + name = "Output Gas Connector Port" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"KP" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Control Room"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"KS" = ( +/obj/effect/turf_decal/pool, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Lc" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"Li" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"Lu" = ( +/obj/item/fuel_rod, +/turf/open/indestructible/sound/pool/end, +/area/engine/engineering) +"Lw" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Mc" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction, +/turf/open/floor/plating, +/area/engine/engineering) +"ME" = ( +/obj/machinery/air_sensor/atmos/toxin_tank{ + frequency = 1445 + }, +/turf/open/floor/engine/plasma, +/area/engine/engineering) +"MQ" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Nm" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/turf/open/floor/carpet/royalblack, +/area/engine/engineering) +"NL" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"NO" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Moderators to Reactor" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Oh" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1; + name = "Output Gas Connector Port" + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Om" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/brown/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Oq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 2; + external_pressure_bound = 0; + frequency = 1445; + id_tag = "tox_out"; + initialize_directions = 1; + internal_pressure_bound = 4000; + pressure_checks = 2; + pressure_resistance = 10; + pump_direction = 0 + }, +/turf/open/floor/engine/plasma, +/area/engine/engineering) +"Or" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"OM" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/toolbox/electrical{ + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Pg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"PP" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "reactorcore"; + name = "Reactor Core Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"PR" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Qk" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Qp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Qt" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"QR" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Rd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/turf_decal/pool/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"RI" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"RU" = ( +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/space/nearstation) +"Sa" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/paper/guides/jobs/engi/agcnr, +/obj/machinery/computer/reactor/preset, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Sb" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Sr" = ( +/turf/template_noop, +/area/template_noop) +"Sz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plasteel, +/area/engine/engineering) +"SG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Tn" = ( +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/preset{ + dir = 2 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Uc" = ( +/obj/effect/turf_decal/pool{ + dir = 8 + }, +/obj/machinery/light, +/obj/structure/closet/crate, +/obj/item/pool/rubber_ring, +/obj/item/pool/rubber_ring, +/obj/item/pool/rubber_ring, +/obj/item/pool/pool_noodle, +/obj/item/pool/pool_noodle, +/obj/item/pool/pool_noodle, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ue" = ( +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ug" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "reactorcore"; + name = "Reactor Core Shutters" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Um" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Uv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Uz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"UF" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 1 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"UX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Wp" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plating, +/area/engine/engineering) +"Wq" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + name = "Input Gas Connector Port" + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Wt" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Atmospherics to Coolant" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"WU" = ( +/obj/machinery/door/poddoor{ + id = "reactorvent"; + name = "Reactor Vent" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Xk" = ( +/turf/open/floor/engine, +/area/engine/engineering) +"XN" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"XR" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ym" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Yp" = ( +/obj/structure/closet/radiation, +/obj/item/clothing/glasses/meson/engine, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/sign/warning/radiation{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/item/sealant, +/obj/machinery/camera{ + c_tag = "Engineering East Clean Room"; + network = list("ss13","engine") + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"YD" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/engine/engineering) +"YG" = ( +/obj/machinery/air_sensor/atmos/oxygen_tank{ + frequency = 1445 + }, +/turf/open/floor/engine/o2, +/area/engine/engineering) +"Zm" = ( +/obj/machinery/computer/atmos_control/tank/oxygen_tank{ + frequency = 1445 + }, +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ZI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ZS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) + +(1,1,1) = {" +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +yw +Sr +Sr +yw +Sr +Sr +yw +Sr +Sr +Sr +yw +Sr +Sr +Sr +Sr +Sr +Sr +Sr +"} +(2,1,1) = {" +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +yw +Sr +Sr +yw +Sr +Sr +yw +Sr +Sr +Sr +yw +Sr +Sr +Sr +Sr +Sr +Sr +Sr +"} +(3,1,1) = {" +Sr +Sr +Sr +Sr +Sr +Sr +Sr +yw +yw +yw +yw +yw +yw +yw +yw +yw +yw +yw +yw +yw +Sr +Sr +Sr +Sr +Sr +Sr +"} +(4,1,1) = {" +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +yw +ri +ri +ri +yw +Sr +yw +ri +ri +ri +ri +ri +ri +Sr +Sr +ri +ri +Sr +"} +(5,1,1) = {" +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +ri +cg +ri +Sr +Sr +Sr +ri +cg +cg +cg +cg +ri +yw +yw +cg +ri +ri +"} +(6,1,1) = {" +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +yw +ri +ri +ri +yw +Sr +yw +ri +ri +ri +ri +ri +ri +yw +Sr +yw +cg +ri +"} +(7,1,1) = {" +Sr +Sr +Sr +Sr +qV +qV +dH +yw +yw +yw +yw +yw +yw +yw +yw +yw +Sr +Sr +Sr +Sr +yw +Sr +Sr +Sr +yw +Sr +"} +(8,1,1) = {" +Sr +Sr +OM +pZ +qV +nf +dH +Sr +Sr +yw +Sr +yw +Sr +Sr +Sr +ez +bB +bB +bB +bB +bB +jY +Sr +yw +yw +Sr +"} +(9,1,1) = {" +Sr +Sr +vs +cz +iB +Wp +CA +Sr +yw +yw +Fp +yw +yw +Sr +yw +Li +zS +Lc +Lc +Lc +Lc +Hi +yw +ri +ri +ri +"} +(10,1,1) = {" +Sr +gI +hw +ws +dH +dH +dH +dH +dH +ws +XN +ws +dH +dH +dH +Li +AK +bB +bB +bB +bB +jY +Sr +ri +cg +ri +"} +(11,1,1) = {" +ws +is +Qk +wr +dH +ME +Oq +tc +BT +Ue +uK +Ue +Fd +Oh +dH +Li +zS +Lc +Lc +Lc +Lc +Hi +Sr +ri +cg +ri +"} +(12,1,1) = {" +dH +df +Lw +py +dH +dH +dH +dH +dL +pU +UF +iV +FF +Kx +dH +Li +AK +bB +bB +bB +bB +jY +Sr +ri +cg +ri +"} +(13,1,1) = {" +dH +wg +RI +nP +dH +YG +nH +tc +Zm +dV +vT +Fl +yC +Ue +dH +Li +yw +yw +yw +yw +yw +zY +Sr +ri +cg +ri +"} +(14,1,1) = {" +dH +dH +Je +dH +dH +dH +dH +dH +pv +NO +wo +ul +cd +qY +Mc +Kt +ez +bB +bB +bB +bB +Kt +Sr +ri +cg +ri +"} +(15,1,1) = {" +dH +bO +bp +Hj +Az +Wq +CL +If +ZI +dV +rN +Ue +Ue +eT +ws +yw +jb +Lc +Lc +Lc +Lc +vl +Sr +ri +cg +ri +"} +(16,1,1) = {" +ws +Pg +pd +Wt +jF +eG +nm +FF +xE +MQ +Sb +Gz +rd +wH +Mc +jY +ez +bB +bB +bB +bB +Kt +Sr +ri +cg +ri +"} +(17,1,1) = {" +ws +JW +Nm +iu +FU +Gc +Sz +Sz +ra +XR +le +Jj +ug +jz +dH +Li +jb +Lc +Lc +Lc +Lc +vl +yw +ri +ri +ri +"} +(18,1,1) = {" +ws +Sa +bZ +wV +tc +kZ +vm +fO +Hd +Om +le +KS +Lu +kq +dH +AK +bB +bB +bB +bB +bB +Kt +Sr +yw +yw +Sr +"} +(19,1,1) = {" +ws +yt +GY +ql +ws +rZ +kg +Cx +Um +HQ +Im +KS +zj +kq +dH +yw +Sr +Sr +Sr +Sr +yw +Sr +Sr +Sr +yw +Sr +"} +(20,1,1) = {" +ws +Jb +nR +lR +ws +CV +Ue +le +Uz +xm +Ue +KS +Lu +kq +dH +ri +ri +ri +ri +ri +ri +yw +Sr +yw +cg +ri +"} +(21,1,1) = {" +dH +tZ +PR +Qp +Az +Dv +Ue +YD +yn +oz +rW +Rd +cA +Uc +dH +cg +cg +cg +cg +cg +ri +yw +yw +cg +ri +ri +"} +(22,1,1) = {" +dH +dH +KP +dH +dH +dH +dH +ej +PP +JS +Ug +Or +dH +dH +dH +ri +ri +ri +ri +ri +ri +Sr +Sr +ri +ri +Sr +"} +(23,1,1) = {" +dH +Bn +HI +qk +dH +Xk +Xk +En +SG +NL +Xk +pk +vP +Xk +dH +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +"} +(24,1,1) = {" +dH +Yp +oF +nL +dH +xN +CI +bl +gB +Jx +iZ +et +Bh +sb +dH +yw +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +"} +(25,1,1) = {" +dH +vp +Ym +hV +dH +Xk +Xk +np +Xk +Bq +Xk +ZS +UX +Xk +WU +RU +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +"} +(26,1,1) = {" +Cd +dH +vb +dH +dH +Xk +Xk +aV +Ck +Tn +md +xA +Xk +Xk +WU +RU +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +"} +(27,1,1) = {" +Sr +uu +kM +Ue +dH +qH +Xk +FM +Xk +Xk +Xk +Uv +Xk +sb +dH +yw +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +"} +(28,1,1) = {" +Sr +Ue +jx +oD +dH +Xk +Xk +QR +CT +CT +CT +Qt +Xk +Xk +dH +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +"} +(29,1,1) = {" +Sr +ae +cp +qV +dH +dH +dH +dH +dH +dH +dH +dH +dH +dH +dH +dH +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +Sr +"} diff --git a/_maps/RandomRuins/StationRuins/MetaStation/meta_reactor.dmm b/_maps/RandomRuins/StationRuins/MetaStation/meta_reactor.dmm new file mode 100644 index 0000000000000..fe57dad9aba19 --- /dev/null +++ b/_maps/RandomRuins/StationRuins/MetaStation/meta_reactor.dmm @@ -0,0 +1,2477 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aj" = ( +/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, +/area/icemoon/top_layer/outdoors) +"aA" = ( +/obj/machinery/shower{ + pixel_y = 20 + }, +/obj/machinery/camera{ + c_tag = "Engineering South Clean Room"; + dir = 8; + network = list("ss13","engine") + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 25 + }, +/turf/open/floor/noslip, +/area/engine/engineering) +"aD" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_y = -28 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"aK" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"bl" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"bw" = ( +/obj/item/fuel_rod, +/obj/structure/pool_ladder, +/turf/open/indestructible/sound/pool/end, +/area/engine/engineering) +"cq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cs" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 8 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cI" = ( +/obj/machinery/atmospherics/pipe/manifold/brown/visible{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/turf/open/floor/plasteel, +/area/engine/engineering) +"di" = ( +/obj/structure/table, +/obj/item/paper/guides/jobs/engi/agcnr, +/obj/machinery/computer/reactor/preset, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"dp" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dO" = ( +/turf/closed/mineral/random/snow/top_layer, +/area/icemoon/top_layer/outdoors) +"dY" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"eb" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"eu" = ( +/obj/structure/sign/warning/radiation/rad_area, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"eB" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Atmos to Cooling" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"eS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"eT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"eZ" = ( +/turf/open/floor/plasteel, +/area/engine/engineering) +"fA" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + name = "Input Gas Connector Port" + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"fH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"gn" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"gB" = ( +/obj/machinery/computer/atmos_control/tank/oxygen_tank{ + frequency = 1445 + }, +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"gL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"hb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"hs" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"hD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/table/reinforced, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/clothing/mask/breath{ + pixel_x = 4 + }, +/obj/item/clothing/mask/breath{ + pixel_x = 4 + }, +/obj/item/flashlight/flare/signal, +/obj/item/flashlight/flare/signal, +/turf/open/floor/plasteel, +/area/engine/engineering) +"hW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"id" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"ir" = ( +/obj/machinery/light, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/camera{ + c_tag = "Engineering Reactor Maintenance South"; + dir = 1; + network = list("ss13","engine") + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"iC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"je" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"jg" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/carpet/royalblack, +/area/engine/engineering) +"jp" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) +"kb" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, +/area/icemoon/top_layer/outdoors) +"kd" = ( +/obj/item/fuel_rod, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/indestructible/sound/pool{ + id = 1 + }, +/area/engine/engineering) +"ke" = ( +/obj/effect/turf_decal/pool/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kg" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 6 + }, +/obj/structure/cable/orange{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"kt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"kC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 25 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"lc" = ( +/obj/machinery/air_sensor/atmos/oxygen_tank{ + frequency = 1445 + }, +/turf/open/floor/engine/o2, +/area/engine/engineering) +"le" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/top_layer/outdoors) +"lx" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"lE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"lI" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Tank to Cooling" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lJ" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lP" = ( +/obj/effect/turf_decal/pool/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"lY" = ( +/obj/machinery/modular_computer/console/preset/engineering{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"lZ" = ( +/obj/structure/table, +/obj/effect/turf_decal/delivery, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mm" = ( +/obj/machinery/atmospherics/pipe/manifold/brown/visible, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mC" = ( +/obj/structure/lattice, +/obj/structure/grille/broken, +/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, +/area/icemoon/top_layer/outdoors) +"mG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mS" = ( +/obj/effect/spawner/structure/window/plasma/reinforced/shutter, +/turf/open/floor/plating, +/area/engine/engineering) +"mU" = ( +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/top_layer/outdoors) +"nd" = ( +/obj/machinery/atmospherics/components/trinary/filter{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plasteel, +/area/engine/engineering) +"nh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/noslip, +/area/engine/engineering) +"nl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ns" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable/orange{ + icon_state = "1-8" + }, +/turf/open/floor/carpet/royalblack, +/area/engine/engineering) +"nA" = ( +/obj/structure/lattice, +/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, +/area/icemoon/top_layer/outdoors) +"nZ" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"os" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/snacks/pizzaslice/meat, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oA" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oN" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, +/turf/open/floor/carpet/royalblack, +/area/engine/engineering) +"pp" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Tank to Cooling" + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"pO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"pX" = ( +/obj/machinery/computer/atmos_control/tank/toxin_tank{ + frequency = 1445 + }, +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qe" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qg" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qA" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/top_layer/outdoors) +"qR" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/top_layer/outdoors) +"qV" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/structure/cable/orange{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"re" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"rf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"rj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"rq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Reactor Control Room"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ + dirx = 2; + diry = -2 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"rz" = ( +/obj/effect/turf_decal/pool{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"rB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/spawner/structure/window/plasma/reinforced/shutter, +/turf/open/floor/plating, +/area/engine/engineering) +"sh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"sY" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"th" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"tC" = ( +/obj/effect/turf_decal/pool{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"tS" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/engineering) +"un" = ( +/obj/machinery/atmospherics/components/binary/valve/on{ + name = "Waste to Environment" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"up" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"uv" = ( +/obj/structure/table, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/shovel, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uL" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uP" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Atmos to Moderator" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vJ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/top_layer/outdoors) +"wF" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"xj" = ( +/obj/item/radio/intercom{ + pixel_y = 21 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Engineering Reactor Maintenance North"; + network = list("ss13","engine") + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"xJ" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/meter, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ya" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Reactor to Cooling Loop" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 25 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"yf" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/obj/item/sealant, +/turf/open/floor/plasteel, +/area/engine/engineering) +"yt" = ( +/obj/structure/closet/radiation, +/obj/item/clothing/glasses/meson/engine, +/obj/effect/turf_decal/bot, +/obj/item/sealant, +/obj/structure/cable/orange{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"yD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"yI" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1; + name = "Input Gas Connector Port" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"yU" = ( +/obj/machinery/atmospherics/components/trinary/mixer/t_mixer{ + dir = 2 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"zF" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"zG" = ( +/obj/structure/closet/radiation, +/obj/item/clothing/glasses/meson/engine, +/obj/effect/turf_decal/bot, +/obj/item/sealant, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"zI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"zS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"zZ" = ( +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/effect/turf_decal/delivery, +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"AO" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Reactor Control Room"; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ + dirx = 2; + diry = 2 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"AZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Bf" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Bg" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/top_layer/outdoors) +"Bo" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"BF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"CS" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Dy" = ( +/obj/machinery/bounty_board, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"DK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"DQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Em" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Eu" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/air_sensor/atmos/toxin_tank{ + frequency = 1445 + }, +/turf/open/floor/engine/plasma, +/area/engine/engineering) +"Ez" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"EB" = ( +/obj/structure/table, +/obj/machinery/button/door{ + id = "reactorcore"; + name = "Core Access"; + pixel_y = -2; + req_access_txt = "10" + }, +/obj/machinery/button/door{ + id = "reactorvent"; + name = "Core Vent"; + pixel_y = 8; + req_access_txt = "10" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/orange{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"EG" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 25 + }, +/turf/open/floor/noslip, +/area/engine/engineering) +"EK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Fk" = ( +/obj/structure/lattice, +/obj/structure/girder/reinforced, +/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, +/area/icemoon/top_layer/outdoors) +"Fp" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/top_layer/outdoors) +"FG" = ( +/obj/effect/turf_decal/pool{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel, +/area/engine/engineering) +"FQ" = ( +/obj/machinery/computer/station_alert{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_y = -28 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Gh" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Moderators to Reactor" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Go" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"GD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"GE" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"GH" = ( +/obj/effect/turf_decal/pool{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"GL" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/preset, +/turf/open/floor/engine, +/area/engine/engineering) +"HV" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/engineering) +"It" = ( +/turf/open/floor/engine, +/area/engine/engineering) +"IA" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"IG" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"IP" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "reactorcore"; + name = "Reactor Core Shutters" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"JW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Kf" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Lm" = ( +/obj/machinery/atmospherics/components/trinary/filter{ + dir = 1; + filter_type = list(/datum/gas/pluonium) + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"LI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"LT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 6 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"LX" = ( +/obj/structure/lattice, +/turf/closed/wall/r_wall, +/area/icemoon/top_layer/outdoors) +"Mx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 2; + external_pressure_bound = 0; + frequency = 1445; + id_tag = "o2_out"; + initialize_directions = 1; + internal_pressure_bound = 4000; + pressure_checks = 2; + pressure_resistance = 10; + pump_direction = 0 + }, +/turf/open/floor/engine/o2, +/area/engine/engineering) +"ME" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"MQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"MW" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Nf" = ( +/obj/item/fuel_rod, +/turf/open/indestructible/sound/pool/end, +/area/engine/engineering) +"Np" = ( +/obj/machinery/atmospherics/components/unary/passive_vent, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/top_layer/outdoors) +"Nw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ny" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/orange{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"NF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"NJ" = ( +/obj/effect/turf_decal/pool, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Oe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"OD" = ( +/turf/template_noop, +/area/template_noop) +"Pd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Pm" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/top_layer/outdoors) +"PG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable/orange{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"PI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 2; + external_pressure_bound = 0; + frequency = 1445; + id_tag = "tox_out"; + initialize_directions = 1; + internal_pressure_bound = 4000; + pressure_checks = 2; + pressure_resistance = 10; + pump_direction = 0 + }, +/turf/open/floor/engine/plasma, +/area/engine/engineering) +"PK" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/top_layer/outdoors) +"PQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Qj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Qq" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"QH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"QO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"QQ" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/structure/cable/orange{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"QV" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Rc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/pool, +/obj/structure/closet/crate, +/obj/item/pool/rubber_ring, +/obj/item/pool/rubber_ring, +/obj/item/pool/rubber_ring, +/obj/item/pool/pool_noodle, +/obj/item/pool/pool_noodle, +/obj/item/pool/pool_noodle, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Rp" = ( +/obj/structure/lattice, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"RG" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "reactorcore"; + name = "Reactor Core Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"RK" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"RV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/pool{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"RZ" = ( +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Si" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/door/airlock/engineering{ + name = "Reactor Maintenance"; + req_access_txt = "10" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Sl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"SE" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"SJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"SM" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"SY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Engineering Reactor Core"; + dir = 8; + network = list("ss13","engine") + }, +/turf/open/floor/engine, +/area/engine/engineering) +"TX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Uk" = ( +/obj/machinery/shower{ + pixel_y = 20 + }, +/obj/machinery/camera{ + c_tag = "Engineering North Clean Room"; + dir = 8; + network = list("ss13","engine") + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/turf/open/floor/noslip, +/area/engine/engineering) +"Uq" = ( +/obj/machinery/door/poddoor{ + id = "reactorvent"; + name = "Reactor Vent" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Uv" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/valve/on{ + dir = 4; + name = "Cooling Loop Bypass" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"UH" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/item/radio/intercom{ + pixel_y = 21 + }, +/obj/machinery/camera{ + c_tag = "Engineering Reactor Control Room"; + dir = 8; + network = list("ss13","engine") + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Va" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Vb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Vi" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Vr" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"VA" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"VF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/airlock/engineering{ + name = "Reactor Maintenance"; + req_access_txt = "10" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"WA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"WC" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Reactor Control Room"; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ + dirx = -2; + diry = 2 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/structure/cable/orange{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"XZ" = ( +/obj/item/fuel_rod, +/turf/open/indestructible/sound/pool{ + id = 1 + }, +/area/engine/engineering) +"Yh" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Cooling Loop to Reactor" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Yi" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/clothing/head/ushanka, +/obj/item/clothing/head/ushanka, +/obj/item/clothing/head/ushanka, +/turf/open/floor/plasteel, +/area/engine/engineering) +"YC" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/stripes{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"YK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/orange{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Zk" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Zo" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/turf/open/floor/noslip, +/area/engine/engineering) +"Zt" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Reactor Control Room"; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ + dirx = -2; + diry = -2 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"ZC" = ( +/obj/structure/sign/warning/nosmoking, +/turf/closed/wall/r_wall, +/area/engine/engineering) + +(1,1,1) = {" +OD +OD +OD +zF +QH +Ny +eS +QH +zZ +lZ +Ny +mG +QH +GE +uv +QH +GD +cq +OD +OD +OD +OD +OD +OD +"} +(2,1,1) = {" +OD +OD +OD +IG +jp +QQ +rq +SM +MW +Dy +QQ +Em +SM +ZC +MW +SM +AO +SM +OD +OD +OD +OD +OD +OD +"} +(3,1,1) = {" +OD +OD +OD +IG +jp +yt +Pd +zG +jp +lY +EB +di +bl +FQ +jp +zG +MQ +zG +OD +OD +OD +OD +OD +OD +"} +(4,1,1) = {" +OD +OD +OD +Bf +SM +qV +kg +PG +WC +YK +ns +jg +oX +je +Zt +lE +Qq +re +OD +OD +OD +OD +OD +OD +"} +(5,1,1) = {" +RZ +OD +eZ +tS +jp +Uk +nh +EG +jp +UH +JW +hW +Vb +lx +jp +aA +nh +Zo +OD +OD +OD +OD +OD +OD +"} +(6,1,1) = {" +iC +hb +eZ +tS +jp +jp +eu +jp +jp +eu +SM +VF +SM +eu +jp +jp +eu +jp +OD +OD +OD +OD +OD +OD +"} +(7,1,1) = {" +YC +DQ +rj +hD +kt +Rc +Nf +XZ +kd +RV +sh +NF +lI +Go +yI +os +yf +Yi +OD +OD +OD +OD +OD +OD +"} +(8,1,1) = {" +jp +jp +jp +SM +jp +NJ +bw +XZ +XZ +tC +eZ +Ez +eZ +eZ +eZ +eZ +eZ +tS +OD +OD +OD +OD +OD +OD +"} +(9,1,1) = {" +Eu +PI +Bo +pX +qg +lP +rz +GH +FG +ke +Qj +cI +uP +cs +gn +gn +gn +oN +Si +OD +OD +OD +OD +OD +"} +(10,1,1) = {" +jp +jp +jp +yU +oA +oA +CS +SE +oA +oA +Gh +mm +eZ +eB +eZ +cz +Nw +ir +OD +OD +OD +OD +OD +OD +"} +(11,1,1) = {" +lc +Mx +Bo +gB +VA +uL +eZ +eZ +eZ +QV +hs +nZ +Yh +qe +aa +nd +Lm +HV +wF +qR +Bg +OD +OD +OD +"} +(12,1,1) = {" +jp +jp +jp +mS +jp +xj +QO +un +gL +eT +Sl +lJ +Sl +Sl +Sl +Zk +TX +Uv +mS +mU +le +vJ +Bg +mU +"} +(13,1,1) = {" +dO +dO +mU +Np +rB +Oe +kC +fA +pp +dp +QH +xJ +QH +DK +BF +Va +ya +IA +wF +qR +PK +PK +PK +Bg +"} +(14,1,1) = {" +dO +dO +mU +mU +jp +jp +jp +jp +jp +Kf +IP +RG +IP +PQ +jp +jp +jp +jp +jp +vJ +PK +PK +PK +Pm +"} +(15,1,1) = {" +dO +aj +aj +aj +mU +mU +eu +AZ +LT +Vi +zS +RK +rf +fH +nl +pO +jp +mU +mU +Fp +PK +PK +PK +Bg +"} +(16,1,1) = {" +aj +aj +aj +aj +mU +mU +Uq +yD +EK +dY +It +sY +It +up +LI +aK +jp +mU +mU +vJ +PK +PK +PK +Pm +"} +(17,1,1) = {" +aj +aj +aj +aj +mU +mU +Uq +yD +zI +eb +id +GL +SJ +kJ +lX +aD +jp +mU +mU +Fp +PK +PK +PK +Bg +"} +(18,1,1) = {" +aj +aj +aj +aj +mU +mU +Uq +yD +It +It +It +It +It +It +It +aK +jp +mU +mU +vJ +PK +PK +PK +Pm +"} +(19,1,1) = {" +aj +aj +aj +aj +mU +mU +eu +WA +Vr +th +th +SY +th +th +Vr +ME +jp +mU +mU +Fp +qA +qA +qA +Bg +"} +(20,1,1) = {" +aj +aj +aj +aj +Rp +Rp +jp +Rp +jp +jp +Rp +jp +Rp +jp +Rp +jp +Rp +nA +mU +mU +Fp +Pm +Fp +Pm +"} +(21,1,1) = {" +aj +aj +aj +dO +dO +nA +dO +nA +dO +dO +nA +dO +nA +dO +nA +dO +dO +nA +nA +dO +OD +OD +OD +OD +"} +(22,1,1) = {" +aj +aj +kb +kb +kb +nA +kb +kb +kb +kb +kb +kb +mC +kb +kb +kb +kb +kb +mC +dO +OD +OD +OD +OD +"} +(23,1,1) = {" +aj +aj +dO +nA +dO +dO +LX +LX +LX +LX +Fk +nA +nA +nA +nA +Fk +nA +dO +dO +dO +OD +OD +OD +OD +"} +(24,1,1) = {" +aj +aj +dO +nA +nA +nA +kb +kb +kb +kb +mC +kb +kb +kb +kb +mC +kb +kb +kb +dO +OD +OD +OD +OD +"} +(25,1,1) = {" +OD +aj +dO +dO +dO +dO +dO +dO +dO +dO +dO +dO +dO +dO +dO +dO +dO +dO +dO +dO +OD +OD +OD +OD +"} +(26,1,1) = {" +OD +OD +aj +dO +dO +dO +dO +dO +dO +dO +dO +dO +dO +dO +dO +dO +dO +OD +OD +OD +OD +OD +OD +OD +"} diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 65f2caf86ed80..b4d250e7d2baf 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -47,6 +47,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define RAD_PROTECT_CONTENTS_1 (1 << 15) /// should this object be allowed to be contaminated #define RAD_NO_CONTAMINATE_1 (1 << 16) +/// Prevents most radiation on this turf from leaving it +#define RAD_CONTAIN_CONTENTS (1<<17) //turf-only flags #define NOJAUNT_1 (1<<0) @@ -56,7 +58,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 /// Blocks lava rivers being generated on the turf #define NO_LAVA_GEN_1 (1<<6) /// Blocks ruins spawning on the turf -#define NO_RUINS_1 (1<<17) +#define NO_RUINS_1 (1<<18) //AREA FLAGS /// If blobs can spawn there and if it counts towards their score. diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 1368ae95820c3..408db118901af 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -21,6 +21,7 @@ #define INVESTIGATE_PRESENTS "presents" #define INVESTIGATE_VIROLOGY "viro" // yogs - Adds Investigate Virology #define INVESTIGATE_HYPERTORUS "hypertorus" +#define INVESTIGATE_REACTOR "reactor" // Logging types for log_message() #define LOG_ATTACK (1 << 0) diff --git a/code/__DEFINES/reactor.dm b/code/__DEFINES/reactor.dm new file mode 100644 index 0000000000000..1188ae516d822 --- /dev/null +++ b/code/__DEFINES/reactor.dm @@ -0,0 +1,59 @@ +// Index of each node in the list of nodes the reactor has +#define COOLANT_INPUT_GATE 1 +#define MODERATOR_INPUT_GATE 2 +#define COOLANT_OUTPUT_GATE 3 + +#define REACTOR_TEMPERATURE_MINIMUM 400 // Minimum temperature needed to run normally +#define REACTOR_TEMPERATURE_OPERATING 800 //Kelvin +#define REACTOR_TEMPERATURE_CRITICAL 1000 //At this point the entire station is alerted to a meltdown. This may need altering +#define REACTOR_TEMPERATURE_MELTDOWN 1200 + +#define REACTOR_HEAT_CAPACITY 6000 //How much thermal energy it takes to cool the reactor +#define REACTOR_ROD_HEAT_CAPACITY 400 //How much thermal energy it takes to cool each reactor rod +#define REACTOR_HEAT_EXPONENT 1.5 // The exponent used for the function for K heating +#define REACTOR_HEAT_FACTOR (20 / (REACTOR_HEAT_EXPONENT**2)) //How much heat from K + +#define REACTOR_NO_COOLANT_TOLERANCE 5 //How many process()ing ticks the reactor can sustain without coolant before slowly taking damage + +#define REACTOR_MODERATOR_DECAY_RATE 0.1 //Don't use up ALL of the moderator, engineers need it to last a full round + +#define REACTOR_PRESSURE_OPERATING 6000 //Kilopascals +#define REACTOR_PRESSURE_CRITICAL 10000 + +#define REACTOR_MAX_CRITICALITY 5 //No more criticality than N for now. +#define REACTOR_CRITICALITY_POWER_FACTOR 3000 // affects criticality from high power + +#define REACTOR_MAX_FUEL_RODS 5 //Maximum number of fuel rods that can fit in the reactor + +#define REACTOR_POWER_FLAVOURISER 1000 //To turn those KWs into something usable +#define REACTOR_PERMEABILITY_FACTOR 500 // How effective permeability-type moderators are +#define REACTOR_CONTROL_FACTOR 250 // How effective control-type moderators are + + +/// Moderator effects, must be added to the moderator input for them to do anything + +// Fuel types: increases power, at the cost of making K harder to control +#define PLASMA_FUEL_POWER 1 // baseline fuel +#define TRITIUM_FUEL_POWER 10 // woah there +#define ANTINOBLIUM_FUEL_POWER 100 // oh god oh fuck + +// Power types: makes the fuel have more of an effect +#define OXYGEN_POWER_MOD 1 // baseline power modifier gas, optimal plasma/O2 ratio is 50/50 if you can handle the K increase from the plasma +#define HYDROGEN_POWER_MOD 10 // far superior power moderator gas, if you can handle the rads + +// Control types: increases the effectiveness of control rods, makes K easier to control +#define NITROGEN_CONTROL_MOD 1 // good at controlling the reaction, but deadly rads +#define CARBON_CONTROL_MOD 2 // even better control, but even worse rads +#define PLUOXIUM_CONTROL_MOD 3 // best control gas, no rads! + +// Cooling types: increases the effectiveness of coolant, exchanges more heat per process +#define BZ_PERMEABILITY_MOD 1 // makes cooling more effective +#define WATER_PERMEABILITY_MOD 2 // even better than BZ +#define NOBLIUM_PERMEABILITY_MOD 10 // best gas for cooling + +// Radiation types: increases radiation, lower is better +#define NITROGEN_RAD_MOD 0.04 // mmm radiation +#define CARBON_RAD_MOD 0.08 // even higher +#define HYDROGEN_RAD_MOD 0.12 // getting a bit spicy there +#define TRITIUM_RAD_MOD 0.2 // fuck that's a lot +#define ANTINOBLIUM_RAD_MOD 10 // AAAAAAAAAAAAAAAAAAAA diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 23c2da40b3ca6..27cafa5a56f3c 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -12,6 +12,12 @@ #define CHANNEL_VOICE_ANNOUNCE 1015 #define CHANNEL_MEGAFAUNA 1014 // battle music #define CHANNEL_CHARGED_SPELL 1013 +#define CHANNEL_REACTOR_ALERT 1012 + +//THIS SHOULD ALWAYS BE THE LOWEST ONE! +//KEEP IT UPDATED + +#define CHANNEL_HIGHEST_AVAILABLE 1011 ///Default range of a sound. #define SOUND_RANGE 17 @@ -24,11 +30,6 @@ ///The default exponent of sound falloff #define SOUND_FALLOFF_EXPONENT 6 -//THIS SHOULD ALWAYS BE THE LOWEST ONE! -//KEEP IT UPDATED - -#define CHANNEL_HIGHEST_AVAILABLE 1013 - #define MAX_INSTRUMENT_CHANNELS (128 * 6) #define SOUND_MINIMUM_PRESSURE 10 diff --git a/code/__HELPERS/radiation.dm b/code/__HELPERS/radiation.dm index baa82c36acf89..5f12f846538b5 100644 --- a/code/__HELPERS/radiation.dm +++ b/code/__HELPERS/radiation.dm @@ -28,8 +28,13 @@ /proc/radiation_pulse(atom/source, intensity, range_modifier, log=FALSE, can_contaminate=TRUE, collectable_radiation = TRUE) if(!SSradiation.can_fire) return - for(var/dir in GLOB.cardinals) - new /datum/radiation_wave(source, dir, intensity, range_modifier, can_contaminate, collectable_radiation) + if(source && (source.flags_1 & RAD_CONTAIN_CONTENTS)) + return + if(source?.loc && (source.loc.flags_1 & RAD_CONTAIN_CONTENTS)) + return + if(intensity >= RAD_BACKGROUND_RADIATION) + for(var/dir in GLOB.cardinals) + new /datum/radiation_wave(source, dir, intensity, range_modifier, can_contaminate, collectable_radiation) var/list/things = get_rad_contents(source) //copypasta because I don't want to put special code in waves to handle their origin for(var/k in 1 to things.len) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 873f4e7f7d87f..a4aee22a3aa7a 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -4,6 +4,7 @@ GLOBAL_LIST_EMPTY(airlocks) //list of all airlocks GLOBAL_LIST_EMPTY(mechas_list) //list of all mechs. Used by hostile mobs target tracking. GLOBAL_LIST_EMPTY(shuttle_caller_list) //list of all communication consoles and AIs, for automatic shuttle calls when there are none. GLOBAL_LIST_EMPTY(machines) //NOTE: this is a list of ALL machines now. The processing machines list is SSmachine.processing ! +GLOBAL_LIST_EMPTY(lights) //list of all light bulbs GLOBAL_LIST_EMPTY(navigation_computers) //list of all /obj/machinery/computer/camera_advanced/shuttle_docker GLOBAL_LIST_EMPTY(syndicate_shuttle_boards) //important to keep track of for managing nukeops war declarations. GLOBAL_LIST_EMPTY(navbeacons) //list of all bot nagivation beacons, used for patrolling. diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 27a857368a146..31b9e68c1d8fe 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -850,3 +850,18 @@ ) result = /obj/item/reagent_containers/food/snacks/bait/wild category = CAT_BAIT + +// It can't run without fuel rods (cargo only) so this shouldn't be a problem +/datum/crafting_recipe/reactor_frame + name = "Nuclear Reactor Frame" + reqs = list( + /obj/item/stack/sheet/plasteel = 20, + /obj/item/stack/sheet/metal = 50, + /obj/item/stack/cable_coil = 10, + /obj/item/pipe = 3, + /obj/item/electronics/advanced_airlock_controller = 1 + ) + tool_behaviors = list(TOOL_WELDER) + result = /obj/structure/reactor_frame + category = CAT_STRUCTURES + time = 10 SECONDS diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 1caefc8eda385..4cb6f486d4c85 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -814,6 +814,10 @@ * Default behaviour is to send COMSIG_ATOM_RAD_ACT and return */ /atom/proc/rad_act(strength, collectable_radiation) + if(flags_1 & RAD_CONTAIN_CONTENTS) + return + if(loc && (loc.flags_1 & RAD_CONTAIN_CONTENTS)) + return SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, strength, collectable_radiation) /** diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index bd5bf80cb3463..bdeefcf376c6a 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -73,6 +73,7 @@ desc = "A crate with a lock on it, painted in the scheme of the station's engineers." name = "secure engineering crate" icon_state = "engi_secure_crate" + flags_1 = RAD_CONTAIN_CONTENTS // rad-insulated /obj/structure/closet/crate/secure/science name = "secure science crate" diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 60f018208f85c..e673d0da3dc70 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -10,7 +10,7 @@ if(!holder) return - var/list/investigates = list(INVESTIGATE_RESEARCH, INVESTIGATE_EXONET, INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_RADIATION, INVESTIGATE_NANITES, INVESTIGATE_PRESENTS, INVESTIGATE_VIROLOGY, INVESTIGATE_HYPERTORUS) //Yogs - investigate virology + var/list/investigates = list(INVESTIGATE_RESEARCH, INVESTIGATE_EXONET, INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_RADIATION, INVESTIGATE_NANITES, INVESTIGATE_PRESENTS, INVESTIGATE_VIROLOGY, INVESTIGATE_HYPERTORUS, INVESTIGATE_REACTOR) //Yogs - investigate virology var/list/logs_present = list("notes, memos, watchlist") var/list/logs_missing = list("---") diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index 2f213ce0464ad..95ca4b6660344 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -8,6 +8,7 @@ var/list/datum/pipeline/parents var/list/datum/gas_mixture/airs + var/startingvolume = 200 /obj/machinery/atmospherics/components/New() parents = new(device_type) @@ -16,7 +17,7 @@ ..() for(var/i in 1 to device_type) - var/datum/gas_mixture/A = new(200) + var/datum/gas_mixture/A = new(startingvolume) airs[i] = A // Iconnery diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 38990b7b3893c..aa2ef33a253ce 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1234,6 +1234,43 @@ crate_type = /obj/structure/closet/crate/secure/engineering dangerous = TRUE +/datum/supply_pack/engine/fuel_rod_basic + name = "Uranium-235 Fuel Rods Crate" + desc = "Contains 5 Enriched Uranium Control Rods." + cost = 5000 + contains = list(/obj/item/fuel_rod, + /obj/item/fuel_rod, + /obj/item/fuel_rod, + /obj/item/fuel_rod, + /obj/item/fuel_rod) + crate_name = "Uranium-235 Fuel Rods" + crate_type = /obj/structure/closet/crate/radiation + +/datum/supply_pack/engine/fuel_rod_plutonium + name = "Plutonium-239 Fuel Rods Crate" + desc = "Contains 5 Plutonium-239 Control Rods." + cost = 15000 + contains = list(/obj/item/fuel_rod/plutonium, + /obj/item/fuel_rod/plutonium, + /obj/item/fuel_rod/plutonium, + /obj/item/fuel_rod/plutonium, + /obj/item/fuel_rod/plutonium) + crate_name = "Plutonium-239 Fuel Rods" + crate_type = /obj/structure/closet/crate/radiation + +/datum/supply_pack/engine/fuel_rod_bananium + name = "Bananium Fuel Rods Crate" + desc = "Contains 5 Bananium Control Rods." + cost = 15000 + contraband = TRUE + contains = list(/obj/item/fuel_rod/material/bananium, + /obj/item/fuel_rod/material/bananium, + /obj/item/fuel_rod/material/bananium, + /obj/item/fuel_rod/material/bananium, + /obj/item/fuel_rod/material/bananium) + crate_name = "Bananium Fuel Rods" + crate_type = /obj/structure/closet/crate/radiation + ////////////////////////////////////////////////////////////////////////////// /////////////////////// Canisters & Materials //////////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/modular_computers/computers/item/pda/pda_presets.dm b/code/modules/modular_computers/computers/item/pda/pda_presets.dm index bc3cb7c3956d7..13bebc619a9fd 100644 --- a/code/modules/modular_computers/computers/item/pda/pda_presets.dm +++ b/code/modules/modular_computers/computers/item/pda/pda_presets.dm @@ -43,6 +43,7 @@ starting_files |= list( new /datum/computer_file/program/alarm_monitor, new /datum/computer_file/program/supermatter_monitor, + new /datum/computer_file/program/nuclear_monitor, new /datum/computer_file/program/power_monitor ) . = ..() @@ -82,7 +83,8 @@ starting_files |= list( new /datum/computer_file/program/atmosscan, new /datum/computer_file/program/alarm_monitor, - new /datum/computer_file/program/supermatter_monitor + new /datum/computer_file/program/supermatter_monitor, + new /datum/computer_file/program/nuclear_monitor ) . = ..() diff --git a/code/modules/modular_computers/computers/item/phone/phone_presets.dm b/code/modules/modular_computers/computers/item/phone/phone_presets.dm index a799ef900c58f..cadef4f926826 100644 --- a/code/modules/modular_computers/computers/item/phone/phone_presets.dm +++ b/code/modules/modular_computers/computers/item/phone/phone_presets.dm @@ -70,7 +70,10 @@ starting_files = list( new /datum/computer_file/program/budgetorders, new /datum/computer_file/program/card_mod, - new /datum/computer_file/program/alarm_monitor) + new /datum/computer_file/program/alarm_monitor, + new /datum/computer_file/program/supermatter_monitor, + new /datum/computer_file/program/nuclear_monitor, + new /datum/computer_file/program/energy_harvester_control) finish_color = "orange" /obj/item/modular_computer/tablet/phone/preset/advanced/command/rd diff --git a/code/modules/modular_computers/computers/machinery/console/console_presets.dm b/code/modules/modular_computers/computers/machinery/console/console_presets.dm index 2ea5d77ced5cf..c475a3d2109c4 100644 --- a/code/modules/modular_computers/computers/machinery/console/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console/console_presets.dm @@ -30,6 +30,7 @@ desc = "A stationary computer. This one comes preloaded with engineering programs." starting_files = list( new /datum/computer_file/program/power_monitor, new /datum/computer_file/program/alarm_monitor, + new /datum/computer_file/program/nuclear_monitor, new /datum/computer_file/program/supermatter_monitor) initial_program = /datum/computer_file/program/power_monitor @@ -145,6 +146,7 @@ new /datum/computer_file/program/card_mod, new /datum/computer_file/program/power_monitor, new /datum/computer_file/program/alarm_monitor, + new /datum/computer_file/program/nuclear_monitor, new /datum/computer_file/program/supermatter_monitor, new /datum/computer_file/program/energy_harvester_control) diff --git a/code/modules/modular_computers/file_system/programs/engineering/reactor_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/reactor_monitor.dm new file mode 100644 index 0000000000000..69d6659eb627a --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/engineering/reactor_monitor.dm @@ -0,0 +1,131 @@ +//I love nuclear energy!!!!! +/datum/computer_file/program/nuclear_monitor + filename = "agcnrmonitor" + filedesc = "Nuclear Reactor Monitoring" + category = PROGRAM_CATEGORY_ENGI + ui_header = "smmon_0.gif" + program_icon_state = "smmon_0" + extended_desc = "This program connects to specially calibrated sensors to provide information on the status of nuclear reactors." + requires_ntnet = TRUE + transfer_access = ACCESS_ENGINE + program_icon = "radiation" // duh + //network_destination = "reactor monitoring system" dont need anymore? + size = 2 + tgui_id = "NtosReactorStats" + var/active = TRUE //Easy process throttle + var/next_stat_interval = 0 + var/list/kpaData = list() + var/list/powerData = list() + var/list/tempCoreData = list() + var/list/tempInputData = list() + var/list/tempOutputData = list() + var/list/reactors + var/obj/machinery/atmospherics/components/trinary/nuclear_reactor/reactor //Our reactor. + +/datum/computer_file/program/nuclear_monitor/process_tick() + ..() + if(!reactor || !active) + return FALSE + var/stage = 0 + switch(reactor.temperature) + if(0 to REACTOR_TEMPERATURE_MINIMUM) + stage = 1 + if(REACTOR_TEMPERATURE_MINIMUM to REACTOR_TEMPERATURE_OPERATING) + stage = 2 + if(REACTOR_TEMPERATURE_OPERATING to REACTOR_TEMPERATURE_CRITICAL) + stage = 3 + if(REACTOR_TEMPERATURE_CRITICAL to REACTOR_TEMPERATURE_MELTDOWN) + stage = 4 + if(REACTOR_TEMPERATURE_MELTDOWN to INFINITY) + stage = 5 + if(reactor.vessel_integrity <= 100) //Bye bye! GET OUT! + stage = 6 + ui_header = "smmon_[stage].gif" + program_icon_state = "smmon_[stage]" + if(istype(computer)) + computer.update_appearance(UPDATE_ICON) + +// Refreshes list of active reactors, stolen from SM monitor code +/datum/computer_file/program/nuclear_monitor/proc/refresh() + reactors = list() + var/turf/T = get_turf(ui_host()) + if(!T) + return + for(var/obj/machinery/atmospherics/components/trinary/nuclear_reactor/N in GLOB.machines) + if(!isturf(N.loc) || !(is_station_level(N.z) || is_mining_level(N.z) || N.z == T.z)) + continue + reactors.Add(N) + + if(!(reactor in reactors)) + reactor = null + +/datum/computer_file/program/nuclear_monitor/run_program(mob/living/user) + . = ..(user) + //No reactor? Go find one then. + if(!(reactor in GLOB.machines)) + reactor = null + refresh() + active = TRUE + +/datum/computer_file/program/nuclear_monitor/kill_program(forced = FALSE) + active = FALSE + ..() + +/datum/computer_file/program/nuclear_monitor/ui_data() + var/list/data = get_header_data() + if(istype(reactor)) + if(!get_turf(reactor)) + reactor = null + refresh() + return + data["powerData"] = reactor.powerData + data["kpaData"] = reactor.kpaData + data["tempCoreData"] = reactor.tempCoreData + data["tempInputData"] = reactor.tempInputData + data["tempOutputData"] = reactor.tempOutputData + data["coreTemp"] = reactor.temperature + data["coolantInput"] = reactor.last_coolant_temperature + data["coolantOutput"] = reactor.last_output_temperature + data["power"] = reactor.last_power_produced + data["kpa"] = reactor.pressure + data["k"] = reactor.K + data["integrity"] = reactor.get_integrity() + data["selected"] = TRUE + else + var/list/reactor_data = list() + var/next_uid = 0 + for(var/obj/machinery/atmospherics/components/trinary/nuclear_reactor/N as anything in reactors) + var/area/A = get_area(N) + next_uid++ + if(A) + reactor_data.Add(list(list( + "area_name" = A.name, + "integrity" = N.get_integrity(), + "uid" = next_uid + ))) + data["selected"] = FALSE + data["reactors"] = reactor_data + return data + +/datum/computer_file/program/nuclear_monitor/ui_act(action, params) + if(..()) + return TRUE + + switch(action) + if("PRG_clear") + reactor = null + return TRUE + if("PRG_refresh") + refresh() + return TRUE + if("PRG_set") + var/new_id = text2num(params["target"]) + if(new_id < 1 || new_id > reactors.len) + return TRUE + reactor = reactors[new_id] + powerData = list() + kpaData = list() + tempCoreData = list() + tempInputData = list() + tempOutputData = list() + return TRUE diff --git a/code/modules/pool/pool.dm b/code/modules/pool/pool.dm index 5580d9c4abd76..d9021beac0c65 100644 --- a/code/modules/pool/pool.dm +++ b/code/modules/pool/pool.dm @@ -22,6 +22,7 @@ Place a pool filter somewhere in the pool if you want people to be able to modif icon = 'icons/obj/pool.dmi' icon_state = "pool" sound = 'sound/effects/splash.ogg' + flags_1 = CAN_BE_DIRTY_1|RAD_CONTAIN_CONTENTS // contains most of the rads on the tile within that tile var/id = null //Set me if you don't want the pool and the pump to be in the same area, or you have multiple pools per area. var/obj/effect/water_overlay = null diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 53a5d30b2f589..3e742c88e3b44 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -305,6 +305,7 @@ // create a new lighting fixture /obj/machinery/light/Initialize(mapload) . = ..() + GLOB.lights += src RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean_light)) if(!mapload) //sync up nightshift lighting for player made lights @@ -332,6 +333,7 @@ update(0) /obj/machinery/light/Destroy() + GLOB.lights.Remove(src) var/area/A = get_area(src) if(A) on = FALSE && !forced_off diff --git a/code/modules/power/reactor/fuel_rods.dm b/code/modules/power/reactor/fuel_rods.dm new file mode 100644 index 0000000000000..0f9c3c85506eb --- /dev/null +++ b/code/modules/power/reactor/fuel_rods.dm @@ -0,0 +1,234 @@ +/obj/item/fuel_rod + name = "uranium-235 fuel rod" + desc = "A titanium sheathed rod containing a measure of enriched uranium-dioxide powder inside, and a breeding blanket of uranium-238 around it, used to kick off a fission reaction and breed plutonium fuel respectivly." + icon = 'icons/obj/control_rod.dmi' + icon_state = "irradiated" + w_class = WEIGHT_CLASS_BULKY + var/depletion = 0 //Each fuel rod will deplete in around 30 minutes. + var/fuel_power = 0.10 + var/rad_strength = 500 + var/half_life = 2000 // how many depletion ticks are needed to half the fuel_power (1 tick = 1 second) + var/time_created = 0 + var/process = FALSE + // The depletion where depletion_final() will be called (and does something) + var/depletion_threshold = 100 + var/depleted_final = FALSE // depletion_final should run only once + var/depletion_conversion_type = /obj/item/fuel_rod/plutonium + +/obj/item/fuel_rod/Initialize(mapload) + . = ..() + time_created = world.time + AddComponent(/datum/component/radioactive, rad_strength, src, half_life) // This should be temporary for it won't make rads go lower than 350 + if(process) + START_PROCESSING(SSobj, src) + +/obj/item/fuel_rod/Destroy() + if(process) + STOP_PROCESSING(SSobj, src) + var/obj/machinery/atmospherics/components/trinary/nuclear_reactor/N = loc + if(istype(N)) + N.fuel_rods -= src + . = ..() + +// Converts a fuel rod into a given type +/obj/item/fuel_rod/proc/depletion_final(result_rod) + if(!result_rod) + return FALSE + var/obj/machinery/atmospherics/components/trinary/nuclear_reactor/N = loc + // Right now there's no reason rods should deplete outside a reactor + if(istype(N)) + var/obj/item/fuel_rod/R = new result_rod(loc) + if(istype(R, /obj/item/fuel_rod)) // if it's not even a fuel rod then what the fuck are we doing here + R.depletion = depletion + R.fuel_power = fuel_power // conservation of energy + N.fuel_rods += R + qdel(src) + return TRUE + else + stack_trace("Invalid fuel rod type: [R.type]") + return FALSE + +/obj/item/fuel_rod/proc/deplete(amount=0.035) + depletion += amount + if(depletion >= depletion_threshold && !depleted_final) // set whether or not it's depleted + depleted_final = depletion_final(depletion_conversion_type) + +/obj/item/fuel_rod/plutonium + fuel_power = 0.20 + name = "plutonium-239 fuel rod" + desc = "A highly energetic titanium sheathed rod containing a sizeable measure of weapons grade plutonium, it's highly efficient as nuclear fuel, but will cause the reaction to get out of control if not properly utilised." + icon_state = "inferior" + rad_strength = 1500 + process = TRUE // for half life code + depletion_threshold = 300 + depletion_conversion_type = /obj/item/fuel_rod/depleted + +/obj/item/fuel_rod/process(delta_time) + fuel_power *= 0.5**(delta_time / half_life) // halves the fuel power every half life (33 minutes) + +/obj/item/fuel_rod/depleted + fuel_power = 0.05 + name = "depleted fuel rod" + desc = "A highly radioactive fuel rod which has expended most of its useful energy." + icon_state = "normal" + rad_strength = 6000 // smelly + depletion_conversion_type = null // It means that it won't turn into anything + process = TRUE + +// Master type for material optional (or requiring, wyci) and/or producing rods +/obj/item/fuel_rod/material + // Whether the rod has been harvested. Should be set in expend(). + var/expended = FALSE + // The material that will be inserted and then multiplied (or not). Should be some sort of /obj/item/stack + var/material_type + // The name of material that'll be used for texts + var/material_name + var/material_name_singular + var/initial_amount = 0 + // The maximum amount of material the rod can hold + var/max_initial_amount = 10 + var/grown_amount = 0 + // The multiplier for growth. 1 for the same 2 for double etc etc + var/multiplier = 2 + // After this depletion, you won't be able to add new materials + var/material_input_deadline = 25 + // Material fuel rods generally don't get converted into another fuel object + depletion_conversion_type = null + +/obj/item/fuel_rod/material/Initialize(mapload) + . = ..() + var/obj/item/stack/S = new material_type() + material_name = S.name + material_name_singular = S.singular_name + qdel(S) + +// Called when the rod is fully harvested +/obj/item/fuel_rod/material/proc/expend() + expended = TRUE + +// Basic checks for material rods +/obj/item/fuel_rod/material/proc/check_material_input(mob/user) + if(depletion >= material_input_deadline) + to_chat(user, "The sample slots have sealed themselves shut, it's too late to add [material_name] now!") // no cheesing in crystals at 100% + return FALSE + if(expended) + to_chat(user, "\The [src]'s material slots have already been used.") + return FALSE + return TRUE + +// The actual growth +/obj/item/fuel_rod/material/depletion_final(result_rod) + if(result_rod) + return ..() // So if you put anything into depletion_conversion_type then your fuel rod will be converted (or not) and *won't grow* + grown_amount = initial_amount * multiplier + return TRUE + +/obj/item/fuel_rod/material/attackby(obj/item/W, mob/user, params) + var/obj/item/stack/sheet/M = W + if(!material_type && istype(M)) + material_type = M.type + if(istype(M, material_type)) + if(!check_material_input(user)) + return + if(initial_amount < max_initial_amount) + var/adding = min((max_initial_amount - initial_amount), M.amount) + M.amount -= adding + initial_amount += adding + if (adding == 1) + to_chat(user, "You insert [adding] [material_name_singular] into \the [src].") + else + to_chat(user, "You insert [adding] [material_name] into \the [src].") + M.zero_amount() + else + to_chat(user, "\The [src]'s material slots are full!") + return + else + return ..() + +/obj/item/fuel_rod/material/attack_self(mob/user) + if(expended) + to_chat(user, "You have already removed [material_name] from \the [src].") + return + + if(depleted_final) + new material_type(user.loc, grown_amount) + if (grown_amount == 1) + to_chat(user, "You harvest [grown_amount] [material_name_singular] from \the [src].") // Unlikely + else + to_chat(user, "You harvest [grown_amount] [material_name] from \the [src].") + playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) + grown_amount = 0 + expend() + else if(depletion) + to_chat(user, "\The [src] has not fissiled enough to fully grow the sample. The progress bar shows it is [min(depletion/depletion_threshold*100,100)]% complete.") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) + else if(initial_amount) + new material_type(user.loc, initial_amount) + if (initial_amount == 1) + to_chat(user, "You remove [initial_amount] [material_name_singular] from \the [src].") + else + to_chat(user, "You remove [initial_amount] [material_name] from \the [src].") + playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) + initial_amount = 0 + +/obj/item/fuel_rod/material/examine(mob/user) + . = ..() + if(material_type) + if(expended) + . += "The material slots have been slagged by the extreme heat, you can't grow [material_name] in this rod again..." + return + else if(depleted_final) + . += "This fuel rod's [material_name] are now fully grown, and it currently bears [grown_amount] harvestable [material_name_singular]\s." + return + if(depletion) + . += "The sample is [min(depletion/depletion_threshold*100,100)]% fissiled." + . += "[initial_amount]/[max_initial_amount] of the slots for [material_name] are full." + else + . += "This rod is ready for material breeding" + +/obj/item/fuel_rod/material/telecrystal + name = "telecrystal fuel rod" + desc = "A disguised titanium sheathed rod containing several small slots infused with uranium dioxide. Permits the insertion of telecrystals to grow more. Fissiles much faster than its standard counterpart" + icon_state = "telecrystal" + fuel_power = 0.30 // twice as powerful as a normal rod, you're going to need some engineering autism if you plan to mass produce TC + depletion_threshold = 33 // otherwise it takes two hours + rad_strength = 1500 + max_initial_amount = 8 + multiplier = 3 + material_type = /obj/item/stack/telecrystal + +/obj/item/fuel_rod/material/telecrystal/depletion_final(result_rod) + if(..()) + return TRUE + fuel_power = 0.60 // thrice as powerful as plutonium, you'll want to get this one out quick! + name = "exhausted telecrystal fuel rod" + desc = "A highly energetic, disguised titanium sheathed rod containing a number of slots filled with greatly expanded telecrystals which can be removed by hand. It's extremely efficient as nuclear fuel, but will cause the reaction to get out of control if not properly utilised." + icon_state = "telecrystal_used" + AddComponent(/datum/component/radioactive, 3000, src) + return FALSE + +/obj/item/fuel_rod/material/bananium + name = "bananium fuel rod" + desc = "A hilarious heavy-duty fuel rod which fissiles a bit slower than its cowardly counterparts. However, its cutting-edge cosmic clown technology allows rooms for extraordinarily exhilarating extraterrestrial element called bananium to menacingly multiply." + icon_state = "bananium" + fuel_power = 0.15 + depletion_threshold = 33 + rad_strength = 350 + max_initial_amount = 10 + multiplier = 3 + material_type = /obj/item/stack/sheet/mineral/bananium + +/obj/item/fuel_rod/material/bananium/deplete(amount=0.035) + ..() + if(initial_amount == max_initial_amount && prob(10)) + playsound(src, pick('sound/items/bikehorn.ogg'), 50) // HONK + +/obj/item/fuel_rod/material/bananium/depletion_final(result_rod) + if(..()) + return TRUE + fuel_power = 0.3 // Be warned + name = "fully grown bananium fuel rod" + desc = "A hilarious heavy-duty fuel rod which fissiles a bit slower than it cowardly counterparts. Its greatly grimacing growth stage is now over, and bananium outgrowth hums as if it's blatantly honking bike horns." + icon_state = "bananium_used" + AddComponent(/datum/component/radioactive, 1250, src) + return FALSE diff --git a/code/modules/power/reactor/reactor.dm b/code/modules/power/reactor/reactor.dm new file mode 100644 index 0000000000000..6f51eccb60162 --- /dev/null +++ b/code/modules/power/reactor/reactor.dm @@ -0,0 +1,1097 @@ +/// See code/__DEFINES/reactor.dm for all the defines used + +//Remember kids. If the reactor itself is not physically powered by an APC, it cannot shove coolant in! + +//Helper proc to set a new looping ambience, and play it to any mobs already inside of that area. + + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor + name = "\improper Advanced Gas-Cooled Nuclear Reactor" + desc = "A tried and tested design which can output stable power at an acceptably low risk. The moderator can be changed to provide different effects." + icon = 'icons/obj/machines/reactor.dmi' + icon_state = "reactor_map" + pixel_x = -32 + pixel_y = -32 + density = FALSE //It burns you if you're stupid enough to walk over it. + anchored = TRUE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF + light_color = LIGHT_COLOR_CYAN + dir = 2 //Less headache inducing + startingvolume = 600 // 3x base + var/id = null //Change me mappers + //Variables essential to operation + var/active = FALSE + var/temperature = T20C //Lose control of this -> Meltdown + var/vessel_integrity = 400 //How long can the reactor withstand overpressure / meltdown? This gives you a fair chance to react to even a massive pipe fire + var/pressure = 0 //Lose control of this -> Blowout + var/K = 0 //Rate of reaction. + var/desired_k = 0 + var/control_rod_effectiveness = 0.65 //Starts off with a lot of control over K. If you flood this thing with plasma, you lose your ability to control K as easily. + var/power = 0 //0-100%. A function of the maximum heat you can achieve within operating temperature + var/power_modifier = 1 //Upgrade me with parts, science! Flat out increase to physical power output when loaded with plasma. + var/list/fuel_rods = list() + //Secondary variables. + var/gas_absorption_effectiveness = 0.5 + var/gas_absorption_constant = 0.5 //We refer to this one as it's set on init, randomized. + var/minimum_coolant_level = MINIMUM_MOLE_COUNT + var/next_warning = 0 //To avoid spam. + var/last_power_produced = 0 //For logging purposes + var/next_flicker = 0 //Light flicker timer + var/base_power_modifier = REACTOR_POWER_FLAVOURISER + var/slagged = FALSE //Is this reactor even usable any more? + //Console statistics. + var/last_coolant_temperature = 0 + var/last_output_temperature = 0 + var/last_heat_delta = 0 //For administrative cheating only. Knowing the delta lets you know EXACTLY what to set K at. + var/no_coolant_ticks = 0 //How many times in succession did we not have enough coolant? Decays twice as fast as it accumulates. + var/last_user = null + var/current_desired_k = null + var/datum/powernet/powernet = null + var/obj/item/radio/radio + var/key_type = /obj/item/encryptionkey/headset_eng + //Which channels should it broadcast to? + var/engi_channel = RADIO_CHANNEL_ENGINEERING + var/crew_channel = RADIO_CHANNEL_COMMON + + var/has_hit_emergency = FALSE + var/evacuation_procedures = FALSE + + //Data, because graphs are cool + var/list/kpaData = list() + var/list/powerData = list() + var/list/tempCoreData = list() + var/list/tempInputData = list() + var/list/tempOutputData = list() + +//Use this in your maps if you want everything to be preset. +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/preset + id = "default_reactor_for_lazy_mappers" + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/syndie_base + id = "syndie_base_reactor" + // uses syndicate comms + engi_channel = RADIO_CHANNEL_SYNDICATE + crew_channel = RADIO_CHANNEL_SYNDICATE + key_type = /obj/item/encryptionkey/syndicate + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/New() + . = ..() + if(isnull(id)) + id = getnewid() + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/get_integrity() + return round(100 * vessel_integrity / initial(vessel_integrity), 0.01) + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/examine(mob/user) + . = ..() + if(Adjacent(src, user) || isobserver(user)) + var/msg + if(slagged) + msg = span_boldwarning("The reactor is destroyed. Its core lies exposed!") + else + msg = span_warning("The reactor looks operational.") + switch(get_integrity()) + if(0 to 10) + msg = span_boldwarning("[src]'s seals are dangerously warped and you can see cracks all over the reactor vessel!") + if(10 to 40) + msg = span_boldwarning("[src]'s seals are heavily warped and cracked!") + if(40 to 60) + msg = span_warning("[src]'s seals are holding, but barely. You can see some micro-fractures forming in the reactor vessel.") + if(60 to 80) + msg = span_warning("[src]'s seals are in-tact, but slightly worn. There are no visible cracks in the reactor vessel.") + if(80 to 90) + msg = span_notice("[src]'s seals are in good shape, and there are no visible cracks in the reactor vessel.") + if(95 to 100) + msg = span_notice("[src]'s seals look factory new, and the reactor's in excellent shape.") + . += msg + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/fuel_rod)) + return try_insert_fuel(W, user) + if(istype(W, /obj/item/sealant)) + if(slagged) + to_chat(user, span_warning("The reactor has been critically damaged!")) + return FALSE + if(temperature > REACTOR_TEMPERATURE_MINIMUM) + to_chat(user, span_warning("You cannot repair [src] while the core temperature is above [REACTOR_TEMPERATURE_MINIMUM] kelvin.")) + return FALSE + if(vessel_integrity >= 350) + to_chat(user, span_warning("[src]'s seals are already in-tact, repairing them further would require a new set of seals.")) + return FALSE + if(get_integrity() <= 50) //Heavily damaged. + to_chat(user, span_warning("[src]'s reactor vessel is cracked and worn, you need to repair the cracks with a welder before you can repair the seals.")) + return FALSE + while(do_after(user, 1 SECONDS, target=src)) + playsound(src, 'sound/effects/spray2.ogg', 50, 1, -6) + vessel_integrity += 10 + vessel_integrity = clamp(vessel_integrity, 0, initial(vessel_integrity)) + if(vessel_integrity >= 350) // Check if it's done + to_chat(user, span_warning("[src]'s seals are already in-tact, repairing them further would require a new set of seals.")) + return FALSE + user.visible_message(span_warning("[user] applies sealant to some of [src]'s worn out seals."), span_notice("You apply sealant to some of [src]'s worn out seals.")) + return TRUE + return ..() + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/MouseDrop_T(atom/A, mob/living/user) + if(user.incapacitated()) + return + if(!user.IsAdvancedToolUser()) + to_chat(user, span_warning("You don't have the dexterity to do this!")) + return + if(istype(A, /obj/item/fuel_rod)) + try_insert_fuel(A, user) + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/try_insert_fuel(obj/item/fuel_rod/rod, mob/user) + if(!istype(rod)) + return FALSE + if(slagged) + to_chat(user, span_warning("The reactor has been critically damaged")) + return FALSE + if(temperature > REACTOR_TEMPERATURE_MINIMUM) + to_chat(user, span_warning("You cannot insert fuel into [src] with the core temperature above [REACTOR_TEMPERATURE_MINIMUM] kelvin.")) + return FALSE + if(fuel_rods.len >= REACTOR_MAX_FUEL_RODS) + to_chat(user, span_warning("[src] is already at maximum fuel load.")) + return FALSE + to_chat(user, span_notice("You start to insert [rod] into [src]...")) + radiation_pulse(src, temperature) + if(do_after(user, 2 SECONDS, target=src)) + fuel_rods += rod + rod.forceMove(src) + radiation_pulse(src, temperature) //Wear protective equipment when even breathing near a reactor! + investigate_log("Rod added to reactor by [key_name(user)] at [AREACOORD(src)]", INVESTIGATE_REACTOR) + return TRUE + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/crowbar_act(mob/living/user, obj/item/I) + if(slagged) + to_chat(user, span_warning("The fuel rods have melted into a radioactive lump.")) + var/removal_time = 5 SECONDS + if(temperature > REACTOR_TEMPERATURE_MINIMUM) + if(istype(I, /obj/item/jawsoflife)) // Snatch the reactor from the jaws of death! + removal_time *= 2 + else + to_chat(user, span_warning("You can't remove fuel rods while the reactor is operating above [REACTOR_TEMPERATURE_MINIMUM] kelvin!")) + return TRUE + if(!has_fuel()) + to_chat(user, span_notice("The reactor has no fuel rods!")) + return TRUE + var/obj/item/fuel_rod/rod = tgui_input_list(usr, "Select a fuel rod to remove", "Fuel Rods", fuel_rods) + if(rod && istype(rod) && I.use_tool(src, user, removal_time)) + if(temperature > REACTOR_TEMPERATURE_MINIMUM) + var/turf/T = get_turf(src) + T.atmos_spawn_air("water_vapor=[pressure/100];TEMP=[temperature]") + user.rad_act(rod.fuel_power * 1000) + fuel_rods.Remove(rod) + if(!user.put_in_hands(rod)) + rod.forceMove(user.loc) + return TRUE + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/welder_act(mob/living/user, obj/item/I) + if(slagged) + to_chat(user, span_warning("The reactor has been critically damaged")) + return TRUE + if(temperature > REACTOR_TEMPERATURE_MINIMUM) + to_chat(user, span_warning("You can't repair [src] while it is running at above [REACTOR_TEMPERATURE_MINIMUM] kelvin.")) + return TRUE + if(get_integrity() > 50) + to_chat(user, span_warning("[src] is free from cracks. Further repairs must be carried out with flexi-seal sealant.")) + return TRUE + while(I.use_tool(src, user, 1 SECONDS, volume=40)) + vessel_integrity += 20 + if(get_integrity() > 50) + to_chat(user, span_warning("[src] is free from cracks. Further repairs must be carried out with flexi-seal sealant.")) + return TRUE + to_chat(user, span_notice("You weld together some of [src]'s cracks. This'll do for now.")) + return TRUE + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/multitool_act(mob/living/user, obj/item/multitool/I) + if(istype(I)) + to_chat(user, "You add \the [src]'s ID into the multitool's buffer.") + I.buffer = src + return TRUE + +//Admin procs to mess with the reaction environment. + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/lazy_startup() + for(var/I=0;I<5;I++) + fuel_rods += new /obj/item/fuel_rod(src) + message_admins("Reactor started up by admins in [ADMIN_VERBOSEJMP(src)]") + start_up() + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/deplete() + for(var/obj/item/fuel_rod/FR in fuel_rods) + FR.depletion = 100 + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/Initialize(mapload) + . = ..() + icon_state = "reactor_off" + gas_absorption_effectiveness = rand(5, 6)/10 //All reactors are slightly different. This will result in you having to figure out what the balance is for K. + gas_absorption_constant = gas_absorption_effectiveness //And set this up for the rest of the round. + + radio = new(src) + radio.keyslot = new key_type(radio) + radio.subspace_transmission = TRUE + radio.use_command = TRUE + radio.canhear_range = 0 + radio.recalculateChannels() + + STOP_PROCESSING(SSmachines, src) //We'll handle this one ourselves. + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/LateInitialize() + . = ..() + connect_to_network() + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/Crossed(atom/movable/AM, oldloc) + . = ..() + if(isliving(AM) && temperature > T0C) + var/mob/living/L = AM + L.adjust_bodytemperature(clamp(temperature, BODYTEMP_COOLING_MAX, BODYTEMP_HEATING_MAX)) //If you're on fire, you heat up! + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/process() + // Make some power! + var/turf/T = get_turf(src) + var/obj/structure/cable/C = T.get_cable_node() + if(C?.powernet) + add_avail(last_power_produced) + else + connect_to_network() + + // You're overloading the reactor. Give a more subtle warning that power is getting out of control. + if(power >= 100 && world.time >= next_flicker) + next_flicker = world.time + 1.5 MINUTES + for(var/obj/machinery/light/L in GLOB.lights) + if(prob(25) && L.z == z) //If youre running the reactor cold though, no need to flicker the lights. + L.flicker() + investigate_log("Reactor overloading at [power]% power", INVESTIGATE_REACTOR) + + // Meltdown this, blowout that, I just wanna grill for god's sake! + for(var/atom/movable/I in get_turf(src)) + if(isliving(I)) + var/mob/living/L = I + if(temperature > L.bodytemperature) + L.adjust_bodytemperature(clamp(temperature, BODYTEMP_COOLING_MAX, BODYTEMP_HEATING_MAX)) //If you're on fire, you heat up! + if(istype(I, /obj/item/reagent_containers/food) && !istype(I, /obj/item/reagent_containers/food/drinks) && temperature >= REACTOR_TEMPERATURE_MINIMUM) + playsound(src, pick('sound/machines/fryer/deep_fryer_1.ogg', 'sound/machines/fryer/deep_fryer_2.ogg'), 100, TRUE) + var/obj/item/reagent_containers/food/grilled_item = I + if(!(grilled_item.foodtype & FRIED)) + if(prob(100 - power)) + return //To give the illusion that it's actually cooking omegalul. + SEND_SIGNAL(grilled_item, COMSIG_ITEM_GRILLED, src, INFINITY) + switch(power) + if(0 to 39) + grilled_item.name = "grilled [initial(grilled_item.name)]" + grilled_item.desc = "[initial(I.desc)] It's been grilled over a nuclear reactor." + if(40 to 70) + grilled_item.name = "heavily grilled [initial(grilled_item.name)]" + grilled_item.desc = "[initial(I.desc)] It's been heavily grilled through the magic of nuclear fission." + if(70 to 95) + grilled_item.name = "\improper Three-Mile Nuclear-Grilled [initial(grilled_item.name)]" + grilled_item.desc = "A [initial(grilled_item.name)]. It's been put on top of a nuclear reactor running at extreme power by some badass engineer." + if(95 to INFINITY) + grilled_item.name = "\improper Ultimate Meltdown Grilled [initial(grilled_item.name)]" + grilled_item.desc = "A [initial(grilled_item.name)]. A grill this perfect is a rare technique only known by a few engineers who know how to perform a 'controlled' meltdown whilst also having the time to throw food on a reactor. I'll bet it tastes amazing." + grilled_item.foodtype |= FRIED + grilled_item.add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY) + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/process_atmos(delta_time) + //Let's get our gasses sorted out. + var/datum/gas_mixture/coolant_input = airs[COOLANT_INPUT_GATE] + var/datum/gas_mixture/moderator_input = airs[MODERATOR_INPUT_GATE] + var/datum/gas_mixture/coolant_output = airs[COOLANT_OUTPUT_GATE] + + var/power_produced = 0 // How much power we're producing from the moderator + var/radioactivity_spice_multiplier = 1 + get_fuel_power() //Some gasses make the reactor a bit spicy. + var/depletion_modifier = 0.035 //How rapidly do your rods decay + gas_absorption_effectiveness = gas_absorption_constant + last_power_produced = 0 + + //First up, handle moderators! + if(active && moderator_input.total_moles() >= minimum_coolant_level) + // Fuel types: increases power and K + var/total_fuel_moles = 0 + total_fuel_moles += moderator_input.get_moles(/datum/gas/plasma) * PLASMA_FUEL_POWER + total_fuel_moles += moderator_input.get_moles(/datum/gas/tritium) * TRITIUM_FUEL_POWER + total_fuel_moles += moderator_input.get_moles(/datum/gas/antinoblium) * ANTINOBLIUM_FUEL_POWER + + // Power modifier types: increases fuel effectiveness + var/power_mod_moles = 0 + power_mod_moles += moderator_input.get_moles(/datum/gas/oxygen) * OXYGEN_POWER_MOD + power_mod_moles += moderator_input.get_moles(/datum/gas/hydrogen) * HYDROGEN_POWER_MOD + + // Now make some actual power! + if(total_fuel_moles >= minimum_coolant_level) //You at least need SOME fuel. + var/fuel_power = max((total_fuel_moles * 10 / moderator_input.total_moles()), 1) + var/power_modifier = max(power_mod_moles * 10 / moderator_input.total_moles(), 1) //You can never have negative IPM. For now. + power_produced = max(0,((fuel_power*power_modifier)*moderator_input.total_moles())) / delta_time + if(active) + coolant_output.adjust_moles(/datum/gas/pluonium, total_fuel_moles/20) //Shove out pluonium into the air when it's fuelled. You need to filter this off, or you're gonna have a bad time. + + // Control types: increases control of K + var/total_control_moles = 0 + total_control_moles += moderator_input.get_moles(/datum/gas/nitrogen) * NITROGEN_CONTROL_MOD + total_control_moles += moderator_input.get_moles(/datum/gas/carbon_dioxide) * CARBON_CONTROL_MOD + total_control_moles += moderator_input.get_moles(/datum/gas/pluoxium) * PLUOXIUM_CONTROL_MOD + if(total_control_moles >= minimum_coolant_level) + var/control_bonus = total_control_moles / REACTOR_CONTROL_FACTOR //1 mol of n2 -> 0.002 bonus control rod effectiveness, if you want a super controlled reaction, you'll have to sacrifice some power. + control_rod_effectiveness = initial(control_rod_effectiveness) + control_bonus + + // Permeability types: increases cooling efficiency + var/total_permeability_moles = 0 + total_permeability_moles += moderator_input.get_moles(/datum/gas/bz) * BZ_PERMEABILITY_MOD + total_permeability_moles += moderator_input.get_moles(/datum/gas/water_vapor) * WATER_PERMEABILITY_MOD + total_permeability_moles += moderator_input.get_moles(/datum/gas/hypernoblium) * NOBLIUM_PERMEABILITY_MOD + if(total_permeability_moles >= minimum_coolant_level) + gas_absorption_effectiveness = clamp(gas_absorption_constant + (total_permeability_moles / REACTOR_PERMEABILITY_FACTOR), 0, 1) + + // Radiation types: increases radiation + radioactivity_spice_multiplier += moderator_input.get_moles(/datum/gas/nitrogen) * NITROGEN_RAD_MOD //An example setup of 50 moles of n2 (for dealing with spent fuel) leaves us with a radioactivity spice multiplier of 3. + radioactivity_spice_multiplier += moderator_input.get_moles(/datum/gas/carbon_dioxide) * CARBON_RAD_MOD + radioactivity_spice_multiplier += moderator_input.get_moles(/datum/gas/hydrogen) * HYDROGEN_RAD_MOD + radioactivity_spice_multiplier += moderator_input.get_moles(/datum/gas/tritium) * TRITIUM_RAD_MOD + radioactivity_spice_multiplier += moderator_input.get_moles(/datum/gas/antinoblium) * ANTINOBLIUM_RAD_MOD + + // Degradation types: degrades the fuel rods + var/total_degradation_moles = moderator_input.get_moles(/datum/gas/pluonium) //Because it's quite hard to get. + if(total_degradation_moles >= minimum_coolant_level) //I'll be nice. + depletion_modifier += total_degradation_moles / 15 //Oops! All depletion. This causes your fuel rods to get SPICY. + if(prob(total_degradation_moles)) // don't spam the sound so much please + playsound(src, pick('sound/machines/sm/accent/normal/1.ogg','sound/machines/sm/accent/normal/2.ogg','sound/machines/sm/accent/normal/3.ogg','sound/machines/sm/accent/normal/4.ogg','sound/machines/sm/accent/normal/5.ogg'), 100, TRUE) + + //From this point onwards, we clear out the remaining gasses. + moderator_input.remove_ratio(REACTOR_MODERATOR_DECAY_RATE) //Remove about 10% of the gases + K += total_fuel_moles / 1000 + else // if there's not enough to do anything, just clear it + moderator_input.clear() + + var/fuel_power = 0 //So that you can't magically generate K with your control rods. + if(active) + if(!has_fuel()) //Reactor must be fuelled and ready to go before we can heat it up. + shut_down() // shut it down!!! + else + for(var/obj/item/fuel_rod/FR in fuel_rods) + K += FR.fuel_power + fuel_power += FR.fuel_power + FR.deplete(depletion_modifier) + K += power / REACTOR_CRITICALITY_POWER_FACTOR + radioactivity_spice_multiplier += fuel_power + + // Firstly, find the difference between the two numbers. + var/difference = abs(K - desired_k) + + // Then, hit as much of that goal with our cooling per tick as we possibly can. + difference = clamp(difference, 0, control_rod_effectiveness) //And we can't instantly zap the K to what we want, so let's zap as much of it as we can manage.... + if(difference > fuel_power && desired_k > K) + investigate_log("Reactor does not have enough fuel to get [difference]. We have [fuel_power] fuel power.", INVESTIGATE_REACTOR) + difference = fuel_power //Again, to stop you being able to run off of 1 fuel rod. + + // If K isn't what we want it to be, let's try to change that + if(K != desired_k) + if(desired_k > K) + K += difference + else if(desired_k < K) + K -= difference + if(last_user && current_desired_k != desired_k) // Tell admins about it if it's done by a player + current_desired_k = desired_k + message_admins("Reactor desired criticality set to [desired_k] by [ADMIN_LOOKUPFLW(last_user)] in [ADMIN_VERBOSEJMP(src)]") + investigate_log("reactor desired criticality set to [desired_k] by [key_name(last_user)] at [AREACOORD(src)]", INVESTIGATE_REACTOR) + + // Now, clamp K and heat up the reactor based on it. + K = clamp(K, 0, REACTOR_MAX_CRITICALITY) + var/particle_chance = min(power * K, 1000) + while(particle_chance >= 100) + fire_nuclear_particle() + particle_chance -= 100 + if(prob(particle_chance)) + fire_nuclear_particle() + if(active && has_fuel()) + temperature += REACTOR_HEAT_FACTOR * delta_time * has_fuel() * ((REACTOR_HEAT_EXPONENT**K) - 1) // heating from K has to be exponential to make higher K more dangerous + + // Cooling time! + var/input_moles = coolant_input.total_moles() //Firstly. Do we have enough moles of coolant? + if(input_moles >= minimum_coolant_level) + last_coolant_temperature = coolant_input.return_temperature() + //Important thing to remember, once you slot in the fuel rods, this thing will not stop making heat, at least, not unless you can live to be thousands of years old which is when the spent fuel finally depletes fully. + var/heat_delta = (last_coolant_temperature - temperature) * gas_absorption_effectiveness //Take in the gas as a cooled input, cool the reactor a bit. The optimum, 100% balanced reaction sits at K=1, coolant input temp of 200K / -73 celsius. + var/coolant_heat_factor = coolant_input.heat_capacity() / (coolant_input.heat_capacity() + REACTOR_HEAT_CAPACITY + (REACTOR_ROD_HEAT_CAPACITY * has_fuel())) //What percent of the total heat capacity is in the coolant + last_heat_delta = heat_delta + temperature += heat_delta * coolant_heat_factor + coolant_input.set_temperature(last_coolant_temperature - (heat_delta * (1 - coolant_heat_factor))) //Heat the coolant output gas that we just had pass through us. + coolant_output.merge(coolant_input) //And now, shove the input into the output. + coolant_input.clear() //Clear out anything left in the input gate. + color = null + no_coolant_ticks = max(0, no_coolant_ticks-2) //Needs half as much time to recover the ticks than to acquire them + else + if(active && has_fuel()) + no_coolant_ticks++ + if(no_coolant_ticks > REACTOR_NO_COOLANT_TOLERANCE) + temperature += temperature * delta_time / 500 //This isn't really harmful early game, but when your reactor is up to full power, this can get out of hand quite quickly. + vessel_integrity -= temperature * delta_time / 200 //Think fast loser. + color = "[COLOR_RED]" + investigate_log("Reactor taking damage from the lack of coolant", INVESTIGATE_REACTOR) + + // And finally, set our pressure. + last_output_temperature = coolant_output.return_temperature() + pressure = coolant_output.return_pressure() + power = ((temperature / REACTOR_TEMPERATURE_CRITICAL)**3) * 100 + + // Make some power! + if(power_produced > 0) + last_power_produced = power_produced + last_power_produced *= (max(0,power)/100) //Aaaand here comes the cap. Hotter reactor => more power. + last_power_produced *= base_power_modifier //Finally, we turn it into actual usable numbers. + + // Let's check if they're about to die, and let them know. + handle_alerts(delta_time) + update_icon() + + // Finally, our beautiful radiation! + radiation_pulse(src, K*temperature*radioactivity_spice_multiplier*has_fuel()/(REACTOR_MAX_CRITICALITY*REACTOR_MAX_FUEL_RODS)) + + // I FUCKING LOVE DATA!!!!!! + kpaData += pressure + if(kpaData.len > 100) //Only lets you track over a certain timeframe. + kpaData.Cut(1, 2) + powerData += last_power_produced //We scale up the figure for a consistent:tm: scale + if(powerData.len > 100) //Only lets you track over a certain timeframe. + powerData.Cut(1, 2) + tempCoreData += temperature //We scale up the figure for a consistent:tm: scale + if(tempCoreData.len > 100) //Only lets you track over a certain timeframe. + tempCoreData.Cut(1, 2) + tempInputData += last_coolant_temperature //We scale up the figure for a consistent:tm: scale + if(tempInputData.len > 100) //Only lets you track over a certain timeframe. + tempInputData.Cut(1, 2) + tempOutputData += last_output_temperature //We scale up the figure for a consistent:tm: scale + if(tempOutputData.len > 100) //Only lets you track over a certain timeframe. + tempOutputData.Cut(1, 2) + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/has_fuel() + return length(fuel_rods) + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/get_fuel_power() + var/total_fuel_power = 0 + for(var/obj/item/fuel_rod/rod in fuel_rods) + total_fuel_power += rod.fuel_power + return total_fuel_power + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/relay(var/sound, var/message=null, loop = FALSE, channel = null) //Sends a sound + text message to the crew of a ship + for(var/mob/M in GLOB.player_list) + if(M.z == z) + if(!isinspace(M)) + if(sound) + if(channel) //Doing this forbids overlapping of sounds + SEND_SOUND(M, sound(sound, repeat = loop, wait = 0, volume = 70, channel = channel)) + else + SEND_SOUND(M, sound(sound, repeat = loop, wait = 0, volume = 70)) + if(message) + to_chat(M, message) + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/stop_relay(channel) //Stops all playing sounds for crewmen on N channel. + for(var/mob/M in GLOB.player_list) + if(M.z == z) + M.stop_sound_channel(channel) + +//Method to handle sound effects, reactor warnings, all that jazz. +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/handle_alerts(delta_time) + var/alert = FALSE //If we have an alert condition, we'd best let people know. + + //First alert condition: Overheat + if(temperature >= REACTOR_TEMPERATURE_CRITICAL) + alert = TRUE + if(!has_hit_emergency) + has_hit_emergency = TRUE + for(var/i in 1 to min((temperature-REACTOR_TEMPERATURE_CRITICAL)/100, 10)) + src.fire_nuclear_particle() + radio.talk_into(src, "WARNING!! REACTOR CORE OVERHEATING!! NUCLEAR MELTDOWN IMMINENT!!", engi_channel) + playsound(src, 'sound/machines/reactor_alert_1.ogg', 100, extrarange=100, pressure_affected=FALSE, ignore_walls=TRUE) + investigate_log("Reactor reaching critical temperature at [temperature] kelvin with desired criticality at [desired_k]", INVESTIGATE_REACTOR) + message_admins("Reactor reaching critical temperature at [ADMIN_VERBOSEJMP(src)]") + if(temperature >= REACTOR_TEMPERATURE_MELTDOWN) + var/temp_damage = min(temperature/300, initial(vessel_integrity)/180) * delta_time //3 minutes to meltdown from full integrity, worst-case. + vessel_integrity -= temp_damage + else if(temperature < 73) //That's as cold as I'm letting you get it, engineering. + color = COLOR_CYAN + else + color = null + + //Second alert condition: Overpressurized (the more lethal one) + if(pressure >= REACTOR_PRESSURE_CRITICAL) + alert = TRUE + if(!has_hit_emergency) + has_hit_emergency = TRUE + radio.talk_into(src, "WARNING!! REACTOR CORE OVERPRESSURIZED!! BLOWOUT IMMINENT!!", engi_channel) + playsound(src, 'sound/machines/reactor_alert_3.ogg', 100, extrarange=100, pressure_affected=FALSE, ignore_walls=TRUE) + investigate_log("Reactor reaching critical pressure at [pressure] kPa with desired criticality at [desired_k]", INVESTIGATE_REACTOR) + message_admins("Reactor reaching critical pressure at [ADMIN_VERBOSEJMP(src)]") + Shake(6, 6, (delta_time/2) SECONDS) + playsound(loc, 'sound/machines/clockcult/steam_whoosh.ogg', 100, TRUE) + var/turf/T = get_turf(src) + T.atmos_spawn_air("water_vapor=[pressure/100];TEMP=[temperature]") + var/pressure_damage = min(pressure/300, initial(vessel_integrity)/180) * delta_time //You get 60 seconds (if you had full integrity), worst-case. But hey, at least it can't be instantly nuked with a pipe-fire.. though it's still very difficult to save. + vessel_integrity -= pressure_damage + if(vessel_integrity <= 0) //It wouldn't be able to tank another hit. + investigate_log("Reactor blowout at [pressure] kPa with desired criticality at [desired_k]", INVESTIGATE_REACTOR) + blowout() + return + + // Yikes, that's no good + if(vessel_integrity <= 0) + investigate_log("Reactor melted down at [temperature] kelvin with desired criticality at [desired_k]", INVESTIGATE_REACTOR) + meltdown() //Oops! All meltdown + return + + if(!alert) //Congrats! You stopped the meltdown / blowout. + if(!next_warning) + return // don't bother if the reactor wasn't in trouble + stop_relay(CHANNEL_REACTOR_ALERT) + next_warning = 0 // there's no next warning if the reactor is fine + set_light(0) + light_color = LIGHT_COLOR_CYAN + set_light(10) + has_hit_emergency = FALSE + var/msg = "Reactor returning to safe operating parameters." + if(vessel_integrity <= 350) + msg += " Maintenance required." + msg += " Structural integrity: [get_integrity()]%." + radio.talk_into(src, msg, engi_channel) + if(evacuation_procedures) + radio.talk_into(src, "Attention: Reactor has been stabilized. Please return to your workplaces.", crew_channel) + evacuation_procedures = FALSE + return + + if(world.time < next_warning) // we're not ready for another warning yet + return + + next_warning = world.time + 30 SECONDS //To avoid engis pissing people off when reaaaally trying to stop the meltdown or whatever. + if(get_integrity() < 95) + radio.talk_into(src, "WARNING: Reactor structural integrity faltering. Integrity: [get_integrity()]%", engi_channel) + + if(get_integrity() < 50) // At this point we should alert the whole station + relay('sound/effects/reactor/alarm.ogg', null, TRUE, channel = CHANNEL_REACTOR_ALERT) + + set_light(0) + light_color = LIGHT_COLOR_RED + set_light(10) + + //PANIC + if(vessel_integrity <= initial(vessel_integrity)/4 && !evacuation_procedures) + evacuation_procedures = TRUE + radio.talk_into(src, "Reactor failure imminent. Please remain calm and evacuate the facility immediately.", crew_channel) + playsound(src, 'sound/machines/reactor_alert_3.ogg', 100, extrarange=100, pressure_affected=FALSE, ignore_walls=TRUE) + +//Failure condition 1: Meltdown. Achieved by having heat go over tolerances. This is less devastating because it's easier to achieve. +//Results: Engineering becomes unusable and your engine irreparable +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/meltdown() + set waitfor = FALSE + SSair.atmos_machinery -= src //Annd we're now just a useless brick. + vessel_integrity = null // this makes it show up weird on the monitor to even further emphasize something's gone horribly wrong + slagged = TRUE + color = null + update_icon() + STOP_PROCESSING(SSmachines, src) + icon_state = "reactor_slagged" + AddComponent(/datum/component/radioactive, 15000 , src, 0) + var/obj/effect/landmark/nuclear_waste_spawner/NSW = new /obj/effect/landmark/nuclear_waste_spawner/strong(get_turf(src)) + relay('sound/effects/reactor/meltdown.ogg', "You hear a horrible metallic hissing.") + stop_relay(CHANNEL_REACTOR_ALERT) + NSW.fire() //This will take out engineering for a decent amount of time as they have to clean up the sludge. + for(var/obj/machinery/power/apc/apc in GLOB.apcs_list) + if((apc.z == z) && prob(70)) + apc.overload_lighting() + var/datum/gas_mixture/coolant_input = airs[COOLANT_INPUT_GATE] + var/datum/gas_mixture/moderator_input = airs[MODERATOR_INPUT_GATE] + var/datum/gas_mixture/coolant_output = airs[COOLANT_OUTPUT_GATE] + var/turf/T = get_turf(src) + coolant_input.set_temperature(temperature*2) + moderator_input.set_temperature(temperature*2) + coolant_output.set_temperature(temperature*2) + T.assume_air(coolant_input) + T.assume_air(moderator_input) + T.assume_air(coolant_output) + var/turf/lower_turf = SSmapping.get_turf_below(T) + if(lower_turf) // reactor fuel will melt down into the lower levels on multi-z maps like icemeta + new /obj/structure/reactor_corium(lower_turf) + var/turf/lowest_turf = SSmapping.get_turf_below(lower_turf) + if(lowest_turf) // WE NEED TO GO DEEPER + new /obj/structure/reactor_corium(lower_turf) + explosion(get_turf(src), 0, 5, 10, 20, TRUE, TRUE) + +//Failure condition 2: Blowout. Achieved by reactor going over-pressured. This is a round-ender because it requires more fuckery to achieve. +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/blowout() + explosion(get_turf(src), GLOB.MAX_EX_DEVESTATION_RANGE, GLOB.MAX_EX_HEAVY_RANGE, GLOB.MAX_EX_LIGHT_RANGE, GLOB.MAX_EX_FLASH_RANGE) + meltdown() //Double kill. + relay('sound/effects/reactor/explode.ogg') + SSweather.run_weather("nuclear fallout") + for(var/X in GLOB.landmarks_list) + if(istype(X, /obj/effect/landmark/nuclear_waste_spawner)) + var/obj/effect/landmark/nuclear_waste_spawner/WS = X + if(is_station_level(WS.z)) //Begin the SLUDGING + WS.range *= 3 + WS.fire() + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/update_icon(updates=ALL) + . = ..() + icon_state = "reactor_off" + switch(temperature) + if(0 to REACTOR_TEMPERATURE_MINIMUM) + icon_state = "reactor_on" + if(REACTOR_TEMPERATURE_MINIMUM to REACTOR_TEMPERATURE_OPERATING) + icon_state = "reactor_hot" + if(REACTOR_TEMPERATURE_OPERATING to REACTOR_TEMPERATURE_CRITICAL) + icon_state = "reactor_veryhot" + if(REACTOR_TEMPERATURE_CRITICAL to REACTOR_TEMPERATURE_MELTDOWN) //Point of no return. + icon_state = "reactor_overheat" + if(REACTOR_TEMPERATURE_MELTDOWN to INFINITY) + icon_state = "reactor_meltdown" + if(!has_fuel()) + icon_state = "reactor_off" + if(slagged) + icon_state = "reactor_slagged" + + +//Startup, shutdown + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/start_up() + START_PROCESSING(SSmachines, src) + desired_k = 1 + active = TRUE + set_light(10) + var/startup_sound = pick('sound/effects/reactor/startup.ogg', 'sound/effects/reactor/startup2.ogg') + playsound(loc, startup_sound, 100) + update_parents() // double-check all the pipes are connected on startup + if(!powernet) + connect_to_network() + +//Shuts off the fuel rods, ambience, etc. Keep in mind that your temperature may still go up! +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/shut_down() + STOP_PROCESSING(SSmachines, src) + set_light(0) + K = 0 + desired_k = 0 + power = 0 + active = FALSE + update_icon() + +//Controlling the reactor. + +/obj/machinery/computer/reactor + name = "reactor control console" + desc = "A computer which monitors and controls a reactor" + light_color = "#55BA55" + light_power = 1 + light_range = 3 + icon_state = "oldcomp" + icon_screen = "oldcomp_broken" + icon_keyboard = null + circuit = /obj/item/circuitboard/computer/reactor // we have the technology + var/obj/machinery/atmospherics/components/trinary/nuclear_reactor/reactor = null + var/id = null + var/next_stat_interval = 0 + +/obj/machinery/computer/reactor/multitool_act(mob/living/user, obj/item/multitool/I) + if(isnull(id) || isnum(id)) + var/obj/machinery/atmospherics/components/trinary/nuclear_reactor/N = I.buffer + if(!istype(N)) + user.balloon_alert(user, "invalid reactor ID!") + return TRUE + reactor = N + id = N.id + user.balloon_alert(user, "linked!") + return TRUE + return ..() + +/obj/machinery/computer/reactor/preset + id = "default_reactor_for_lazy_mappers" + +/obj/machinery/computer/reactor/syndie_base + id = "syndie_base_reactor" + +/obj/item/circuitboard/computer/reactor + name = "Reactor Control (Computer Board)" + icon_state = "engineering" + build_path = /obj/machinery/computer/reactor + +/obj/machinery/computer/reactor/Initialize(mapload, obj/item/circuitboard/C) + . = ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/computer/reactor/LateInitialize() + . = ..() + link_to_reactor() + +/obj/machinery/computer/reactor/attack_hand(mob/living/user) + . = ..() + ui_interact(user) + +/obj/machinery/computer/reactor/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ReactorComputer") + ui.open() + ui.set_autoupdate(TRUE) + +/obj/machinery/computer/reactor/ui_act(action, params) + if(..()) + return + if(!reactor) + return + switch(action) + if("power") + if(reactor.active) + if(reactor.K <= 0 && reactor.temperature <= REACTOR_TEMPERATURE_MINIMUM) + reactor.shut_down() + else if(reactor.fuel_rods.len) + reactor.start_up() + message_admins("Reactor started up by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_VERBOSEJMP(src)]") + investigate_log("Reactor started by [key_name(usr)] at [AREACOORD(src)]", INVESTIGATE_REACTOR) + if("input") + var/input = text2num(params["target"]) + reactor.last_user = usr + reactor.desired_k = reactor.active ? clamp(input, 0, REACTOR_MAX_CRITICALITY) : 0 + if("eject") + if(reactor?.temperature > REACTOR_TEMPERATURE_MINIMUM) + return + if(reactor?.slagged) + return + var/rod_index = text2num(params["rod_index"]) + if(rod_index < 1 || rod_index > reactor.fuel_rods.len) + return + var/obj/item/fuel_rod/rod = reactor.fuel_rods[rod_index] + if(!rod) + return + playsound(src, pick('sound/effects/reactor/switch.ogg','sound/effects/reactor/switch2.ogg','sound/effects/reactor/switch3.ogg'), 100, FALSE) + playsound(reactor, 'sound/effects/reactor/crane_1.wav', 100, FALSE) + rod.forceMove(get_turf(reactor)) + reactor.fuel_rods.Remove(rod) + +/obj/machinery/computer/reactor/ui_data(mob/user) + var/list/data = list() + data["control_rods"] = 0 + data["k"] = 0 + data["desiredK"] = 0 + if(reactor) + data["k"] = reactor.K + data["desiredK"] = reactor.desired_k + data["control_rods"] = 100 - (100 * reactor.desired_k / REACTOR_MAX_CRITICALITY) //Rod insertion is extrapolated as a function of the percentage of K + data["integrity"] = reactor.get_integrity() + data["powerData"] = reactor ? reactor.powerData : list() + data["kpaData"] = reactor ? reactor.kpaData : list() + data["tempCoreData"] = reactor ? reactor.tempCoreData : list() + data["tempInputData"] = reactor ? reactor.tempInputData : list() + data["tempOutputData"] = reactor ? reactor.tempOutputData : list() + data["coreTemp"] = reactor ? round(reactor.temperature) : 0 + data["coolantInput"] = reactor ? round(reactor.last_coolant_temperature) : T20C + data["coolantOutput"] = reactor ? round(reactor.last_output_temperature) : T20C + data["power"] = reactor ? reactor.last_power_produced : 0 + data["kpa"] = reactor ? reactor.pressure : 0 + data["active"] = reactor ? reactor.active : FALSE + data["shutdownTemp"] = REACTOR_TEMPERATURE_MINIMUM + var/list/rod_data = list() + if(reactor) + var/cur_index = 0 + for(var/obj/item/fuel_rod/rod in reactor.fuel_rods) + cur_index++ + rod_data.Add( + list(list( + "name" = rod.name, + "depletion" = rod.depletion, + "rod_index" = cur_index + )) + ) + data["rods"] = rod_data + return data + +/obj/machinery/computer/reactor/wrench_act(mob/living/user, obj/item/I) + to_chat(user, span_notice("You start [anchored ? "un" : ""]securing [name]...")) + if(I.use_tool(src, user, 40, volume=75)) + to_chat(user, span_notice("You [anchored ? "un" : ""]secure [name].")) + setAnchored(!anchored) + return TRUE + return FALSE + +/obj/machinery/computer/reactor/proc/link_to_reactor() + for(var/obj/machinery/atmospherics/components/trinary/nuclear_reactor/asdf in GLOB.machines) + if(asdf.id && asdf.id == id) + reactor = asdf + return TRUE + return FALSE + +#define FREQ_REACTOR_CONTROL 1439.69 + +//Preset pumps for mappers. You can also set the id tags yourself. +/obj/machinery/atmospherics/components/binary/pump/reactor_input + id = "reactor_input" + frequency = FREQ_REACTOR_CONTROL + +/obj/machinery/atmospherics/components/binary/pump/reactor_output + id = "reactor_output" + frequency = FREQ_REACTOR_CONTROL + +/obj/machinery/atmospherics/components/binary/pump/reactor_moderator + id = "reactor_moderator" + frequency = FREQ_REACTOR_CONTROL + +/obj/machinery/computer/reactor/pump + name = "Reactor inlet valve computer" + desc = "A computer which controls valve settings on an advanced gas cooled reactor. Alt click it to remotely set pump pressure." + icon_screen = "reactor_input" + id = "reactor_input" + var/datum/radio_frequency/radio_connection + var/on = FALSE + +/obj/machinery/computer/reactor/pump/AltClick(mob/user) + . = ..() + var/newPressure = input(user, "Set new output pressure (kPa)", "Remote pump control", null) as num + if(!newPressure) + return + newPressure = clamp(newPressure, 0, MAX_OUTPUT_PRESSURE) //Number sanitization is not handled in the pumps themselves, only during their ui_act which this doesn't use. + signal(on, newPressure) + +/obj/machinery/computer/reactor/attack_robot(mob/user) + . = ..() + attack_hand(user) + +/obj/machinery/computer/reactor/attack_ai(mob/user) + . = ..() + attack_hand(user) + +/obj/machinery/computer/reactor/pump/attack_hand(mob/living/user) + . = ..() + if(!is_operational()) + return FALSE + playsound(loc, pick('sound/effects/reactor/switch.ogg','sound/effects/reactor/switch2.ogg','sound/effects/reactor/switch3.ogg'), 100, FALSE) + visible_message(span_notice("[src]'s switch flips [on ? "off" : "on"].")) + on = !on + signal(on) + +/obj/machinery/computer/reactor/pump/Initialize(mapload, obj/item/circuitboard/C) + . = ..() + radio_connection = SSradio.add_object(src, FREQ_REACTOR_CONTROL,filter=RADIO_ATMOSIA) + +/obj/machinery/computer/reactor/pump/proc/signal(power, set_output_pressure=null) + var/datum/signal/signal + if(!set_output_pressure) //Yes this is stupid, but technically if you pass through "set_output_pressure" onto the signal, it'll always try and set its output pressure and yeahhh... + signal = new(list( + "tag" = id, + "frequency" = FREQ_REACTOR_CONTROL, + "timestamp" = world.time, + "power" = power, + "sigtype" = "command" + )) + else + signal = new(list( + "tag" = id, + "frequency" = FREQ_REACTOR_CONTROL, + "timestamp" = world.time, + "power" = power, + "set_output_pressure" = set_output_pressure, + "sigtype" = "command" + )) + radio_connection.post_signal(src, signal, filter=RADIO_ATMOSIA) + +//Preset subtypes for mappers +/obj/machinery/computer/reactor/pump/reactor_input + name = "Reactor inlet valve computer" + icon_screen = "reactor_input" + id = "reactor_input" + +/obj/machinery/computer/reactor/pump/reactor_output + name = "Reactor output valve computer" + icon_screen = "reactor_output" + id = "reactor_output" + +/obj/machinery/computer/reactor/pump/reactor_moderator + name = "Reactor moderator valve computer" + icon_screen = "reactor_moderator" + id = "reactor_moderator" + +/obj/effect/decal/nuclear_waste + name = "plutonium sludge" + desc = "A writhing pool of heavily irradiated, spent reactor fuel. You probably shouldn't step through this..." + icon = 'icons/obj/machines/reactor_parts.dmi' + icon_state = "nuclearwaste" + alpha = 150 + light_color = LIGHT_COLOR_GREEN + obj_flags = RAD_NO_CONTAMINATE_1 // already making rads, don't contaminate it further + color = "#ff9eff" + +/obj/effect/decal/nuclear_waste/Initialize(mapload) + . = ..() + for(var/obj/A in get_turf(src)) + if(istype(A, /obj/structure)) + qdel(src) //It is more processing efficient to do this here rather than when searching for available turfs. + set_light(1) + START_PROCESSING(SSobj, src) + +/obj/effect/decal/nuclear_waste/process(delta_time) + if(prob(10)) // woah there, don't overload the radiation subsystem + radiation_pulse(src, 1000, RAD_DISTANCE_COEFFICIENT*2) + +/obj/effect/decal/nuclear_waste/Destroy(force) + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/effect/landmark/nuclear_waste_spawner //Clean way of spawning nuclear gunk after a reactor core meltdown. + name = "Nuclear waste spawner" + var/range = 15 //15 tile radius to spawn goop + +/obj/effect/landmark/nuclear_waste_spawner/strong + range = 30 + +/obj/effect/landmark/nuclear_waste_spawner/proc/fire() + playsound(loc, 'sound/effects/gib_step.ogg', 100) + for(var/turf/open/floor in orange(range, get_turf(src))) + if(prob(35)) //Scatter the sludge, don't smear it everywhere + new /obj/effect/decal/nuclear_waste (floor) + qdel(src) + +/obj/effect/decal/nuclear_waste/Crossed(atom/movable/AM) + . = ..() + if(isliving(AM)) + var/mob/living/L = AM + playsound(loc, 'sound/effects/gib_step.ogg', HAS_TRAIT(L, TRAIT_LIGHT_STEP) ? 20 : 50, 1) + AM.rad_act(500) //MORE RADS + +/obj/effect/decal/nuclear_waste/attackby(obj/item/tool, mob/user) + if(tool.tool_behaviour == TOOL_SHOVEL) + to_chat(user, span_notice("You start to clear [src]...")) + if(tool.use_tool(src, user, 50, volume=100)) + radiation_pulse(src, 1000, 5) //MORE RADS + to_chat(user, span_notice("You clear [src]. ")) + qdel(src) + return + . = ..() + +/datum/weather/nuclear_fallout + name = "nuclear fallout" + desc = "Irradiated dust falls down everywhere." + telegraph_duration = 50 + telegraph_message = "The air suddenly becomes dusty.." + weather_message = "You feel a wave of hot ash fall down on you." + weather_overlay = "light_ash" + telegraph_overlay = "light_snow" + weather_duration_lower = 600 + weather_duration_upper = 1500 + weather_color = "green" + telegraph_sound = null + weather_sound = 'sound/effects/reactor/falloutwind.ogg' + end_duration = 100 + area_type = /area + protected_areas = list(/area/maintenance, /area/ai_monitored/turret_protected/ai_upload, /area/ai_monitored/turret_protected/ai_upload_foyer, + /area/ai_monitored/turret_protected/ai, /area/shuttle) + target_trait = ZTRAIT_STATION + end_message = "The ash stops falling." + immunity_type = "rad" + +/datum/weather/nuclear_fallout/weather_act(mob/living/L) + L.rad_act(100) + +/datum/weather/nuclear_fallout/telegraph() + ..() + status_alarm(TRUE) + +/datum/weather/nuclear_fallout/proc/status_alarm(active) //Makes the status displays show the radiation warning for those who missed the announcement. + var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) + if(!frequency) + return + + var/datum/signal/signal = new + if (active) + signal.data["command"] = "alert" + signal.data["picture_state"] = "radiation" + else + signal.data["command"] = "shuttle" + + var/atom/movable/virtualspeaker/virt = new(null) + frequency.post_signal(virt, signal) + +/datum/weather/nuclear_fallout/end() + if(..()) + return + status_alarm(FALSE) + +/obj/item/sealant + name = "Flexi seal" + desc = "A neat spray can that can repair torn inflatable segments, and more!" + icon = 'icons/obj/inflatable.dmi' + icon_state = "sealant" + w_class = WEIGHT_CLASS_TINY + +/area/engineering/main/reactor_core + name = "Nuclear Reactor Core" + +/area/engineering/main/reactor_control + name = "Reactor Control Room" + + +//Procs shamelessly taken from machinery/power +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/connect_to_network() + var/turf/T = src.loc + if(!T || !istype(T)) + return FALSE + + 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) + return FALSE + + C.powernet.add_machine(src) + return TRUE + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/disconnect_from_network() + if(!powernet) + return FALSE + powernet.remove_machine(src) + return TRUE + +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/add_avail(amount) + if(powernet) + powernet.newavail += amount + return TRUE + else + return FALSE + +// Guide for setting this up, best to put one of these somewhere in the engine room so engineers know what to do +/obj/item/paper/guides/jobs/engi/agcnr + name = "paper- 'Advanced Gas-Cooled Nuclear Reactor'" + info = "What the hell is this thing?
\ + The Advanced Gas-Cooled Nuclear Reactor is exactly what it sounds like: a nuclear reactor cooled by gas. To get it running and producing stable power, you'll need fuel rods, some moderator gas to actually make power from it, and coolant gas to cool it all down with so you don't turn the station into a radioactive hellscape.
\ +
How do set up reactor?
\ + Fortunately for you, the reactor is easy to get running. Unfortunately for you, it's hard to make it stop running if it's not set up properly, so make sure you follow these steps correctly.
\ + 1) First wrench down the canister of nitrogen. This is our coolant and we want it in the reactor.
\ + 2) Next, turn on and max out every other pump in the room in order to get the coolant flowing.
\ + 3) Now, turn on the filters and make sure both of them are set to filter pluonium. Pluonium causes fuel rods to deplete much faster, so it's best to keep it out of the coolant so we can run the reactor for longer. There is a mixer in the same room, do not turn that on yet.
\ + 4) Put on a radiation suit and insert as many fuel rods as you can into the reactor. You should have one spare left, leave it in the reactor pool to keep it from irradiating things. Keep a geiger counter on you while near the engine room from now on.
\ + 5) Now that all the fuel rods are in and the cooling is set up, go to the reactor computer in the control room and hit the power button in the control rod section. You should hear a noise indicating that it just started up. Set the desired K to 2.
\ + 6) With the reactor running, go to the mixer and turn it on. This is the moderator gas mix used to actually make power from the reactor. For a safe mix that makes a decent amount of power, set the mixer to 20% plasma and 80% oxygen, then turn the pressure up to 250 kPa. A 50/50 mix makes more power, but will also make the reactor slightly harder to control. See the moderator effects section of this guide for more details.
\ + 7) With the reactor computer, you can use the control rods to keep the reactor at the temperature you want. A higher K will make it hotter, which produces more power. Try to keep it somewhere between 800 and 1000 kelvin, and be careful to increase it in small increments so you aren't caught off guard by it heating up more than you expected. Do NOT allow the temperature to exceed 1000 kelvin or you'll cause a meltdown if you can't cool it back down in time.
\ +
Going supercritical
\ + A very important part of nuclear reactors that must be kept under control is K, which stands for criticality. This is a measure of how much the reactor is... well, reacting. As K increases the reactor will heat up more, meaning it's *very* important to keep K under control or the heating will get out of control too, causing a meltdown.
\ + Fortunately we have a tool for this: control rods! The reactor control computer in the engine room has a handy interface for adjusting the control rods. It's as simple as just setting what you want K to be, and the control rods will adjust themselves to meet that number. Be warned though, that exceptionally high temperatures and certain moderator gases can increase K faster than the control rods can lower it, resulting in a runaway chain reaction that can turn your nuclear reactor into a nuclear bomb.
\ +
How I learned to stop worrying and love nuclear waste
\ + Over time, fuel rods will eventually deplete. This is an inevitable part of fission reactors like the AGCNR, but it can also have its benefits. The standard uranium-235 fuel rods have a special lining that will become plutonium-239 when fully depleted, which is an even better fuel. If you really want to, you can add pluonium to the moderator mix to cause your fuel rods to deplete much faster. More fuel rods can be ordered from cargo if you run out.
\ + To remove a depleted fuel rod, power the reactor down to below 400 kelvin and use a crowbar to pry it out.
\ +
Moderator effects
\ + Fuel Types:
\ + - Plasma: Power production gas. More plasma -> more power, but it enriches your fuel and increases K faster than the control rods can handle if too much is added.
\ + - Tritium: Extremely efficient power production gas. Increases K even more than plasma.
\ + - Anti-Noblium: Insane power production, but forces K as high as it can go. Don't use this gas unless you're autistic enough to handle it. Makes enough radiation to fry you instantly if you go near without protection.
\ + Power Modifier Types:
\ + - O2: Increases the effectiveness of fuel-type moderators. Having at least 10% of this in your plasma will make it much more effective at producing power, but a 50/50 mix is most effective. Higher amounts like 80% are much safer, but produce less power.
\ + - H2: Much more effective than oxygen for increasing the efficiency of your fuel, but has a huge increase to radioactivity.
\ + Moderation Types:
\ + - N2: Helps you regain control of the reaction by increasing control rod effectiveness, will massively boost the rad production of the reactor.
\ + - CO2: Super effective shutdown gas for runaway reactions, but even more rads than N2.
\ + - Pluoxium: Same as N2, but no cancer-rads!
\ + Permeability Types:
\ + - BZ: Increases your reactor's ability to transfer its heat to the coolant when added to the moderator input, thus letting you cool it down faster (but your output will get hotter)
\ + - Water Vapour: More efficient permeability modifier
\ + - Hyper-Noblium: Extremely efficient permeability increase (10x as efficient as bz)
\ + Depletion types:
\ + - Pluonium: When you need weapons grade plutonium yesterday. Causes your fuel to deplete much, much faster. Not a huge amount of use outside of plutonium production or sabotage.
\ +
OH GOD IT'S SCREAMING AT ME WHAT DO I DO
\ + Don't panic! There's a few things you can do to prevent the station from becoming an irradiated hellscape.
\ + Scenario 1: Overheating
\ + - Check for obstructions in the cooling loop. Ensure every pipe and filter in it is on, unblocked, and working at maximum capacity. Check the vent in space to make it's still there. Use the control rods to lower K as much as you can. If you lose control of K, add nitrogen or CO2 to the moderator to increase your control over K. If all else fails, grab the plasma canister from secure storage and dump it into the coolant line.
\ + Scenario 2: Overpressure
\ + - Similarly to scenario 1, check the cooling loop to make sure nothing is blocked and try to lower K as much as possible. If the pressure is still too high, use the filters to filter off excess coolant to lower the pressure until it's at a safe level. If removing too much coolant causes the reactor to overheat, refer to scenario 1.
\ + Once the reactor reaches safe operating conditions, it will report its structural integrity over engineering comms. The reactor must be repaired manually, and to do this the core temperature must be below 400 kelvin. Minor damage can be mostly repaired with some sealant spray found on the nearby table, but if it's too damaged you'll need to use a welding tool first. It can never be repaired all the way back to 100% integrity however, and of course there's no coming back from a meltdown or blowout." diff --git a/code/modules/power/reactor/reactor_frame.dm b/code/modules/power/reactor/reactor_frame.dm new file mode 100644 index 0000000000000..b9577f83c38f3 --- /dev/null +++ b/code/modules/power/reactor/reactor_frame.dm @@ -0,0 +1,101 @@ +// Reactor frame, used to build a finished reactor +/obj/structure/reactor_frame + name = "nuclear reactor frame" + desc = "The outer shell of a nuclear reactor core, made from plasteel due to its excellent strength and radiation shielding." + icon = 'icons/obj/machines/reactor.dmi' + icon_state = "reactor_frame_0" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF // no + density = FALSE + anchored = TRUE + pixel_x = -32 + pixel_y = -32 + var/completion = 0 + +/obj/structure/reactor_frame/examine(mob/user) + . = ..() + if(!anchored) + . += span_notice("It can be secured with a wrench.") + return + switch(completion) + if(0) + . += span_notice("The frame can be reinforced with metal rods, or unsecured with a wrench.") + if(1) + . += span_notice("The metal rods can be welded into place.") + if(2) + . += span_notice("The control rods can be added using plasteel sheets.") + if(3) + . += span_notice("The coolant pipes can be wrenched into place.") + +/obj/structure/reactor_frame/attackby(obj/item/I, mob/living/user, params) + var/obj/item/stack/S = I + if(istype(S, /obj/item/stack/rods)) + if(!anchored) + user.balloon_alert(user, span_notice("anchor it first!")) + return + if(completion > 0) + user.balloon_alert(user, span_notice("already reinforced!")) + return + if(S.use_tool(src, user, 2 SECONDS, 20)) + completion++ + update_icon() + return + return + if(I.tool_behaviour == TOOL_WELDER) + if(completion < 1) + user.balloon_alert(user, span_notice("add rods first!")) + return + if(completion > 1) + user.balloon_alert(user, span_notice("already welded!")) + return + if(I.use_tool(src, user, 2 SECONDS, 1, 50)) + completion++ + update_icon() + return + return + if(istype(S, /obj/item/stack/sheet/plasteel)) + if(completion < 2) + user.balloon_alert(user, span_notice("weld it first!")) + return + if(completion > 2) + user.balloon_alert(user, span_notice("already has control rods!")) + return + if(I.use_tool(src, user, 2 SECONDS, 10)) + completion++ + update_icon() + return + return + if(I.tool_behaviour == TOOL_WRENCH) + if(!completion) + I.use_tool(src, user, 0, volume=50) + I.play_tool_sound(src, 50) + setAnchored(!anchored) + user.balloon_alert(user, span_notice("[anchored ? "" : "un"]secured")) + return + if(I.use_tool(src, user, 2 SECONDS, volume=50)) + new /obj/machinery/atmospherics/components/trinary/nuclear_reactor(get_turf(src)) + qdel(src) + return + return + return ..() + +/obj/structure/reactor_frame/update_icon(updates) + . = ..() + icon_state = "reactor_frame_[completion]" + +/obj/structure/reactor_corium + name = "radioactive mass" + desc = "A large mass of molten reactor fuel, sometimes called corium. If you can see it, you're probably close enough to receive a lethal dose of radiation." + icon = 'icons/obj/machines/reactor.dmi' + icon_state = "reactor_corium" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF // no + light_color = LIGHT_COLOR_RED + light_range = 10 + light_on = TRUE + anchored = TRUE + density = FALSE + pixel_x = -32 + pixel_y = -32 + +/obj/structure/reactor_corium/Initialize(mapload) + . = ..() + AddComponent(/datum/component/radioactive, 15000, src, 0) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 68f7f64ac26f8..9492a27330b6a 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -770,3 +770,11 @@ build_path = /obj/item/circuitboard/machine/plort category = list("Research Machinery") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/reactor_control + name = "Computer Design (Reactor Control)" + desc = "The circuit board for a reactor control console." + id = "reactor_control" + build_path = /obj/item/circuitboard/computer/reactor + category = list ("Engineering Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 319fd2a8cad04..081af67e41e68 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -154,7 +154,7 @@ prereq_ids = list("base") design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin", "scanner_gate", "atmosalerts", "atmos_control", "recycler", "autolathe", "high_micro_laser", "nano_mani", "mesons", "thermomachine", "rad_collector", "tesla_coil", "grounding_rod", - "cell_charger", "stack_console", "stack_machine", "conveyor_belt", "conveyor_switch", + "cell_charger", "stack_console", "stack_machine", "conveyor_belt", "conveyor_switch", "reactor_control", "oxygen_tank", "plasma_tank", "emergency_oxygen", "emergency_oxygen_engi", "plasmaman_tank_belt", "electrolyzer", "floorigniter", "crystallizer", "suit_storage_unit", "atmos_thermal") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) diff --git a/config/game_options.txt b/config/game_options.txt index 645817ba6142a..fdda42c87c8ba 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -698,5 +698,5 @@ ECONOMY ## Uncomment to enable dynamic ruleset config file. DYNAMIC_CONFIG_ENABLED -## Force Engine - 1 for SM, 2 for Sing/Tesla, 3 for any. +## Force Engine - 1 for SM, 2 for Sing/Tesla, 3 for any, 4 for AGCNR ENGINE_TYPE 3 diff --git a/icons/obj/control_rod.dmi b/icons/obj/control_rod.dmi new file mode 100644 index 0000000000000..bef59ebf2ecdc Binary files /dev/null and b/icons/obj/control_rod.dmi differ diff --git a/icons/obj/inflatable.dmi b/icons/obj/inflatable.dmi new file mode 100644 index 0000000000000..625d7acd96064 Binary files /dev/null and b/icons/obj/inflatable.dmi differ diff --git a/icons/obj/machines/reactor.dmi b/icons/obj/machines/reactor.dmi new file mode 100644 index 0000000000000..46dabef0d4b70 Binary files /dev/null and b/icons/obj/machines/reactor.dmi differ diff --git a/icons/obj/machines/reactor_parts.dmi b/icons/obj/machines/reactor_parts.dmi new file mode 100644 index 0000000000000..7fd5cfccb07a7 Binary files /dev/null and b/icons/obj/machines/reactor_parts.dmi differ diff --git a/icons/obj/reactor_computer.dmi b/icons/obj/reactor_computer.dmi new file mode 100644 index 0000000000000..66bbcb40ac22d Binary files /dev/null and b/icons/obj/reactor_computer.dmi differ diff --git a/sound/effects/reactor/alarm.ogg b/sound/effects/reactor/alarm.ogg new file mode 100644 index 0000000000000..8e698a69f1a5b Binary files /dev/null and b/sound/effects/reactor/alarm.ogg differ diff --git a/sound/effects/reactor/crane_1.wav b/sound/effects/reactor/crane_1.wav new file mode 100644 index 0000000000000..394bd658cb830 Binary files /dev/null and b/sound/effects/reactor/crane_1.wav differ diff --git a/sound/effects/reactor/explode.ogg b/sound/effects/reactor/explode.ogg new file mode 100644 index 0000000000000..a16a0634b93d1 Binary files /dev/null and b/sound/effects/reactor/explode.ogg differ diff --git a/sound/effects/reactor/falloutwind.ogg b/sound/effects/reactor/falloutwind.ogg new file mode 100644 index 0000000000000..4119371517e88 Binary files /dev/null and b/sound/effects/reactor/falloutwind.ogg differ diff --git a/sound/effects/reactor/meltdown.ogg b/sound/effects/reactor/meltdown.ogg new file mode 100644 index 0000000000000..9c0a1a9917915 Binary files /dev/null and b/sound/effects/reactor/meltdown.ogg differ diff --git a/sound/effects/reactor/startup.ogg b/sound/effects/reactor/startup.ogg new file mode 100644 index 0000000000000..4df6e736c50d5 Binary files /dev/null and b/sound/effects/reactor/startup.ogg differ diff --git a/sound/effects/reactor/startup2.ogg b/sound/effects/reactor/startup2.ogg new file mode 100644 index 0000000000000..4df6e736c50d5 Binary files /dev/null and b/sound/effects/reactor/startup2.ogg differ diff --git a/sound/effects/reactor/switch.ogg b/sound/effects/reactor/switch.ogg new file mode 100644 index 0000000000000..b9cd7d1540212 Binary files /dev/null and b/sound/effects/reactor/switch.ogg differ diff --git a/sound/effects/reactor/switch2.ogg b/sound/effects/reactor/switch2.ogg new file mode 100644 index 0000000000000..668d3b0310565 Binary files /dev/null and b/sound/effects/reactor/switch2.ogg differ diff --git a/sound/effects/reactor/switch3.ogg b/sound/effects/reactor/switch3.ogg new file mode 100644 index 0000000000000..b89cbab4cc822 Binary files /dev/null and b/sound/effects/reactor/switch3.ogg differ diff --git a/sound/machines/reactor_alert_1.ogg b/sound/machines/reactor_alert_1.ogg new file mode 100644 index 0000000000000..b91965b7944f6 Binary files /dev/null and b/sound/machines/reactor_alert_1.ogg differ diff --git a/sound/machines/reactor_alert_2.ogg b/sound/machines/reactor_alert_2.ogg new file mode 100644 index 0000000000000..81dec95e083ec Binary files /dev/null and b/sound/machines/reactor_alert_2.ogg differ diff --git a/sound/machines/reactor_alert_3.ogg b/sound/machines/reactor_alert_3.ogg new file mode 100644 index 0000000000000..886dc932585fb Binary files /dev/null and b/sound/machines/reactor_alert_3.ogg differ diff --git a/tgui/packages/tgui/interfaces/NtosReactorStats.js b/tgui/packages/tgui/interfaces/NtosReactorStats.js new file mode 100644 index 0000000000000..5a906a1a6416c --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosReactorStats.js @@ -0,0 +1,82 @@ +import { useBackend } from '../backend'; +import { NtosWindow } from '../layouts'; +import { Button, ProgressBar, Section, Table } from '../components'; +import { ReactorStatsSection } from './ReactorComputer'; + +export const NtosReactorStats = (props, context) => { + return ( + + + + + + ); +}; + +export const NtosReactorMonitorContent = (props, context) => { + const { act, data } = useBackend(context); + if(!data.selected) { + return ( + + ); + } + return ( +
act('PRG_clear')} /> + )}> + +
+ ); +}; + +const ReactorList = (props, context) => { + const { act, data } = useBackend(context); + const { reactors = [] } = data; + return ( +
act('PRG_refresh')} /> + )}> + + {reactors.map(reactor => ( + + + {reactor.uid + '. ' + reactor.area_name} + + + Integrity: + + + + + +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/ReactorComputer.js b/tgui/packages/tgui/interfaces/ReactorComputer.js new file mode 100644 index 0000000000000..b233c728aeb3b --- /dev/null +++ b/tgui/packages/tgui/interfaces/ReactorComputer.js @@ -0,0 +1,256 @@ +import { useBackend, useLocalState } from '../backend'; +import { Window } from '../layouts'; +import { Box, Button, Chart, Flex, ProgressBar, Section, Tabs, Slider } from '../components'; +import { FlexItem } from '../components/Flex'; +import { formatSiUnit } from '../format'; + +export const ReactorComputer = (props, context) => { + const [tabIndex, setTabIndex] = useLocalState(context, "tab-index", 1); + return ( + + + + setTabIndex(1)}> + Status + + setTabIndex(2)}> + Control Rods + + setTabIndex(3)}> + Fuel Rods + + + {tabIndex === 1 && } + {tabIndex === 2 && } + {tabIndex === 3 && } + + + ); +}; + +export const ReactorStatsSection = (props, context) => { + const { act, data } = useBackend(context); + const powerData = data.powerData.map((value, i) => [i, value]); + const kpaData = data.kpaData.map((value, i) => [i, value]); + const tempCoreData = data.tempCoreData.map((value, i) => [i, value]); + const tempInputData = data.tempInputData.map((value, i) => [i, value]); + const tempOutputData = data.tempOutputData.map((value, i) => [i, value]); + return ( + +
+ Integrity: + + {data.integrity}% + + Reactor Power: + + {formatSiUnit(data.power, 0, "W")} + + Reactor Pressure: + + {formatSiUnit(data.kpa*1000, 1, "Pa")} + + Coolant temperature: + + {data.coolantInput} K + + Outlet temperature: + + {data.coolantOutput} K + + Core temperature: + + {data.coreTemp} K + + Neutrons per generation (K): + + {data.k} + +
+
+ + + + + +
+
+ ); +}; + +export const ReactorControlRodControl = (props, context) => { + const { act, data } = useBackend(context); + const control_rods = data.control_rods; + const k = data.k; + const desiredK = data.desiredK; + const fuel_rods = data.rods.length; + const shutdown_temp = data.shutdownTemp; + return ( + +
+ {'Reactor Power: '} +
+
+ Control Rod Insertion: + +
+ Neutrons per generation (K): +
+ + {k} + +
+ Target criticality: +
+ act('input', { + target: value, + })} /> +
+
+ ); +}; + +export const ReactorFuelControl = (props, context) => { + const { act, data } = useBackend(context); + const shutdown_temp = data.shutdownTemp; + return ( +
+ {data.rods.length > 0 ? ( + + + {Object.keys(data.rods).map(rod => ( + + + {data.rods[rod].rod_index}. {data.rods[rod].name} + +
+ ); +}; diff --git a/yogstation.dme b/yogstation.dme index 4a14ea489819b..24cf176ec8f32 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -102,6 +102,7 @@ #include "code\__DEFINES\radiation.dm" #include "code\__DEFINES\radio.dm" #include "code\__DEFINES\reactions.dm" +#include "code\__DEFINES\reactor.dm" #include "code\__DEFINES\reagents.dm" #include "code\__DEFINES\reagents_specific_heat.dm" #include "code\__DEFINES\research.dm" @@ -3012,6 +3013,7 @@ #include "code\modules\modular_computers\file_system\programs\engineering\atmosscan.dm" #include "code\modules\modular_computers\file_system\programs\engineering\energyharvestercontrol.dm" #include "code\modules\modular_computers\file_system\programs\engineering\powermonitor.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\reactor_monitor.dm" #include "code\modules\modular_computers\file_system\programs\engineering\sm_monitor.dm" #include "code\modules\modular_computers\file_system\programs\medical\chem_scan.dm" #include "code\modules\modular_computers\file_system\programs\medical\crew_monitor.dm" @@ -3133,6 +3135,9 @@ #include "code\modules\power\terminal.dm" #include "code\modules\power\tracker.dm" #include "code\modules\power\turbine.dm" +#include "code\modules\power\reactor\fuel_rods.dm" +#include "code\modules\power\reactor\reactor.dm" +#include "code\modules\power\reactor\reactor_frame.dm" #include "code\modules\power\singularity\collector.dm" #include "code\modules\power\singularity\containment_field.dm" #include "code\modules\power\singularity\emitter.dm" diff --git a/yogstation/code/datums/ruins/station.dm b/yogstation/code/datums/ruins/station.dm index b95dde7cf380c..d949aa6aa61c5 100644 --- a/yogstation/code/datums/ruins/station.dm +++ b/yogstation/code/datums/ruins/station.dm @@ -90,6 +90,11 @@ suffix = "engine_teg.dmm" name = "Engine TEG" +/datum/map_template/ruin/station/box/engine/reactor + id = "engine_reactor" + suffix = "engine_reactor.dmm" + name = "Engine Nuclear Reactor" + /datum/map_template/ruin/station/box/testingsite/bunker id = "testing_site_1" suffix = "testingsite_range1.dmm" @@ -287,7 +292,11 @@ id = "meta_teg" suffix = "meta_teg.dmm" name = "Meta TEG" - + +/datum/map_template/ruin/station/meta/reactor + id = "meta_reactor" + suffix = "meta_reactor.dmm" + name = "Meta Nuclear Reactor" //GaxStation diff --git a/yogstation/code/game/objects/effects/landmarks.dm b/yogstation/code/game/objects/effects/landmarks.dm index b531ab3fbd6b6..8833fd2e3ed29 100644 --- a/yogstation/code/game/objects/effects/landmarks.dm +++ b/yogstation/code/game/objects/effects/landmarks.dm @@ -102,7 +102,7 @@ GLOBAL_LIST_EMPTY(chosen_station_templates) return TRUE /obj/effect/landmark/stationroom/box/engine - template_names = list("Engine SM" = 60, "Engine Singulo And Tesla" = 40) + template_names = list("Engine SM" = 50, "Engine Singulo And Tesla" = 30, "Engine Nuclear Reactor" = 20) /obj/effect/landmark/stationroom/box/engine/choose() . = ..() @@ -114,6 +114,9 @@ GLOBAL_LIST_EMPTY(chosen_station_templates) return "Engine Singulo And Tesla" if(3) return . //We let the normal choose() do the work if we want to have all of them in play + if(4) + return "Engine Nuclear Reactor" + /obj/effect/landmark/stationroom/box/testingsite template_names = list("Bunker Bomb Range","Syndicate Bomb Range","Clown Bomb Range", "Clerk Bomb Range") @@ -134,7 +137,7 @@ GLOBAL_LIST_EMPTY(chosen_station_templates) template_names = list("Chapel 1", "Chapel 2") /obj/effect/landmark/stationroom/meta/engine - template_names = list("Meta Singulo And Tesla" = 40, "Meta SM" = 60, "Meta TEG" = 0) + template_names = list("Meta SM" = 25, "Meta Nuclear Reactor" = 75) // tesla is loud as fuck and singulo doesn't make sense, so SM/reactor only /obj/effect/landmark/stationroom/meta/engine/choose() . = ..() @@ -147,7 +150,7 @@ GLOBAL_LIST_EMPTY(chosen_station_templates) if(3) return . //We let the normal choose() do the work if we want to have all of them in play if(4) - return "Meta TEG" + return "Meta Nuclear Reactor" /obj/effect/landmark/stationroom/maint/