Merge pull request #14120 from duncathan/listmos

[READY] Listmos & "Datum Gases"
This commit is contained in:
Razharas
2016-01-15 11:58:05 +03:00
62 changed files with 906 additions and 1036 deletions
@@ -6196,14 +6196,14 @@
"cph" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/atmos)
"cpi" = (/obj/machinery/door/window/eastright{dir = 2},/turf/simulated/floor/plasteel,/area/atmos)
"cpj" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/simulated/floor/plasteel,/area/atmos)
"cpk" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = 3; flipped = 0; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cpk" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = "n2"; flipped = 0; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cpl" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/obj/machinery/meter,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cpm" = (/obj/machinery/atmospherics/components/binary/pump{dir = 8; name = "To Mix"; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
"cpn" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/toxins/mixing)
"cpo" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 6; initialize_directions = 6},/turf/simulated/floor/plasteel,/area/atmos)
"cpp" = (/obj/machinery/atmospherics/components/binary/pump{dir = 4; name = "Air to Mix"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
"cpq" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = 4; flipped = 0; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cpr" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = 2; flipped = 0; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cpq" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = "o2"; flipped = 0; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cpr" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = "co2"; flipped = 0; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cps" = (/obj/machinery/atmospherics/pipe/manifold/cyan/visible,/turf/simulated/floor/plasteel,/area/atmos)
"cpt" = (/obj/machinery/door/airlock/external{name = "Atmosphereics External Access"; req_access_txt = "24"},/turf/simulated/floor/plating,/area/atmos)
"cpu" = (/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -6561,11 +6561,11 @@
"cwi" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 5},/turf/simulated/floor/plasteel,/area/atmos)
"cwj" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/simulated/floor/plasteel,/area/atmos)
"cwk" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
"cwl" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = 1; flipped = 0; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cwl" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = "plasma"; flipped = 0; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cwm" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/machinery/door/window/eastright{dir = 2},/turf/simulated/floor/plasteel,/area/atmos)
"cwn" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/machinery/door/window/eastright{dir = 2},/obj/machinery/atmospherics/components/binary/pump{dir = 1; name = "O2 to Pure"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
"cwo" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/yellow/visible,/turf/simulated/floor/plasteel,/area/atmos)
"cwp" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = 0; flipped = 0; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cwp" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = "n2o"; flipped = 0; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cwq" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel,/area/atmos)
"cwr" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel,/area/atmos)
"cws" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 9},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel,/area/atmos)
@@ -6958,7 +6958,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbrvbLxcmXcmYbsebsebLxckhbsecmZcnacxbbrvbsechnchzchzcnbchzchncnccndcnecmmcnGclEcjacnhcnichzchzchzchnbGichBcnjcmncnkcmnchBcmocmpcmqchDcnlcnmcnncmvaabaaeaaeaaeaaeaaeaabcmvcmwcnocnpcnpcnqcnrcnscntchOcnvclZcnwcnwcnxcnwcnwcnwcnwcnwcnxcnwcnycelcelcelcelcelcelcelcpocpscppcqccqacfYchTaaechTchUchjchjccraaecjEaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbrvcnzcnAbrvbsebsebsebsebsebLxbLxbLxbrvbsechnchzchzchzchzchncnBcnCcnDcnHcolcnHckIciicnIchzchzcikchnbGichBchBchBchBchBchBchDchDchDcqocyFckRcmtcmvaabaabaaeaaeaaeaaeaaecmvcnOcnPcnQcnRcnScnTcnUcnVchOcelcfQcqxcelcmhcmDcmDcmDcricmDcmDcmDcmDcmDcmDcmDcmDcmDcmDcmDcuUcnXcvEcwacvTcmTcmUcyGcmUcwdchjchjccraaeagmaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbrvbrvbrvbrvbsebsebsebsebsecvXcobbsebQvbsechncodchzcoecofcogcohcoicokcojchtcojcjacjbcoochpchpcjdchnbGibsebsecyHbsebsebsecnJbsecyJczdcnMcyKcmtcotcmvcmvcmvcmvcmvcmvcmvcmucnOcnPcoucovcelcelcelcpKcwccfRcgXcelcelcwecwfciMciMcwgciNciMciMciNciMciMciMciNciMciMciMciNcmWcelcwhcgBcfYccraaeccrccrccrccrccraaecgCaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbrvcozcvZcoBbsebsebsebseckhcoCcoDcoEbrvbsechncoFcoGcoHchzchzcoIcoJcomciecoMchtconcjHcjHcjHcjHcjHchnbFnbIkbIkbIlbIkbIkbIkcyMcyLcyNcmucyOcoQcoRcoScoTcoUcoVcoWcoXcoYcoZcpacpbcpccpdcpecpfcpgcpfcphchOcpicwicprcwkcwjcwmcwlcwkcwjcwncpkcwkcwocwmcwpcwkcwocwmcpqcwkcwocwqcwqcwscwrcfYccraaeaaeaaeaaeaaeaaeaaeagmaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbrvcozcvZcoBbsebsebsebseckhcoCcoDcoEbrvbsechncoFcoGcoHchzchzcoIcoJcomciecoMchtconcjHcjHcjHcjHcjHchnbFnbIkbIkbIlbIkbIkbIkcyMcyLcyNcmucyOcoQcoRcoScoTcoUcoVcoWcoXcoYcoZcpacpbcpccpdcpecpfcpgcpfcphchOcpicwicpkcwkcwjcwmcpqcwkcwjcwncprcwkcwocwmcwlcwkcwocwmcwpcwkcwocwqcwqcwscwrcfYccraaeaaeaaeaaeaaeaaeaaeagmaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbrvbrvbrvbrvbrvbrvbrvcpucpubrvbrvbrvbrvbsechnchzcpvchzchzcpwcpxcpycoKchtcnDchtcyPcoLcoNcoNcoNcoNchnbsecmucmucmucmucmucmucmucmucmucoOcrgckRcpPcpPcnPcpPcpPcpPcpQcnPcpRcpRcpScpTccrchTchTccrccrccrccrcfYcfYcpUcpZcwtcfYcwucwwcwvcwxcpUcpVcpWcfYcpUcpXcpWcfYcpUcpYcpWcfYcfYcfYcfYcfYccraaeagmagncgCagmagmcjEagmaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaaeaaeaaeaaeaaecqdcqecqecqecqebsechnchzchzchzchzchncqfcqgcpzchtcnDchtcyRcyQcoNcoNcoNcpCchnbsecmucpFcpGcpHcpIcyScqycpLcpMcyTcpOcyUcqqcqrcqrcqrcqrcqrcqscqrcqrcqrcqtcqucmuaeHaeHaeHaeHaeHccrcqvcqzcqwcfYcwCcqvcqwcfYcwDczfcqwcfYcwEcqvcqwcfYcwFcqvcqwcfYcwGczgcfYcqvcfYcfYccraaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaabaabaabaabaabaabaaeaaeaaecqdcqdcqdcqCcqDcqEcqFbsechnchzchzcqGchzchncqHcqIcqhcpDcqichtcyVcqJcoNcoNcoNcoNchnbEicqlcyWcyYcyXcyZcyZcyYcyYczaczaczaczbcqOcpPcnPcpPcpPcpPcqMcnPcpRcpRcnPczhcmuaeHaeHaeHaeHaeHccrccrccrcqPchTcqQccrcwHcwJcwIccrcqPchTcqQccrcqPchTcqQccrcqPchTcqQccrccrccrccrcptccrccraeHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+6 -5
View File
@@ -5599,7 +5599,7 @@
"cdI" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/atmos)
"cdJ" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel,/area/atmos)
"cdK" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/atmos)
"cdL" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = 4; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cdL" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "n2o"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cdM" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 6},/area/atmos)
"cdN" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "n2o_in"; pixel_y = 1},/turf/simulated/floor/engine/n20,/area/atmos)
"cdO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/grille,/turf/simulated/floor/plating,/area/atmos)
@@ -5863,7 +5863,7 @@
"ciM" = (/obj/machinery/atmospherics/components/binary/pump{dir = 2; name = "Port to Filter"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
"ciN" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 8},/obj/structure/bed/stool,/turf/simulated/floor/plasteel,/area/atmos)
"ciO" = (/obj/machinery/atmospherics/components/unary/heat_reservoir/heater{dir = 8},/turf/simulated/floor/plasteel,/area/atmos)
"ciP" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"ciP" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "plasma"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"ciQ" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/atmos)
"ciR" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "tox_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
"ciS" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel/neutral,/area/atmos)
@@ -5943,7 +5943,7 @@
"cko" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 4; frequency = 1441; id = "n2_in"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
"ckp" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/wall/r_wall,/area/atmos)
"ckq" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/yellow/visible,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel/red/side{tag = "icon-red (SOUTHWEST)"; icon_state = "red"; dir = 10},/area/atmos)
"ckr" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 2; filter_type = 2; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"ckr" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 2; filter_type = "n2"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cks" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/turf/simulated/floor/plasteel,/area/atmos)
"ckt" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{dir = 8},/turf/simulated/floor/plasteel,/area/atmos)
"cku" = (/obj/machinery/atmospherics/components/binary/pump{dir = 8; name = "Port to Filter"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
@@ -6129,7 +6129,7 @@
"cnS" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "o2_in"; name = "Oxygen Supply Control"; output_tag = "o2_out"; sensors = list("o2_sensor" = "Tank")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/atmos)
"cnT" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plasteel,/area/atmos)
"cnU" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
"cnV" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = 3; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cnV" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "co2"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cnW" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/atmos)
"cnX" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
"cnY" = (/turf/simulated/wall/r_wall,/area/hallway/primary/aft)
@@ -7169,6 +7169,7 @@
"cHS" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"cHT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"cHU" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"cHV" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 2; filter_type = "o2"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -7347,7 +7348,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbQcdjcdjcdjcjCcdjcdjcbRceqcfRcjDchcckWckWckXchcaaaadpckYckZcdqcdqclaclbclcclcclccldcleclfclcclcclgclhclicljclkckbcllclmclncloclpclqclrclscltcluckmaaaclvciHclwceRabmbUObUObUObUObUOabmbUNclxbXzcktclyclzbTlchIbTlcaWcaXcaYclAbWibWjbWkclBclCclCbUOabmbSZbQNbQObMAbNYckxbSaclDclDclDclDclDclDclDabmabmabmabmcdQcdQcdQcdQcdQcdWckDckEcdWclEclEclEclEclEclFclGclHclEclEclEclIcdWclJckHckIcjcckHcjcckIcjccjccjcckHclKclLclMclNckPckPckQckRcgUcgVcfJcfJcfJcfJcfJcgVclOckTbWLcjxckUcjzclPckVckVckVclQaaaaaaabmabmabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbQcbQcepcbQcbQcbQcbQcbQclRclScbQcipclTckWclUchcchgchgcdqclVclWclXclYclZcmacmbcmccmccmdcmecmccmccmfcdscmgcmhcmicmjcmkcmlcmmcmnckmcmocmpcmqcmrcmsckmaaaclvcmtchBceRabmbUOcmucmucmvchEbWjbWicmwcmxcmycmzbTlbTlcmAcmBcmCbXCbXzcmDbUNabmbXEcmEcmFcmGbUOabmbSZbQNbQObMAbRZckxcmHcmIcmJcmKcmLcmMcmNcmIcmOcmOcmOaaacdQcmPcmQcmRcmScmTcmUcmVcmWclEcmXcmYcmZclEcnacnbcnccndcneclEcnfcdWcngcnhcnicdWcnjcdQcnkcnlcnlcnlcnmbWLcnncnocnpcnqcnqcnrckRbYkcjucfJcfJcfJcfJcfJcjubYkbYkbWLcjxckUcjzciickVckVckVclQaaaabmabmabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbRcdjcbRaaaaaaaaacbRceqcfRcjDchccnsckWckWcntcitciucitcnucnvcnwcnxcnycnzcnAcnzcnBcnCcnAcnDcnEcnFcdscdsckbckbckbcnGcnHcnIcnJckmcnKcnLcnMcnNcnOckmaaaclvcnPchBceRabmbUOcmucnQcnRbXEabmbUNcnSbXzckscnTcnUcnUcnUcnUcmzccxcnVcnWbYXbYYbWkcnXclCclCbUOabmcnYcnZcoacnYbNYcobcoccodcoecofcogcohcohcoicojcokcmOaaacdQcolcomconcoocopcoqckEckyclEcorcorcorclEcoscotcouclEclEcdQchYcovcowcoxchYcoyciacdQcozcoAcoAcoAcoBbWLcoCcoDcoEbYkbYkbYkckRcgUcgVcfJcfJcfJcfJcfJbWLbWLbWLbWLcoFcoGcjzciicoHcoIciiciiabmabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbRcdjcbRaaaaaaaaacbRceqcfRcjDchccoJcoJcoJchcchgchgcdqcoKcoLcoMcoNcoOcoPcoQcoNcoOcoRcoQcoNcoOcoScdscdsckbckbckbcoTcoUckbckmckmcoVcoWcoXcnNcoYckmaaaclvcnPcoZceRabmbUOcmucpacpbckpbYYbYXcpcckrcktcpdcpdcpecpfcpfcpgbXCbXzcphbUNabmbUObUObUObUObUOabmcnYcpicpjcpkcplcpmcpncmIcpocppcpqcohcprcmIcpscptcmOaaacdQcdQcdQcdQcdQcdWckDckEcdWclEcpucpvcpwclEcoscorcorcpxcpycdQcpzcomcpAcdQcpzcomcpAcdQcpBcoAcoAcoAcpCbWLcpDcpEcpFcpGcpHcpIcpJcgUcgVcfJcfJcfJcfJcfJbWLcoFcpKcpLcpMcpNcpOciiclQclQciiabmabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbRcdjcbRaaaaaaaaacbRceqcfRcjDchccoJcoJcoJchcchgchgcdqcoKcoLcoMcoNcoOcoPcoQcoNcoOcoRcoQcoNcoOcoScdscdsckbckbckbcoTcoUckbckmckmcoVcoWcoXcnNcoYckmaaaclvcnPcoZceRabmbUOcmucpacpbckpbYYbYXcpccHVcktcpdcpdcpecpfcpfcpgbXCbXzcphbUNabmbUObUObUObUObUOabmcnYcpicpjcpkcplcpmcpncmIcpocppcpqcohcprcmIcpscptcmOaaacdQcdQcdQcdQcdQcdWckDckEcdWclEcpucpvcpwclEcoscorcorcpxcpycdQcpzcomcpAcdQcpzcomcpAcdQcpBcoAcoAcoAcpCbWLcpDcpEcpFcpGcpHcpIcpJcgUcgVcfJcfJcfJcfJcfJbWLcoFcpKcpLcpMcpNcpOciiclQclQciiabmabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbRcdjcbRaaaaaaaaacbQcpPciocbQcpQcpRcpRcpRcpSaaaadpckYcpTcpUcpVcpTcpWcpXcpYcoNcpZcqacqbcoNcqccqdcqecdsckbcqfcqgcqhcqicqjcqkckmckmckmckmckmckmckmaaaclvcnPcqlceRabmbUObUObUObUObUOabmbUNbXucqmcqncqocqocqocqocqocqpcqqcqrcqsbMAabmabmabmabmabmabmabmcnYcqtcqucqvcqvcqwcqxcqycqzcqAcqBcohcqCcmIcojcqDcmOaaacdQcmPcmQcmRcmScqEcmUcmVcqFclEcorcorcorclEcoscorcorclEclEcdQcolcomcqGcdQcolcomcqGcdQcqHcoAcqIcqJcqKbWLbWLbWLbWLbWLbWLcqLbWLbWLbWLcfJcfJcfJcfJcfJbWLckUcqMcqNcqOcpOaaaaaaaaaaaaaaaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbRcdjcbRaaaaaaaaacbQceqcfRcbQcdpcdpcdpcdpcdpcpTcpTcpTcpTcqPcqQcpTcqRcpXcqScoNcqTcqacqScoNcqUcqVcqScdsckbcqWcqXclncqiclncqYcqZckbaaaaaaabmabmaaaaaaclvcnPcraceRabmabmabmabmabmabmabmbUNcrbcrccrdcrecrfcrgcrhcricnTcrjcrkcrlcrmcrnabmabmabmabmabmabmcnYcrocrpcrpcrqcrrcrscrtcrucrvcrwcrxcrycmIcmOcmOcmOaaacdQcolcomconcrzcopcrAcrBcdWclEcmXcrCcorcrDcrEcrFcorcrGcrHcdQcdQcdQcdQcdQcdQcdQcdQcdQciicrIciiciiciiciicrJcrKcrLcrMcrNcrOcrPcrQbWLbWLbWLbWLbWLbWLbWLckUcrRciiciiabmabmabmabmabmabmabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbQcbQcepcbQcbQaaaaaacbQcrScfRcbQcrTcrUcrVcbQaaacrWcrXcrYcrZcsacsbcpTcdscsccoNcoNcoNcsdcoNcoNcoNcsecdscdsckbcsfcsgclncshclnclncsickbaaaclvcsjcsjclvclvclvcnPchBceRceRceRceRceRceRceRceRbMAbMAcskcslbMAbMAbMAcsmcsnbRXcsobMAbMAbMAcspcspcspcspcspcspcspcspcsqcsrcspcsscstcsucsvcsvcsvcsvcsvcsvcsvabmabmabmabmcdQcdQcdQcdQcdQcswcsxcsycszcsAcsAcsAcsAcsAcsAcsAcsAcsAcsAcsAcsBcsCcsCcsCcsCcsDcsEcsCcsFcsGcsHcsCcsIcsJcsJcsJcsJcsKcsJcsLcsMcsNcsNcsNcsNcsNcsNcsNcsOcsPcjzciiaaaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1559,7 +1559,7 @@
"aDY" = (/obj/effect/spawner/structure/window,/turf/simulated/floor/plating,/area/atmos)
"aDZ" = (/obj/machinery/atmospherics/components/binary/pump{dir = 0; name = "Port Mix to Filling Ports"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
"aEa" = (/obj/machinery/atmospherics/components/binary/pump{dir = 0; name = "Port Mix to Temperature Ports"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
"aEb" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = 4; on = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "escape"},/area/atmos)
"aEb" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "n2o"; on = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "escape"},/area/atmos)
"aEc" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "n2o_in"; pixel_y = 1},/turf/simulated/floor/engine/n20,/area/atmos)
"aEd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/atmos_control)
"aEe" = (/turf/simulated/wall/mineral/wood,/area/maintenance/atmos_control)
@@ -1850,7 +1850,7 @@
"aJD" = (/obj/structure/sign/nosmoking_2,/turf/simulated/wall,/area/atmos)
"aJE" = (/obj/machinery/atmospherics/components/binary/pump{dir = 0; name = "Port to Filter"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
"aJF" = (/obj/machinery/atmospherics/components/unary/cold_sink/freezer{dir = 8},/turf/simulated/floor/plasteel,/area/atmos)
"aJG" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "purple"},/area/atmos)
"aJG" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "plasma"; on = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "purple"},/area/atmos)
"aJH" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "tox_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
"aJI" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken6"; tag = "icon-wood-broken6"},/area/maintenance/atmos_control)
"aJJ" = (/obj/structure/bed/chair/comfy/lime{tag = "icon-comfychair (NORTH)"; icon_state = "comfychair"; dir = 1},/turf/simulated/floor/wood,/area/maintenance/atmos_control)
@@ -2140,7 +2140,7 @@
"aPh" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 4},/obj/machinery/atmospherics/components/binary/pump{dir = 1; name = "O2 Outlet Pump"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
"aPi" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 10; initialize_directions = 10},/turf/simulated/floor/plasteel,/area/atmos)
"aPj" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/simulated/floor/plasteel/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/area/atmos)
"aPk" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = 3; on = 1},/turf/simulated/floor/plasteel{tag = "icon-caution (SOUTHWEST)"; icon_state = "caution"; dir = 10},/area/atmos)
"aPk" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "co2"; on = 1},/turf/simulated/floor/plasteel{tag = "icon-caution (SOUTHWEST)"; icon_state = "caution"; dir = 10},/area/atmos)
"aPl" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4; initialize_directions = 12},/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/atmos)
"aPm" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
"aPn" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/atmos_control)
@@ -2226,11 +2226,11 @@
"aQP" = (/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
"aQQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0; tag = "w"},/turf/simulated/floor/plasteel/neutral/corner{tag = "icon-neutralcorner (NORTH)"; icon_state = "neutralcorner"; dir = 1},/area/hallway/secondary/entry)
"aQR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 5},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/atmos)
"aQS" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = 2; on = 1},/turf/simulated/floor/plasteel/red/side{tag = "icon-red (NORTHWEST)"; icon_state = "red"; dir = 9},/area/atmos)
"aQS" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = "n2"; on = 1},/turf/simulated/floor/plasteel/red/side{tag = "icon-red (NORTHWEST)"; icon_state = "red"; dir = 9},/area/atmos)
"aQT" = (/obj/machinery/atmospherics/pipe/simple/green/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10; initialize_directions = 12},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2_in"; name = "Nitrogen Supply Control"; output_tag = "n2_out"; sensors = list("n2_sensor" = "Tank")},/turf/simulated/floor/plasteel/red/side{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/atmos)
"aQU" = (/obj/machinery/atmospherics/pipe/manifold/cyan/visible{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel/red/side{tag = "icon-red (NORTHEAST)"; icon_state = "red"; dir = 5},/area/atmos)
"aQV" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 6},/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 9},/turf/simulated/floor/plasteel,/area/atmos)
"aQW" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = 1; on = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/atmos)
"aQW" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = "o2"; on = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/atmos)
"aQX" = (/obj/machinery/atmospherics/pipe/simple/green/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10; initialize_directions = 12},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "o2_in"; name = "Oxygen Supply Control"; output_tag = "o2_out"; sensors = list("o2_sensor" = "Tank")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/atmos)
"aQY" = (/obj/machinery/atmospherics/pipe/manifold/cyan/visible{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/atmos)
"aQZ" = (/obj/machinery/atmospherics/components/trinary/mixer{node1_concentration = 0.8; node2_concentration = 0.2},/turf/simulated/floor/plasteel/barber,/area/atmos)
@@ -4804,7 +4804,7 @@
"bOt" = (/obj/machinery/atmospherics/pipe/manifold/general/visible,/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
"bOu" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/atmos)
"bOv" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/atmos)
"bOw" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = 4; on = 1},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 6},/area/atmos)
"bOw" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "n2o"; on = 1},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 6},/area/atmos)
"bOx" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
"bOy" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "n2o_in"; pixel_y = 1},/turf/simulated/floor/engine/n20,/area/atmos)
"bOz" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - N2O"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine/n20,/area/atmos)
@@ -5115,7 +5115,7 @@
"bUs" = (/obj/structure/fireaxecabinet{pixel_x = -32; pixel_y = 0},/obj/machinery/camera{c_tag = "Atmospherics - Port"; dir = 4; network = list("SS13")},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/atmos)
"bUt" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 4},/obj/machinery/portable_atmospherics/canister,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/atmos)
"bUu" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 4; initialize_directions = 11},/obj/machinery/meter,/obj/item/weapon/wrench,/turf/simulated/floor/plasteel,/area/atmos)
"bUv" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; on = 1},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "purplefull"},/area/atmos)
"bUv" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "plasma"; on = 1},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "purplefull"},/area/atmos)
"bUw" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "tox_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
"bUx" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - Toxins"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
"bUy" = (/obj/structure/table,/obj/machinery/microwave,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
@@ -5382,7 +5382,7 @@
"bZz" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{color = "#330000"},/obj/machinery/meter{color = ""},/turf/simulated/floor/plasteel,/area/atmos)
"bZA" = (/obj/machinery/atmospherics/components/binary/pump{dir = 8; name = "Pure to Fuel Pipe"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
"bZB" = (/obj/machinery/atmospherics/pipe/manifold/yellow/visible{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
"bZC" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = 3; on = 1},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "vault"},/area/atmos)
"bZC" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "co2"; on = 1},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "vault"},/area/atmos)
"bZD" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
"bZE" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - CO2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
"bZF" = (/obj/machinery/power/solar_control{id = "aftport"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar)
@@ -5577,11 +5577,11 @@
"cdm" = (/obj/machinery/power/smes{capacity = 9e+006; charge = 10000},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cdn" = (/obj/machinery/door/window/northleft{dir = 1; icon_state = "left"; name = "Inner Pipe Access"; req_access_txt = "24"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
"cdo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 5},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 1; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
"cdp" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = 2; on = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "redfull"},/area/atmos)
"cdp" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = "n2"; on = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "redfull"},/area/atmos)
"cdq" = (/obj/structure/window/reinforced,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2_in"; name = "Nitrogen Supply Control"; output_tag = "n2_out"; sensors = list("n2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/general/visible{color = "#330000"},/turf/simulated/floor/plasteel{icon_state = "redfull"},/area/atmos)
"cdr" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/components/binary/pump{dir = 1; name = "Nitrogen Outlet"; on = 1},/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redfull"},/area/atmos)
"cds" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/northleft{dir = 1; icon_state = "left"; name = "Inner Pipe Access"; req_access_txt = "24"},/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
"cdt" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "bluefull"},/area/atmos)
"cdt" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = "o2"; on = 1},/turf/simulated/floor/plasteel{icon_state = "bluefull"},/area/atmos)
"cdu" = (/obj/structure/window/reinforced,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "o2_in"; name = "Oxygen Supply Control"; output_tag = "o2_out"; sensors = list("o2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bluefull"},/area/atmos)
"cdv" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/components/binary/pump{dir = 1; name = "O2 to Airmix"; on = 1},/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bluefull"},/area/atmos)
"cdw" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/machinery/door/window/northleft{dir = 1; icon_state = "left"; name = "Inner Pipe Access"; req_access_txt = "24"},/obj/machinery/atmospherics/components/binary/pump{dir = 1; name = "O2 to Pure"},/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
@@ -5199,7 +5199,7 @@
"bVY" = (/obj/machinery/atmospherics/pipe/manifold/general/visible,/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
"bVZ" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 8},/turf/simulated/floor/plasteel,/area/atmos)
"bWa" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/atmos)
"bWb" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = 4; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"bWb" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "n2o"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"bWc" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 6},/area/atmos)
"bWd" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "n2o_in"; pixel_y = 1},/turf/simulated/floor/engine/n20,/area/atmos)
"bWe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
@@ -5389,7 +5389,7 @@
"bZG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/atmos)
"bZH" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 4; initialize_directions = 11},/obj/item/weapon/wrench,/turf/simulated/floor/plasteel,/area/atmos)
"bZI" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 8},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
"bZJ" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"bZJ" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "plasma"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"bZK" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/atmos)
"bZL" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "tox_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
"bZM" = (/turf/simulated/floor/plating{icon_state = "platingdmg3"},/area/maintenance/asmaint)
@@ -5589,7 +5589,7 @@
"cdy" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
"cdz" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 4},/obj/machinery/atmospherics/components/binary/pump{dir = 1; name = "O2 to Pure"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
"cdA" = (/obj/machinery/atmospherics/components/trinary/mixer{dir = 4; node1_concentration = 0.8; node2_concentration = 0.2; on = 1; pixel_x = 0; pixel_y = 0; target_pressure = 4500},/turf/simulated/floor/plasteel,/area/atmos)
"cdB" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = 3; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cdB" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "co2"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cdC" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/atmos)
"cdD" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
"cdE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
@@ -5674,7 +5674,7 @@
"cff" = (/obj/machinery/vending/tool,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/engine/engineering)
"cfg" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering)
"cfh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/break_room)
"cfi" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 2; filter_type = 2; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cfi" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 2; filter_type = "n2"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cfj" = (/turf/simulated/wall,/area/maintenance/incinerator)
"cfk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/atmos{name = "Turbine Access"; req_access_txt = "32"},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cfl" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/maintenance/incinerator)
@@ -5709,7 +5709,7 @@
"cfO" = (/obj/machinery/atmospherics/pipe/simple/green/visible,/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor/plasteel,/area/atmos)
"cfP" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
"cfQ" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/simulated/floor/plasteel,/area/atmos)
"cfR" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = 1; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cfR" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 4; filter_type = "o2"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"cfS" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4; initialize_directions = 12},/turf/simulated/floor/plasteel,/area/atmos)
"cfT" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 9},/turf/simulated/floor/plasteel,/area/atmos)
"cfU" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/wall,/area/maintenance/incinerator)
+2 -1
View File
@@ -12,4 +12,5 @@ cheridan
giacomand
rockdtben
MrStonedOne
Jordie0608
Jordie0608
Dunc
@@ -1,9 +1,10 @@
#define FILTER_NOTHING -1
#define FILTER_PLASMA 0
#define FILTER_OXYGEN 1
#define FILTER_NITROGEN 2
#define FILTER_CARBONDIOXIDE 3
#define FILTER_NITROUSOXIDE 4
#define FILTER_NOTHING ""
//very cleverly using the gas IDs so as to simplify a bunch of logic
#define FILTER_PLASMA "plasma"
#define FILTER_OXYGEN "o2"
#define FILTER_NITROGEN "n2"
#define FILTER_CARBONDIOXIDE "co2"
#define FILTER_NITROUSOXIDE "n2o"
/obj/machinery/atmospherics/components/trinary/filter
icon_state = "filter_off"
@@ -17,7 +18,7 @@
var/target_pressure = ONE_ATMOSPHERE
var/filter_type = 0
var/filter_type = FILTER_PLASMA
/*
Filter types:
-1: Nothing
@@ -108,39 +109,17 @@ Filter types:
var/datum/gas_mixture/filtered_out = new
filtered_out.temperature = removed.temperature
switch(filter_type)
if(FILTER_PLASMA)
filtered_out.toxins = removed.toxins
removed.toxins = 0
if(removed.trace_gases.len>0)
for(var/datum/gas/trace_gas in removed.trace_gases)
if(istype(trace_gas, /datum/gas/oxygen_agent_b))
removed.trace_gases -= trace_gas
filtered_out.trace_gases += trace_gas
if(FILTER_OXYGEN)
filtered_out.oxygen = removed.oxygen
removed.oxygen = 0
if(FILTER_NITROGEN)
filtered_out.nitrogen = removed.nitrogen
removed.nitrogen = 0
if(FILTER_CARBONDIOXIDE)
filtered_out.carbon_dioxide = removed.carbon_dioxide
removed.carbon_dioxide = 0
if(FILTER_NITROUSOXIDE)
if(removed.trace_gases.len>0)
for(var/datum/gas/trace_gas in removed.trace_gases)
if(istype(trace_gas, /datum/gas/sleeping_agent))
removed.trace_gases -= trace_gas
filtered_out.trace_gases += trace_gas
else
filtered_out = null
if(filter_type && removed.gases[filter_type])
filtered_out.assert_gas(filter_type)
filtered_out.gases[filter_type][MOLES] = removed.gases[filter_type][MOLES]
removed.gases[filter_type][MOLES] = 0
if(filter_type == FILTER_PLASMA && removed.gases["agent_b"])
filtered_out.assert_gas("agent_b")
filtered_out.gases["agent_b"][MOLES] = removed.gases["agent_b"][MOLES]
removed.gases["agent_b"][MOLES] = 0
removed.garbage_collect()
else
filtered_out = null
air2.merge(filtered_out)
air3.merge(removed)
@@ -266,7 +266,7 @@
if(occupant.bodytemperature < T0C)
occupant.sleeping = max(5 / efficiency, (1 / occupant.bodytemperature) * 2000 / efficiency)
occupant.Paralyse(max(5 / efficiency, (1 / occupant.bodytemperature) * 3000 / efficiency))
if(air_contents.oxygen > 2)
if(air_contents.gases["o2"] && air_contents.gases["o2"][MOLES] > 2)
if(occupant.getOxyLoss()) occupant.adjustOxyLoss(-1)
else
occupant.adjustOxyLoss(-1)
@@ -46,7 +46,8 @@
var/added_oxygen = oxygen_content - total_moles
air_contents.temperature = (current_heat_capacity*air_contents.temperature + 20*added_oxygen*T0C)/(current_heat_capacity+20*added_oxygen)
air_contents.oxygen += added_oxygen
air_contents.assert_gas("o2")
air_contents.gases["o2"][MOLES] += added_oxygen
update_parents()
@@ -6,58 +6,36 @@
desc = "A large vessel containing pressurized gas."
var/volume = 10000 //in liters, 1 meters by 1 meters by 2 meters
density = 1
var/gas_type = 0
/obj/machinery/atmospherics/components/unary/tank/New()
..()
var/datum/gas_mixture/air_contents = AIR1
air_contents.volume = volume
air_contents.temperature = T20C
if(gas_type)
air_contents.assert_gas(gas_type)
air_contents.gases[gas_type][MOLES] = AIR_CONTENTS
name = "[name] ([air_contents.gases[gas_type][GAS_NAME]])"
/obj/machinery/atmospherics/components/unary/tank/carbon_dioxide
name = "pressure tank (Carbon Dioxide)"
/obj/machinery/atmospherics/components/unary/tank/carbon_dioxide/New()
..()
var/datum/gas_mixture/air_contents = AIR1
air_contents.carbon_dioxide = AIR_CONTENTS
gas_type = "co2"
/obj/machinery/atmospherics/components/unary/tank/toxins
icon_state = "orange"
name = "pressure tank (Plasma)"
/obj/machinery/atmospherics/components/unary/tank/toxins/New()
..()
var/datum/gas_mixture/air_contents = AIR1
air_contents.toxins = AIR_CONTENTS
gas_type = "plasma"
/obj/machinery/atmospherics/components/unary/tank/oxygen_agent_b
icon_state = "orange_2"
name = "pressure tank (Oxygen + Plasma)"
/obj/machinery/atmospherics/components/unary/tank/oxygen_agent_b/New()
..()
var/datum/gas_mixture/air_contents = AIR1
var/datum/gas/oxygen_agent_b/trace_gas = new
trace_gas.moles = AIR_CONTENTS
air_contents.trace_gases += trace_gas
gas_type = "agent_b"
/obj/machinery/atmospherics/components/unary/tank/oxygen
icon_state = "blue"
name = "pressure tank (Oxygen)"
/obj/machinery/atmospherics/components/unary/tank/oxygen/New()
..()
var/datum/gas_mixture/air_contents = AIR1
air_contents.oxygen = AIR_CONTENTS
gas_type = "o2"
/obj/machinery/atmospherics/components/unary/tank/nitrogen
icon_state = "red"
name = "pressure tank (Nitrogen)"
/obj/machinery/atmospherics/components/unary/tank/nitrogen/New()
..()
var/datum/gas_mixture/air_contents = AIR1
air_contents.nitrogen = AIR_CONTENTS
gas_type = "n2"
/obj/machinery/atmospherics/components/unary/tank/air
icon_state = "grey"
@@ -66,5 +44,6 @@
/obj/machinery/atmospherics/components/unary/tank/air/New()
..()
var/datum/gas_mixture/air_contents = AIR1
air_contents.oxygen = AIR_CONTENTS * 0.2
air_contents.nitrogen = AIR_CONTENTS * 0.8
air_contents.assert_gases("o2", "n2")
air_contents.gases["o2"][MOLES] = AIR_CONTENTS * 0.2
air_contents.gases["n2"][MOLES] = AIR_CONTENTS * 0.8
@@ -162,40 +162,56 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/proc/scrub(var/turf/simulated/tile)
if (!tile || !istype(tile))
if (!istype(tile))
return 0
var/datum/gas_mixture/environment = tile.return_air()
var/datum/gas_mixture/air_contents = AIR1
var/list/env_gases = environment.gases
if(scrubbing & SCRUBBING)
if((environment.toxins>0) || (environment.carbon_dioxide>0) || (environment.trace_gases.len>0))
var/should_we_scrub = FALSE
for(var/id in env_gases)
if(id == "n2" || id == "o2")
continue
if(env_gases[id][MOLES])
should_we_scrub = TRUE
break
if(should_we_scrub)
var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles()
//Take a gas sample
var/datum/gas_mixture/removed = tile.remove_air(transfer_moles)
var/list/removed_gases = removed.gases
if (isnull(removed)) //in space
return
//Filter it
var/datum/gas_mixture/filtered_out = new
var/list/filtered_gases = filtered_out.gases
filtered_out.temperature = removed.temperature
if(scrub_Toxins)
filtered_out.toxins = removed.toxins
removed.toxins = 0
if(scrub_CO2)
filtered_out.carbon_dioxide = removed.carbon_dioxide
removed.carbon_dioxide = 0
if(removed.trace_gases.len>0)
for(var/datum/gas/trace_gas in removed.trace_gases)
if(istype(trace_gas, /datum/gas/oxygen_agent_b))
removed.trace_gases -= trace_gas
filtered_out.trace_gases += trace_gas
else if(istype(trace_gas, /datum/gas/sleeping_agent) && scrub_N2O)
removed.trace_gases -= trace_gas
filtered_out.trace_gases += trace_gas
if(scrub_Toxins && removed_gases["plasma"])
filtered_out.assert_gas("plasma")
filtered_gases["plasma"][MOLES] = removed_gases["plasma"][MOLES]
removed.gases["plasma"][MOLES] = 0
if(scrub_CO2 && removed_gases["co2"])
filtered_out.assert_gas("co2")
filtered_out.gases["co2"][MOLES] = removed_gases["co2"][MOLES]
removed.gases["co2"][MOLES] = 0
if(removed_gases["agent_b"])
filtered_out.assert_gas("agent_b")
filtered_out.gases["agent_b"][MOLES] = removed_gases["agent_b"][MOLES]
removed.gases["agent_b"][MOLES] = 0
if(scrub_N2O && removed_gases["n2o"])
filtered_out.assert_gas("n2o")
filtered_out.gases["n2o"][MOLES] = removed_gases["n2o"][MOLES]
removed.gases["n2o"][MOLES] = 0
removed.garbage_collect()
//Remix the resulting gases
air_contents.merge(filtered_out)
+19 -56
View File
@@ -129,21 +129,14 @@ var/pipenetwarnings = 10
for(var/obj/machinery/atmospherics/pipe/member in members)
member.air_temporary = new
member.air_temporary.volume = member.volume
member.air_temporary.copy_from(air)
var/member_gases = member.air_temporary.gases
member.air_temporary.oxygen = air.oxygen*member.volume/air.volume
member.air_temporary.nitrogen = air.nitrogen*member.volume/air.volume
member.air_temporary.toxins = air.toxins*member.volume/air.volume
member.air_temporary.carbon_dioxide = air.carbon_dioxide*member.volume/air.volume
for(var/id in member_gases)
member_gases[id][MOLES] *= member.volume/air.volume
member.air_temporary.temperature = air.temperature
if(air.trace_gases.len)
for(var/datum/gas/trace_gas in air.trace_gases)
var/datum/gas/corresponding = new trace_gas.type()
member.air_temporary.trace_gases += corresponding
corresponding.moles = trace_gas.moles*member.volume/air.volume
/datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity)
var/total_heat_capacity = air.heat_capacity()
var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume)
@@ -202,8 +195,8 @@ var/pipenetwarnings = 10
var/list/datum/pipeline/PL = list()
PL += src
for(var/i=1;i<=PL.len;i++)
var/datum/pipeline/P = PL[i]
for(var/i in PL)
var/datum/pipeline/P = i
GL += P.air
GL += P.other_airs
for(var/obj/machinery/atmospherics/components/binary/valve/V in P.other_atmosmch)
@@ -214,56 +207,26 @@ var/pipenetwarnings = 10
if(C.connected_device)
GL += C.portableConnectorReturnAir()
var/total_volume = 0
var/total_thermal_energy = 0
var/total_heat_capacity = 0
var/total_oxygen = 0
var/total_nitrogen = 0
var/total_toxins = 0
var/total_carbon_dioxide = 0
var/list/total_trace_gases = list()
var/datum/gas_mixture/total_gas_mixture = new(0)
for(var/i in GL)
var/datum/gas_mixture/G = i
total_gas_mixture.volume += G.volume
total_gas_mixture.merge(G)
for(var/datum/gas_mixture/G in GL)
total_volume += G.volume
total_thermal_energy += G.thermal_energy()
total_heat_capacity += G.heat_capacity()
total_oxygen += G.oxygen
total_nitrogen += G.nitrogen
total_toxins += G.toxins
total_carbon_dioxide += G.carbon_dioxide
if(G.trace_gases.len)
for(var/datum/gas/trace_gas in G.trace_gases)
var/datum/gas/corresponding = locate(trace_gas.type) in total_trace_gases
if(!corresponding)
corresponding = new trace_gas.type()
total_trace_gases += corresponding
corresponding.moles += trace_gas.moles
if(total_volume > 0)
//Calculate temperature
var/temperature = 0
if(total_heat_capacity > 0)
temperature = total_thermal_energy/total_heat_capacity
total_gas_mixture.temperature = total_heat_capacity ? total_thermal_energy/total_heat_capacity : 0
if(total_gas_mixture.volume > 0)
//Update individual gas_mixtures by volume ratio
for(var/datum/gas_mixture/G in GL)
G.oxygen = total_oxygen*G.volume/total_volume
G.nitrogen = total_nitrogen*G.volume/total_volume
G.toxins = total_toxins*G.volume/total_volume
G.carbon_dioxide = total_carbon_dioxide*G.volume/total_volume
G.copy_from(total_gas_mixture)
var/list/G_gases = G.gases
for(var/id in G_gases)
G_gases[id][MOLES] *= G.volume/total_gas_mixture.volume
G.temperature = temperature
if(total_trace_gases.len)
for(var/datum/gas/trace_gas in total_trace_gases)
var/datum/gas/corresponding = locate(trace_gas.type) in G.trace_gases
if(!corresponding)
corresponding = new trace_gas.type()
G.trace_gases += corresponding
corresponding.moles = trace_gas.moles*G.volume/total_volume
+81
View File
@@ -0,0 +1,81 @@
var/list/hardcoded_gases = list("o2","n2","co2","plasma") //the main four gases, which were at one time hardcoded
/proc/meta_gas_list()
var/meta_list = new /list
for(var/gas_path in subtypesof(/datum/gas))
var/list/gas_info = new(4)
var/datum/gas/g = gas_path
gas_info[1] = initial(g.specific_heat)
gas_info[2] = initial(g.name)
gas_info[3] = initial(g.moles_visible)
if(gas_info[3] != null)
gas_info[4] = new /obj/effect/overlay/gas(initial(g.gas_overlay))
meta_list[initial(g.id)] = gas_info
. = meta_list
/*||||||||||||||/----------\||||||||||||||*\
||||||||||||||||[GAS DATUMS]||||||||||||||||
||||||||||||||||\__________/||||||||||||||||
||||These should never be instantiated. ||||
||||They exist only to make it easier ||||
||||to add a new gas. They are accessed ||||
||||only by meta_gas_list(). ||||
\*||||||||||||||||||||||||||||||||||||||||*/
/datum/gas
var/id = ""
var/specific_heat = 0
var/name = ""
var/gas_overlay = "" //icon_state in icons/effects/tile_effects.dmi
var/moles_visible = null
/datum/gas/oxygen
id = "o2"
specific_heat = 20
name = "Oxygen"
/datum/gas/nitrogen
id = "n2"
specific_heat = 20
name = "Nitrogen"
/datum/gas/carbon_dioxide //what the fuck is this?
id = "co2"
specific_heat = 30
name = "Carbon Dioxide"
/datum/gas/plasma
id = "plasma"
specific_heat = 200
name = "Plasma"
gas_overlay = "plasma"
moles_visible = MOLES_PLASMA_VISIBLE
/datum/gas/nitrous_oxide
id = "n2o"
specific_heat = 40
name = "Nitrous Oxide"
gas_overlay = "sleeping_agent"
moles_visible = 1
/datum/gas/oxygen_agent_b
id = "agent_b"
specific_heat = 300
name = "Oxygen Agent B"
/datum/gas/volatile_fuel
id = "v_fuel"
specific_heat = 30
name = "Volatile Fuel"
/obj/effect/overlay/gas/
icon = 'icons/effects/tile_effects.dmi'
mouse_opacity = 0
layer = 5
appearance_flags = RESET_COLOR
/obj/effect/overlay/gas/New(state)
. = ..()
icon_state = state
+8 -4
View File
@@ -11,9 +11,13 @@
var/datum/gas_mixture/air_contents = return_air()
if(!air_contents)
return 0
var/oxy = air_contents.gases["o2"] ? air_contents.gases["o2"][MOLES] : 0
var/tox = air_contents.gases["plasma"] ? air_contents.gases["plasma"][MOLES] : 0
if(active_hotspot)
if(soh)
if(air_contents.toxins > 0.5 && air_contents.oxygen > 0.5)
if(tox > 0.5 && oxy > 0.5)
if(active_hotspot.temperature < exposed_temperature)
active_hotspot.temperature = exposed_temperature
if(active_hotspot.volume < exposed_volume)
@@ -22,11 +26,11 @@
var/igniting = 0
if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && air_contents.toxins > 0.5)
if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && tox > 0.5)
igniting = 1
if(igniting)
if(air_contents.oxygen < 0.5 || air_contents.toxins < 0.5)
if(oxy < 0.5 || tox < 0.5)
return 0
active_hotspot = PoolOrNew(/obj/effect/hotspot, src)
@@ -104,7 +108,7 @@
qdel(src)
return
if(!(location.air) || location.air.toxins < 0.5 || location.air.oxygen < 0.5)
if(!(location.air) || !location.air.gases["plasma"] || !location.air.gases["o2"] || location.air.gases["plasma"][MOLES] < 0.5 || location.air.gases["o2"][MOLES] < 0.5)
qdel(src)
return
+17 -9
View File
@@ -155,6 +155,7 @@ var/const/SPAWN_AIR = 256
return
var/datum/gas_mixture/G = new
var/list/new_gases = G.gases
if(flag & SPAWN_20C)
G.temperature = T20C
@@ -163,22 +164,29 @@ var/const/SPAWN_AIR = 256
G.temperature += 1000
if(flag & SPAWN_TOXINS)
G.toxins += amount
G.assert_gas("plasma")
new_gases["plasma"][MOLES] += amount
if(flag & SPAWN_OXYGEN)
G.oxygen += amount
G.assert_gas("o2")
new_gases["o2"][MOLES] += amount
if(flag & SPAWN_CO2)
G.carbon_dioxide += amount
G.assert_gas("co2")
new_gases["co2"][MOLES] += amount
if(flag & SPAWN_NITROGEN)
G.nitrogen += amount
G.assert_gas("n2")
new_gases["n2"][MOLES] += amount
if(flag & SPAWN_N2O)
var/datum/gas/sleeping_agent/T = new
T.moles += amount
G.trace_gases += T
G.assert_gas("n2o")
new_gases["n2o"][MOLES] += amount
if(flag & SPAWN_AIR)
G.oxygen += MOLES_O2STANDARD * amount
G.nitrogen += MOLES_N2STANDARD * amount
G.assert_gases("o2","n2")
new_gases["o2"][MOLES] += MOLES_O2STANDARD * amount
new_gases["n2"][MOLES] += MOLES_N2STANDARD * amount
air.merge(G)
SSair.add_to_active(src, 0)
+29 -74
View File
@@ -15,26 +15,14 @@
//Create gas mixture to hold data for passing
var/datum/gas_mixture/GM = new
GM.oxygen = oxygen
GM.carbon_dioxide = carbon_dioxide
GM.nitrogen = nitrogen
GM.toxins = toxins
GM.temperature = temperature
GM.copy_from_turf(src)
return GM
/turf/remove_air(amount as num)
var/datum/gas_mixture/GM = new
/turf/remove_air(amount)
var/datum/gas_mixture/GM = return_air()
var/sum = oxygen + carbon_dioxide + nitrogen + toxins
if(sum>0)
GM.oxygen = (oxygen/sum)*amount
GM.carbon_dioxide = (carbon_dioxide/sum)*amount
GM.nitrogen = (nitrogen/sum)*amount
GM.toxins = (toxins/sum)*amount
GM.temperature = temperature
GM.remove(amount)
return GM
@@ -51,7 +39,7 @@
var/temperature_archived //USED ONLY FOR SOLIDS
var/atmos_overlay_type = "" //current active overlay
var/atmos_overlay_types = list() //gas IDs of current active overlays
/turf/simulated/New()
..()
@@ -61,11 +49,7 @@
visibilityChanged()
if(!blocks_air)
air = new
air.oxygen = oxygen
air.carbon_dioxide = carbon_dioxide
air.nitrogen = nitrogen
air.toxins = toxins
air.temperature = temperature
air.copy_from_turf(src)
/turf/simulated/Destroy()
visibilityChanged()
@@ -168,22 +152,22 @@
excited_group.merge_groups(enemy_simulated.excited_group) //combine groups
share_air(enemy_simulated) //share
else
if((recently_active == 1 && enemy_simulated.recently_active == 1) || !air.compare(enemy_simulated.air))
if((recently_active == 1 && enemy_simulated.recently_active == 1) || air.compare(enemy_simulated.air))
excited_group.add_turf(enemy_simulated) //add enemy to our group
share_air(enemy_simulated) //share
else
if(enemy_simulated.excited_group)
if((recently_active == 1 && enemy_simulated.recently_active == 1) || !air.compare(enemy_simulated.air))
if((recently_active == 1 && enemy_simulated.recently_active == 1) || air.compare(enemy_simulated.air))
enemy_simulated.excited_group.add_turf(src) //join self to enemy group
share_air(enemy_simulated) //share
else
if((recently_active == 1 && enemy_simulated.recently_active == 1) || !air.compare(enemy_simulated.air))
if((recently_active == 1 && enemy_simulated.recently_active == 1) || air.compare(enemy_simulated.air))
var/datum/excited_group/EG = new //generate new group
EG.add_turf(src)
EG.add_turf(enemy_simulated)
share_air(enemy_simulated) //share
else
if(!air.compare(enemy_simulated.air)) //compare if
if(air.compare(enemy_simulated.air)) //compare if
SSair.add_to_active(enemy_simulated) //excite enemy
if(excited_group)
excited_group.add_turf(enemy_simulated) //add enemy to group
@@ -233,34 +217,24 @@
archived_cycle = SSair.times_fired
/turf/simulated/proc/update_visuals()
var/new_overlay_type = tile_graphic()
if (new_overlay_type == atmos_overlay_type)
return
var/atmos_overlay = get_atmos_overlay_by_name(atmos_overlay_type)
if (atmos_overlay)
overlays -= atmos_overlay
var/list/new_overlay_types = tile_graphic()
atmos_overlay = get_atmos_overlay_by_name(new_overlay_type)
if (atmos_overlay)
overlays += atmos_overlay
atmos_overlay_type = new_overlay_type
for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added
overlays -= overlay
atmos_overlay_types -= overlay
/turf/simulated/proc/get_atmos_overlay_by_name(var/name)
switch(name)
if("plasma")
return SSair.plasma_overlay
if("sleeping_agent")
return SSair.sleeptoxin_overlay
return null
for(var/overlay in new_overlay_types-atmos_overlay_types) //doesn't add overlays that already exist
overlays += overlay
atmos_overlay_types = new_overlay_types
/turf/simulated/proc/tile_graphic()
if(air.toxins > MOLES_PLASMA_VISIBLE)
return "plasma"
var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air.trace_gases
if(sleeping_agent && (sleeping_agent.moles > 1))
return "sleeping_agent"
return null
. = new /list
var/list/gases = air.gases
for(var/id in gases)
var/gas = gases[id]
if(gas[GAS_OVERLAY] && gas[MOLES] > gas[MOLES_VISIBLE])
. += gas[GAS_OVERLAY]
/turf/simulated/proc/share_air(turf/simulated/T)
if(T.current_cycle < current_cycle)
@@ -335,36 +309,17 @@
/datum/excited_group/proc/self_breakdown()
var/datum/gas_mixture/A = new
var/datum/gas/sleeping_agent/S = new
A.trace_gases += S
var/list/A_gases = A.gases
for(var/turf/simulated/T in turf_list)
A.oxygen += T.air.oxygen
A.carbon_dioxide+= T.air.carbon_dioxide
A.nitrogen += T.air.nitrogen
A.toxins += T.air.toxins
if(T.air.trace_gases.len)
for(var/datum/gas/N in T.air.trace_gases)
S.moles += N.moles
A.merge(T.air)
for(var/turf/simulated/T in turf_list)
T.air.oxygen = A.oxygen/turf_list.len
T.air.carbon_dioxide= A.carbon_dioxide/turf_list.len
T.air.nitrogen = A.nitrogen/turf_list.len
T.air.toxins = A.toxins/turf_list.len
if(S.moles > 0)
if(T.air.trace_gases.len)
for(var/datum/gas/G in T.air.trace_gases)
G.moles = S.moles/turf_list.len
else
var/datum/gas/sleeping_agent/G = new
G.moles = S.moles/turf_list.len
T.air.trace_gases += G
var/T_gases = T.air.gases
for(var/id in T_gases)
T_gases[id][MOLES] = A_gases[id][MOLES]/turf_list.len
T.update_visuals()
/datum/excited_group/proc/dismantle()
for(var/turf/simulated/T in turf_list)
T.excited = 0
+9 -5
View File
@@ -8,11 +8,15 @@
#define MOLES_O2STANDARD (MOLES_CELLSTANDARD*O2STANDARD) // O2 standard value (21%)
#define MOLES_N2STANDARD (MOLES_CELLSTANDARD*N2STANDARD) // N2 standard value (79%)
#define GAS_O2 (1 << 0)
#define GAS_N2 (1 << 1)
#define GAS_PL (1 << 2)
#define GAS_CO2 (1 << 3)
#define GAS_N2O (1 << 4)
//indices of values in gas lists. used by listmos.
#define MOLES 1
#define ARCHIVE 2
#define GAS_META 3
//this is kinda hacky... but it means I don't have to change every single time they're called.
#define SPECIFIC_HEAT GAS_META][1
#define GAS_NAME GAS_META][2
#define GAS_OVERLAY GAS_META][4
#define MOLES_VISIBLE GAS_META][3
//stuff you should probably leave well alone!
//ATMOS
+9 -14
View File
@@ -949,20 +949,15 @@ var/list/WALLITEMS_INVERSE = list(
user << "<span class='notice'>Results of analysis of \icon[icon] [target].</span>"
if(total_moles>0)
var/o2_concentration = air_contents.oxygen/total_moles
var/n2_concentration = air_contents.nitrogen/total_moles
var/co2_concentration = air_contents.carbon_dioxide/total_moles
var/plasma_concentration = air_contents.toxins/total_moles
var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration)
user << "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
user << "<span class='notice'>Nitrogen: [round(n2_concentration*100)] %</span>"
user << "<span class='notice'>Oxygen: [round(o2_concentration*100)] %</span>"
user << "<span class='notice'>CO2: [round(co2_concentration*100)] %</span>"
user << "<span class='notice'>Plasma: [round(plasma_concentration*100)] %</span>"
if(unknown_concentration>0.01)
user << "<span class='danger'>Unknown: [round(unknown_concentration*100)] %</span>"
var/list/cached_gases = air_contents.gases
for(var/id in cached_gases)
var/gas_concentration = cached_gases[id][MOLES]/total_moles
if(id in hardcoded_gases || gas_concentration > 0.01) //ensures the four primary gases are always shown.
user << "<span class='notice'>[cached_gases[id][GAS_NAME]]: [round(gas_concentration*100)] %</span>"
user << "<span class='notice'>Temperature: [round(air_contents.temperature-T0C)] &deg;C</span>"
else
user << "<span class='notice'>[target] is empty!</span>"
@@ -1240,4 +1235,4 @@ B --><-- A
return 0
for(var/atom/location = A.loc, location, location = location.loc)
if(location == src)
return 1
return 1
+2 -1
View File
@@ -1,5 +1,6 @@
#define DEBUG //Enables byond profiling and full runtime logs - note, this may also be defined in your .dme file
//#define TESTING //Enables in-depth debug messages to runtime log (used for debugging) //By using the testing("message") proc you can create debug-feedback for people with this
//Enables in-depth debug messages to runtime log (used for debugging)
//#define TESTING //By using the testing("message") proc you can create debug-feedback for people with this
//uncommented, but not visible in the release version)
#define PRELOAD_RSC 1 /*set to:
+24 -23
View File
@@ -18,9 +18,6 @@ var/datum/subsystem/air/SSair
var/cost_pipenets = 0
var/cost_atmos_machinery = 0
var/obj/effect/overlay/plasma_overlay //overlay for plasma
var/obj/effect/overlay/sleeptoxin_overlay //overlay for sleeptoxin
var/list/excited_groups = list()
var/list/active_turfs = list()
var/list/hotspots = list()
@@ -36,9 +33,6 @@ var/datum/subsystem/air/SSair
/datum/subsystem/air/New()
NEW_SS_GLOBAL(SSair)
plasma_overlay = new /obj/effect/overlay{icon='icons/effects/tile_effects.dmi';mouse_opacity=0;layer=5;icon_state="plasma";appearance_flags=RESET_COLOR}()
sleeptoxin_overlay = new /obj/effect/overlay{icon='icons/effects/tile_effects.dmi';mouse_opacity=0;layer=5;icon_state="sleeping_agent";appearance_flags=RESET_COLOR}()
/datum/subsystem/air/stat_entry(msg)
msg += "C:{"
msg += "AT:[round(cost_turfs,0.01)]|"
@@ -169,32 +163,39 @@ var/datum/subsystem/air/SSair
/datum/subsystem/air/proc/setup_allturfs(z_level)
var/z_start = 1
var/z_finish = world.maxz
if(1 <= z_level && z_level <= world.maxz)
z_level = round(z_level)
z_start = z_level
z_finish = z_level
var/list/turfs_to_init = block(locate(1, 1, z_start), locate(world.maxx, world.maxy, z_finish))
for(var/turf/simulated/T in turfs_to_init)
T.CalculateAdjacentTurfs()
T.excited = 0
active_turfs -= T
if(!T.blocks_air)
T.update_visuals()
for(var/direction in cardinal)
if(!(T.atmos_adjacent_turfs & direction))
continue
var/turf/enemy_tile = get_step(T, direction)
if(istype(enemy_tile,/turf/simulated/))
var/turf/simulated/enemy_simulated = enemy_tile
if(!T.air.compare(enemy_simulated.air))
T.excited = 1
active_turfs |= T
break
else
if(!T.air.check_turf_total(enemy_tile))
T.excited = 1
active_turfs |= T
break
if(T.blocks_air)
continue
T.update_visuals()
for(var/direction in cardinal)
if(!(T.atmos_adjacent_turfs & direction))
continue
var/turf/enemy_tile = get_step(T, direction)
var/datum/gas_mixture/enemy_air = enemy_tile.return_air()
var/is_active = T.air.compare(enemy_air)
if(is_active)
testing("Active turf found. Return value of compare(): [is_active]")
T.excited = 1
active_turfs |= T
break
if(active_turfs.len)
warning("There are [active_turfs.len] active turfs at roundstart, this is a mapping error caused by a difference of the air between the adjacent turfs. You can see its coordinates using \"Mapping -> Show roundstart AT list\" verb (debug verbs required)")
for(var/turf/simulated/T in active_turfs)
+273 -425
View File
@@ -3,90 +3,108 @@ What are the archived variables for?
Calculations are done using the archived variables with the results merged into the regular variables.
This prevents race conditions that arise based on the order of tile processing.
*/
#define SPECIFIC_HEAT_TOXIN 200
#define SPECIFIC_HEAT_AIR 20
#define SPECIFIC_HEAT_CDO 30
#define HEAT_CAPACITY_CALCULATION(oxygen,carbon_dioxide,nitrogen,toxins) \
(carbon_dioxide*SPECIFIC_HEAT_CDO + (oxygen+nitrogen)*SPECIFIC_HEAT_AIR + toxins*SPECIFIC_HEAT_TOXIN)
#define MINIMUM_HEAT_CAPACITY 0.0003
#define QUANTIZE(variable) (round(variable,0.0000001))/*I feel the need to document what happens here. Basically this is used to catch most rounding errors, however it's previous value made it so that
once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */
/datum/gas
var/moles = 0
var/specific_heat = 0
var/moles_archived = 0
var/list/meta_gas_info = meta_gas_list() //see ATMOSPHERICS/gas_types.dm
var/list/cached_gases_list = null
/datum/gas/sleeping_agent
specific_heat = 40
/proc/gaslist(gasid)
if(!cached_gases_list)
cached_gases_list = new /list(meta_gas_info.len)
/datum/gas/oxygen_agent_b
specific_heat = 300
if(!cached_gases_list[gasid])
if(!meta_gas_info[gasid])
CRASH("Error: no such gas type! Type : [gasid]")
/datum/gas/volatile_fuel
specific_heat = 30
var/list/new_gas_list = new(3)
new_gas_list[MOLES] = 0
new_gas_list[ARCHIVE] = 0
new_gas_list[GAS_META] = meta_gas_info[gasid]
cached_gases_list[gasid] = new_gas_list
var/list/gas = cached_gases_list[gasid]
. = gas.Copy()
/datum/gas_mixture
var/oxygen = 0
var/carbon_dioxide = 0
var/nitrogen = 0
var/toxins = 0
var/volume = CELL_VOLUME
var/temperature = 0 //in Kelvin
var/last_share
var/list/datum/gas/trace_gases = list()
var/tmp/oxygen_archived
var/tmp/carbon_dioxide_archived
var/tmp/nitrogen_archived
var/tmp/toxins_archived
var/list/gases
var/temperature //in Kelvin
var/tmp/temperature_archived
var/volume
var/last_share
var/tmp/fuel_burnt
var/tmp/fuel_burnt = 0
/datum/gas_mixture/New(Volume = CELL_VOLUME)
. = ..()
gases = new
temperature = 0
temperature_archived = 0
volume = Volume
last_share = 0
fuel_burnt = 0
//listmos procs
//assert_gas(gas_id) - used to guarantee that the gas list for this id exists.
//Must be used before adding to a gas. May be used before reading from a gas.
/datum/gas_mixture/proc/assert_gas(gas_id)
var/cached_gases = gases
if(cached_gases[gas_id])
return
cached_gases[gas_id] = gaslist(gas_id) //see ATMOSPHERICS/gas_types.dm
//assert_gases(args) - shorthand for calling assert_gas() once for each gas type.
/datum/gas_mixture/proc/assert_gases()
for(var/id in args)
assert_gas(id)
//add_gas(gas_id) - similar to assert_gas(), but does not check for an existing
//gas list for this id.
//Used instead of assert_gas() when you know the gas does not exist. Faster than assert_gas().
/datum/gas_mixture/proc/add_gas(gas_id)
gases[gas_id] = gaslist(gas_id)
//add_gases(args) - shorthand for calling add_gas() once for each gas_type.
/datum/gas_mixture/proc/add_gases()
for(var/id in args)
add_gas(id)
//garbage_collect() - removes any gas list which is empty.
//Must be used after subtracting from a gas. Must be used after assert_gas()
//if assert_gas() was called only to read from the gas.
//By removing empty gases, processing speed is increased.
/datum/gas_mixture/proc/garbage_collect()
var/list/cached_gases = gases
for(var/id in cached_gases)
var/gas = cached_gases[id]
if(QUANTIZE(gas[MOLES]) <= 0 && QUANTIZE(gas[ARCHIVE]) <= 0)
cached_gases -= id
//PV=nRT - related procedures
/datum/gas_mixture/proc/heat_capacity()
var/heat_capacity = HEAT_CAPACITY_CALCULATION(oxygen,carbon_dioxide,nitrogen,toxins)
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
heat_capacity += trace_gas.moles*trace_gas.specific_heat
return heat_capacity
var/list/cached_gases = gases
. = 0
for(var/id in cached_gases)
. += cached_gases[id][MOLES]*cached_gases[id][SPECIFIC_HEAT]
/datum/gas_mixture/proc/heat_capacity_archived()
var/heat_capacity_archived = HEAT_CAPACITY_CALCULATION(oxygen_archived,carbon_dioxide_archived,nitrogen_archived,toxins_archived)
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
heat_capacity_archived += trace_gas.moles_archived*trace_gas.specific_heat
return heat_capacity_archived
var/list/cached_gases = gases
. = 0
for(var/id in cached_gases)
. += cached_gases[id][ARCHIVE]*cached_gases[id][SPECIFIC_HEAT]
/datum/gas_mixture/proc/total_moles()
var/moles = oxygen + carbon_dioxide + nitrogen + toxins
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
moles += trace_gas.moles
return moles
var/list/cached_gases = gases
. = 0
for(var/id in cached_gases)
. += cached_gases[id][MOLES]
/datum/gas_mixture/proc/return_pressure()
if(volume>0)
return total_moles()*R_IDEAL_GAS_EQUATION*temperature/volume
return 0
/datum/gas_mixture/proc/return_temperature()
return temperature
@@ -103,85 +121,96 @@ What are the archived variables for?
/datum/gas_mixture/proc/react(atom/dump_location)
var/list/procgases = gases //this speeds things up because >byond
var/reacting = 0 //set to 1 if a notable reaction occured (used by pipe_network)
if(temperature < TCMB)
temperature = TCMB
if(trace_gases.len > 0)
if(temperature > 900)
if(toxins > MINIMUM_HEAT_CAPACITY && carbon_dioxide > MINIMUM_HEAT_CAPACITY)
var/datum/gas/oxygen_agent_b/trace_gas = locate(/datum/gas/oxygen_agent_b/) in trace_gases
if(trace_gas)
var/reaction_rate = min(carbon_dioxide*0.75, toxins*0.25, trace_gas.moles*0.05)
if(procgases["agent_b"] && temperature > 900 && procgases["plasma"] && procgases["co2"])
if(procgases["plasma"][MOLES] > MINIMUM_HEAT_CAPACITY && procgases["co2"][MOLES] > MINIMUM_HEAT_CAPACITY)
var/reaction_rate = min(procgases["co2"][MOLES]*0.75, procgases["plasma"][MOLES]*0.25, procgases["agent_b"][MOLES]*0.05)
carbon_dioxide -= reaction_rate
oxygen += reaction_rate
procgases["co2"][MOLES] -= reaction_rate
trace_gas.moles -= reaction_rate*0.05
assert_gas("o2") //only need to assert oxygen, as this reaction doesn't occur without the other gases existing
procgases["o2"][MOLES] += reaction_rate
temperature -= (reaction_rate*20000)/heat_capacity()
procgases["agent_b"][MOLES] -= reaction_rate*0.05
reacting = 1
temperature -= (reaction_rate*20000)/heat_capacity()
garbage_collect()
reacting = 1
/*
if(thermal_energy() > (PLASMA_BINDING_ENERGY*10))
if(toxins > MINIMUM_HEAT_CAPACITY && carbon_dioxide > MINIMUM_HEAT_CAPACITY && (toxins+carbon_dioxide)/total_moles() >= FUSION_PURITY_THRESHOLD)//Fusion wont occur if the level of impurities is too high.
//world << "pre [temperature, [toxins], [carbon_dioxide]
if(procgases["plasma"] && procgases["co2"] && procgases["plasma"][MOLES] > MINIMUM_HEAT_CAPACITY && procgases["co2"][MOLES] > MINIMUM_HEAT_CAPACITY && (procgases["plasma"][MOLES]+procgases["co2"][MOLES])/total_moles() >= FUSION_PURITY_THRESHOLD)//Fusion wont occur if the level of impurities is too high.
//world << "pre [temperature, [procgases["plasma"][MOLES]], [procgases["co2"][MOLES]]
var/old_heat_capacity = heat_capacity()
var/carbon_efficency = min(toxins/carbon_dioxide,MAX_CARBON_EFFICENCY)
var/carbon_efficency = min(procgases["plasma"][MOLES]/procgases["co2"][MOLES],MAX_CARBON_EFFICENCY)
var/reaction_energy = thermal_energy()
var/moles_impurities = total_moles()-(toxins+carbon_dioxide)
var/moles_impurities = total_moles()-(procgases["plasma"][MOLES]+procgases["co2"][MOLES])
var/plasma_fused = (PLASMA_FUSED_COEFFICENT*carbon_efficency)*(temperature/PLASMA_BINDING_ENERGY)
var/carbon_catalyzed = (CARBON_CATALYST_COEFFICENT*carbon_efficency)*(temperature/PLASMA_BINDING_ENERGY)
var/oxygen_added = carbon_catalyzed
var/nitrogen_added = (plasma_fused-oxygen_added)-(thermal_energy()/PLASMA_BINDING_ENERGY)
reaction_energy = max(reaction_energy+((carbon_efficency*toxins)/((moles_impurities/carbon_efficency)+2)*10)+((plasma_fused/(moles_impurities/carbon_efficency))*PLASMA_BINDING_ENERGY),0)
toxins = max(toxins-plasma_fused,0)
carbon_dioxide = max(carbon_dioxide-carbon_catalyzed,0)
oxygen = max(oxygen+oxygen_added,0)
nitrogen = max(nitrogen+nitrogen_added,0)
reaction_energy = max(reaction_energy+((carbon_efficency*procgases["plasma"][MOLES])/((moles_impurities/carbon_efficency)+2)*10)+((plasma_fused/(moles_impurities/carbon_efficency))*PLASMA_BINDING_ENERGY),0)
assert_gases("o2", "n2")
procgases["plasma"][MOLES] -= plasma_fused
procgases["co2"][MOLES] -= carbon_catalyzed
procgases["o2"][MOLES] += oxygen_added
procgases["n2"][MOLES] += nitrogen_added
garbage_collect()
if(reaction_energy > 0)
reacting = 1
var/new_heat_capacity = heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
temperature = max(((temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB)
//Prevents whatever mechanism is causing it to hit negative temperatures.
//world << "post [temperature], [toxins], [carbon_dioxide]
//world << "post [temperature], [procgases["plasma"][MOLES]], [procgases["co2"][MOLES]]
*/
fuel_burnt = 0
if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
//world << "pre [temperature], [oxygen], [toxins]"
if(fire() > 0)
//world << "pre [temperature], [procgases["o2"][MOLES]], [procgases["plasma"][MOLES]]"
if(fire())
reacting = 1
//world << "post [temperature], [oxygen], [toxins]"
//world << "post [temperature], [procgases["o2"][MOLES]], [procgases["plasma"][MOLES]]"
return reacting
/datum/gas_mixture/proc/fire()
var/energy_released = 0
var/old_heat_capacity = heat_capacity()
var/list/procgases = gases //this speeds things up because accessing datum vars is slow
var/datum/gas/volatile_fuel/fuel_store = locate(/datum/gas/volatile_fuel/) in trace_gases
if(fuel_store) //General volatile gas burn
var/burned_fuel = 0
if(procgases["v_fuel"] && procgases["v_fuel"][MOLES]) //General volatile gas burn
var/burned_fuel
if(oxygen < fuel_store.moles)
burned_fuel = oxygen
fuel_store.moles -= burned_fuel
oxygen = 0
if(!procgases["o2"])
burned_fuel = 0
else if(procgases["o2"][MOLES] < procgases["v_fuel"][MOLES])
burned_fuel = procgases["o2"][MOLES]
procgases["v_fuel"][MOLES] -= burned_fuel
procgases["o2"][MOLES] = 0
else
burned_fuel = fuel_store.moles
oxygen -= fuel_store.moles
trace_gases -= fuel_store
fuel_store = null
burned_fuel = procgases["v_fuel"][MOLES]
procgases["o2"][MOLES] -= procgases["v_fuel"][MOLES]
energy_released += FIRE_CARBON_ENERGY_RELEASED * burned_fuel
carbon_dioxide += burned_fuel
fuel_burnt += burned_fuel
if(burned_fuel)
energy_released += FIRE_CARBON_ENERGY_RELEASED * burned_fuel
assert_gas("co2")
procgases["co2"][MOLES] += burned_fuel
fuel_burnt += burned_fuel
//Handle plasma burning
if(toxins > MINIMUM_HEAT_CAPACITY)
if(procgases["plasma"] && procgases["plasma"][MOLES] > MINIMUM_HEAT_CAPACITY)
var/plasma_burn_rate = 0
var/oxygen_burn_rate = 0
//more plasma released at higher temperatures
@@ -191,19 +220,22 @@ What are the archived variables for?
else
temperature_scale = (temperature-PLASMA_MINIMUM_BURN_TEMPERATURE)/(PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE)
if(temperature_scale > 0)
assert_gas("o2")
assert_gas("co2")
oxygen_burn_rate = OXYGEN_BURN_RATE_BASE - temperature_scale
if(oxygen > toxins*PLASMA_OXYGEN_FULLBURN)
plasma_burn_rate = (toxins*temperature_scale)/PLASMA_BURN_RATE_DELTA
if(procgases["o2"][MOLES] > procgases["plasma"][MOLES]*PLASMA_OXYGEN_FULLBURN)
plasma_burn_rate = (procgases["plasma"][MOLES]*temperature_scale)/PLASMA_BURN_RATE_DELTA
else
plasma_burn_rate = (temperature_scale*(oxygen/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA
plasma_burn_rate = (temperature_scale*(procgases["o2"][MOLES]/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA
if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY)
toxins -= plasma_burn_rate
oxygen -= plasma_burn_rate*oxygen_burn_rate
carbon_dioxide += plasma_burn_rate
procgases["plasma"][MOLES] -= plasma_burn_rate
procgases["o2"][MOLES] -= plasma_burn_rate*oxygen_burn_rate
procgases["co2"][MOLES] += plasma_burn_rate
energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate)
fuel_burnt += (plasma_burn_rate)*(1+oxygen_burn_rate)
garbage_collect()
if(energy_released > 0)
var/new_heat_capacity = heat_capacity()
@@ -218,7 +250,7 @@ What are the archived variables for?
/datum/gas_mixture/proc/merge(datum/gas_mixture/giver)
//Merges all air from giver into self. Deletes giver.
//Returns: 1 on success (no failure cases yet)
//Returns: 1 in all cases
/datum/gas_mixture/proc/remove(amount)
//Proportionally removes amount of gas from the gas_mixture
@@ -234,11 +266,11 @@ What are the archived variables for?
/datum/gas_mixture/proc/share(datum/gas_mixture/sharer)
//Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length
//Return: amount of gas exchanged (+ if sharer received)
/datum/gas_mixture/proc/mimic(turf/model) //I want this proc to die a painful death
/datum/gas_mixture/proc/mimic(turf/model)
//Similar to share(...), except the model is not modified
//Return: amount of gas exchanged
/datum/gas_mixture/proc/check_turf(turf/model) //I want this proc to die a painful death
/datum/gas_mixture/proc/check_turf(turf/model)
//Returns: 0 if self-check failed or 1 if check passes
/datum/gas_mixture/proc/temperature_mimic(turf/model, conduction_coefficient) //I want this proc to die a painful death
@@ -249,20 +281,17 @@ What are the archived variables for?
/datum/gas_mixture/proc/compare(datum/gas_mixture/sample)
//Compares sample to self to see if within acceptable ranges that group processing may be enabled
//returns: a string indicating what check failed, or "" if check passes
/datum/gas_mixture/proc/copy_from_turf(turf/model)
//Copies all gas info from the turf into the gas list along with copying temperature, then archives
/datum/gas_mixture/archive()
oxygen_archived = oxygen
carbon_dioxide_archived = carbon_dioxide
nitrogen_archived = nitrogen
toxins_archived = toxins
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
trace_gas.moles_archived = trace_gas.moles
var/list/cached_gases = gases
for(var/id in cached_gases)
cached_gases[id][ARCHIVE] = cached_gases[id][MOLES]
temperature_archived = temperature
return 1
. = 1
/datum/gas_mixture/merge(datum/gas_mixture/giver)
if(!giver)
@@ -272,268 +301,145 @@ What are the archived variables for?
var/self_heat_capacity = heat_capacity()
var/giver_heat_capacity = giver.heat_capacity()
var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity
if(combined_heat_capacity != 0)
if(combined_heat_capacity)
temperature = (giver.temperature*giver_heat_capacity + temperature*self_heat_capacity)/combined_heat_capacity
var/list/cached_gases = gases //accessing datum vars is slower than proc vars
var/list/giver_gases = giver.gases
for(var/giver_id in giver_gases)
assert_gas(giver_id)
cached_gases[giver_id][MOLES] += giver_gases[giver_id][MOLES]
oxygen += giver.oxygen
carbon_dioxide += giver.carbon_dioxide
nitrogen += giver.nitrogen
toxins += giver.toxins
for(var/gas in giver.trace_gases)
var/datum/gas/trace_gas = gas
var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases
if(!corresponding)
corresponding = new trace_gas.type()
trace_gases += corresponding
corresponding.moles += trace_gas.moles
return 1
. = 1
/datum/gas_mixture/remove(amount)
var/sum = total_moles()
amount = min(amount,sum) //Can not take more air than tile has!
if(amount <= 0)
return null
var/datum/gas_mixture/removed = new
var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars
var/list/cached_gases = gases
removed.oxygen = QUANTIZE((oxygen/sum)*amount)
removed.nitrogen = QUANTIZE((nitrogen/sum)*amount)
removed.carbon_dioxide = QUANTIZE((carbon_dioxide/sum)*amount)
removed.toxins = QUANTIZE((toxins/sum)*amount)
oxygen -= removed.oxygen
nitrogen -= removed.nitrogen
carbon_dioxide -= removed.carbon_dioxide
toxins -= removed.toxins
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
var/datum/gas/corresponding = new trace_gas.type()
removed.trace_gases += corresponding
corresponding.moles = (trace_gas.moles/sum)*amount
trace_gas.moles -= corresponding.moles
for(var/id in cached_gases)
removed.assert_gas(id)
removed_gases[id][MOLES] = QUANTIZE((cached_gases[id][MOLES]/sum)*amount)
cached_gases[id][MOLES] -= removed_gases[id][MOLES]
removed.temperature = temperature
return removed
garbage_collect()
. = removed
/datum/gas_mixture/remove_ratio(ratio)
if(ratio <= 0)
return null
ratio = min(ratio, 1)
var/datum/gas_mixture/removed = new
var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars
var/list/cached_gases = gases
removed.oxygen = QUANTIZE(oxygen*ratio)
removed.nitrogen = QUANTIZE(nitrogen*ratio)
removed.carbon_dioxide = QUANTIZE(carbon_dioxide*ratio)
removed.toxins = QUANTIZE(toxins*ratio)
oxygen -= removed.oxygen
nitrogen -= removed.nitrogen
carbon_dioxide -= removed.carbon_dioxide
toxins -= removed.toxins
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
var/datum/gas/corresponding = new trace_gas.type()
removed.trace_gases += corresponding
corresponding.moles = trace_gas.moles*ratio
trace_gas.moles -= corresponding.moles
for(var/id in cached_gases)
removed.assert_gas(id)
removed_gases[id][MOLES] = QUANTIZE(cached_gases[id][MOLES]*ratio)
cached_gases[id][MOLES] -= removed_gases[id][MOLES]
removed.temperature = temperature
return removed
garbage_collect()
. = removed
/datum/gas_mixture/copy_from(datum/gas_mixture/sample)
oxygen = sample.oxygen
carbon_dioxide = sample.carbon_dioxide
nitrogen = sample.nitrogen
toxins = sample.toxins
var/list/cached_gases = gases //accessing datum vars is slower than proc vars
var/list/sample_gases = sample.gases
var/list/copied_gases = list()
for(var/sample_id in sample_gases)
assert_gas(sample_id)
cached_gases[sample_id][MOLES] = sample_gases[sample_id][MOLES]
copied_gases += sample_id
for(var/id in cached_gases-copied_gases)
assert_gas(id)
cached_gases[id][MOLES] = 0
trace_gases.len=null
for(var/gas in sample.trace_gases)
var/datum/gas/trace_gas = gas
var/datum/gas/corresponding = new trace_gas.type()
trace_gases += corresponding
corresponding.moles = trace_gas.moles
garbage_collect()
temperature = sample.temperature
return 1
/datum/gas_mixture/check_turf(turf/model, atmos_adjacent_turfs = 4)
var/delta_oxygen = (oxygen_archived - model.oxygen)/(atmos_adjacent_turfs+1)
var/delta_carbon_dioxide = (carbon_dioxide_archived - model.carbon_dioxide)/(atmos_adjacent_turfs+1)
var/delta_nitrogen = (nitrogen_archived - model.nitrogen)/(atmos_adjacent_turfs+1)
var/delta_toxins = (toxins_archived - model.toxins)/(atmos_adjacent_turfs+1)
var/delta_temperature = (temperature_archived - model.temperature)
if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)))
return 0
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND)
return 0
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4)
return 0
return 1
/datum/gas_mixture/proc/check_turf_total(turf/model) //I want this proc to die a painful death
var/delta_oxygen = (oxygen - model.oxygen)
var/delta_carbon_dioxide = (carbon_dioxide - model.carbon_dioxide)
var/delta_nitrogen = (nitrogen - model.nitrogen)
var/delta_toxins = (toxins - model.toxins)
var/delta_temperature = (temperature - model.temperature)
if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen*MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide*MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen*MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins*MINIMUM_AIR_RATIO_TO_SUSPEND)))
return 0
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND)
return 0
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
if(trace_gas.moles > MINIMUM_AIR_TO_SUSPEND*4)
return 0
return 1
var/datum/gas_mixture/copied = new
copied.copy_from_turf(model)
. = compare(copied, datatype = ARCHIVE, adjacents = atmos_adjacent_turfs)
/datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
if(!sharer) return 0
var/delta_oxygen = QUANTIZE(oxygen_archived - sharer.oxygen_archived)/(atmos_adjacent_turfs+1)
var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - sharer.carbon_dioxide_archived)/(atmos_adjacent_turfs+1)
var/delta_nitrogen = QUANTIZE(nitrogen_archived - sharer.nitrogen_archived)/(atmos_adjacent_turfs+1)
var/delta_toxins = QUANTIZE(toxins_archived - sharer.toxins_archived)/(atmos_adjacent_turfs+1)
. = 0
if(!sharer)
return
var/moved_moles = 0
var/abs_moved_moles = 0
//make this local to the proc for sanic speed
var/list/sharercache = sharer.gases
var/list/selfcache = gases
var/delta_temperature = (temperature_archived - sharer.temperature_archived)
var/old_self_heat_capacity = 0
var/old_sharer_heat_capacity = 0
var/heat_capacity_self_to_sharer = 0
var/heat_capacity_sharer_to_self = 0
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/delta_air = delta_oxygen+delta_nitrogen
if(delta_air)
var/air_heat_capacity = SPECIFIC_HEAT_AIR*delta_air
if(delta_air > 0)
heat_capacity_self_to_sharer += air_heat_capacity
else
heat_capacity_sharer_to_self -= air_heat_capacity
if(delta_carbon_dioxide)
var/carbon_dioxide_heat_capacity = SPECIFIC_HEAT_CDO*delta_carbon_dioxide
if(delta_carbon_dioxide > 0)
heat_capacity_self_to_sharer += carbon_dioxide_heat_capacity
else
heat_capacity_sharer_to_self -= carbon_dioxide_heat_capacity
if(delta_toxins)
var/toxins_heat_capacity = SPECIFIC_HEAT_TOXIN*delta_toxins
if(delta_toxins > 0)
heat_capacity_self_to_sharer += toxins_heat_capacity
else
heat_capacity_sharer_to_self -= toxins_heat_capacity
old_self_heat_capacity = heat_capacity()
old_sharer_heat_capacity = sharer.heat_capacity()
oxygen -= delta_oxygen
sharer.oxygen += delta_oxygen
var/heat_capacity_self_to_sharer = 0 //heat capacity of the moles transferred from us to the sharer
var/heat_capacity_sharer_to_self = 0 //heat capacity of the moles transferred from the sharer to us
carbon_dioxide -= delta_carbon_dioxide
sharer.carbon_dioxide += delta_carbon_dioxide
for(var/sharer_id in sharercache-selfcache)
add_gas(sharer_id) //we can use add_gas() because we're looping only through the IDs not in our cache
nitrogen -= delta_nitrogen
sharer.nitrogen += delta_nitrogen
//GAS TRANSFER
for(var/id in selfcache)
if(!sharercache[id]) //checking here prevents an uneeded proc call if the check fails.
sharer.add_gas(id)
toxins -= delta_toxins
sharer.toxins += delta_toxins
var/gas = selfcache[id]
var/sharergas = sharercache[id]
var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins)
last_share = abs(delta_oxygen) + abs(delta_carbon_dioxide) + abs(delta_nitrogen) + abs(delta_toxins)
var/delta = QUANTIZE(gas[ARCHIVE] - sharergas[ARCHIVE])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures
var/list/trace_types_considered = list()
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
var/datum/gas/corresponding = locate(trace_gas.type) in sharer.trace_gases
var/delta = 0
if(corresponding)
delta = QUANTIZE(trace_gas.moles_archived - corresponding.moles_archived)/(atmos_adjacent_turfs+1)
else
corresponding = new trace_gas.type()
sharer.trace_gases += corresponding
delta = trace_gas.moles_archived/(atmos_adjacent_turfs+1)
trace_gas.moles -= delta
corresponding.moles += delta
if(delta)
var/individual_heat_capacity = trace_gas.specific_heat*delta
if(delta && abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/gas_heat_capacity = delta * gas[SPECIFIC_HEAT]
if(delta > 0)
heat_capacity_self_to_sharer += individual_heat_capacity
heat_capacity_self_to_sharer += gas_heat_capacity
else
heat_capacity_sharer_to_self -= individual_heat_capacity
heat_capacity_sharer_to_self -= gas_heat_capacity //subtract here instead of adding the absolute value because we know that delta is negative. saves a proc call.
moved_moles += delta
last_share += abs(delta)
gas[MOLES] -= delta
sharergas[MOLES] += delta
moved_moles += delta
abs_moved_moles += abs(delta)
trace_types_considered += trace_gas.type
for(var/gas in sharer.trace_gases)
var/datum/gas/trace_gas = gas
if(trace_gas.type in trace_types_considered)
continue
var/datum/gas/corresponding
var/delta = 0
corresponding = new trace_gas.type()
trace_gases += corresponding
delta = trace_gas.moles_archived/5
trace_gas.moles -= delta
corresponding.moles += delta
//Guaranteed transfer from sharer to self
var/individual_heat_capacity = trace_gas.specific_heat*delta
heat_capacity_sharer_to_self += individual_heat_capacity
moved_moles += -delta
last_share += abs(delta)
last_share = abs_moved_moles
//THERMAL ENERGY TRANSFER
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer
var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self
//transfer of thermal energy (via changed heat capacity) between self and sharer
if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY)
temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity
if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY)
sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity
//thermal energy of the system (self and sharer) is unchanged
if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY)
if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.10) // <10% change in sharer heat capacity
@@ -541,78 +447,18 @@ What are the archived variables for?
if((delta_temperature > MINIMUM_TEMPERATURE_TO_MOVE) || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE)
var/delta_pressure = temperature_archived*(total_moles() + moved_moles) - sharer.temperature_archived*(sharer.total_moles() - moved_moles)
return delta_pressure*R_IDEAL_GAS_EQUATION/volume
. = delta_pressure*R_IDEAL_GAS_EQUATION/volume
garbage_collect()
sharer.garbage_collect()
/datum/gas_mixture/mimic(turf/model, atmos_adjacent_turfs = 4)
var/delta_oxygen = QUANTIZE(oxygen_archived - model.oxygen)/(atmos_adjacent_turfs+1)
var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - model.carbon_dioxide)/(atmos_adjacent_turfs+1)
var/delta_nitrogen = QUANTIZE(nitrogen_archived - model.nitrogen)/(atmos_adjacent_turfs+1)
var/delta_toxins = QUANTIZE(toxins_archived - model.toxins)/(atmos_adjacent_turfs+1)
var/delta_temperature = (temperature_archived - model.temperature)
var/heat_transferred = 0
var/old_self_heat_capacity = 0
var/heat_capacity_transferred = 0
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/delta_air = delta_oxygen+delta_nitrogen
if(delta_air)
var/air_heat_capacity = SPECIFIC_HEAT_AIR*delta_air
heat_transferred -= air_heat_capacity*model.temperature
heat_capacity_transferred -= air_heat_capacity
if(delta_carbon_dioxide)
var/carbon_dioxide_heat_capacity = SPECIFIC_HEAT_CDO*delta_carbon_dioxide
heat_transferred -= carbon_dioxide_heat_capacity*model.temperature
heat_capacity_transferred -= carbon_dioxide_heat_capacity
if(delta_toxins)
var/toxins_heat_capacity = SPECIFIC_HEAT_TOXIN*delta_toxins
heat_transferred -= toxins_heat_capacity*model.temperature
heat_capacity_transferred -= toxins_heat_capacity
old_self_heat_capacity = heat_capacity()
oxygen -= delta_oxygen
carbon_dioxide -= delta_carbon_dioxide
nitrogen -= delta_nitrogen
toxins -= delta_toxins
var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins)
last_share = abs(delta_oxygen) + abs(delta_carbon_dioxide) + abs(delta_nitrogen) + abs(delta_toxins)
if(trace_gases.len)
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
var/delta = 0
delta = trace_gas.moles_archived/(atmos_adjacent_turfs+1)
trace_gas.moles -= delta
var/heat_cap_transferred = delta*trace_gas.specific_heat
heat_transferred += heat_cap_transferred*temperature_archived
heat_capacity_transferred += heat_cap_transferred
moved_moles += delta
moved_moles += abs(delta)
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/new_self_heat_capacity = old_self_heat_capacity - heat_capacity_transferred
if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY)
temperature = (old_self_heat_capacity*temperature - heat_capacity_transferred*temperature_archived)/new_self_heat_capacity
temperature_mimic(model, model.thermal_conductivity)
if((delta_temperature > MINIMUM_TEMPERATURE_TO_MOVE) || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE)
var/delta_pressure = temperature_archived*(total_moles() + moved_moles) - model.temperature*(model.oxygen+model.carbon_dioxide+model.nitrogen+model.toxins)
return delta_pressure*R_IDEAL_GAS_EQUATION/volume
else
return 0
var/datum/gas_mixture/copied = new
copied.copy_from_turf(model)
. = share(copied, atmos_adjacent_turfs)
/datum/gas_mixture/temperature_share(datum/gas_mixture/sharer, conduction_coefficient)
//transfer of thermal energy (via conduction) between self and sharer
var/delta_temperature = (temperature_archived - sharer.temperature_archived)
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/self_heat_capacity = heat_capacity_archived()
@@ -622,8 +468,9 @@ What are the archived variables for?
var/heat = conduction_coefficient*delta_temperature* \
(self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity))
temperature -= heat/self_heat_capacity
sharer.temperature += heat/sharer_heat_capacity
temperature = max(temperature - heat/self_heat_capacity, TCMB)
sharer.temperature = max(sharer.temperature + heat/sharer_heat_capacity, TCMB)
//thermal energy of the system (self and sharer) is unchanged
/datum/gas_mixture/temperature_mimic(turf/model, conduction_coefficient)
var/delta_temperature = (temperature - model.temperature)
@@ -634,7 +481,7 @@ What are the archived variables for?
var/heat = conduction_coefficient*delta_temperature* \
(self_heat_capacity*model.heat_capacity/(self_heat_capacity+model.heat_capacity))
temperature -= heat/self_heat_capacity
temperature = max(temperature - heat/self_heat_capacity, TCMB)
/datum/gas_mixture/temperature_turf_share(turf/simulated/sharer, conduction_coefficient)
var/delta_temperature = (temperature_archived - sharer.temperature)
@@ -645,53 +492,54 @@ What are the archived variables for?
var/heat = conduction_coefficient*delta_temperature* \
(self_heat_capacity*sharer.heat_capacity/(self_heat_capacity+sharer.heat_capacity))
temperature -= heat/self_heat_capacity
sharer.temperature += heat/sharer.heat_capacity
temperature = max(temperature - heat/self_heat_capacity, TCMB)
sharer.temperature = max(sharer.temperature + heat/sharer.heat_capacity, TCMB)
/datum/gas_mixture/compare(datum/gas_mixture/sample)
if((abs(oxygen-sample.oxygen) > MINIMUM_AIR_TO_SUSPEND) && \
((oxygen < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.oxygen) || (oxygen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.oxygen)))
return 0
if((abs(nitrogen-sample.nitrogen) > MINIMUM_AIR_TO_SUSPEND) && \
((nitrogen < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen) || (nitrogen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen)))
return 0
if((abs(carbon_dioxide-sample.carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && \
((carbon_dioxide < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide) || (oxygen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide)))
return 0
if((abs(toxins-sample.toxins) > MINIMUM_AIR_TO_SUSPEND) && \
((toxins < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins) || (toxins > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins)))
return 0
/datum/gas_mixture/compare(datum/gas_mixture/sample, datatype = MOLES, adjacents = 0)
. = ""
var/list/sample_gases = sample.gases //accessing datum vars is slower than proc vars
var/list/cached_gases = gases
for(var/id in cached_gases|sample_gases)
var/gas_moles = cached_gases[id] ? cached_gases[id][datatype] : 0
var/sample_moles = sample_gases[id] ? sample_gases[id][datatype] : 0
var/delta = abs(gas_moles - sample_moles)/(adjacents+1)
if(delta > MINIMUM_AIR_TO_SUSPEND && \
delta > gas_moles*MINIMUM_AIR_RATIO_TO_SUSPEND)
return id
if(total_moles() > MINIMUM_AIR_TO_SUSPEND)
if((abs(temperature-sample.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) && \
((temperature < (1-MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature) || (temperature > (1+MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature)))
return 0
var/temp
var/sample_temp
for(var/gas in sample.trace_gases)
var/datum/gas/trace_gas = gas
if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND)
var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases
if(corresponding)
if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \
((corresponding.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles) || (corresponding.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles)))
return 0
else
return 0
switch(datatype)
if(MOLES)
temp = temperature
sample_temp = sample.temperature
if(ARCHIVE)
temp = temperature_archived
sample_temp = sample.temperature_archived
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
if(trace_gas.moles > MINIMUM_AIR_TO_SUSPEND)
var/datum/gas/corresponding = locate(trace_gas.type) in sample.trace_gases
if(corresponding)
if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \
((trace_gas.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles) || (trace_gas.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles)))
return 0
else
return 0
return 1
var/delta_temperature = abs(temp-sample_temp)
if((delta_temperature > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) && \
delta_temperature > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND*temp)
return "temp"
/datum/gas_mixture/copy_from_turf(turf/model)
assert_gases(arglist(hardcoded_gases))
var/list/cached_gases = gases
cached_gases["o2"][MOLES] = model.oxygen
cached_gases["n2"][MOLES] = model.nitrogen
cached_gases["plasma"][MOLES] = model.toxins
cached_gases["co2"][MOLES] = model.carbon_dioxide
for(var/id in cached_gases-hardcoded_gases)
cached_gases[id][MOLES] = 0 //turfs don't account for anything other than the four old hardcoded gases
temperature = model.temperature
garbage_collect()
//Takes the amount of the gas you want to PP as an argument
//So I don't have to do some hacky switches/defines/magic strings
@@ -290,7 +290,14 @@
var/turf/simulated/floor/F = random_location
if(F.air)
var/datum/gas_mixture/A = F.air
if(A.oxygen >= 16 && !A.toxins && A.carbon_dioxide < 10 && !A.trace_gases.len)//Can most things breathe in this location?
var/list/A_gases = A.gases
var/trace_gases
for(var/id in A_gases)
if(id in hardcoded_gases)
continue
trace_gases = TRUE
break
if((A_gases["o2"] && A_gases["o2"][MOLES] >= 16) && !A_gases["plasma"] && (!A_gases["co2"] || A_gases["co2"][MOLES] < 10) && !trace_gases)//Can most things breathe in this location?
if((A.temperature > 270) && (A.temperature < 360))//Not too hot, not too cold
var/pressure = A.return_pressure()
if((pressure > 20) && (pressure < 550))//Account for crushing pressure or vaccuums
+1 -1
View File
@@ -94,7 +94,7 @@
/datum/objective_item/steal/plasma/check_special_completion(obj/item/weapon/tank/T)
var/target_amount = text2num(name)
var/found_amount = 0
found_amount += T.air_contents.toxins
found_amount += T.air_contents.gases["plasma"][MOLES]
return found_amount>=target_amount
+30 -16
View File
@@ -258,7 +258,8 @@
if(!location)
return
var/datum/gas_mixture/environment = location.return_air()
var/total = environment.oxygen + environment.nitrogen + environment.carbon_dioxide + environment.toxins
var/list/env_gases = environment.gases
var/total = environment.total_moles()
var/list/environment_data = list()
data["atmos_alarm"] = alarm_area.atmosalm
@@ -273,26 +274,32 @@
var/pressure_danger = cur_tlv.get_danger_level(pressure)
environment_data += list(list("name" = "Pressure", "value" = pressure, "unit" = "kPa", "danger_level" = pressure_danger))
environment.assert_gases(arglist(hardcoded_gases))
cur_tlv = TLV["oxygen"]
var/oxygen_danger = cur_tlv.get_danger_level(environment.oxygen*partial_pressure)
environment_data += list(list("name" = "Oxygen", "value" = environment.oxygen / total * 100, "unit" = "%", "danger_level" = oxygen_danger))
var/oxygen_danger = cur_tlv.get_danger_level(env_gases["o2"][MOLES]*partial_pressure)
environment_data += list(list("name" = "Oxygen", "value" = env_gases["o2"][MOLES] / total * 100, "unit" = "%", "danger_level" = oxygen_danger))
cur_tlv = TLV["nitrogen"]
var/nitrogen_danger = cur_tlv.get_danger_level(environment.nitrogen*partial_pressure)
environment_data += list(list("name" = "Nitrogen", "value" = environment.nitrogen / total * 100, "unit" = "%", "danger_level" = nitrogen_danger))
var/nitrogen_danger = cur_tlv.get_danger_level(env_gases["n2"][MOLES]*partial_pressure)
environment_data += list(list("name" = "Nitrogen", "value" = env_gases["n2"][MOLES] / total * 100, "unit" = "%", "danger_level" = nitrogen_danger))
cur_tlv = TLV["carbon dioxide"]
var/carbon_dioxide_danger = cur_tlv.get_danger_level(environment.carbon_dioxide*partial_pressure)
environment_data += list(list("name" = "Carbon Dioxide", "value" = environment.carbon_dioxide / total * 100, "unit" = "%", "danger_level" = carbon_dioxide_danger))
var/carbon_dioxide_danger = cur_tlv.get_danger_level(env_gases["co2"][MOLES]*partial_pressure)
environment_data += list(list("name" = "Carbon Dioxide", "value" = env_gases["co2"][MOLES] / total * 100, "unit" = "%", "danger_level" = carbon_dioxide_danger))
cur_tlv = TLV["plasma"]
var/plasma_danger = cur_tlv.get_danger_level(environment.toxins*partial_pressure)
environment_data += list(list("name" = "Toxins", "value" = environment.toxins / total * 100, "unit" = "%", "danger_level" = plasma_danger))
var/plasma_danger = cur_tlv.get_danger_level(env_gases["plasma"][MOLES]*partial_pressure)
environment_data += list(list("name" = "Toxins", "value" = env_gases["plasma"][MOLES] / total * 100, "unit" = "%", "danger_level" = plasma_danger))
environment.garbage_collect()
cur_tlv = TLV["other"]
var/other_moles = 0
for(var/datum/gas/G in environment.trace_gases)
other_moles+=G.moles
for(var/id in env_gases)
if(id in hardcoded_gases)
continue
other_moles += env_gases[id][MOLES]
var/other_danger = cur_tlv.get_danger_level(other_moles*partial_pressure)
environment_data += list(list("name" = "Other", "value" = other_moles / total * 100, "unit" = "%", "danger_level" = other_danger))
@@ -603,6 +610,7 @@
return 0
var/datum/gas_mixture/environment = location.return_air()
var/list/env_gases = environment.gases
var/datum/tlv/cur_tlv
var/GET_PP = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume
@@ -611,19 +619,25 @@
var/environment_pressure = environment.return_pressure()
var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure)
environment.assert_gases(arglist(hardcoded_gases))
cur_tlv = TLV["oxygen"]
var/oxygen_dangerlevel = cur_tlv.get_danger_level(environment.oxygen*GET_PP)
var/oxygen_dangerlevel = cur_tlv.get_danger_level(env_gases["o2"][MOLES]*GET_PP)
cur_tlv = TLV["carbon dioxide"]
var/co2_dangerlevel = cur_tlv.get_danger_level(environment.carbon_dioxide*GET_PP)
var/co2_dangerlevel = cur_tlv.get_danger_level(env_gases["co2"][MOLES]*GET_PP)
cur_tlv = TLV["plasma"]
var/plasma_dangerlevel = cur_tlv.get_danger_level(environment.toxins*GET_PP)
var/plasma_dangerlevel = cur_tlv.get_danger_level(env_gases["plasma"][MOLES]*GET_PP)
environment.garbage_collect()
cur_tlv = TLV["other"]
var/other_moles = 0
for(var/datum/gas/G in environment.trace_gases)
other_moles+=G.moles
for(var/id in env_gases)
if(id in hardcoded_gases)
continue
other_moles += env_gases[id][MOLES]
var/other_dangerlevel = cur_tlv.get_danger_level(other_moles*GET_PP)
cur_tlv = TLV["temperature"]
+7 -4
View File
@@ -37,6 +37,7 @@
signal.data["timestamp"] = world.time
var/datum/gas_mixture/air_sample = return_air()
var/list/sample_gases = air_sample.gases
if(output&1)
signal.data["pressure"] = num2text(round(air_sample.return_pressure(),0.1))
@@ -46,14 +47,16 @@
if(output>4)
var/total_moles = air_sample.total_moles()
if(total_moles > 0)
air_sample.assert_gases(arglist(hardcoded_gases))
if(output&4)
signal.data["oxygen"] = round(100*air_sample.oxygen/total_moles,0.1)
signal.data["oxygen"] = round(100*sample_gases["o2"][MOLES]/total_moles,0.1)
if(output&8)
signal.data["toxins"] = round(100*air_sample.toxins/total_moles,0.1)
signal.data["toxins"] = round(100*sample_gases["plasma"][MOLES]/total_moles,0.1)
if(output&16)
signal.data["nitrogen"] = round(100*air_sample.nitrogen/total_moles,0.1)
signal.data["nitrogen"] = round(100*sample_gases["n2"][MOLES]/total_moles,0.1)
if(output&32)
signal.data["carbon_dioxide"] = round(100*air_sample.carbon_dioxide/total_moles,0.1)
signal.data["carbon_dioxide"] = round(100*sample_gases["co2"][MOLES]/total_moles,0.1)
air_sample.garbage_collect()
else
signal.data["oxygen"] = 0
signal.data["toxins"] = 0
+21 -51
View File
@@ -22,6 +22,7 @@
use_power = 0
var/release_log = ""
var/update_flag = 0
var/gas_type = ""
/obj/machinery/portable_atmospherics/canister/sleeping_agent
@@ -30,30 +31,35 @@
icon_state = "redws"
canister_color = "redws"
can_label = 0
gas_type = "n2o"
/obj/machinery/portable_atmospherics/canister/nitrogen
name = "canister: \[N2\]"
desc = "Nitrogen gas. Reportedly useful for something."
icon_state = "red"
canister_color = "red"
can_label = 0
gas_type = "n2"
/obj/machinery/portable_atmospherics/canister/oxygen
name = "canister: \[O2\]"
desc = "Oxygen. Necessary for human life."
icon_state = "blue"
canister_color = "blue"
can_label = 0
gas_type = "o2"
/obj/machinery/portable_atmospherics/canister/toxins
name = "canister \[Plasma\]"
desc = "Plasma gas. The reason YOU are here. Highly toxic."
icon_state = "orange"
canister_color = "orange"
can_label = 0
gas_type = "plasma"
/obj/machinery/portable_atmospherics/canister/carbon_dioxide
name = "canister \[CO2\]"
desc = "Carbon dioxide. What the fuck is carbon dioxide?"
icon_state = "black"
canister_color = "black"
can_label = 0
gas_type = "co2"
/obj/machinery/portable_atmospherics/canister/air
name = "canister \[Air\]"
desc = "Pre-mixed air."
@@ -345,11 +351,10 @@ update_flag
logmsg = "Valve was <b>opened</b> by [key_name(usr)], starting the transfer into the [holding]<br>"
else
logmsg = "Valve was <b>opened</b> by [key_name(usr)], starting the transfer into the <span class='boldannounce'>air</span><br>"
if(air_contents.toxins > 0)
if(air_contents.gases["plasma"])
message_admins("[key_name_admin(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) opened a canister that contains plasma! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
log_admin("[key_name(usr)] opened a canister that contains plasma at [x], [y], [z]")
var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air_contents.trace_gases
if(sleeping_agent && (sleeping_agent.moles > 1))
if(air_contents.gases["n2o"])
message_admins("[key_name_admin(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) opened a canister that contains N2O! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
log_admin("[key_name(usr)] opened a canister that contains N2O at [x], [y], [z]")
investigate_log(logmsg, "atmos")
@@ -365,38 +370,25 @@ update_flag
update_icon()
return 1
/obj/machinery/portable_atmospherics/canister/toxins/New()
/obj/machinery/portable_atmospherics/canister/New()
..()
src.air_contents.toxins = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
create_gas()
src.update_icon()
update_icon()
return 1
/obj/machinery/portable_atmospherics/canister/oxygen/New()
..()
src.air_contents.oxygen = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
src.update_icon()
return 1
/obj/machinery/portable_atmospherics/canister/sleeping_agent/New()
..()
var/datum/gas/sleeping_agent/trace_gas = new
air_contents.trace_gases += trace_gas
trace_gas.moles = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
src.update_icon()
return 1
/obj/machinery/portable_atmospherics/canister/proc/create_gas()
if(gas_type)
air_contents.assert_gas(gas_type)
air_contents.gases[gas_type][MOLES] = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
//Dirty way to fill room with gas. However it is a bit easier to do than creating some floor/engine/n2o -rastaf0
/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller/New()
..()
var/datum/gas/sleeping_agent/trace_gas = air_contents.trace_gases[1]
trace_gas.moles = 9*4000
air_contents.gases["n2o"][MOLES] = 9*4000
spawn(10)
var/turf/simulated/location = src.loc
if (istype(src.loc))
@@ -406,29 +398,7 @@ update_flag
air_contents = new
return 1
/obj/machinery/portable_atmospherics/canister/nitrogen/New()
..()
src.air_contents.nitrogen = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
src.update_icon()
return 1
/obj/machinery/portable_atmospherics/canister/carbon_dioxide/New()
..()
src.air_contents.carbon_dioxide = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
src.update_icon()
return 1
/obj/machinery/portable_atmospherics/canister/air/New()
..()
src.air_contents.oxygen = (O2STANDARD*src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
src.air_contents.nitrogen = (N2STANDARD*src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
src.update_icon()
return 1
/obj/machinery/portable_atmospherics/canister/air/create_gas()
air_contents.assert_gases("o2","n2")
air_contents.gases["o2"][MOLES] = (O2STANDARD*src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
air_contents.gases["n2"][MOLES] = (N2STANDARD*src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
+16 -14
View File
@@ -72,27 +72,29 @@
//Filter it
if (removed)
var/datum/gas_mixture/filtered_out = new
var/list/filtered_gases = filtered_out.gases
var/list/removed_gases = removed.gases
filtered_out.assert_gases(arglist(hardcoded_gases))
removed.assert_gases(arglist(hardcoded_gases))
filtered_out.temperature = removed.temperature
filtered_out.toxins = removed.toxins
removed.toxins = 0
filtered_gases["plasma"][MOLES] = removed_gases["plasma"][MOLES]
removed_gases["plasma"][MOLES] = 0
filtered_out.carbon_dioxide = removed.carbon_dioxide
removed.carbon_dioxide = 0
filtered_gases["co2"][MOLES] = removed_gases["co2"][MOLES]
removed_gases["co2"][MOLES] = 0
if(removed.trace_gases.len>0)
for(var/datum/gas/trace_gas in removed.trace_gases)
if(istype(trace_gas, /datum/gas/sleeping_agent))
removed.trace_gases -= trace_gas
filtered_out.trace_gases += trace_gas
filtered_gases["agent_b"][MOLES] = removed_gases["agent_b"][MOLES]
removed_gases["agent_b"][MOLES] = 0
if(removed.trace_gases.len>0)
for(var/datum/gas/trace_gas in removed.trace_gases)
if(istype(trace_gas, /datum/gas/oxygen_agent_b))
removed.trace_gases -= trace_gas
filtered_out.trace_gases += trace_gas
filtered_gases["n2o"][MOLES] = removed_gases["n2o"][MOLES]
removed_gases["n2o"][MOLES] = 0
filtered_out.garbage_collect()
removed.garbage_collect()
//Remix the resulting gases
air_contents.merge(filtered_out)
@@ -436,13 +436,14 @@
if(!T)
return
var/datum/gas_mixture/GM = new
GM.assert_gas("plasma")
if(prob(10))
GM.toxins += 100
GM.gases["plasma"][MOLES] += 100
GM.temperature = 1500+T0C //should be enough to start a fire
T.visible_message("The [src] suddenly disgorges a cloud of heated plasma.")
qdel(src)
else
GM.toxins += 5
GM.gases["plasma"][MOLES] += 5
GM.temperature = istype(T) ? T.air.return_temperature() : T20C
T.visible_message("The [src] suddenly disgorges a cloud of plasma.")
T.assume_air(GM)
+3 -2
View File
@@ -177,8 +177,9 @@
cabin_air = new
cabin_air.temperature = T20C
cabin_air.volume = 200
cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
cabin_air.assert_gases("o2","n2")
cabin_air.gases["o2"][MOLES] = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
cabin_air.gases["n2"][MOLES] = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
return cabin_air
/obj/mecha/proc/add_radio()
@@ -163,9 +163,12 @@
T.air_update_turf()
for(var/obj/effect/hotspot/H in T)
qdel(H)
if(G.toxins)
G.nitrogen += (G.toxins)
G.toxins = 0
var/list/G_gases = G.gases
if(G_gases["plasma"])
G.assert_gas("n2")
G_gases["n2"][MOLES] += (G_gases["plasma"][MOLES])
G_gases["plasma"][MOLES] = 0
G.garbage_collect()
for(var/obj/machinery/atmospherics/components/unary/U in T)
if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber.
U.welded = 1
+6 -11
View File
@@ -414,6 +414,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
dat += "Unable to obtain a reading.<br>"
else
var/datum/gas_mixture/environment = T.return_air()
var/list/env_gases = environment.gases
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles()
@@ -421,17 +422,11 @@ var/global/list/obj/item/device/pda/PDAs = list()
dat += "Air Pressure: [round(pressure,0.1)] kPa<br>"
if (total_moles)
var/o2_level = environment.oxygen/total_moles
var/n2_level = environment.nitrogen/total_moles
var/co2_level = environment.carbon_dioxide/total_moles
var/plasma_level = environment.toxins/total_moles
var/unknown_level = 1-(o2_level+n2_level+co2_level+plasma_level)
dat += "Nitrogen: [round(n2_level*100)]%<br>"
dat += "Oxygen: [round(o2_level*100)]%<br>"
dat += "Carbon Dioxide: [round(co2_level*100)]%<br>"
dat += "Plasma: [round(plasma_level*100)]%<br>"
if(unknown_level > 0.01)
dat += "OTHER: [round(unknown_level)]%<br>"
for(var/id in env_gases)
var/gas_level = env_gases[id][MOLES]/total_moles
if(id in hardcoded_gases || gas_level > 0.01)
dat += "[env_gases[id][GAS_NAME]]: [round(gas_level*100)]%<br>"
dat += "Temperature: [round(environment.temperature-T0C)]&deg;C<br>"
dat += "<br>"
+13 -8
View File
@@ -271,12 +271,15 @@ MASS SPECTROMETER
else
user << "<span class='alert'>Pressure: [round(pressure,0.1)] kPa</span>"
if(total_moles)
var/o2_concentration = environment.oxygen/total_moles
var/n2_concentration = environment.nitrogen/total_moles
var/co2_concentration = environment.carbon_dioxide/total_moles
var/plasma_concentration = environment.toxins/total_moles
var/list/env_gases = environment.gases
environment.assert_gases(arglist(hardcoded_gases))
var/o2_concentration = env_gases["o2"][MOLES]/total_moles
var/n2_concentration = env_gases["n2"][MOLES]/total_moles
var/co2_concentration = env_gases["co2"][MOLES]/total_moles
var/plasma_concentration = env_gases["plasma"][MOLES]/total_moles
environment.garbage_collect()
var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration)
if(abs(n2_concentration - N2STANDARD) < 20)
user << "<span class='info'>Nitrogen: [round(n2_concentration*100)] %</span>"
else
@@ -295,9 +298,11 @@ MASS SPECTROMETER
if(plasma_concentration > 0.01)
user << "<span class='info'>Plasma: [round(plasma_concentration*100)] %</span>"
if(unknown_concentration > 0.01)
user << "<span class='alert'>Unknown: [round(unknown_concentration*100)] %</span>"
for(var/id in env_gases)
if(id in hardcoded_gases)
continue
var/gas_concentration = env_gases[id][MOLES]/total_moles
user << "<span class='alert'>[env_gases[id][GAS_NAME]]: [round(gas_concentration*100)] %</span>"
user << "<span class='info'>Temperature: [round(environment.temperature-T0C)] &deg;C</span>"
@@ -239,8 +239,9 @@
/obj/effect/chrono_field/return_air() //we always have nominal air and temperature
var/datum/gas_mixture/GM = new
GM.oxygen = MOLES_O2STANDARD
GM.nitrogen = MOLES_N2STANDARD
GM.assert_gases("o2","n2")
GM.gases["o2"][MOLES] = MOLES_O2STANDARD
GM.gases["n2"][MOLES] = MOLES_N2STANDARD
GM.temperature = T20C
return GM
@@ -198,7 +198,8 @@
//TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this...
//Transfer 5% of current tank air contents to turf
var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(release_amount)
air_transfer.toxins = air_transfer.toxins * 5
if(air_transfer.gases["plasma"])
air_transfer.gases["plasma"][MOLES] *= 5
target.assume_air(air_transfer)
//Burn it based on transfered gas
target.hotspot_expose((ptank.air_contents.temperature*2) + 380,500)
@@ -54,7 +54,7 @@
var/datum/gas_mixture/G = src.air_contents.remove(num)
var/allgases = G.carbon_dioxide + G.nitrogen + G.oxygen + G.toxins //fuck trace gases -Pete
var/allgases = G.total_moles()
if(allgases >= 0.005)
return 1
@@ -73,7 +73,8 @@
/obj/item/weapon/tank/jetpack/void/New()
..()
air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
air_contents.assert_gas("o2")
air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
/obj/item/weapon/tank/jetpack/oxygen
@@ -84,7 +85,8 @@
/obj/item/weapon/tank/jetpack/oxygen/New()
..()
air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
air_contents.assert_gas("o2")
air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
/obj/item/weapon/tank/jetpack/oxygen/harness
name = "jet harness (oxygen)"
@@ -114,7 +116,8 @@
..()
ion_trail = new /datum/effect_system/trail_follow/ion()
ion_trail.set_up(src)
air_contents.carbon_dioxide = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
air_contents.assert_gas("co2")
air_contents.gases["co2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
/obj/item/weapon/tank/jetpack/suit
@@ -20,7 +20,8 @@
/obj/item/weapon/tank/internals/oxygen/New()
..()
src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
air_contents.assert_gas("o2")
air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
@@ -45,13 +46,9 @@
/obj/item/weapon/tank/internals/anesthetic/New()
..()
src.air_contents.oxygen = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
var/datum/gas/sleeping_agent/trace_gas = new()
trace_gas.moles = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
src.air_contents.trace_gases += trace_gas
air_contents.assert_gases("o2", "n2o")
air_contents.gases["o2"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
air_contents.gases["n2o"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
return
/*
@@ -66,9 +63,9 @@
/obj/item/weapon/tank/internals/air/New()
..()
src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
src.air_contents.nitrogen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
air_contents.assert_gases("o2","n2")
air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
air_contents.gases["n2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
return
@@ -86,8 +83,8 @@
/obj/item/weapon/tank/internals/plasma/New()
..()
src.air_contents.toxins = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
air_contents.assert_gas("plasma")
air_contents.gases["plasma"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
/obj/item/weapon/tank/internals/plasma/attackby(obj/item/weapon/W, mob/user, params)
@@ -105,7 +102,8 @@
/obj/item/weapon/tank/internals/plasma/full/New()
..()
src.air_contents.toxins = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
air_contents.assert_gas("plasma")
air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
@@ -120,14 +118,14 @@
/obj/item/weapon/tank/internals/plasmaman/New()
..()
src.air_contents.toxins = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
air_contents.assert_gas("plasma")
air_contents.gases["plasma"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
/obj/item/weapon/tank/internals/plasmaman/full/New()
..()
src.air_contents.toxins = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
air_contents.assert_gas("plasma")
air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
@@ -139,8 +137,8 @@
/obj/item/weapon/tank/internals/plasmaman/belt/full/New()
..()
src.air_contents.toxins = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
air_contents.assert_gas("plasma")
air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
@@ -162,7 +160,8 @@
/obj/item/weapon/tank/internals/emergency_oxygen/New()
..()
src.air_contents.oxygen = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
air_contents.assert_gas("o2")
air_contents.gases["o2"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
/obj/item/weapon/tank/internals/emergency_oxygen/engi
@@ -64,15 +64,14 @@
/obj/structure/closet/crate/freezer/return_air()
var/datum/gas_mixture/gas = (..())
if(!gas) return null
if(!gas)
return null
var/datum/gas_mixture/newgas = new/datum/gas_mixture()
newgas.oxygen = gas.oxygen
newgas.carbon_dioxide = gas.carbon_dioxide
newgas.nitrogen = gas.nitrogen
newgas.toxins = gas.toxins
newgas.volume = gas.volume
newgas.temperature = gas.temperature
if(newgas.temperature <= target_temp) return
newgas.copy_from(gas)
if(newgas.temperature <= target_temp)
return
if((newgas.temperature - cooling_power) > target_temp)
newgas.temperature -= cooling_power
@@ -11,8 +11,9 @@
/obj/structure/transit_tube_pod/New(loc)
..(loc)
air_contents.oxygen = MOLES_O2STANDARD * 2
air_contents.nitrogen = MOLES_N2STANDARD
air_contents.assert_gases("o2", "n2")
air_contents.gases["o2"][MOLES] = MOLES_O2STANDARD * 2
air_contents.gases["n2"][MOLES] = MOLES_N2STANDARD
air_contents.temperature = T20C
// Give auto tubes time to align before trying to start moving
@@ -124,11 +125,7 @@
// datum, there might be problems if I don't...
/obj/structure/transit_tube_pod/return_air()
var/datum/gas_mixture/GM = new()
GM.oxygen = air_contents.oxygen
GM.carbon_dioxide = air_contents.carbon_dioxide
GM.nitrogen = air_contents.nitrogen
GM.toxins = air_contents.toxins
GM.temperature = air_contents.temperature
GM.copy_from(air_contents)
return GM
// For now, copying what I found in an unused FEA file (and almost identical in a
+2 -3
View File
@@ -134,10 +134,9 @@
/turf/simulated/floor/engine/n20/New()
..()
var/datum/gas_mixture/adding = new
var/datum/gas/sleeping_agent/trace_gas = new
trace_gas.moles = 6000
adding.trace_gases += trace_gas
adding.assert_gas("n2o")
adding.gases["n2o"][MOLES] = 6000
adding.temperature = T20C
assume_air(adding)
+16 -16
View File
@@ -140,32 +140,32 @@
//////Assimilate Air//////
/turf/simulated/proc/Assimilate_Air()
if(air)
var/aoxy = 0//Holders to assimilate air from nearby turfs
var/anitro = 0
var/aco = 0
var/atox = 0
var/atemp = 0
var/datum/gas_mixture/a_gas_mixture = new//Holders to assimilate air from nearby turfs
var/list/a_gases = a_gas_mixture.gases
var/turf_count = 0
for(var/direction in cardinal)//Only use cardinals to cut down on lag
var/turf/T = get_step(src,direction)
if(istype(T,/turf/space))//Counted as no air
turf_count++//Considered a valid turf for air calcs
continue
else if(istype(T,/turf/simulated/floor))
var/turf/simulated/S = T
if(S.air)//Add the air's contents to the holders
aoxy += S.air.oxygen
anitro += S.air.nitrogen
aco += S.air.carbon_dioxide
atox += S.air.toxins
atemp += S.air.temperature
turf_count ++
air.oxygen = (aoxy/max(turf_count,1))//Averages contents of the turfs, ignoring walls and the like
air.nitrogen = (anitro/max(turf_count,1))
air.carbon_dioxide = (aco/max(turf_count,1))
air.toxins = (atox/max(turf_count,1))
air.temperature = (atemp/max(turf_count,1))//Trace gases can get bant
var/list/S_gases = S.air.gases
for(var/id in a_gases)
a_gases[id][MOLES] += S_gases[id][MOLES]
a_gas_mixture.temperature += S.air.temperature
turf_count++
air.copy_from(a_gas_mixture)
var/list/air_gases = air.gases
for(var/id in air_gases)
air_gases[id][MOLES] /= max(turf_count,1)//Averages contents of the turfs, ignoring walls and the like
air.temperature /= max(turf_count,1)
SSair.add_to_active(src)
/turf/proc/ReplaceWithLattice()
+6 -5
View File
@@ -194,12 +194,12 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return
var/datum/gas_mixture/env = T.return_air()
var/list/env_gases = env.gases
var/t = ""
t+= "Nitrogen : [env.nitrogen]\n"
t+= "Oxygen : [env.oxygen]\n"
t+= "Plasma : [env.toxins]\n"
t+= "CO2: [env.carbon_dioxide]\n"
for(var/id in env_gases)
if(id in hardcoded_gases || env_gases[id][MOLES])
t+= "[env_gases[id][GAS_NAME]] : [env_gases[id][MOLES]]\n"
usr << t
feedback_add_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -638,7 +638,8 @@ var/global/list/g_fancy_list_of_types = null
if(Rad.anchored)
if(!Rad.P)
var/obj/item/weapon/tank/internals/plasma/Plasma = new/obj/item/weapon/tank/internals/plasma(Rad)
Plasma.air_contents.toxins = 70
Plasma.air_contents.assert_gas("plasma")
Plasma.air_contents.gases["plasma"][MOLES] = 70
Rad.drainratio = 0
Rad.P = Plasma
Plasma.loc = Rad
+5 -3
View File
@@ -6,15 +6,17 @@
return
var/datum/gas_mixture/GM = target.return_air()
var/list/GM_gases
var/burning = 0
if(istype(target, /turf/simulated))
var/turf/simulated/T = target
if(T.active_hotspot)
burning = 1
usr << "<span class='adminnotice'>@[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]</span>"
for(var/datum/gas/trace_gas in GM.trace_gases)
usr << "[trace_gas.type]: [trace_gas.moles]"
usr << "<span class='adminnotice'>@[target.x],[target.y]: [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]</span>"
for(var/id in GM_gases)
if(id in hardcoded_gases || GM_gases[id][MOLES])
usr << "[GM_gases[id][GAS_NAME]]: [GM_gases[id][MOLES]]"
feedback_add_details("admin_verb","DAST") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/fix_next_move()
+4 -1
View File
@@ -108,7 +108,10 @@
return
/obj/item/weapon/tank/proc/ignite() //This happens when a bomb is told to explode
var/fuel_moles = air_contents.toxins + air_contents.oxygen/6
air_contents.assert_gases("plasma", "o2")
var/fuel_moles = air_contents.gases["plasma"][MOLES] + air_contents.gases["o2"][MOLES]/6
air_contents.garbage_collect()
var/strength = 1
var/turf/ground_zero = get_turf(loc)
+16 -4
View File
@@ -228,7 +228,10 @@
var/turf/simulated/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
GM.oxygen = max(0, GM.oxygen - severity * holder.energy)
if(!GM.gases["o2"])
return
GM.gases["o2"][MOLES] -= severity * holder.energy
GM.garbage_collect()
/datum/spacevine_mutation/nitro_eater
name = "nitrogen consuming"
@@ -240,7 +243,10 @@
var/turf/simulated/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
GM.nitrogen = max(0, GM.nitrogen - severity * holder.energy)
if(!GM.gases["n2"])
return
GM.gases["n2"][MOLES] -= severity * holder.energy
GM.garbage_collect()
/datum/spacevine_mutation/carbondioxide_eater
name = "CO2 consuming"
@@ -252,7 +258,10 @@
var/turf/simulated/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
GM.carbon_dioxide = max(0, GM.carbon_dioxide - severity * holder.energy)
if(!GM.gases["co2"])
return
GM.gases["co2"][MOLES] -= severity * holder.energy
GM.garbage_collect()
/datum/spacevine_mutation/plasma_eater
name = "toxins consuming"
@@ -264,7 +273,10 @@
var/turf/simulated/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
GM.toxins = max(0, GM.toxins - severity * holder.energy)
if(!GM.gases["plasma"])
return
GM.gases["plasma"][MOLES] -= severity * holder.energy
GM.garbage_collect()
/datum/spacevine_mutation/thorns
name = "thorny"
+1 -5
View File
@@ -258,11 +258,7 @@
A.nitrogen = 82
A.carbon_dioxide = 0
A.toxins = 0
A.air.oxygen = 21
A.air.carbon_dioxide = 0
A.air.nitrogen = 82
A.air.toxins = 0
A.air.temperature = 293.15
A.air.copy_from_turf(A)
SSair.add_to_active(A)
A.overlays.Cut()
var/area/Z = get_area(A)
+10 -5
View File
@@ -9,22 +9,27 @@
var/toxins_used = 0
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
var/list/breath_gases = breath.gases
breath.assert_gases("plasma", "o2")
//Partial pressure of the toxins in our breath
var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure
var/Toxins_pp = (breath_gases["plasma"][MOLES]/breath.total_moles())*breath_pressure
if(Toxins_pp) // Detect toxins in air
adjustPlasma(breath.toxins*250)
adjustPlasma(breath_gases["plasma"][MOLES]*250)
throw_alert("alien_tox", /obj/screen/alert/alien_tox)
toxins_used = breath.toxins
toxins_used = breath_gases["plasma"][MOLES]
else
clear_alert("alien_tox")
//Breathe in toxins and out oxygen
breath.toxins -= toxins_used
breath.oxygen += toxins_used
breath_gases["plasma"][MOLES] -= toxins_used
breath_gases["o2"][MOLES] += toxins_used
breath.garbage_collect()
//BREATH TEMPERATURE
handle_breath_temperature(breath)
+32 -29
View File
@@ -1168,10 +1168,14 @@
var/gas_breathed = 0
var/list/breath_gases = breath.gases
breath.assert_gases("o2", "plasma", "co2", "n2o")
//Partial pressures in our breath
var/O2_pp = breath.get_breath_partial_pressure(breath.oxygen)
var/Toxins_pp = breath.get_breath_partial_pressure(breath.toxins)
var/CO2_pp = breath.get_breath_partial_pressure(breath.carbon_dioxide)
var/O2_pp = breath.get_breath_partial_pressure(breath_gases["o2"][MOLES])
var/Toxins_pp = breath.get_breath_partial_pressure(breath_gases["plasma"][MOLES])
var/CO2_pp = breath.get_breath_partial_pressure(breath_gases["co2"][MOLES])
//-- OXY --//
@@ -1179,7 +1183,7 @@
//Too much oxygen! //Yes, some species may not like it.
if(safe_oxygen_max)
if(O2_pp > safe_oxygen_max && !(NOBREATH in specflags))
var/ratio = (breath.oxygen/safe_oxygen_max) * 10
var/ratio = (breath_gases["o2"][MOLES]/safe_oxygen_max) * 10
H.adjustOxyLoss(Clamp(ratio,oxy_breath_dam_min,oxy_breath_dam_max))
H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy)
else
@@ -1188,17 +1192,17 @@
//Too little oxygen!
if(safe_oxygen_min)
if(O2_pp < safe_oxygen_min)
gas_breathed = handle_too_little_breath(H,O2_pp,safe_oxygen_min,breath.oxygen)
gas_breathed = handle_too_little_breath(H,O2_pp,safe_oxygen_min,breath_gases["o2"][MOLES])
H.throw_alert("oxy", /obj/screen/alert/oxy)
else
H.failed_last_breath = 0
H.adjustOxyLoss(-5)
gas_breathed = breath.oxygen/6
gas_breathed = breath_gases["o2"][MOLES]/6
H.clear_alert("oxy")
//Exhale
breath.oxygen -= gas_breathed
breath.carbon_dioxide += gas_breathed
breath_gases["o2"][MOLES] -= gas_breathed
breath_gases["co2"][MOLES] += gas_breathed
gas_breathed = 0
@@ -1225,17 +1229,17 @@
//Too little CO2!
if(safe_co2_min)
if(CO2_pp < safe_co2_min)
gas_breathed = handle_too_little_breath(H,CO2_pp, safe_co2_min,breath.carbon_dioxide)
gas_breathed = handle_too_little_breath(H,CO2_pp, safe_co2_min,breath_gases["co2"][MOLES])
H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2)
else
H.failed_last_breath = 0
H.adjustOxyLoss(-5)
gas_breathed = breath.carbon_dioxide/6
gas_breathed = breath_gases["co2"][MOLES]/6
H.clear_alert("not_enough_co2")
//Exhale
breath.carbon_dioxide -= gas_breathed
breath.oxygen += gas_breathed
breath_gases["co2"][MOLES] -= gas_breathed
breath_gases["o2"][MOLES] += gas_breathed
gas_breathed = 0
@@ -1244,7 +1248,7 @@
//Too much toxins!
if(safe_toxins_max)
if(Toxins_pp > safe_toxins_max && !(NOBREATH in specflags))
var/ratio = (breath.toxins/safe_toxins_max) * 10
var/ratio = (breath_gases["plasma"][MOLES]/safe_toxins_max) * 10
if(H.reagents)
H.reagents.add_reagent("plasma", Clamp(ratio, tox_breath_dam_min, tox_breath_dam_max))
H.throw_alert("tox_in_air", /obj/screen/alert/tox_in_air)
@@ -1255,34 +1259,33 @@
//Too little toxins!
if(safe_toxins_min)
if(Toxins_pp < safe_toxins_min && !(NOBREATH in specflags))
gas_breathed = handle_too_little_breath(H,Toxins_pp, safe_toxins_min, breath.toxins)
gas_breathed = handle_too_little_breath(H,Toxins_pp, safe_toxins_min, breath_gases["plasma"][MOLES])
H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
else
H.failed_last_breath = 0
H.adjustOxyLoss(-5)
gas_breathed = breath.toxins/6
gas_breathed = breath_gases["plasma"][MOLES]/6
H.clear_alert("not_enough_tox")
//Exhale
breath.toxins -= gas_breathed
breath.carbon_dioxide += gas_breathed
breath_gases["plasma"][MOLES] -= gas_breathed
breath_gases["co2"][MOLES] += gas_breathed
gas_breathed = 0
//-- TRACES --//
if(breath.trace_gases.len && !(NOBREATH in specflags)) // If there's some other shit in the air lets deal with it here.
for(var/datum/gas/sleeping_agent/SA in breath.trace_gases)
var/SA_pp = breath.get_breath_partial_pressure(SA.moles)
if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit
H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
H.sleeping = max(H.sleeping+2, 10)
else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
if(prob(20))
H.emote(pick("giggle", "laugh"))
handle_breath_temperature(breath, H)
if(breath && !(NOBREATH in specflags)) // If there's some other shit in the air lets deal with it here.
var/SA_pp = breath.get_breath_partial_pressure(breath_gases["n2o"][MOLES])
if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit
H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
H.sleeping = max(H.sleeping+2, 10)
else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
if(prob(20))
H.emote(pick("giggle", "laugh"))
handle_breath_temperature(breath, H)
breath.garbage_collect()
return 1
@@ -510,7 +510,7 @@ var/global/image/plasmaman_on_fire = image("icon"='icons/mob/OnFire.dmi', "icon_
if(environment)
var/total_moles = environment.total_moles()
if(total_moles)
if((environment.oxygen /total_moles) >= 0.01)
if(environment.gases["o2"] && (environment.gases["o2"][MOLES] /total_moles) >= 0.01)
H.adjust_fire_stacks(0.5)
if(!H.on_fire && H.fire_stacks > 0)
H.visible_message("<span class='danger'>[H]'s body reacts with the atmosphere and bursts into flames!</span>","<span class='userdanger'>Your body reacts with the atmosphere and bursts into flame!</span>")
+22 -19
View File
@@ -105,9 +105,12 @@
var/oxygen_used = 0
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
var/O2_partialpressure = (breath.oxygen/breath.total_moles())*breath_pressure
var/Toxins_partialpressure = (breath.toxins/breath.total_moles())*breath_pressure
var/CO2_partialpressure = (breath.carbon_dioxide/breath.total_moles())*breath_pressure
var/list/breath_gases = breath.gases
breath.assert_gases("o2","plasma","co2","n2o")
var/O2_partialpressure = (breath_gases["o2"][MOLES]/breath.total_moles())*breath_pressure
var/Toxins_partialpressure = (breath_gases["plasma"][MOLES]/breath.total_moles())*breath_pressure
var/CO2_partialpressure = (breath_gases["co2"][MOLES]/breath.total_moles())*breath_pressure
//OXYGEN
@@ -118,7 +121,7 @@
var/ratio = safe_oxy_min/O2_partialpressure
adjustOxyLoss(min(5*ratio, 3))
failed_last_breath = 1
oxygen_used = breath.oxygen*ratio/6
oxygen_used = breath_gases["o2"][MOLES]*ratio/6
else
adjustOxyLoss(3)
failed_last_breath = 1
@@ -127,11 +130,11 @@
else //Enough oxygen
failed_last_breath = 0
adjustOxyLoss(-5)
oxygen_used = breath.oxygen/6
oxygen_used = breath_gases["o2"][MOLES]/6
clear_alert("oxy")
breath.oxygen -= oxygen_used
breath.carbon_dioxide += oxygen_used
breath_gases["o2"][MOLES] -= oxygen_used
breath_gases["co2"][MOLES] += oxygen_used
//CARBON DIOXIDE
if(CO2_partialpressure > safe_co2_max)
@@ -150,24 +153,24 @@
//TOXINS/PLASMA
if(Toxins_partialpressure > safe_tox_max)
var/ratio = (breath.toxins/safe_tox_max) * 10
var/ratio = (breath_gases["plasma"][MOLES]/safe_tox_max) * 10
if(reagents)
reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
throw_alert("tox_in_air", /obj/screen/alert/tox_in_air)
else
clear_alert("tox_in_air")
//TRACE GASES
if(breath.trace_gases.len)
for(var/datum/gas/sleeping_agent/SA in breath.trace_gases)
var/SA_partialpressure = (SA.moles/breath.total_moles())*breath_pressure
if(SA_partialpressure > SA_para_min)
Paralyse(3)
if(SA_partialpressure > SA_sleep_min)
sleeping = max(sleeping+2, 10)
else if(SA_partialpressure > 0.01)
if(prob(20))
emote(pick("giggle","laugh"))
//NITROUS OXIDE
if(breath_gases["n2o"])
var/SA_partialpressure = (breath_gases["n2o"][MOLES]/breath.total_moles())*breath_pressure
if(SA_partialpressure > SA_para_min)
Paralyse(3)
if(SA_partialpressure > SA_sleep_min)
sleeping = max(sleeping+2, 10)
else if(SA_partialpressure > 0.01)
if(prob(20))
emote(pick("giggle","laugh"))
breath.garbage_collect()
//BREATH TEMPERATURE
handle_breath_temperature(breath)
+1 -1
View File
@@ -142,7 +142,7 @@
ExtinguishMob()
return
var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment
if(G.oxygen < 1)
if(!G.gases["o2"] || G.gases["o2"][MOLES] < 1)
ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire
return
var/turf/location = get_turf(src)
@@ -526,6 +526,7 @@
dat += "Unable to obtain a reading.<br>"
else
var/datum/gas_mixture/environment = T.return_air()
var/list/env_gases = environment.gases
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles()
@@ -533,17 +534,10 @@
dat += "Air Pressure: [round(pressure,0.1)] kPa<br>"
if (total_moles)
var/o2_level = environment.oxygen/total_moles
var/n2_level = environment.nitrogen/total_moles
var/co2_level = environment.carbon_dioxide/total_moles
var/plasma_level = environment.toxins/total_moles
var/unknown_level = 1-(o2_level+n2_level+co2_level+plasma_level)
dat += "Nitrogen: [round(n2_level*100)]%<br>"
dat += "Oxygen: [round(o2_level*100)]%<br>"
dat += "Carbon Dioxide: [round(co2_level*100)]%<br>"
dat += "Plasma: [round(plasma_level*100)]%<br>"
if(unknown_level > 0.01)
dat += "OTHER: [round(unknown_level)]%<br>"
for(var/id in env_gases)
var/gas_level = env_gases[id][MOLES]/total_moles
if(id in hardcoded_gases || gas_level > 0.01)
dat += "[env_gases[id][GAS_NAME]]: [round(gas_level*100)]%<br>"
dat += "Temperature: [round(environment.temperature-T0C)]&deg;C<br>"
dat += "<a href='byond://?src=\ref[src];software=atmosensor;sub=0'>Refresh Reading</a> <br>"
dat += "<br>"
@@ -388,7 +388,15 @@
if(src.beacon) //Check that the beacon still exists and is in a safe place. No instant kills.
if(beacon.air)
var/datum/gas_mixture/Z = beacon.air
if(Z.oxygen >= 16 && !Z.toxins && Z.carbon_dioxide < 10 && !Z.trace_gases.len)
var/list/Z_gases = Z.gases
var/trace_gases = FALSE
for(var/id in Z_gases)
if(id in hardcoded_gases)
continue
trace_gases = TRUE
break
if((Z_gases["o2"] && Z_gases["o2"][MOLES] >= 16) && !Z_gases["plasma"] && (!Z_gases["co2"] || Z_gases["co2"][MOLES] < 10) && !trace_gases)
if((Z.temperature > 270) && (Z.temperature < 360))
var/pressure = Z.return_pressure()
if((pressure > 20) && (pressure < 550))
@@ -41,12 +41,12 @@
..()
if(istype(src.loc, /turf/simulated))
var/turf/simulated/T = src.loc
if(T.air)
var/co2 = T.air.carbon_dioxide
if(T.air && T.air.gases["co2"])
var/co2 = T.air.gases["co2"][MOLES]
if(co2 > 0)
if(prob(25))
var/amt = min(co2, 9)
T.air.carbon_dioxide -= amt
T.air.gases["co2"][MOLES] -= amt
T.atmos_spawn_air(SPAWN_OXYGEN, amt)
/mob/living/simple_animal/hostile/tree/AttackingTarget()
@@ -196,10 +196,15 @@
if(istype(T,/turf/simulated))
var/turf/simulated/ST = T
if(ST.air)
var/tox = ST.air.toxins
var/oxy = ST.air.oxygen
var/n2 = ST.air.nitrogen
var/co2 = ST.air.carbon_dioxide
var/ST_gases = ST.air.gases
ST.air.assert_gases(arglist(hardcoded_gases))
var/tox = ST_gases["plasma"][MOLES]
var/oxy = ST_gases["o2"][MOLES]
var/n2 = ST_gases["n2"][MOLES]
var/co2 = ST_gases["co2"][MOLES]
ST.air.garbage_collect()
if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"])
atmos_suitable = 0
+7 -9
View File
@@ -33,14 +33,12 @@ var/next_mob_id = 0
var/datum/gas_mixture/environment = loc.return_air()
var/t = "<span class='notice'>Coordinates: [x],[y] \n</span>"
t+= "<span class='danger'>Temperature: [environment.temperature] \n</span>"
t+= "<span class='notice'>Nitrogen: [environment.nitrogen] \n</span>"
t+= "<span class='notice'>Oxygen: [environment.oxygen] \n</span>"
t+= "<span class='notice'>Plasma : [environment.toxins] \n</span>"
t+= "<span class='notice'>Carbon Dioxide: [environment.carbon_dioxide] \n</span>"
for(var/datum/gas/trace_gas in environment.trace_gases)
t+= "<span class='notice'>[trace_gas.type]: [trace_gas.moles] \n</span>"
var/t = "<span class='notice'>Coordinates: [x],[y] \n</span>"
t += "<span class='danger'>Temperature: [environment.temperature] \n</span>"
for(var/id in environment.gases)
var/gas = environment.gases[id]
if(gas[MOLES])
t+="<span class='notice'>[gas[GAS_NAME]]: [gas[MOLES]] \n</span>"
usr << t
@@ -967,4 +965,4 @@ var/next_mob_id = 0
for(var/F in faction)
if(F in target.faction)
return 1
return 0
return 0
+6 -6
View File
@@ -26,12 +26,12 @@ var/global/list/rad_collectors = list()
/obj/machinery/power/rad_collector/process()
if(P)
if(P.air_contents.toxins <= 0)
if(!P.air_contents.gases["plasma"])
investigate_log("<font color='red'>out of fuel</font>.","singulo")
P.air_contents.toxins = 0
eject()
else
P.air_contents.toxins -= 0.001*drainratio
P.air_contents.gases["plasma"][MOLES] -= 0.001*drainratio
P.air_contents.garbage_collect()
return
@@ -43,7 +43,7 @@ var/global/list/rad_collectors = list()
toggle_power()
user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \
"<span class='notice'>You turn the [src.name] [active? "on":"off"].</span>")
investigate_log("turned [active?"<font color='green'>on</font>":"<font color='red'>off</font>"] by [user.key]. [P?"Fuel: [round(P.air_contents.toxins/0.29)]%":"<font color='red'>It is empty</font>"].","singulo")
investigate_log("turned [active?"<font color='green'>on</font>":"<font color='red'>off</font>"] by [user.key]. [P?"Fuel: [round(P.air_contents.gases["plasma"][MOLES]/0.29)]%":"<font color='red'>It is empty</font>"].","singulo")
return
else
user << "<span class='warning'>The controls are locked!</span>"
@@ -129,8 +129,8 @@ var/global/list/rad_collectors = list()
/obj/machinery/power/rad_collector/proc/receive_pulse(pulse_strength)
if(P && active)
var/power_produced = 0
power_produced = P.air_contents.toxins*pulse_strength*20
var/power_produced = P.air_contents.gases["plasma"] ? P.air_contents.gases["plasma"][MOLES] : 0
power_produced *= pulse_strength*20
add_avail(power_produced)
last_power = power_produced
return
@@ -138,7 +138,13 @@
damage = max( damage + ( (removed.temperature - 800) / 150 ) , 0 )
//Ok, 100% oxygen atmosphere = best reaction
//Maxes out at 100% oxygen pressure
oxygen = max(min((removed.oxygen - (removed.nitrogen * NITROGEN_RETARDATION_FACTOR)) / MOLES_CELLSTANDARD, 1), 0)
var/removed_nitrogen = 0
if(removed.gases["n2"])
removed_nitrogen = (removed.gases["n2"][MOLES] * NITROGEN_RETARDATION_FACTOR)
removed.assert_gases("o2", "plasma")
oxygen = max(min((removed.gases["o2"][MOLES] - removed_nitrogen) / MOLES_CELLSTANDARD, 1), 0)
var/temp_factor = 50
@@ -169,9 +175,9 @@
removed.temperature = max(0, min(removed.temperature, 2500))
//Calculate how much gas to release
removed.toxins += max(device_energy / PLASMA_RELEASE_MODIFIER, 0)
removed.gases["plasma"][MOLES] += max(device_energy / PLASMA_RELEASE_MODIFIER, 0)
removed.oxygen += max((device_energy + removed.temperature - T0C) / OXYGEN_RELEASE_MODIFIER, 0)
removed.gases["o2"][MOLES] += max((device_energy + removed.temperature - T0C) / OXYGEN_RELEASE_MODIFIER, 0)
env.merge(removed)
@@ -14,11 +14,7 @@
SSair.remove_from_active(T)
for(var/turf/simulated/T in map)
if(T.air)
T.air.oxygen = T.oxygen
T.air.nitrogen = T.nitrogen
T.air.carbon_dioxide = T.carbon_dioxide
T.air.toxins = T.toxins
T.air.temperature = T.temperature
T.air.copy_from_turf(T)
SSair.add_to_active(T)
//Only places atoms/turfs on area borders
+1
View File
@@ -108,6 +108,7 @@
#include "code\_onclick\hud\screen_objects.dm"
#include "code\ATMOSPHERICS\atmospherics.dm"
#include "code\ATMOSPHERICS\datum_pipeline.dm"
#include "code\ATMOSPHERICS\gas_types.dm"
#include "code\ATMOSPHERICS\components\components_base.dm"
#include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm"
#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm"
+1 -1
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
File diff suppressed because one or more lines are too long
+13 -13
View File
@@ -9,17 +9,17 @@
<span class='buttoninfo'>{{Math.round(adata.set_pressure)}} kPa</span>
</ui-section>
<ui-section label='Filter'>
<ui-button state='{{data.filter_type == -1 ? "selected" : null}}'
action='filter' params='{"mode": -1}'>Nothing</ui-button>
<ui-button state='{{data.filter_type == 0 ? "selected" : null}}'
action='filter' params='{"mode": 0}'>Plasma</ui-button>
<ui-button state='{{data.filter_type == 1 ? "selected" : null}}'
action='filter' params='{"mode": 1}'>O2</ui-button>
<ui-button state='{{data.filter_type == 2 ? "selected" : null}}'
action='filter' params='{"mode": 2}'>N2</ui-button>
<ui-button state='{{data.filter_type == 3 ? "selected" : null}}'
action='filter' params='{"mode": 3}'>CO2</ui-button>
<ui-button state='{{data.filter_type == 4 ? "selected" : null}}'
action='filter' params='{"mode": 4}'>N2O</ui-button>
<ui-button state='{{data.filter_type == "" ? "selected" : null}}'
action='filter' params='{"mode": ""}'>Nothing</ui-button>
<ui-button state='{{data.filter_type == "plasma" ? "selected" : null}}'
action='filter' params='{"mode": "plasma"}'>Plasma</ui-button>
<ui-button state='{{data.filter_type == "o2" ? "selected" : null}}'
action='filter' params='{"mode": "o2"}'>O2</ui-button>
<ui-button state='{{data.filter_type == "n2" ? "selected" : null}}'
action='filter' params='{"mode": "n2"}'>N2</ui-button>
<ui-button state='{{data.filter_type == "co2" ? "selected" : null}}'
action='filter' params='{"mode": "co2"}'>CO2</ui-button>
<ui-button state='{{data.filter_type == "n2o" ? "selected" : null}}'
action='filter' params='{"mode": "n2o"}'>N2O</ui-button>
</ui-section>
</ui-display>
</ui-display>