diff --git a/_maps/map_files/AsteroidStation/AsteroidStation.dmm b/_maps/map_files/AsteroidStation/AsteroidStation.dmm index 6ff357918f3..b5d50e29b64 100644 --- a/_maps/map_files/AsteroidStation/AsteroidStation.dmm +++ b/_maps/map_files/AsteroidStation/AsteroidStation.dmm @@ -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 diff --git a/_maps/map_files/DiscStation/DiscStation.dmm b/_maps/map_files/DiscStation/DiscStation.dmm index d7bdd21fff1..ab1a53129e4 100644 --- a/_maps/map_files/DiscStation/DiscStation.dmm +++ b/_maps/map_files/DiscStation/DiscStation.dmm @@ -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 diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm index 59358751fb7..e3db186bcc3 100644 --- a/_maps/map_files/DreamStation/dreamstation04.dmm +++ b/_maps/map_files/DreamStation/dreamstation04.dmm @@ -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) diff --git a/_maps/map_files/MetaStation/MetaStation.v41I.dmm b/_maps/map_files/MetaStation/MetaStation.v41I.dmm index 8b18832a2b5..740d7025b17 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41I.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41I.dmm @@ -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) diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 4c3ecf89e98..a5edf3f42c9 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -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) diff --git a/cfg/admin.txt b/cfg/admin.txt index fa0b92dbdad..236e1dee367 100644 --- a/cfg/admin.txt +++ b/cfg/admin.txt @@ -12,4 +12,5 @@ cheridan giacomand rockdtben MrStonedOne -Jordie0608 \ No newline at end of file +Jordie0608 +Dunc \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 81fd5e1866f..6b55e9f8484 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -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) diff --git a/code/ATMOSPHERICS/components/unary_devices/cryo.dm b/code/ATMOSPHERICS/components/unary_devices/cryo.dm index 0e116e25725..4bb78933cc6 100644 --- a/code/ATMOSPHERICS/components/unary_devices/cryo.dm +++ b/code/ATMOSPHERICS/components/unary_devices/cryo.dm @@ -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) diff --git a/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm b/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm index 0c0bee0b275..55215da0753 100644 --- a/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm +++ b/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm @@ -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() diff --git a/code/ATMOSPHERICS/components/unary_devices/tank.dm b/code/ATMOSPHERICS/components/unary_devices/tank.dm index 44ab5048460..dfff3ced12f 100644 --- a/code/ATMOSPHERICS/components/unary_devices/tank.dm +++ b/code/ATMOSPHERICS/components/unary_devices/tank.dm @@ -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 \ No newline at end of file + air_contents.assert_gases("o2", "n2") + air_contents.gases["o2"][MOLES] = AIR_CONTENTS * 0.2 + air_contents.gases["n2"][MOLES] = AIR_CONTENTS * 0.8 \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 4aaae1ba502..548db3f41d6 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -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) diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index 6bbc0924dbe..6c765cd1c11 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -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 \ No newline at end of file diff --git a/code/ATMOSPHERICS/gas_types.dm b/code/ATMOSPHERICS/gas_types.dm new file mode 100644 index 00000000000..5679b3d5f88 --- /dev/null +++ b/code/ATMOSPHERICS/gas_types.dm @@ -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 \ No newline at end of file diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index 00d16589414..52ea8059ee0 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -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 diff --git a/code/LINDA/LINDA_system.dm b/code/LINDA/LINDA_system.dm index e1904d8973b..a3a972aba68 100644 --- a/code/LINDA/LINDA_system.dm +++ b/code/LINDA/LINDA_system.dm @@ -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) \ No newline at end of file diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index e3d747e6f42..fdada2d153d 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -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 diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 3937282472f..8d410ef0764 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -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 diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index c5f6bbe390f..fef8563b618 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -949,20 +949,15 @@ var/list/WALLITEMS_INVERSE = list( user << "Results of analysis of \icon[icon] [target]." 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 << "Pressure: [round(pressure,0.1)] kPa" - user << "Nitrogen: [round(n2_concentration*100)] %" - user << "Oxygen: [round(o2_concentration*100)] %" - user << "CO2: [round(co2_concentration*100)] %" - user << "Plasma: [round(plasma_concentration*100)] %" - if(unknown_concentration>0.01) - user << "Unknown: [round(unknown_concentration*100)] %" + + 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 << "[cached_gases[id][GAS_NAME]]: [round(gas_concentration*100)] %" + user << "Temperature: [round(air_contents.temperature-T0C)] °C" else user << "[target] is empty!" @@ -1240,4 +1235,4 @@ B --><-- A return 0 for(var/atom/location = A.loc, location, location = location.loc) if(location == src) - return 1 \ No newline at end of file + return 1 diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 4f4fef2c952..70ed708c3e4 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -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: diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 360f9833591..619a38e999f 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -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) diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm index e2dad8d7e4f..69293a78bf9 100644 --- a/code/datums/gas_mixture.dm +++ b/code/datums/gas_mixture.dm @@ -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 diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 6b3591cb4ef..6baf88b688a 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -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 diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 9f1c99cea84..c3121978a60 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -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 diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 723f6b7a10b..1ba91162918 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -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"] diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 89c4d084ced..0b9f6633758 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -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 diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 091f09bc22f..65674a55c35 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -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 opened by [key_name(usr)], starting the transfer into the [holding]
" else logmsg = "Valve was opened by [key_name(usr)], starting the transfer into the air
" - if(air_contents.toxins > 0) + if(air_contents.gases["plasma"]) message_admins("[key_name_admin(usr)] (?) (FLW) opened a canister that contains plasma! (JMP)") 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)] (?) (FLW) opened a canister that contains N2O! (JMP)") 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) diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 5b8100857c1..2bd2649d799 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -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) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 0f53b062e7f..a1ce789e73a 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -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) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index a664b6227c5..689d83d7676 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -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() diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index cb5f4de5cdd..a3b42392f70 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -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 diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index c30b883c460..34d8002ea9b 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -414,6 +414,7 @@ var/global/list/obj/item/device/pda/PDAs = list() dat += "Unable to obtain a reading.
" 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
" 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)]%
" - dat += "Oxygen: [round(o2_level*100)]%
" - dat += "Carbon Dioxide: [round(co2_level*100)]%
" - dat += "Plasma: [round(plasma_level*100)]%
" - if(unknown_level > 0.01) - dat += "OTHER: [round(unknown_level)]%
" + 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)]%
" + dat += "Temperature: [round(environment.temperature-T0C)]°C
" dat += "
" diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 38404d1658e..6a76998e260 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -271,12 +271,15 @@ MASS SPECTROMETER else user << "Pressure: [round(pressure,0.1)] kPa" 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 << "Nitrogen: [round(n2_concentration*100)] %" else @@ -295,9 +298,11 @@ MASS SPECTROMETER if(plasma_concentration > 0.01) user << "Plasma: [round(plasma_concentration*100)] %" - if(unknown_concentration > 0.01) - user << "Unknown: [round(unknown_concentration*100)] %" - + for(var/id in env_gases) + if(id in hardcoded_gases) + continue + var/gas_concentration = env_gases[id][MOLES]/total_moles + user << "[env_gases[id][GAS_NAME]]: [round(gas_concentration*100)] %" user << "Temperature: [round(environment.temperature-T0C)] °C" diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index 96c48aab975..2695041736a 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -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 diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 723725e46f5..44f29a96e7a 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -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) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 6d7db63e8a8..fea4e6db9fc 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -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 diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index aa55051c783..0bc932047d5 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -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 diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 573df27cd88..90c267d2a2a 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -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 diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 0370ec49f9d..f2cd240656f 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -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 diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index f1d67f5776e..1373a0501de 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -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) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index bd43318820c..85a846c8767 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -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() diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index de914537a72..1e99c5a4ea0 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -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 diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index c1284154c64..7811b0bc3c0 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -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 << "@[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)]" - for(var/datum/gas/trace_gas in GM.trace_gases) - usr << "[trace_gas.type]: [trace_gas.moles]" + usr << "@[target.x],[target.y]: [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]" + 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() diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 9e5cc53faf9..3a446749607 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -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) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 04b43b8872c..72517dce58b 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -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" diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 9479416bb12..40c0ea1d568 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -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) diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 4162a583675..ac23410cc38 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -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) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 6d5491b5eb3..2f00d7f0024 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index 3eb97f4c0ef..4b819853b4e 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -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("[H]'s body reacts with the atmosphere and bursts into flames!","Your body reacts with the atmosphere and bursts into flame!") diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index b1797c1a63d..00fbd98a442 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -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) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 1af50b500f1..a41f907d439 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -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) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 80babb296c8..c10a41e6a78 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -526,6 +526,7 @@ dat += "Unable to obtain a reading.
" 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
" 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)]%
" - dat += "Oxygen: [round(o2_level*100)]%
" - dat += "Carbon Dioxide: [round(co2_level*100)]%
" - dat += "Plasma: [round(plasma_level*100)]%
" - if(unknown_level > 0.01) - dat += "OTHER: [round(unknown_level)]%
" + 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)]%
" dat += "Temperature: [round(environment.temperature-T0C)]°C
" dat += "Refresh Reading
" dat += "
" diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 55e68b5ffe1..83fe038b649 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -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)) diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 885a188ac4c..26817a3f3c9 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -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() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 416a8079c15..805156d5c13 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -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 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index b438be0fb2c..377ddabf388 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -33,14 +33,12 @@ var/next_mob_id = 0 var/datum/gas_mixture/environment = loc.return_air() - var/t = "Coordinates: [x],[y] \n" - t+= "Temperature: [environment.temperature] \n" - t+= "Nitrogen: [environment.nitrogen] \n" - t+= "Oxygen: [environment.oxygen] \n" - t+= "Plasma : [environment.toxins] \n" - t+= "Carbon Dioxide: [environment.carbon_dioxide] \n" - for(var/datum/gas/trace_gas in environment.trace_gases) - t+= "[trace_gas.type]: [trace_gas.moles] \n" + var/t = "Coordinates: [x],[y] \n" + t += "Temperature: [environment.temperature] \n" + for(var/id in environment.gases) + var/gas = environment.gases[id] + if(gas[MOLES]) + t+="[gas[GAS_NAME]]: [gas[MOLES]] \n" 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 \ No newline at end of file + return 0 diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index aab80c9e97f..304e5a37a1f 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -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("out of fuel.","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"].", \ "You turn the [src.name] [active? "on":"off"].") - investigate_log("turned [active?"on":"off"] by [user.key]. [P?"Fuel: [round(P.air_contents.toxins/0.29)]%":"It is empty"].","singulo") + investigate_log("turned [active?"on":"off"] by [user.key]. [P?"Fuel: [round(P.air_contents.gases["plasma"][MOLES]/0.29)]%":"It is empty"].","singulo") return else user << "The controls are locked!" @@ -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 diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 18a05a582a4..4cc508f6f37 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -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) diff --git a/code/modules/procedural mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural mapping/mapGeneratorModules/helpers.dm index 2c76915504b..ff7ea4fc8f7 100644 --- a/code/modules/procedural mapping/mapGeneratorModules/helpers.dm +++ b/code/modules/procedural mapping/mapGeneratorModules/helpers.dm @@ -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 diff --git a/tgstation.dme b/tgstation.dme index 2dfc1ae6a57..5354cad0eff 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -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" diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index e64fdb8bc3e..61499976696 100644 --- a/tgui/assets/tgui.css +++ b/tgui/assets/tgui.css @@ -1 +1 @@ -.normal{color:#40628a}.good{color:#537d29}.average{color:#be6209}.bad{color:#b00e0e}.highlight{color:#8ba5c4}html{box-sizing:border-box;min-height:100%;margin:0;cursor:default}*,:after,:before{box-sizing:inherit}body{min-height:100%;height:100%;margin:0 6px;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff}main{display:block;margin-top:32px;padding-top:3px}hr{height:2px;background-color:#40628a;border:none}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}.bar .barText,span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}.bold{font-weight:700}.italic{font-style:italic}[unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}.bar .barText{position:absolute;top:0;right:3px}.bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}.bar .barFill.good{background-color:#537d29}.bar .barFill.average{background-color:#be6209}.bar .barFill.bad{background-color:#b00e0e}.bar .barFill.highlight{background-color:#8ba5c4}span.button{display:inline-block;vertical-align:middle;height:20px;line-height:19px;padding:0 5px;white-space:nowrap}span.button .fa{padding-right:2px}span.button.normal{transition:background-color .5s;background-color:#40628a}span.button.normal.active:focus,span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}span.button.disabled{transition:background-color .5s;background-color:#999}span.button.disabled.active:focus,span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}span.button.selected{transition:background-color .5s;background-color:#2f943c}span.button.selected.active:focus,span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}span.button.caution{transition:background-color .5s;background-color:#9a9d00}span.button.caution.active:focus,span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}span.button.danger{transition:background-color .5s;background-color:#9d0808}span.button.danger.active:focus,span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}span.button.gridable{width:125px;margin:2px 0}div.display,div.notice{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}div.display header,div.notice header,div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;border-bottom:2px solid #40628a}div.display header .buttonRight,div.notice header .buttonRight,div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}div.display article,div.notice article,div.subdisplay article{display:table;width:100%;border-spacing:4px 6px}div.notice{background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px);margin:8px 0;box-shadow:none;color:#000;font-weight:700;font-style:italic}div.notice .button{outline:1px solid #272727}div.notice .label{color:#000}div.notice hr{background-color:#272727}div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}section .content,section .label,section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle}section{display:table-row;width:100%;padding:3px 0}section:not(first-child){padding-top:4px}section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}section .content:not(:last-child){padding-right:16px}section .line{width:100%}section .buttoninfo{margin-left:5px}div.subdisplay{width:100%;margin:0}header.titlebar .close,header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#98b0c3}header.titlebar .close:hover,header.titlebar .minimize:hover{color:#a7bccc}header.titlebar{position:fixed;top:0;left:0;width:100%;height:32px;background-color:#363636;box-shadow:0 3px 3px rgba(0,0,0,.1)}header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}header.titlebar .title{position:absolute;top:6px;left:46px;color:#98b0c3;font-size:16px;white-space:nowrap}header.titlebar .minimize{position:absolute;top:6px;right:46px}header.titlebar .close{position:absolute;top:4px;right:12px}.wf-inactive .statusicon:after{content:"O"}.wf-inactive .minimize:after{content:"-"}.wf-inactive .close:after{content:"X"}body.generic{background-color:#2a2a2a;background:linear-gradient(180deg,#2a2a2a 0,#202020)}body.generic,body.nanotrasen{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen{background-color:#2a2a2a;background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MjUgMjAwIiBvcGFjaXR5PSIuMzMiPgogIDxwYXRoIGQ9Im0gMTc4LjAwMzk5LDAuMDM4NjkgLTcxLjIwMzkzLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM0LDYuMDI1NTUgbCAwLDE4Ny44NzE0NyBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNCw2LjAyNTU0IGwgNTMuMTA3MiwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTAxLjU0NDAxOCA3Mi4yMTYyOCwxMDQuNjk5Mzk4IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA1Ljc2MDE1LDIuODcwMTYgbCA3My41NTQ4NywwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzNSwtNi4wMjU1NSBsIC01NC43MTY0NCwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzMyw2LjAyNTU1IGwgMCwxMDIuNjE5MzUgTCAxODMuNzY0MTMsMi45MDg4NiBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTUuNzYwMTQsLTIuODcwMTcgeiIgLz4KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPgogIDxwYXRoIGQ9Im0gNDIwLjE1NTM1LDE3Ny44OTExOSBhIDEzLjQxMjAzOCwxMi41MDE4NDIgMCAwIDEgLTguNjMyOTUsMjIuMDY5NTEgbCAtNjYuMTE4MzIsMCBhIDUuMzY0ODE1Miw1LjAwMDczNyAwIDAgMSAtNS4zNjQ4MiwtNS4wMDA3NCBsIDAsLTc5Ljg3OTMxIHoiIC8+Cjwvc3ZnPgo=") no-repeat fixed center/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020)}body.syndicate{background-color:#b30f0f;background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA4NS4yNSAxMTQuMzUiIG9wYWNpdHk9Ii4zMyI+CiAgPHRleHQKICAgIHN0eWxlPSJmb250LXNpemU6MjAwcHg7Zm9udC1mYW1pbHk6J1ZlcmRhbmEnLHNhbnMtc2VyaWYiCiAgICB4PSItMTAuNzQyMTg4IgogICAgeT0iMTExLjcxODc1Ij4KICAgIDx0c3Bhbj5zPC90c3Bhbj4KICA8L3RleHQ+Cjwvc3ZnPgo=") no-repeat fixed center/70% 70%,linear-gradient(180deg,#b30f0f 0,#740d0d);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb30f0f',endColorstr='#ff740d0d',GradientType=0)} \ No newline at end of file +.normal{color:#40628a}.good{color:#537d29}.average{color:#be6209}.bad{color:#b00e0e}.highlight{color:#8ba5c4}html{box-sizing:border-box;min-height:100%;margin:0;cursor:default}*,:after,:before{box-sizing:inherit}body{min-height:100%;height:100%;margin:0 6px;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff}main{display:block;margin-top:32px;padding-top:3px}hr{height:2px;background-color:#40628a;border:none}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}.bar .barText,span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}.bold{font-weight:700}.italic{font-style:italic}[unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}.bar .barText{position:absolute;top:0;right:3px}.bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}.bar .barFill.good{background-color:#537d29}.bar .barFill.average{background-color:#be6209}.bar .barFill.bad{background-color:#b00e0e}.bar .barFill.highlight{background-color:#8ba5c4}span.button{display:inline-block;vertical-align:middle;height:20px;line-height:19px;padding:0 5px;white-space:nowrap}span.button .fa{padding-right:2px}span.button.normal{transition:background-color .5s;background-color:#40628a}span.button.normal.active:focus,span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}span.button.disabled{transition:background-color .5s;background-color:#999}span.button.disabled.active:focus,span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}span.button.selected{transition:background-color .5s;background-color:#2f943c}span.button.selected.active:focus,span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}span.button.caution{transition:background-color .5s;background-color:#9a9d00}span.button.caution.active:focus,span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}span.button.danger{transition:background-color .5s;background-color:#9d0808}span.button.danger.active:focus,span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}span.button.gridable{width:125px;margin:2px 0}div.display,div.notice{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}div.display header,div.notice header,div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;border-bottom:2px solid #40628a}div.display header .buttonRight,div.notice header .buttonRight,div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}div.display article,div.notice article,div.subdisplay article{display:table;width:100%;border-spacing:4px 6px}div.notice{background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px);margin:8px 0;box-shadow:none;color:#000;font-weight:700;font-style:italic}div.notice .button{outline:1px solid #272727}div.notice .label{color:#000}div.notice hr{background-color:#272727}div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}section .content,section .label,section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle}section{display:table-row;width:100%;padding:3px 0}section:not(first-child){padding-top:4px}section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}section .content:not(:last-child){padding-right:16px}section .line{width:100%}section .buttoninfo{margin-left:5px}div.subdisplay{width:100%;margin:0}header.titlebar .close,header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#98b0c3}header.titlebar .close:hover,header.titlebar .minimize:hover{color:#a7bccc}header.titlebar{position:fixed;top:0;left:0;width:100%;height:32px;background-color:#363636;box-shadow:0 3px 3px rgba(0,0,0,.1)}header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}header.titlebar .title{position:absolute;top:6px;left:46px;color:#98b0c3;font-size:16px;white-space:nowrap}header.titlebar .minimize{position:absolute;top:6px;right:46px}header.titlebar .close{position:absolute;top:4px;right:12px}.wf-inactive .statusicon:after{content:"O"}.wf-inactive .minimize:after{content:"-"}.wf-inactive .close:after{content:"X"}body.generic{background-color:#2a2a2a;background:linear-gradient(180deg,#2a2a2a 0,#202020)}body.generic,body.nanotrasen{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen{background-color:#2a2a2a;background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo=") no-repeat fixed center/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020)}body.syndicate{background-color:#b30f0f;background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgODUuMjUgMTE0LjM1IiBvcGFjaXR5PSIuMzMiPg0KICA8dGV4dA0KICAgIHN0eWxlPSJmb250LXNpemU6MjAwcHg7Zm9udC1mYW1pbHk6J1ZlcmRhbmEnLHNhbnMtc2VyaWYiDQogICAgeD0iLTEwLjc0MjE4OCINCiAgICB5PSIxMTEuNzE4NzUiPg0KICAgIDx0c3Bhbj5zPC90c3Bhbj4NCiAgPC90ZXh0Pg0KPC9zdmc+DQo=") no-repeat fixed center/70% 70%,linear-gradient(180deg,#b30f0f 0,#740d0d);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb30f0f',endColorstr='#ff740d0d',GradientType=0)} \ No newline at end of file diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index fa5b67a5f9e..93a34b34fa9 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -6,5 +6,5 @@ var e,n,r=[Ya];for(e=t.length;e--;)for(n=t[e].parent;n&&!n.isRoot;)-1===t.indexO this.children.push(t),this.totalChildren+=1,this.outroChildren+=1},decrementOutros:function(){this.outroChildren-=1,X(this)},decrementTotal:function(){this.totalChildren-=1,X(this)},add:function(t){var e=t.isIntro?this.intros:this.outros;e.push(t)},addDecorator:function(t){this.decoratorQueue.push(t)},remove:function(t){var e=t.isIntro?this.intros:this.outros;R(e,t),X(this)},init:function(){this.ready=!0,X(this)},detachNodes:function(){this.decoratorQueue.forEach(G),this.detachQueue.forEach(Y),this.children.forEach(J)}};var hs,ds,vs=ps,ms=[],gs=new os("change");ds={start:function(t,e){var n,r;return e&&(n=new cs(function(t){return r=t})),hs={previousBatch:hs,transitionManager:new vs(r,hs&&hs.transitionManager),views:[],tasks:[],ractives:[],instance:t},t&&hs.ractives.push(t),n},end:function(){Z(),hs.transitionManager.init(),!hs.previousBatch&&hs.instance&&(hs.instance.viewmodel.changes=[]),hs=hs.previousBatch},addRactive:function(t){hs&&j(hs.ractives,t)},registerTransition:function(t){t._manager=hs.transitionManager,hs.transitionManager.add(t)},registerDecorator:function(t){hs.transitionManager.addDecorator(t)},addView:function(t){hs.views.push(t)},addUnresolved:function(t){ms.push(t)},removeUnresolved:function(t){R(ms,t)},detachWhenReady:function(t){hs.transitionManager.detachQueue.push(t)},scheduleTask:function(t,e){var n;if(hs){for(n=hs;e&&n.previousBatch;)n=n.previousBatch;n.tasks.push(t)}else t()}};var ys=ds,bs=[],ws={tick:function(){var t,e,n;for(n=ns(),ys.start(),t=0;t=this.duration?(null!==o&&(ys.start(this.root),this.root.viewmodel.set(o,this.to),ys.end()),this.step&&this.step(1,this.to),this.complete(this.to),i=this.root._animations.indexOf(this),-1===i&&v("Animation was not found"),this.root._animations.splice(i,1),this.running=!1,!1):(e=this.easing?this.easing(t/this.duration):t/this.duration,null!==o&&(n=this.interpolator(e),ys.start(this.root),this.root.viewmodel.set(o,n),ys.end()),this.step&&this.step(e,n),!0)):!1},stop:function(){var t;this.running=!1,t=this.root._animations.indexOf(this),-1===t&&v("Animation was not found"),this.root._animations.splice(t,1)}};var Es=_s,ks=nt,Ss={stop:Ea},Os=it,As=new os("detach"),Ps=ot,Cs=at,Ts=function(){var t,e,n;t=this._root[this._isComponentQuery?"liveComponentQueries":"liveQueries"],e=this.selector,n=t.indexOf(e),-1!==n&&(t.splice(n,1),t[e]=null)},js=function(t,e){var n,r,i,o,a,s,u,c,l,f;for(n=ut(t.component||t._ractive.proxy),r=ut(e.component||e._ractive.proxy),i=L(n),o=L(r);i&&i===o;)n.pop(),r.pop(),a=i,i=L(n),o=L(r);if(i=i.component||i,o=o.component||o,l=i.parentFragment,f=o.parentFragment,l===f)return s=l.items.indexOf(i),u=f.items.indexOf(o),s-u||n.length-r.length;if(c=a.fragments)return s=c.indexOf(l),u=c.indexOf(f),s-u||n.length-r.length;throw Error("An unexpected condition was met while comparing the position of two components. Please file an issue at https://github.com/RactiveJS/Ractive/issues - thanks!")},Ms=function(t,e){var n;return t.compareDocumentPosition?(n=t.compareDocumentPosition(e),2&n?1:-1):js(t,e)},Fs=function(){this.sort(this._isComponentQuery?js:Ms),this._dirty=!1},Ns=function(){var t=this;this._dirty||(this._dirty=!0,ys.scheduleTask(function(){t._sort()}))},Ls=function(t){var e=this.indexOf(this._isComponentQuery?t.instance:t);-1!==e&&this.splice(e,1)},Rs=ct,Is=lt,Ds=ft,Vs=pt,Us=ht,Bs=dt,qs={enqueue:function(t,e){t.event&&(t._eventQueue=t._eventQueue||[],t._eventQueue.push(t.event)),t.event=e},dequeue:function(t){t._eventQueue&&t._eventQueue.length?t.event=t._eventQueue.pop():delete t.event}},Ws=qs,zs=vt,Hs=yt,Gs=bt,Ks={capture:!0,noUnwrap:!0,fullRootGet:!0},$s=wt,Qs=new os("insert"),Ys=_t,Js=function(t,e,n,r){this.root=t,this.keypath=e,this.callback=n,this.defer=r.defer,this.context=r&&r.context?r.context:t};Js.prototype={init:function(t){this.value=this.root.get(this.keypath.str),t!==!1?this.update():this.oldValue=this.value},setValue:function(t){var e=this;s(t,this.value)||(this.value=t,this.defer&&this.ready?ys.scheduleTask(function(){return e.update()}):this.update())},update:function(){this.updating||(this.updating=!0,this.callback.call(this.context,this.value,this.oldValue,this.keypath.str),this.oldValue=this.value,this.updating=!1)}};var Xs,Zs=Js,tu=Et,eu=Array.prototype.slice;Xs=function(t,e,n,r){this.root=t,this.callback=n,this.defer=r.defer,this.keypath=e,this.regex=RegExp("^"+e.str.replace(/\./g,"\\.").replace(/\*/g,"([^\\.]+)")+"$"),this.values={},this.defer&&(this.proxies=[]),this.context=r&&r.context?r.context:t},Xs.prototype={init:function(t){var e,n;if(e=tu(this.root,this.keypath),t!==!1)for(n in e)e.hasOwnProperty(n)&&this.update(k(n));else this.values=e},update:function(t){var e,n=this;if(t.isPattern){e=tu(this.root,t);for(t in e)e.hasOwnProperty(t)&&this.update(k(t))}else if(!this.root.viewmodel.implicitChanges[t.str])return this.defer&&this.ready?void ys.scheduleTask(function(){return n.getProxy(t).update()}):void this.reallyUpdate(t)},reallyUpdate:function(t){var e,n,r,i;return e=t.str,n=this.root.viewmodel.get(t),this.updating?void(this.values[e]=n):(this.updating=!0,s(n,this.values[e])&&this.ready||(r=eu.call(this.regex.exec(e),1),i=[n,this.values[e],e].concat(r),this.values[e]=n,this.callback.apply(this.context,i)),void(this.updating=!1))},getProxy:function(t){var e=this;return this.proxies[t.str]||(this.proxies[t.str]={update:function(){return e.reallyUpdate(t)}}),this.proxies[t.str]}};var nu,ru,iu,ou,au,su,uu=Xs,cu=kt,lu={},fu=St,pu=Ot,hu=function(t){return t.trim()},du=function(t){return""!==t},vu=At,mu=Pt,gu=Ct,yu=Tt,bu=Array.prototype,wu=function(t){return function(e){for(var n=arguments.length,r=Array(n>1?n-1:0),i=1;n>i;i++)r[i-1]=arguments[i];var a,s,u,c,l=[];if(e=k(A(e)),a=this.viewmodel.get(e),s=a.length,!o(a))throw Error("Called ractive."+t+"('"+e.str+"'), but '"+e.str+"' does not refer to an array");return l=yu(a,t,r),c=bu[t].apply(a,r),u=ys.start(this,!0).then(function(){return c}),l?this.viewmodel.smartUpdate(e,a,l):this.viewmodel.mark(e),ys.end(),u}},xu=wu("pop"),_u=wu("push"),Eu="/* Ractive.js component styles */\n",ku=[],Su=!1;Zo?(iu=document.createElement("style"),iu.type="text/css",ou=document.getElementsByTagName("head")[0],su=!1,au=iu.styleSheet,ru=function(){var t=Eu+ku.map(function(t){return"\n/* {"+t.id+"} */\n"+t.styles}).join("\n");au?au.cssText=t:iu.innerHTML=t,su||(ou.appendChild(iu),su=!0)},nu={add:function(t){ku.push(t),Su=!0},apply:function(){Su&&(ru(),Su=!1)}}):nu={add:Ea,apply:Ea};var Ou,Au,Pu,Cu=nu,Tu=Mt,ju=new os("render"),Mu=new os("complete"),Fu={extend:function(t,e,n){e.adapt=Nt(e.adapt,N(n.adapt))},init:function(){}},Nu=Fu,Lu=Lt,Ru=/(?:^|\})?\s*([^\{\}]+)\s*\{/g,Iu=/\/\*.*?\*\//g,Du=/((?:(?:\[[^\]+]\])|(?:[^\s\+\>\~:]))+)((?::[^\s\+\>\~\(]+(?:\([^\)]+\))?)?\s*[\s\+\>\~]?)\s*/g,Vu=/^@media/,Uu=/\[data-ractive-css~="\{[a-z0-9-]+\}"]/g,Bu=1,qu={name:"css",extend:function(t,e,n){if(n.css){var r=Bu++,i=n.noCssTransform?n.css:Lu(n.css,r);e.cssId=r,Cu.add({id:r,styles:i})}},init:function(){}},Wu=qu,zu={name:"data",extend:function(t,e,n){var r=void 0,i=void 0;if(n.data&&c(n.data))for(r in n.data)i=n.data[r],i&&"object"==typeof i&&(c(i)||o(i))&&v("Passing a `data` option with object and array properties to Ractive.extend() is discouraged, as mutating them is likely to cause bugs. Consider using a data function instead:\n\n // this...\n data: function () {\n return {\n myObject: {}\n };\n })\n\n // instead of this:\n data: {\n myObject: {}\n }");e.data=Vt(e.data,n.data)},init:function(t,e,n){var r=Vt(t.prototype.data,n.data);return"function"==typeof r&&(r=r.call(e)),r||{}},reset:function(t){var e=this.init(t.constructor,t,t.viewmodel);return t.viewmodel.reset(e),!0}},Hu=zu,Gu=null,Ku=["preserveWhitespace","sanitize","stripComments","delimiters","tripleDelimiters","interpolate"],$u={fromId:zt,isHashedId:Ht,isParsed:Gt,getParseOptions:Kt,createHelper:qt,parse:Wt},Qu=$u,Yu={name:"template",extend:function(t,e,n){var r;"template"in n&&(r=n.template,"function"==typeof r?e.template=r:e.template=Jt(r,e))},init:function(t,e,n){var r,i;r="template"in n?n.template:t.prototype.template,"function"==typeof r&&(i=r,r=Qt(e,i),e._config.template={fn:i,result:r}),r=Jt(r,e),e.template=r.t,r.p&&Xt(e.partials,r.p)},reset:function(t){var e,n=$t(t);return n?(e=Jt(n,t),t.template=e.t,Xt(t.partials,e.p,!0),!0):void 0}},Ju=Yu;Ou=["adaptors","components","computed","decorators","easing","events","interpolators","partials","transitions"],Au=function(t,e){this.name=t,this.useDefaults=e},Au.prototype={constructor:Au,extend:function(t,e,n){this.configure(this.useDefaults?t.defaults:t,this.useDefaults?e:e.constructor,n)},init:function(){},configure:function(t,e,n){var r,i=this.name,o=n[i];r=ka(t[i]);for(var a in o)r[a]=o[a];e[i]=r},reset:function(t){var e=t[this.name],n=!1;return Object.keys(e).forEach(function(t){var r=e[t];r._fn&&(r._fn.isOwner?e[t]=r._fn:delete e[t],n=!0)}),n}},Pu=Ou.map(function(t){return new Au(t,"computed"===t)});var Xu,Zu,tc,ec,nc,rc,ic=Pu,oc=Zt,ac=re;ec={adapt:Nu,css:Wu,data:Hu,template:Ju},tc=Object.keys(ua),rc=ae(tc.filter(function(t){return!ec[t]})),nc=ae(tc.concat(ic.map(function(t){return t.name}))),Zu=[].concat(tc.filter(function(t){return!ic[t]&&!ec[t]}),ic,ec.data,ec.template,ec.css),Xu={extend:function(t,e,n){return ie("extend",t,e,n)},init:function(t,e,n){return ie("init",t,e,n)},reset:function(t){return Zu.filter(function(e){return e.reset&&e.reset(t)}).map(function(t){return t.name})},order:Zu};var sc,uc,cc=Xu,lc=se,fc=ue,pc=ce,hc=le,dc=fe,vc=pe,mc=he,gc=de,yc=/^\s+/;uc=function(t){this.name="ParseError",this.message=t;try{throw Error(t)}catch(e){this.stack=e.stack}},uc.prototype=Error.prototype,sc=function(t,e){var n,r,i=0;for(this.str=t,this.options=e||{},this.pos=0,this.lines=this.str.split("\n"),this.lineEnds=this.lines.map(function(t){var e=i+t.length+1;return i=e,e},0),this.init&&this.init(t,e),n=[];this.posn;n+=1)if(this.pos=e,i=t[n](this))return i;return null},getLinePos:function(t){for(var e,n=0,r=0;t>=this.lineEnds[n];)r=this.lineEnds[n],n+=1;return e=t-r,[n+1,e+1,t]},error:function(t){var e=this.getLinePos(this.pos),n=e[0],r=e[1],i=this.lines[e[0]-1],o=0,a=i.replace(/\t/g,function(t,n){return n/g,fl=/&/g;var gl=function(){return e(this.node)},yl=function(t){this.type=Ec,this.text=t.template};yl.prototype={detach:gl,firstNode:function(){return this.node},render:function(){return this.node||(this.node=document.createTextNode(this.text)),this.node},toString:function(t){return t?ke(this.text):this.text},unrender:function(t){return t?this.detach():void 0}};var bl=yl,wl=Se,xl=Oe,_l=function(t,e,n){var r;this.ref=e,this.resolved=!1,this.root=t.root,this.parentFragment=t.parentFragment,this.callback=n,r=fs(t.root,e,t.parentFragment),void 0!=r?this.resolve(r):ys.addUnresolved(this)};_l.prototype={resolve:function(t){this.keypath&&!t&&ys.addUnresolved(this),this.resolved=!0,this.keypath=t,this.callback(t)},forceResolution:function(){this.resolve(k(this.ref))},rebind:function(t,e){var n;void 0!=this.keypath&&(n=this.keypath.replace(t,e),void 0!==n&&this.resolve(n))},unbind:function(){this.resolved||ys.removeUnresolved(this)}};var El=_l,kl=function(t,e,n){this.parentFragment=t.parentFragment,this.ref=e,this.callback=n,this.rebind()},Sl={"@keypath":{prefix:"c",prop:["context"]},"@index":{prefix:"i",prop:["index"]},"@key":{prefix:"k",prop:["key","index"]}};kl.prototype={rebind:function(){var t,e=this.ref,n=this.parentFragment,r=Sl[e];if(!r)throw Error('Unknown special reference "'+e+'" - valid references are @index, @key and @keypath');if(this.cached)return this.callback(k("@"+r.prefix+Ae(this.cached,r)));if(-1!==r.prop.indexOf("index")||-1!==r.prop.indexOf("key"))for(;n;){if(n.owner.currentSubtype===Vc&&void 0!==(t=Ae(n,r)))return this.cached=n,n.registerIndexRef(this),this.callback(k("@"+r.prefix+t));n=!n.parent&&n.owner&&n.owner.component&&n.owner.component.parentFragment&&!n.owner.component.instance.isolated?n.owner.component.parentFragment:n.parent}else for(;n;){if(void 0!==(t=Ae(n,r)))return this.callback(k("@"+r.prefix+t.str));n=n.parent}},unbind:function(){this.cached&&this.cached.unregisterIndexRef(this)}};var Ol=kl,Al=function(t,e,n){this.parentFragment=t.parentFragment,this.ref=e,this.callback=n,e.ref.fragment.registerIndexRef(this),this.rebind()};Al.prototype={rebind:function(){var t,e=this.ref.ref;t="k"===e.ref.t?"k"+e.fragment.key:"i"+e.fragment.index,void 0!==t&&this.callback(k("@"+t))},unbind:function(){this.ref.ref.fragment.unregisterIndexRef(this)}};var Pl=Al,Cl=Pe;Pe.resolve=function(t){var e,n,r={};for(e in t.refs)n=t.refs[e],r[n.ref.n]="k"===n.ref.t?n.fragment.key:n.fragment.index;return r};var Tl,jl=Ce,Ml=Te,Fl={},Nl=Function.prototype.bind;Tl=function(t,e,n,r){var i,o=this;i=t.root,this.root=i,this.parentFragment=e,this.callback=r,this.owner=t,this.str=n.s,this.keypaths=[],this.pending=n.r.length,this.refResolvers=n.r.map(function(t,e){return jl(o,t,function(t){o.resolve(e,t)})}),this.ready=!0,this.bubble()},Tl.prototype={bubble:function(){this.ready&&(this.uniqueString=Me(this.str,this.keypaths),this.keypath=Fe(this.uniqueString),this.createEvaluator(),this.callback(this.keypath))},unbind:function(){for(var t;t=this.refResolvers.pop();)t.unbind()},resolve:function(t,e){this.keypaths[t]=e,this.bubble()},createEvaluator:function(){var t,e,n,r,i,o=this;r=this.keypath,t=this.root.viewmodel.computations[r.str],t?this.root.viewmodel.mark(r):(i=Ml(this.str,this.refResolvers.length),e=this.keypaths.map(function(t){var e;return"undefined"===t?function(){}:t.isSpecial?(e=t.value,function(){return e}):function(){var e=o.root.viewmodel.get(t,{noUnwrap:!0,fullRootGet:!0});return"function"==typeof e&&(e=Le(e,o.root)),e}}),n={deps:this.keypaths.filter(Ne),getter:function(){var t=e.map(je);return i.apply(null,t)}},t=this.root.viewmodel.compute(r,n))},rebind:function(t,e){this.refResolvers.forEach(function(n){return n.rebind(t,e)})}};var Ll=Tl,Rl=function(t,e,n){var r=this;this.resolver=e,this.root=e.root,this.parentFragment=n,this.viewmodel=e.root.viewmodel,"string"==typeof t?this.value=t:t.t===Rc?this.refResolver=jl(this,t.n,function(t){r.resolve(t)}):new Ll(e,n,t,function(t){r.resolve(t)})};Rl.prototype={resolve:function(t){this.keypath&&this.viewmodel.unregister(this.keypath,this),this.keypath=t,this.value=this.viewmodel.get(t),this.bind(),this.resolver.bubble()},bind:function(){this.viewmodel.register(this.keypath,this)},rebind:function(t,e){this.refResolver&&this.refResolver.rebind(t,e)},setValue:function(t){this.value=t,this.resolver.bubble()},unbind:function(){this.keypath&&this.viewmodel.unregister(this.keypath,this),this.refResolver&&this.refResolver.unbind()},forceResolution:function(){this.refResolver&&this.refResolver.forceResolution()}};var Il=Rl,Dl=function(t,e,n){var r,i,o,a,s=this;this.parentFragment=a=t.parentFragment,this.root=r=t.root,this.mustache=t,this.ref=i=e.r,this.callback=n,this.unresolved=[],(o=fs(r,i,a))?this.base=o:this.baseResolver=new El(this,i,function(t){s.base=t,s.baseResolver=null,s.bubble()}),this.members=e.m.map(function(t){return new Il(t,s,a)}),this.ready=!0,this.bubble()};Dl.prototype={getKeypath:function(){var t=this.members.map(Re);return!t.every(Ie)||this.baseResolver?null:this.base.join(t.join("."))},bubble:function(){this.ready&&!this.baseResolver&&this.callback(this.getKeypath())},unbind:function(){this.members.forEach(K)},rebind:function(t,e){var n;if(this.base){var r=this.base.replace(t,e);r&&r!==this.base&&(this.base=r,n=!0)}this.members.forEach(function(r){r.rebind(t,e)&&(n=!0)}),n&&this.bubble()},forceResolution:function(){this.baseResolver&&(this.base=k(this.ref),this.baseResolver.unbind(),this.baseResolver=null),this.members.forEach(De),this.bubble()}};var Vl=Dl,Ul=Ve,Bl=Ue,ql=Be,Wl={getValue:xl,init:Ul,resolve:Bl,rebind:ql},zl=function(t){this.type=kc,Wl.init(this,t)};zl.prototype={update:function(){this.node.data=void 0==this.value?"":this.value},resolve:Wl.resolve,rebind:Wl.rebind,detach:gl,unbind:wl,render:function(){return this.node||(this.node=document.createTextNode(n(this.value))),this.node},unrender:function(t){t&&e(this.node)},getValue:Wl.getValue,setValue:function(t){var e;this.keypath&&(e=this.root.viewmodel.wrapped[this.keypath.str])&&(t=e.get()),s(t,this.value)||(this.value=t,this.parentFragment.bubble(),this.node&&ys.addView(this))},firstNode:function(){return this.node},toString:function(t){var e=""+n(this.value);return t?ke(e):e}};var Hl=zl,Gl=qe,Kl=We,$l=ze,Ql=He,Yl=Ge,Jl=Ke,Xl=$e,Zl=Qe,tf=Ye,ef=function(t,e){Wl.rebind.call(this,t,e)},nf=Xe,rf=Ze,of=fn,af=pn,sf=hn,uf=mn,cf=function(t){this.type=Oc,this.subtype=this.currentSubtype=t.template.n,this.inverted=this.subtype===Dc,this.pElement=t.pElement,this.fragments=[],this.fragmentsToCreate=[],this.fragmentsToRender=[],this.fragmentsToUnrender=[],t.template.i&&(this.indexRefs=t.template.i.split(",").map(function(t,e){return{n:t,t:0===e?"k":"i"}})),this.renderedFragments=[],this.length=0,Wl.init(this,t)};cf.prototype={bubble:Gl,detach:Kl,find:$l,findAll:Ql,findAllComponents:Yl,findComponent:Jl,findNextNode:Xl,firstNode:Zl,getIndexRef:function(t){if(this.indexRefs)for(var e=this.indexRefs.length;e--;){var n=this.indexRefs[e];if(n.n===t)return n}},getValue:Wl.getValue,shuffle:tf,rebind:ef,render:nf,resolve:Wl.resolve,setValue:rf,toString:of,unbind:af,unrender:sf,update:uf};var lf,ff,pf=cf,hf=gn,df=yn,vf=bn,mf=wn,gf={};try{fa("table").innerHTML="foo"}catch(Pa){lf=!0,ff={TABLE:['',"
"],THEAD:['',"
"],TBODY:['',"
"],TR:['',"
"],SELECT:['"]}}var yf=function(t,e,n){var r,i,o,a,s,u=[];if(null!=t&&""!==t){for(lf&&(i=ff[e.tagName])?(r=xn("DIV"),r.innerHTML=i[0]+t+i[1],r=r.querySelector(".x"),"SELECT"===r.tagName&&(o=r.options[r.selectedIndex])):e.namespaceURI===ra.svg?(r=xn("DIV"),r.innerHTML=''+t+"",r=r.querySelector(".x")):(r=xn(e.tagName),r.innerHTML=t,"SELECT"===r.tagName&&(o=r.options[r.selectedIndex]));a=r.firstChild;)u.push(a),n.appendChild(a);if("SELECT"===e.tagName)for(s=u.length;s--;)u[s]!==o&&(u[s].selected=!1)}return u},bf=_n,wf=kn,xf=Sn,_f=On,Ef=An,kf=Pn,Sf=function(t){this.type=Sc,Wl.init(this,t)};Sf.prototype={detach:hf,find:df,findAll:vf,firstNode:mf,getValue:Wl.getValue,rebind:Wl.rebind,render:wf,resolve:Wl.resolve,setValue:xf,toString:_f,unbind:wl,unrender:Ef,update:kf};var Of,Af,Pf,Cf,Tf=Sf,jf=function(){this.parentFragment.bubble()},Mf=Cn,Ff=function(t){return this.node?pa(this.node,t)?this.node:this.fragment&&this.fragment.find?this.fragment.find(t):void 0:null},Nf=function(t,e){e._test(this,!0)&&e.live&&(this.liveQueries||(this.liveQueries=[])).push(e),this.fragment&&this.fragment.findAll(t,e)},Lf=function(t,e){this.fragment&&this.fragment.findAllComponents(t,e)},Rf=function(t){return this.fragment?this.fragment.findComponent(t):void 0},If=Tn,Df=jn,Vf=Mn,Uf=/^true|on|yes|1$/i,Bf=/^[0-9]+$/,qf=function(t,e){var n,r,i;return i=e.a||{},r={},n=i.twoway,void 0!==n&&(r.twoway=0===n||Uf.test(n)),n=i.lazy,void 0!==n&&(0!==n&&Bf.test(n)?r.lazy=parseInt(n):r.lazy=0===n||Uf.test(n)),r},Wf=Fn;Of="altGlyph altGlyphDef altGlyphItem animateColor animateMotion animateTransform clipPath feBlend feColorMatrix feComponentTransfer feComposite feConvolveMatrix feDiffuseLighting feDisplacementMap feDistantLight feFlood feFuncA feFuncB feFuncG feFuncR feGaussianBlur feImage feMerge feMergeNode feMorphology feOffset fePointLight feSpecularLighting feSpotLight feTile feTurbulence foreignObject glyphRef linearGradient radialGradient textPath vkern".split(" "),Af="attributeName attributeType baseFrequency baseProfile calcMode clipPathUnits contentScriptType contentStyleType diffuseConstant edgeMode externalResourcesRequired filterRes filterUnits glyphRef gradientTransform gradientUnits kernelMatrix kernelUnitLength keyPoints keySplines keyTimes lengthAdjust limitingConeAngle markerHeight markerUnits markerWidth maskContentUnits maskUnits numOctaves pathLength patternContentUnits patternTransform patternUnits pointsAtX pointsAtY pointsAtZ preserveAlpha preserveAspectRatio primitiveUnits refX refY repeatCount repeatDur requiredExtensions requiredFeatures specularConstant specularExponent spreadMethod startOffset stdDeviation stitchTiles surfaceScale systemLanguage tableValues targetX targetY textLength viewBox viewTarget xChannelSelector yChannelSelector zoomAndPan".split(" "),Pf=function(t){for(var e={},n=t.length;n--;)e[t[n].toLowerCase()]=t[n];return e},Cf=Pf(Of.concat(Af));var zf=function(t){var e=t.toLowerCase();return Cf[e]||e},Hf=function(t,e){var n,r;if(n=e.indexOf(":"),-1===n||(r=e.substr(0,n),"xmlns"===r))t.name=t.element.namespace!==ra.html?zf(e):e;else if(e=e.substring(n+1),t.name=zf(e),t.namespace=ra[r.toLowerCase()],t.namespacePrefix=r,!t.namespace)throw'Unknown namespace ("'+r+'")'},Gf=Nn,Kf=Ln,$f=Rn,Qf=In,Yf={"accept-charset":"acceptCharset",accesskey:"accessKey",bgcolor:"bgColor","class":"className",codebase:"codeBase",colspan:"colSpan",contenteditable:"contentEditable",datetime:"dateTime",dirname:"dirName","for":"htmlFor","http-equiv":"httpEquiv",ismap:"isMap",maxlength:"maxLength",novalidate:"noValidate",pubdate:"pubDate",readonly:"readOnly",rowspan:"rowSpan",tabindex:"tabIndex",usemap:"useMap"},Jf=Dn,Xf=Un,Zf=Bn,tp=qn,ep=Wn,np=zn,rp=Hn,ip=Gn,op=Kn,ap=$n,sp=Qn,up=Yn,cp=Jn,lp=Xn,fp=Zn,pp=function(t){this.init(t)};pp.prototype={bubble:Wf,init:Kf,rebind:$f,render:Qf,toString:Jf,unbind:Xf,update:fp};var hp,dp=pp,vp=function(t,e){var n,r,i=[];for(n in e)"twoway"!==n&&"lazy"!==n&&e.hasOwnProperty(n)&&(r=new dp({element:t,name:n,value:e[n],root:t.root}),i[n]=r,"value"!==n&&i.push(r));return(r=i.value)&&i.push(r),i};"undefined"!=typeof document&&(hp=fa("div"));var mp=function(t,e){this.element=t,this.root=t.root,this.parentFragment=t.parentFragment,this.attributes=[],this.fragment=new im({root:t.root,owner:this,template:[e]})};mp.prototype={bubble:function(){this.node&&this.update(),this.element.bubble()},rebind:function(t,e){this.fragment.rebind(t,e)},render:function(t){this.node=t,this.isSvg=t.namespaceURI===ra.svg,this.update()},unbind:function(){this.fragment.unbind()},update:function(){var t,e,n=this;t=""+this.fragment,e=tr(t,this.isSvg),this.attributes.filter(function(t){return er(e,t)}).forEach(function(t){n.node.removeAttribute(t.name)}),e.forEach(function(t){n.node.setAttribute(t.name,t.value)}),this.attributes=e},toString:function(){return""+this.fragment}};var gp=mp,yp=function(t,e){return e?e.map(function(e){return new gp(t,e)}):[]},bp=function(t){var e,n,r,i;if(this.element=t,this.root=t.root,this.attribute=t.attributes[this.name||"value"],e=this.attribute.interpolator,e.twowayBinding=this,n=e.keypath){if("}"===n.str.slice(-1))return m("Two-way binding does not work with expressions (`%s` on <%s>)",e.resolver.uniqueString,t.name,{ractive:this.root}),!1;if(n.isSpecial)return m("Two-way binding does not work with %s",e.resolver.ref,{ractive:this.root}),!1}else{var o=e.template.r?"'"+e.template.r+"' reference":"expression";v("The %s being used for two-way binding is ambiguous, and may cause unexpected results. Consider initialising your data to eliminate the ambiguity",o,{ractive:this.root}),e.resolver.forceResolution(),n=e.keypath}this.attribute.isTwoway=!0,this.keypath=n,r=this.root.viewmodel.get(n),void 0===r&&this.getInitialValue&&(r=this.getInitialValue(),void 0!==r&&this.root.viewmodel.set(n,r)),(i=nr(t))&&(this.resetValue=r,i.formBindings.push(this))};bp.prototype={handleChange:function(){var t=this;ys.start(this.root),this.attribute.locked=!0,this.root.viewmodel.set(this.keypath,this.getValue()),ys.scheduleTask(function(){return t.attribute.locked=!1}),ys.end()},rebound:function(){var t,e,n;e=this.keypath,n=this.attribute.interpolator.keypath,e!==n&&(R(this.root._twowayBindings[e.str],this),this.keypath=n,t=this.root._twowayBindings[n.str]||(this.root._twowayBindings[n.str]=[]),t.push(this))},unbind:function(){}},bp.extend=function(t){var e,n=this;return e=function(t){bp.call(this,t),this.init&&this.init()},e.prototype=ka(n.prototype),r(e.prototype,t),e.extend=bp.extend,e};var wp,xp=bp,_p=rr;wp=xp.extend({getInitialValue:function(){return""},getValue:function(){return this.element.node.value},render:function(){var t,e=this.element.node,n=!1;this.rendered=!0,t=this.root.lazy,this.element.lazy===!0?t=!0:this.element.lazy===!1?t=!1:u(this.element.lazy)?(t=!1,n=+this.element.lazy):u(t||"")&&(n=+t,t=!1,this.element.lazy=n),this.handler=n?or:_p,e.addEventListener("change",_p,!1),t||(e.addEventListener("input",this.handler,!1),e.attachEvent&&e.addEventListener("keyup",this.handler,!1)),e.addEventListener("blur",ir,!1)},unrender:function(){var t=this.element.node;this.rendered=!1,t.removeEventListener("change",_p,!1),t.removeEventListener("input",this.handler,!1),t.removeEventListener("keyup",this.handler,!1), t.removeEventListener("blur",ir,!1)}});var Ep=wp,kp=Ep.extend({getInitialValue:function(){return this.element.fragment?""+this.element.fragment:""},getValue:function(){return this.element.node.innerHTML}}),Sp=kp,Op=ar,Ap={},Pp=xp.extend({name:"checked",init:function(){this.siblings=Op(this.root._guid,"radio",this.element.getAttribute("name")),this.siblings.push(this)},render:function(){var t=this.element.node;t.addEventListener("change",_p,!1),t.attachEvent&&t.addEventListener("click",_p,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_p,!1),t.removeEventListener("click",_p,!1)},handleChange:function(){ys.start(this.root),this.siblings.forEach(function(t){t.root.viewmodel.set(t.keypath,t.getValue())}),ys.end()},getValue:function(){return this.element.node.checked},unbind:function(){R(this.siblings,this)}}),Cp=Pp,Tp=xp.extend({name:"name",init:function(){this.siblings=Op(this.root._guid,"radioname",this.keypath.str),this.siblings.push(this),this.radioName=!0},getInitialValue:function(){return this.element.getAttribute("checked")?this.element.getAttribute("value"):void 0},render:function(){var t=this.element.node;t.name="{{"+this.keypath.str+"}}",t.checked=this.root.viewmodel.get(this.keypath)==this.element.getAttribute("value"),t.addEventListener("change",_p,!1),t.attachEvent&&t.addEventListener("click",_p,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_p,!1),t.removeEventListener("click",_p,!1)},getValue:function(){var t=this.element.node;return t._ractive?t._ractive.value:t.value},handleChange:function(){this.element.node.checked&&xp.prototype.handleChange.call(this)},rebound:function(t,e){var n;xp.prototype.rebound.call(this,t,e),(n=this.element.node)&&(n.name="{{"+this.keypath.str+"}}")},unbind:function(){R(this.siblings,this)}}),jp=Tp,Mp=xp.extend({name:"name",getInitialValue:function(){return this.noInitialValue=!0,[]},init:function(){var t,e;this.checkboxName=!0,this.siblings=Op(this.root._guid,"checkboxes",this.keypath.str),this.siblings.push(this),this.noInitialValue&&(this.siblings.noInitialValue=!0),this.siblings.noInitialValue&&this.element.getAttribute("checked")&&(t=this.root.viewmodel.get(this.keypath),e=this.element.getAttribute("value"),t.push(e))},unbind:function(){R(this.siblings,this)},render:function(){var t,e,n=this.element.node;t=this.root.viewmodel.get(this.keypath),e=this.element.getAttribute("value"),o(t)?this.isChecked=M(t,e):this.isChecked=t==e,n.name="{{"+this.keypath.str+"}}",n.checked=this.isChecked,n.addEventListener("change",_p,!1),n.attachEvent&&n.addEventListener("click",_p,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_p,!1),t.removeEventListener("click",_p,!1)},changed:function(){var t=!!this.isChecked;return this.isChecked=this.element.node.checked,this.isChecked===t},handleChange:function(){this.isChecked=this.element.node.checked,xp.prototype.handleChange.call(this)},getValue:function(){return this.siblings.filter(sr).map(ur)}}),Fp=Mp,Np=xp.extend({name:"checked",render:function(){var t=this.element.node;t.addEventListener("change",_p,!1),t.attachEvent&&t.addEventListener("click",_p,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_p,!1),t.removeEventListener("click",_p,!1)},getValue:function(){return this.element.node.checked}}),Lp=Np,Rp=xp.extend({getInitialValue:function(){var t,e,n,r,i=this.element.options;if(void 0===this.element.getAttribute("value")&&(e=t=i.length,t)){for(;e--;)if(i[e].getAttribute("selected")){n=i[e].getAttribute("value"),r=!0;break}if(!r)for(;++ee;e+=1)if(r=t[e],t[e].selected)return i=r._ractive?r._ractive.value:r.value},forceUpdate:function(){var t=this,e=this.getValue();void 0!==e&&(this.attribute.locked=!0,ys.scheduleTask(function(){return t.attribute.locked=!1}),this.root.viewmodel.set(this.keypath,e))}}),Ip=Rp,Dp=Ip.extend({getInitialValue:function(){return this.element.options.filter(function(t){return t.getAttribute("selected")}).map(function(t){return t.getAttribute("value")})},render:function(){var t;this.element.node.addEventListener("change",_p,!1),t=this.root.viewmodel.get(this.keypath),void 0===t&&this.handleChange()},unrender:function(){this.element.node.removeEventListener("change",_p,!1)},setValue:function(){throw Error("TODO not implemented yet")},getValue:function(){var t,e,n,r,i,o;for(t=[],e=this.element.node.options,r=e.length,n=0;r>n;n+=1)i=e[n],i.selected&&(o=i._ractive?i._ractive.value:i.value,t.push(o));return t},handleChange:function(){var t,e,n;return t=this.attribute,e=t.value,n=this.getValue(),void 0!==e&&F(n,e)||Ip.prototype.handleChange.call(this),this},forceUpdate:function(){var t=this,e=this.getValue();void 0!==e&&(this.attribute.locked=!0,ys.scheduleTask(function(){return t.attribute.locked=!1}),this.root.viewmodel.set(this.keypath,e))},updateModel:function(){void 0!==this.attribute.value&&this.attribute.value.length||this.root.viewmodel.set(this.keypath,this.initialValue)}}),Vp=Dp,Up=xp.extend({render:function(){this.element.node.addEventListener("change",_p,!1)},unrender:function(){this.element.node.removeEventListener("change",_p,!1)},getValue:function(){return this.element.node.files}}),Bp=Up,qp=Ep.extend({getInitialValue:function(){},getValue:function(){var t=parseFloat(this.element.node.value);return isNaN(t)?void 0:t}}),Wp=cr,zp=fr,Hp=pr,Gp=hr,Kp=dr,$p=/^event(?:\.(.+))?/,Qp=yr,Yp=br,Jp={},Xp={touchstart:!0,touchmove:!0,touchend:!0,touchcancel:!0,touchleave:!0},Zp=xr,th=_r,eh=Er,nh=kr,rh=Sr,ih=function(t,e,n){this.init(t,e,n)};ih.prototype={bubble:zp,fire:Hp,getAction:Gp,init:Kp,listen:Yp,rebind:Zp,render:th,resolve:eh,unbind:nh,unrender:rh};var oh=ih,ah=function(t,e){var n,r,i,o,a=[];for(r in e)if(e.hasOwnProperty(r))for(i=r.split("-"),n=i.length;n--;)o=new oh(t,i[n],e[r]),a.push(o);return a},sh=function(t,e){var n,r,i,o=this;this.element=t,this.root=n=t.root,r=e.n||e,("string"==typeof r||(i=new im({template:r,root:n,owner:t}),r=""+i,i.unbind(),""!==r))&&(e.a?this.params=e.a:e.d&&(this.fragment=new im({template:e.d,root:n,owner:t}),this.params=this.fragment.getArgsList(),this.fragment.bubble=function(){this.dirtyArgs=this.dirtyValue=!0,o.params=this.getArgsList(),o.ready&&o.update()}),this.fn=g("decorators",n,r),this.fn||f(Da(r,"decorator")))};sh.prototype={init:function(){var t,e,n;if(t=this.element.node,this.params?(n=[t].concat(this.params),e=this.fn.apply(this.root,n)):e=this.fn.call(this.root,t),!e||!e.teardown)throw Error("Decorator definition must return an object with a teardown method");this.actual=e,this.ready=!0},update:function(){this.actual.update?this.actual.update.apply(this.root,this.params):(this.actual.teardown(!0),this.init())},rebind:function(t,e){this.fragment&&this.fragment.rebind(t,e)},teardown:function(t){this.torndown=!0,this.ready&&this.actual.teardown(),!t&&this.fragment&&this.fragment.unbind()}};var uh,ch,lh,fh=sh,ph=Mr,hh=Fr,dh=Vr,vh=function(t){return t.replace(/-([a-zA-Z])/g,function(t,e){return e.toUpperCase()})};Zo?(ch={},lh=fa("div").style,uh=function(t){var e,n,r;if(t=vh(t),!ch[t])if(void 0!==lh[t])ch[t]=t;else for(r=t.charAt(0).toUpperCase()+t.substring(1),e=oa.length;e--;)if(n=oa[e],void 0!==lh[n+r]){ch[t]=n+r;break}return ch[t]}):uh=null;var mh,gh,yh=uh;Zo?(gh=window.getComputedStyle||Aa.getComputedStyle,mh=function(t){var e,n,r,i,a;if(e=gh(this.node),"string"==typeof t)return a=e[yh(t)],"0px"===a&&(a=0),a;if(!o(t))throw Error("Transition$getStyle must be passed a string, or an array of strings representing CSS properties");for(n={},r=t.length;r--;)i=t[r],a=e[yh(i)],"0px"===a&&(a=0),n[i]=a;return n}):mh=null;var bh=mh,wh=function(t,e){var n;if("string"==typeof t)this.node.style[yh(t)]=e;else for(n in t)t.hasOwnProperty(n)&&(this.node.style[yh(n)]=t[n]);return this},xh=function(t){var e;this.duration=t.duration,this.step=t.step,this.complete=t.complete,"string"==typeof t.easing?(e=t.root.easing[t.easing],e||(m(Da(t.easing,"easing")),e=Ur)):e="function"==typeof t.easing?t.easing:Ur,this.easing=e,this.start=ns(),this.end=this.start+this.duration,this.running=!0,xs.add(this)};xh.prototype={tick:function(t){var e,n;return this.running?t>this.end?(this.step&&this.step(1),this.complete&&this.complete(1),!1):(e=t-this.start,n=this.easing(e/this.duration),this.step&&this.step(n),!0):!1},stop:function(){this.abort&&this.abort(),this.running=!1}};var _h,Eh,kh,Sh,Oh,Ah,Ph,Ch,Th=xh,jh=RegExp("^-(?:"+oa.join("|")+")-"),Mh=function(t){return t.replace(jh,"")},Fh=RegExp("^(?:"+oa.join("|")+")([A-Z])"),Nh=function(t){var e;return t?(Fh.test(t)&&(t="-"+t),e=t.replace(/[A-Z]/g,function(t){return"-"+t.toLowerCase()})):""},Lh={},Rh={};Zo?(Eh=fa("div").style,function(){void 0!==Eh.transition?(kh="transition",Sh="transitionend",Oh=!0):void 0!==Eh.webkitTransition?(kh="webkitTransition",Sh="webkitTransitionEnd",Oh=!0):Oh=!1}(),kh&&(Ah=kh+"Duration",Ph=kh+"Property",Ch=kh+"TimingFunction"),_h=function(t,e,n,r,i){setTimeout(function(){var o,a,s,u,c;u=function(){a&&s&&(t.root.fire(t.name+":end",t.node,t.isIntro),i())},o=(t.node.namespaceURI||"")+t.node.tagName,t.node.style[Ph]=r.map(yh).map(Nh).join(","),t.node.style[Ch]=Nh(n.easing||"linear"),t.node.style[Ah]=n.duration/1e3+"s",c=function(e){var n;n=r.indexOf(vh(Mh(e.propertyName))),-1!==n&&r.splice(n,1),r.length||(t.node.removeEventListener(Sh,c,!1),s=!0,u())},t.node.addEventListener(Sh,c,!1),setTimeout(function(){for(var i,l,f,p,h,d=r.length,m=[];d--;)p=r[d],i=o+p,Oh&&!Rh[i]&&(t.node.style[yh(p)]=e[p],Lh[i]||(l=t.getStyle(p),Lh[i]=t.getStyle(p)!=e[p],Rh[i]=!Lh[i],Rh[i]&&(t.node.style[yh(p)]=l))),(!Oh||Rh[i])&&(void 0===l&&(l=t.getStyle(p)),f=r.indexOf(p),-1===f?v("Something very strange happened with transitions. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!",{node:t.node}):r.splice(f,1),h=/[^\d]*$/.exec(e[p])[0],m.push({name:yh(p),interpolator:Ua(parseFloat(l),parseFloat(e[p])),suffix:h}));m.length?new Th({root:t.root,duration:n.duration,easing:vh(n.easing||""),step:function(e){var n,r;for(r=m.length;r--;)n=m[r],t.node.style[n.name]=n.interpolator(e)+n.suffix},complete:function(){a=!0,u()}}):a=!0,r.length||(t.node.removeEventListener(Sh,c,!1),s=!0,u())},0)},n.delay||0)}):_h=null;var Ih,Dh,Vh,Uh,Bh,qh=_h;if("undefined"!=typeof document){if(Ih="hidden",Bh={},Ih in document)Vh="";else for(Uh=oa.length;Uh--;)Dh=oa[Uh],Ih=Dh+"Hidden",Ih in document&&(Vh=Dh);void 0!==Vh?(document.addEventListener(Vh+"visibilitychange",Br),Br()):("onfocusout"in document?(document.addEventListener("focusout",qr),document.addEventListener("focusin",Wr)):(window.addEventListener("pagehide",qr),window.addEventListener("blur",qr),window.addEventListener("pageshow",Wr),window.addEventListener("focus",Wr)),Bh.hidden=!1)}var Wh,zh,Hh,Gh=Bh;Zo?(zh=window.getComputedStyle||Aa.getComputedStyle,Wh=function(t,e,n){var r,i=this;if(4===arguments.length)throw Error("t.animateStyle() returns a promise - use .then() instead of passing a callback");if(Gh.hidden)return this.setStyle(t,e),Hh||(Hh=cs.resolve());"string"==typeof t?(r={},r[t]=e):(r=t,n=e),n||(m('The "%s" transition does not supply an options object to `t.animateStyle()`. This will break in a future version of Ractive. For more info see https://github.com/RactiveJS/Ractive/issues/340',this.name),n=this);var o=new cs(function(t){var e,o,a,s,u,c,l;if(!n.duration)return i.setStyle(r),void t();for(e=Object.keys(r),o=[],a=zh(i.node),u={},c=e.length;c--;)l=e[c],s=a[yh(l)],"0px"===s&&(s=0),s!=r[l]&&(o.push(l),i.node.style[yh(l)]=s);return o.length?void qh(i,r,n,o,t):void t()});return o}):Wh=null;var Kh=Wh,$h=function(t,e){return"number"==typeof t?t={duration:t}:"string"==typeof t?t="slow"===t?{duration:600}:"fast"===t?{duration:200}:{duration:400}:t||(t={}),i({},t,e)},Qh=zr,Yh=function(t,e,n){this.init(t,e,n)};Yh.prototype={init:dh,start:Qh,getStyle:bh,setStyle:wh,animateStyle:Kh,processParams:$h};var Jh,Xh,Zh=Yh,td=Gr;Jh=function(){var t=this.node,e=this.fragment.toString(!1);if(window&&window.appearsToBeIELessEqual8&&(t.type="text/css"),t.styleSheet)t.styleSheet.cssText=e;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}},Xh=function(){this.node.type&&"text/javascript"!==this.node.type||v("Script tag was updated. This does not cause the code to be re-evaluated!",{ractive:this.root}),this.node.text=this.fragment.toString(!1)};var ed=function(){var t,e;return this.template.y?"":(t="<"+this.template.e,t+=this.attributes.map(Xr).join("")+this.conditionalAttributes.map(Xr).join(""),"option"===this.name&&Yr(this)&&(t+=" selected"),"input"===this.name&&Jr(this)&&(t+=" checked"),t+=">","textarea"===this.name&&void 0!==this.getAttribute("value")?t+=ke(this.getAttribute("value")):void 0!==this.getAttribute("contenteditable")&&(t+=this.getAttribute("value")||""),this.fragment&&(e="script"!==this.name&&"style"!==this.name,t+=this.fragment.toString(e)),ol.test(this.template.e)||(t+=""),t)},nd=Zr,rd=ti,id=function(t){this.init(t)};id.prototype={bubble:jf,detach:Mf,find:Ff,findAll:Nf,findAllComponents:Lf,findComponent:Rf,findNextNode:If,firstNode:Df,getAttribute:Vf,init:ph,rebind:hh,render:td,toString:ed,unbind:nd,unrender:rd};var od=id,ad=/^\s*$/,sd=/^\s*/,ud=function(t){var e,n,r,i;return e=t.split("\n"),n=e[0],void 0!==n&&ad.test(n)&&e.shift(),r=L(e),void 0!==r&&ad.test(r)&&e.pop(),i=e.reduce(ni,null),i&&(t=e.map(function(t){return t.replace(i,"")}).join("\n")),t},cd=ri,ld=function(t,e){var n;return e?n=t.split("\n").map(function(t,n){return n?e+t:t}).join("\n"):t},fd='Could not find template for partial "%s"',pd=function(t){var e,n;e=this.parentFragment=t.parentFragment,this.root=e.root,this.type=Pc,this.index=t.index,this.name=t.template.r,this.rendered=!1,this.fragment=this.fragmentToRender=this.fragmentToUnrender=null,Wl.init(this,t),this.keypath||((n=cd(this.root,this.name,e))?(wl.call(this),this.isNamed=!0,this.setTemplate(n)):m(fd,this.name))};pd.prototype={bubble:function(){this.parentFragment.bubble()},detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},firstNode:function(){return this.fragment.firstNode()},findNextNode:function(){return this.parentFragment.findNextNode(this)},getPartialName:function(){return this.isNamed&&this.name?this.name:void 0===this.value?this.name:this.value},getValue:function(){return this.fragment.getValue()},rebind:function(t,e){this.isNamed||ql.call(this,t,e),this.fragment&&this.fragment.rebind(t,e)},render:function(){return this.docFrag=document.createDocumentFragment(),this.update(),this.rendered=!0,this.docFrag},resolve:Wl.resolve,setValue:function(t){var e;(void 0===t||t!==this.value)&&(void 0!==t&&(e=cd(this.root,""+t,this.parentFragment)),!e&&this.name&&(e=cd(this.root,this.name,this.parentFragment))&&(wl.call(this),this.isNamed=!0),e||m(fd,this.name,{ractive:this.root}),this.value=t,this.setTemplate(e||[]),this.bubble(),this.rendered&&ys.addView(this))},setTemplate:function(t){this.fragment&&(this.fragment.unbind(),this.rendered&&(this.fragmentToUnrender=this.fragment)),this.fragment=new im({template:t,root:this.root,owner:this,pElement:this.parentFragment.pElement}),this.fragmentToRender=this.fragment},toString:function(t){var e,n,r,i;return e=this.fragment.toString(t),n=this.parentFragment.items[this.index-1],n&&n.type===Ec?(r=n.text.split("\n").pop(),(i=/^\s+$/.exec(r))?ld(e,i[0]):e):e},unbind:function(){this.isNamed||wl.call(this),this.fragment&&this.fragment.unbind()},unrender:function(t){this.rendered&&(this.fragment&&this.fragment.unrender(t),this.rendered=!1)},update:function(){var t,e;this.fragmentToUnrender&&(this.fragmentToUnrender.unrender(!0),this.fragmentToUnrender=null),this.fragmentToRender&&(this.docFrag.appendChild(this.fragmentToRender.render()),this.fragmentToRender=null),this.rendered&&(t=this.parentFragment.getNode(),e=this.parentFragment.findNextNode(this),t.insertBefore(this.docFrag,e))}};var hd,dd,vd,md=pd,gd=ui,yd=ci,bd=new os("detach"),wd=li,xd=fi,_d=pi,Ed=hi,kd=di,Sd=vi,Od=function(t,e,n,r){var i=t.root,o=t.keypath;r?i.viewmodel.smartUpdate(o,e,r):i.viewmodel.mark(o)},Ad=[],Pd=["pop","push","reverse","shift","sort","splice","unshift"];Pd.forEach(function(t){var e=function(){for(var e=arguments.length,n=Array(e),r=0;e>r;r++)n[r]=arguments[r];var i,o,a,s;for(i=yu(this,t,n),o=Array.prototype[t].apply(this,arguments),ys.start(),this._ractive.setting=!0,s=this._ractive.wrappers.length;s--;)a=this._ractive.wrappers[s],ys.addRactive(a.root),Od(a,this,t,i);return ys.end(),this._ractive.setting=!1,o};Sa(Ad,t,{value:e})}),hd={},hd.__proto__?(dd=function(t){t.__proto__=Ad},vd=function(t){t.__proto__=Array.prototype}):(dd=function(t){var e,n;for(e=Pd.length;e--;)n=Pd[e],Sa(t,n,{value:Ad[n],configurable:!0})},vd=function(t){var e;for(e=Pd.length;e--;)delete t[Pd[e]]}),dd.unpatch=vd;var Cd,Td,jd,Md=dd;Cd={filter:function(t){return o(t)&&(!t._ractive||!t._ractive.setting)},wrap:function(t,e,n){return new Td(t,e,n)}},Td=function(t,e,n){this.root=t,this.value=e,this.keypath=k(n),e._ractive||(Sa(e,"_ractive",{value:{wrappers:[],instances:[],setting:!1},configurable:!0}),Md(e)),e._ractive.instances[t._guid]||(e._ractive.instances[t._guid]=0,e._ractive.instances.push(t)),e._ractive.instances[t._guid]+=1,e._ractive.wrappers.push(this)},Td.prototype={get:function(){return this.value},teardown:function(){var t,e,n,r,i;if(t=this.value,e=t._ractive,n=e.wrappers,r=e.instances,e.setting)return!1;if(i=n.indexOf(this),-1===i)throw Error(jd);if(n.splice(i,1),n.length){if(r[this.root._guid]-=1,!r[this.root._guid]){if(i=r.indexOf(this.root),-1===i)throw Error(jd);r.splice(i,1)}}else delete t._ractive,Md.unpatch(this.value)}},jd="Something went wrong in a rather interesting way";var Fd,Nd,Ld=Cd,Rd=/^\s*[0-9]+\s*$/,Id=function(t){return Rd.test(t)?[]:{}};try{Object.defineProperty({},"test",{value:0}),Fd={filter:function(t,e,n){var r,i;return e?(e=k(e),(r=n.viewmodel.wrapped[e.parent.str])&&!r.magic?!1:(i=n.viewmodel.get(e.parent),o(i)&&/^[0-9]+$/.test(e.lastKey)?!1:i&&("object"==typeof i||"function"==typeof i))):!1},wrap:function(t,e,n){return new Nd(t,e,n)}},Nd=function(t,e,n){var r,i,o;return n=k(n),this.magic=!0,this.ractive=t,this.keypath=n,this.value=e,this.prop=n.lastKey,r=n.parent,this.obj=r.isRoot?t.viewmodel.data:t.viewmodel.get(r),i=this.originalDescriptor=Object.getOwnPropertyDescriptor(this.obj,this.prop),i&&i.set&&(o=i.set._ractiveWrappers)?void(-1===o.indexOf(this)&&o.push(this)):void mi(this,e,i)},Nd.prototype={get:function(){return this.value},reset:function(t){return this.updating?void 0:(this.updating=!0,this.obj[this.prop]=t,ys.addRactive(this.ractive),this.ractive.viewmodel.mark(this.keypath,{keepExistingWrapper:!0}),this.updating=!1,!0)},set:function(t,e){this.updating||(this.obj[this.prop]||(this.updating=!0,this.obj[this.prop]=Id(t),this.updating=!1),this.obj[this.prop][t]=e)},teardown:function(){var t,e,n,r,i;return this.updating?!1:(t=Object.getOwnPropertyDescriptor(this.obj,this.prop),e=t&&t.set,void(e&&(r=e._ractiveWrappers,i=r.indexOf(this),-1!==i&&r.splice(i,1),r.length||(n=this.obj[this.prop],Object.defineProperty(this.obj,this.prop,this.originalDescriptor||{writable:!0,enumerable:!0,configurable:!0}),this.obj[this.prop]=n))))}}}catch(Pa){Fd=!1}var Dd,Vd,Ud=Fd;Ud&&(Dd={filter:function(t,e,n){return Ud.filter(t,e,n)&&Ld.filter(t)},wrap:function(t,e,n){return new Vd(t,e,n)}},Vd=function(t,e,n){this.value=e,this.magic=!0,this.magicWrapper=Ud.wrap(t,e,n),this.arrayWrapper=Ld.wrap(t,e,n)},Vd.prototype={get:function(){return this.value},teardown:function(){this.arrayWrapper.teardown(),this.magicWrapper.teardown()},reset:function(t){return this.magicWrapper.reset(t)}});var Bd=Dd,qd=gi,Wd={},zd=wi,Hd=xi,Gd=ki,Kd=Ci,$d=Ti,Qd=function(t,e){this.computation=t,this.viewmodel=t.viewmodel,this.ref=e,this.root=this.viewmodel.ractive,this.parentFragment=this.root.component&&this.root.component.parentFragment};Qd.prototype={resolve:function(t){this.computation.softDeps.push(t),this.computation.unresolvedDeps[t.str]=null,this.viewmodel.register(t,this.computation,"computed")}};var Yd=Qd,Jd=function(t,e){this.key=t,this.getter=e.getter,this.setter=e.setter,this.hardDeps=e.deps||[],this.softDeps=[],this.unresolvedDeps={},this.depValues={},this._dirty=this._firstRun=!0};Jd.prototype={constructor:Jd,init:function(t){var e,n=this;this.viewmodel=t,this.bypass=!0,e=t.get(this.key),t.clearCache(this.key.str),this.bypass=!1,this.setter&&void 0!==e&&this.set(e),this.hardDeps&&this.hardDeps.forEach(function(e){return t.register(e,n,"computed")})},invalidate:function(){this._dirty=!0},get:function(){var t,e,n=this,r=!1;if(this.getting){var i="The "+this.key.str+" computation indirectly called itself. This probably indicates a bug in the computation. It is commonly caused by `array.sort(...)` - if that's the case, clone the array first with `array.slice().sort(...)`";return d(i),this.value}if(this.getting=!0,this._dirty){if(this._firstRun||!this.hardDeps.length&&!this.softDeps.length?r=!0:[this.hardDeps,this.softDeps].forEach(function(t){var e,i,o;if(!r)for(o=t.length;o--;)if(e=t[o],i=n.viewmodel.get(e),!s(i,n.depValues[e.str]))return n.depValues[e.str]=i,void(r=!0)}),r){this.viewmodel.capture();try{this.value=this.getter()}catch(o){v('Failed to compute "%s"',this.key.str),p(o.stack||o),this.value=void 0}t=this.viewmodel.release(),e=this.updateDependencies(t),e&&[this.hardDeps,this.softDeps].forEach(function(t){t.forEach(function(t){n.depValues[t.str]=n.viewmodel.get(t)})})}this._dirty=!1}return this.getting=this._firstRun=!1,this.value},set:function(t){if(this.setting)return void(this.value=t);if(!this.setter)throw Error("Computed properties without setters are read-only. (This may change in a future version of Ractive!)");this.setter(t)},updateDependencies:function(t){var e,n,r,i,o;for(n=this.softDeps,e=n.length;e--;)r=n[e],-1===t.indexOf(r)&&(i=!0,this.viewmodel.unregister(r,this,"computed"));for(e=t.length;e--;)r=t[e],-1!==n.indexOf(r)||this.hardDeps&&-1!==this.hardDeps.indexOf(r)||(i=!0,ji(this.viewmodel,r)&&!this.unresolvedDeps[r.str]?(o=new Yd(this,r.str),t.splice(e,1),this.unresolvedDeps[r.str]=o,ys.addUnresolved(o)):this.viewmodel.register(r,this,"computed"));return i&&(this.softDeps=t.slice()),i}};var Xd=Jd,Zd=Mi,tv={FAILED_LOOKUP:!0},ev=Fi,nv={},rv=Li,iv=Ri,ov=function(t,e){this.localKey=t,this.keypath=e.keypath,this.origin=e.origin,this.deps=[],this.unresolved=[],this.resolved=!1};ov.prototype={forceResolution:function(){this.keypath=this.localKey,this.setup()},get:function(t,e){return this.resolved?this.origin.get(this.map(t),e):void 0},getValue:function(){return this.keypath?this.origin.get(this.keypath):void 0},initViewmodel:function(t){this.local=t,this.setup()},map:function(t){return void 0===typeof this.keypath?this.localKey:t.replace(this.localKey,this.keypath)},register:function(t,e,n){this.deps.push({keypath:t,dep:e,group:n}),this.resolved&&this.origin.register(this.map(t),e,n)},resolve:function(t){void 0!==this.keypath&&this.unbind(!0),this.keypath=t,this.setup()},set:function(t,e){this.resolved||this.forceResolution(),this.origin.set(this.map(t),e)},setup:function(){var t=this;void 0!==this.keypath&&(this.resolved=!0,this.deps.length&&(this.deps.forEach(function(e){var n=t.map(e.keypath);if(t.origin.register(n,e.dep,e.group),e.dep.setValue)e.dep.setValue(t.origin.get(n));else{if(!e.dep.invalidate)throw Error("An unexpected error occurred. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");e.dep.invalidate()}}),this.origin.mark(this.keypath)))},setValue:function(t){if(!this.keypath)throw Error("Mapping does not have keypath, cannot set value. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");this.origin.set(this.keypath,t)},unbind:function(t){var e=this;t||delete this.local.mappings[this.localKey],this.resolved&&(this.deps.forEach(function(t){e.origin.unregister(e.map(t.keypath),t.dep,t.group)}),this.tracker&&this.origin.unregister(this.keypath,this.tracker))},unregister:function(t,e,n){var r,i;if(this.resolved){for(r=this.deps,i=r.length;i--;)if(r[i].dep===e){r.splice(i,1);break}this.origin.unregister(this.map(t),e,n)}}};var av=Ii,sv=function(t,e){var n,r,i,o;return n={},r=0,i=t.map(function(t,i){var a,s,u;s=r,u=e.length;do{if(a=e.indexOf(t,s),-1===a)return o=!0,-1;s=a+1}while(n[a]&&u>s);return a===r&&(r+=1),a!==i&&(o=!0),n[a]=!0,a})},uv=Di,cv={},lv=Bi,fv=Wi,pv=zi,hv=Hi,dv=Ki,vv={implicit:!0},mv={noCascade:!0},gv=Qi,yv=Yi,bv=function(t){var e,n,r=t.adapt,i=t.data,o=t.ractive,a=t.computed,s=t.mappings;this.ractive=o,this.adaptors=r,this.onchange=t.onchange,this.cache={},this.cacheMap=ka(null),this.deps={computed:ka(null),"default":ka(null)},this.depsMap={computed:ka(null),"default":ka(null)},this.patternObservers=[],this.specials=ka(null),this.wrapped=ka(null),this.computations=ka(null),this.captureGroups=[],this.unresolvedImplicitDependencies=[],this.changes=[],this.implicitChanges={},this.noCascade={},this.data=i,this.mappings=ka(null);for(e in s)this.map(k(e),s[e]);if(i)for(e in i)(n=this.mappings[e])&&void 0===n.getValue()&&n.setValue(i[e]);for(e in a)s&&e in s&&f("Cannot map to a computed property ('%s')",e),this.compute(k(e),a[e]);this.ready=!0};bv.prototype={adapt:qd,applyChanges:Gd,capture:Kd,clearCache:$d,compute:Zd,get:ev,init:rv,map:iv,mark:av,merge:uv,register:lv,release:fv,reset:pv,set:hv,smartUpdate:dv,teardown:gv,unregister:yv};var wv=bv;Xi.prototype={constructor:Xi,begin:function(t){this.inProcess[t._guid]=!0},end:function(t){var e=t.parent;e&&this.inProcess[e._guid]?Zi(this.queue,e).push(t):to(this,t),delete this.inProcess[t._guid]}};var xv=Xi,_v=eo,Ev=/\$\{([^\}]+)\}/g,kv=new os("construct"),Sv=new os("config"),Ov=new xv("init"),Av=0,Pv=["adaptors","components","decorators","easing","events","interpolators","partials","transitions"],Cv=oo,Tv=lo;lo.prototype={bubble:function(){this.dirty||(this.dirty=!0,ys.addView(this))},update:function(){this.callback(this.fragment.getValue()),this.dirty=!1},rebind:function(t,e){this.fragment.rebind(t,e)},unbind:function(){this.fragment.unbind()}};var jv=function(t,e,n,i,a){var s,u,c,l,f,p,h={},d={},m={},g=[];for(u=t.parentFragment,c=t.root,a=a||{},r(h,a),a.content=i||[],h[""]=a.content,e.defaults.el&&v("The <%s/> component has a default `el` property; it has been disregarded",t.name),l=u;l;){if(l.owner.type===Mc){f=l.owner.container;break}l=l.parent}return n&&Object.keys(n).forEach(function(e){var r,i,a=n[e];if("string"==typeof a)r=pl(a),d[e]=r?r.value:a;else if(0===a)d[e]=!0;else{if(!o(a))throw Error("erm wut");po(a)?(m[e]={origin:t.root.viewmodel,keypath:void 0},i=fo(t,a[0],function(t){t.isSpecial?p?s.set(e,t.value):(d[e]=t.value,delete m[e]):p?s.viewmodel.mappings[e].resolve(t):m[e].keypath=t})):i=new Tv(t,a,function(t){p?s.set(e,t):d[e]=t}),g.push(i)}}),s=ka(e.prototype),Cv(s,{el:null,append:!0,data:d,partials:a,magic:c.magic||e.defaults.magic,modifyArrays:c.modifyArrays,adapt:c.adapt},{parent:c,component:t,container:f,mappings:m,inlinePartials:h,cssIds:u.cssIds}),p=!0,t.resolvers=g,s},Mv=ho,Fv=function(t){var e,n;for(e=t.root;e;)(n=e._liveComponentQueries["_"+t.name])&&n.push(t.instance),e=e.parent},Nv=mo,Lv=go,Rv=yo,Iv=bo,Dv=wo,Vv=new os("teardown"),Uv=_o,Bv=function(t,e){this.init(t,e)};Bv.prototype={detach:yd,find:wd,findAll:xd,findAllComponents:_d,findComponent:Ed,findNextNode:kd,firstNode:Sd,init:Nv,rebind:Lv,render:Rv,toString:Iv,unbind:Dv,unrender:Uv};var qv=Bv,Wv=function(t){this.type=Cc,this.value=t.template.c};Wv.prototype={detach:gl,firstNode:function(){return this.node},render:function(){return this.node||(this.node=document.createComment(this.value)),this.node},toString:function(){return""},unrender:function(t){t&&this.node.parentNode.removeChild(this.node)}};var zv=Wv,Hv=function(t){var e,n;this.type=Mc,this.container=e=t.parentFragment.root,this.component=n=e.component,this.container=e,this.containerFragment=t.parentFragment,this.parentFragment=n.parentFragment;var r=this.name=t.template.n||"",i=e._inlinePartials[r];i||(v('Could not find template for partial "'+r+'"',{ractive:t.root}),i=[]),this.fragment=new im({owner:this,root:e.parent,template:i,pElement:this.containerFragment.pElement}),o(n.yielders[r])?n.yielders[r].push(this):n.yielders[r]=[this],ys.scheduleTask(function(){if(n.yielders[r].length>1)throw Error("A component template can only have one {{yield"+(r?" "+r:"")+"}} declaration at a time")})};Hv.prototype={detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},findNextNode:function(){return this.containerFragment.findNextNode(this)},firstNode:function(){return this.fragment.firstNode()},getValue:function(t){return this.fragment.getValue(t)},render:function(){return this.fragment.render()},unbind:function(){this.fragment.unbind()},unrender:function(t){this.fragment.unrender(t),R(this.component.yielders[this.name],this)},rebind:function(t,e){this.fragment.rebind(t,e)},toString:function(){return""+this.fragment}};var Gv=Hv,Kv=function(t){this.declaration=t.template.a};Kv.prototype={init:Ea,render:Ea,unrender:Ea,teardown:Ea,toString:function(){return""}};var $v=Kv,Qv=Eo,Yv=So,Jv=Oo,Xv=Ao,Zv=To,tm=Mo,em=function(t){this.init(t)};em.prototype={bubble:lc,detach:fc,find:pc,findAll:hc,findAllComponents:dc,findComponent:vc,findNextNode:mc,firstNode:gc,getArgsList:dl,getNode:vl,getValue:ml,init:Qv,rebind:Yv,registerIndexRef:function(t){var e=this.registeredIndexRefs;-1===e.indexOf(t)&&e.push(t)},render:Jv,toString:Xv,unbind:Zv,unregisterIndexRef:function(t){var e=this.registeredIndexRefs;e.splice(e.indexOf(t),1)},unrender:tm};var nm,rm,im=em,om=Fo,am=["template","partials","components","decorators","events"],sm=new os("reset"),um=function(t,e){function n(e,r,i){i&&i.partials[t]||e.forEach(function(e){e.type===Pc&&e.getPartialName()===t&&r.push(e),e.fragment&&n(e.fragment.items,r,i),o(e.fragments)?n(e.fragments,r,i):o(e.items)?n(e.items,r,i):e.type===jc&&e.instance&&n(e.instance.fragment.items,r,e.instance),e.type===Ac&&(o(e.attributes)&&n(e.attributes,r,i),o(e.conditionalAttributes)&&n(e.conditionalAttributes,r,i))})}var r,i=[];return n(this.fragment.items,i),this.partials[t]=e,r=ys.start(this,!0),i.forEach(function(e){e.value=void 0,e.setValue(t)}),ys.end(),r},cm=No,lm=wu("reverse"),fm=Lo,pm=wu("shift"),hm=wu("sort"),dm=wu("splice"),vm=Io,mm=Do,gm=new os("teardown"),ym=Uo,bm=Bo,wm=qo,xm=new os("unrender"),_m=wu("unshift"),Em=Wo,km=new os("update"),Sm=zo,Om={add:Za,animate:ks,detach:Os,find:Ps,findAll:Is,findAllComponents:Ds,findComponent:Vs,findContainer:Us,findParent:Bs,fire:Hs,get:Gs,insert:$s,merge:Ys,observe:fu,observeOnce:pu,off:vu,on:mu,once:gu,pop:xu,push:_u,render:Tu,reset:om,resetPartial:um,resetTemplate:cm,reverse:lm,set:fm,shift:pm,sort:hm,splice:dm,subtract:vm,teardown:mm,toggle:ym,toHTML:bm,toHtml:bm,unrender:wm,unshift:_m,update:Em,updateModel:Sm},Am=function(t,e,n){return n||Go(t,e)?function(){var n,r="_super"in this,i=this._super;return this._super=e,n=t.apply(this,arguments),r&&(this._super=i),n}:t},Pm=Ko,Cm=Jo,Tm=function(t){var e,n,r={};return t&&(e=t._ractive)?(r.ractive=e.root,r.keypath=e.keypath.str, r.index={},(n=Cl(e.proxy.parentFragment))&&(r.index=Cl.resolve(n)),r):r};nm=function(t){return this instanceof nm?void Cv(this,t):new nm(t)},rm={DEBUG:{writable:!0,value:!0},DEBUG_PROMISES:{writable:!0,value:!0},extend:{value:Cm},getNodeInfo:{value:Tm},parse:{value:Gu},Promise:{value:cs},svg:{value:ia},magic:{value:na},VERSION:{value:"0.7.3"},adaptors:{writable:!0,value:{}},components:{writable:!0,value:{}},decorators:{writable:!0,value:{}},easing:{writable:!0,value:ca},events:{writable:!0,value:{}},interpolators:{writable:!0,value:qa},partials:{writable:!0,value:{}},transitions:{writable:!0,value:{}}},Oa(nm,rm),nm.prototype=r(Om,ua),nm.prototype.constructor=nm,nm.defaults=nm.prototype;var jm="function";if(typeof Date.now!==jm||typeof String.prototype.trim!==jm||typeof Object.keys!==jm||typeof Array.prototype.indexOf!==jm||typeof Array.prototype.forEach!==jm||typeof Array.prototype.map!==jm||typeof Array.prototype.filter!==jm||"undefined"!=typeof window&&typeof window.addEventListener!==jm)throw Error("It looks like you're attempting to use Ractive.js in an older browser. You'll need to use one of the 'legacy builds' in order to continue - see http://docs.ractivejs.org/latest/legacy-builds for more information.");var Mm=nm;return Mm})},{}],197:[function(t,e,n){!function(){function t(t,e,n){return t.call.apply(t.bind,arguments)}function n(t,e,n){if(!t)throw Error();if(2r;r++)if(n[r]==e)return!0;return!1}function l(t){if("string"==typeof t.f)return t.f;var e=t.m.location.protocol;return"about:"==e&&(e=t.a.location.protocol),"https:"==e?"https:":"http:"}function f(t){return t.m.location.hostname||t.a.location.hostname}function p(t,e,n){function r(){c&&i&&s&&(c(u),c=null)}e=o(t,"link",{rel:"stylesheet",href:e,media:"all"});var i=!1,s=!0,u=null,c=n||null;it?(e.onload=function(){i=!0,r()},e.onerror=function(){i=!0,u=Error("Stylesheet failed to load"),r()}):setTimeout(function(){i=!0,r()},0),a(t,"head",e)}function h(t,e,n,r){var i=t.c.getElementsByTagName("head")[0];if(i){var a=o(t,"script",{src:e}),s=!1;return a.onload=a.onreadystatechange=function(){s||this.readyState&&"loaded"!=this.readyState&&"complete"!=this.readyState||(s=!0,n&&n(null),a.onload=a.onreadystatechange=null,"HEAD"==a.parentNode.tagName&&i.removeChild(a))},i.appendChild(a),setTimeout(function(){s||(s=!0,n&&n(Error("Script load timeout")))},r||5e3),a}return null}function d(){this.a=0,this.c=null}function v(t){return t.a++,function(){t.a--,g(t)}}function m(t,e){t.c=e,g(t)}function g(t){0==t.a&&t.c&&(t.c(),t.c=null)}function y(t){this.a=t||"-"}function b(t,e){this.c=t,this.f=4,this.a="n";var n=(e||"n4").match(/^([nio])([1-9])$/i);n&&(this.a=n[1],this.f=parseInt(n[2],10))}function w(t){return E(t)+" "+(t.f+"00")+" 300px "+x(t.c)}function x(t){var e=[];t=t.split(/,\s*/);for(var n=0;nparseInt(t[1],10)||536===parseInt(t[1],10)&&11>=parseInt(t[2],10))}return at}function I(t,e,n){for(var r in ot)if(ot.hasOwnProperty(r)&&e===t.f[ot[r]]&&n===t.f[ot[r]])return!0;return!1}function D(t){var e,n=t.g.a.offsetWidth,r=t.h.a.offsetWidth;(e=n===t.f.serif&&r===t.f["sans-serif"])||(e=R()&&I(t,n,r)),e?rt()-t.A>=t.w?R()&&I(t,n,r)&&(null===t.u||t.u.hasOwnProperty(t.a.c))?U(t,t.v):U(t,t.B):V(t):U(t,t.v)}function V(t){setTimeout(r(function(){D(this)},t),50)}function U(t,e){setTimeout(r(function(){s(this.g.a),s(this.h.a),s(this.j.a),s(this.o.a),e(this.a)},t),0)}function B(t,e,n){this.c=t,this.a=e,this.f=0,this.o=this.j=!1,this.s=n}function q(t){0==--t.f&&t.j&&(t.o?(t=t.a,t.g&&u(t.f,[t.a.c("wf","active")],[t.a.c("wf","loading"),t.a.c("wf","inactive")]),P(t,"active")):A(t.a))}function W(t){this.j=t,this.a=new C,this.h=0,this.f=this.g=!0}function z(t,e,n,i,o){var a=0==--t.h;(t.f||t.g)&&setTimeout(function(){var t=o||null,s=i||null||{};if(0===n.length&&a)A(e.a);else{e.f+=n.length,a&&(e.j=a);var c,l=[];for(c=0;ce;e++)r[e].load(function(e,n,r){z(t,o,e,n,r)})}function G(t,e){this.c=t,this.a=e}function K(t,e,n){var r=l(t.c);return t=(t.a.api||"fast.fonts.net/jsapi").replace(/^.*http(s?):(\/\/)?/,""),r+"//"+t+"/"+e+".js"+(n?"?v="+n:"")}function $(t,e){this.c=t,this.a=e}function Q(t,e,n){t?this.c=t:this.c=e+ut,this.a=[],this.f=[],this.g=n||""}function Y(t,e){for(var n=e.length,r=0;n>r;r++){var i=e[r].split(":");3==i.length&&t.f.push(i.pop());var o="";2==i.length&&""!=i[1]&&(o=":"),t.a.push(i.join(o))}}function J(t){if(0==t.a.length)throw Error("No fonts to load!");if(-1!=t.c.indexOf("kit="))return t.c;for(var e=t.a.length,n=[],r=0;e>r;r++)n.push(t.a[r].replace(/ /g,"+"));return e=t.c+"?family="+n.join("%7C"),0n;n++){var r=t.f[n].split(":"),i=r[0].replace(/\+/g," "),o=["n4"];if(2<=r.length){var a,s=r[1];if(a=[],s)for(var s=s.split(","),u=s.length,c=0;u>c;c++){var l;if(l=s[c],l.match(/^[\w-]+$/)){var f=pt.exec(l.toLowerCase());if(null==f)l="";else{if(l=f[2],l=null==l||""==l?"n":ft[l],f=f[1],null==f||""==f)f="4";else var p=lt[f],f=p?p:isNaN(f)?"4":f.substr(0,1);l=""+l+f}}else l="";l&&a.push(l)}0=n.j?n.f(n.a):e.fonts.load(w(n.a),n.h).then(function(e){1<=e.length?n.g(n.a):setTimeout(t,25)},function(){n.f(n.a)})}var e=this.c.m.document,n=this,r=rt();t()};var ot={D:"serif",C:"sans-serif"},at=null;L.prototype.start=function(){this.f.serif=this.j.a.offsetWidth,this.f["sans-serif"]=this.o.a.offsetWidth,this.A=rt(),D(this)};var st=null;B.prototype.g=function(t){var e=this.a;e.g&&u(e.f,[e.a.c("wf",t.c,""+_(t),"active")],[e.a.c("wf",t.c,""+_(t),"loading"),e.a.c("wf",t.c,""+_(t),"inactive")]),P(e,"fontactive",t),this.o=!0,q(this)},B.prototype.h=function(t){var e=this.a;if(e.g){var n=c(e.f,e.a.c("wf",t.c,""+_(t),"active")),r=[],i=[e.a.c("wf",t.c,""+_(t),"loading")];n||r.push(e.a.c("wf",t.c,""+_(t),"inactive")),u(e.f,r,i)}P(e,"fontinactive",t),q(this)},W.prototype.load=function(t){this.c=new i(this.j,t.context||this.j),this.g=!1!==t.events,this.f=!1!==t.classes,H(this,new S(this.c,t),t)},G.prototype.load=function(t){function e(){if(i["__mti_fntLst"+n]){var r,o=i["__mti_fntLst"+n](),a=[];if(o)for(var s=0;se;e++)p(this.c,r[e],v(a));var s=[];for(e=0,n=i.length;n>e;e++)if(r=i[e].split(":"),r[1])for(var u=r[1].split(","),c=0;ci;++i){var a=n.fonts[i];r.a.push(new b(a.name,k("font-weight:"+a.weight+";font-style:"+a.style)))}t(r.a)},h(this.c,l(this.c)+(this.f.api||"//f.fontdeck.com/s/css/js/")+f(this.c)+"/"+e+".js",function(e){e&&t([])})):t([])};var dt=new W(window);dt.a.c.custom=function(t,e){return new $(e,t)},dt.a.c.fontdeck=function(t,e){return new nt(e,t)},dt.a.c.monotype=function(t,e){return new G(e,t)},dt.a.c.typekit=function(t,e){return new et(e,t)},dt.a.c.google=function(t,e){return new tt(e,t)};var vt={load:r(dt.load,dt)};"function"==typeof define&&define.amd?define(function(){return vt}):void 0!==e&&e.exports?e.exports=vt:(window.WebFont=vt,window.WebFontConfig&&dt.load(window.WebFontConfig))}()},{}],198:[function(t,e,n){(function(t){"use strict";function e(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=arguments.length<=1||void 0===arguments[1]?"":arguments[1];return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function r(t,n){var r=arguments.length<=2||void 0===arguments[2]?{}:arguments[2];r.src=t,r.action=n,window.location.href=e(r)}function i(n,r,i){window.location.href=e(t.defineProperty({},n+"."+r,i),"winset")}Object.defineProperty(n,"__esModule",{value:!0}),n.href=e,n.act=r,n.winset=i;var o=encodeURIComponent}).call(this,t("babel/external-helpers"))},{"babel/external-helpers":"babel/external-helpers"}],199:[function(t,e,n){var r=t(196),i={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.observe("value",function(e,n,r){var i=t.get(),o=i.min,a=i.max,s=Math.clamp(o,a,e);t.animate("percentage",Math.round((s-o)/(a-o)*100))})}}}(i),i.exports.template={v:3,t:[" ",{p:[13,1,315],t:7,e:"div",a:{"class":"bar"},f:[{p:[14,3,336],t:7,e:"div",a:{"class":["barFill ",{t:2,r:"state",p:[14,23,356]}],style:["width: ",{t:2,r:"percentage",p:[14,48,381]},"%"]}}," ",{p:[15,3,408],t:7,e:"span",a:{"class":"barText"},f:[{t:16,p:[15,25,430]}]}]}]},e.exports=r.extend(i.exports)},{196:196}],200:[function(t,e,n){var r=t(196),i={exports:{}};!function(e){"use strict";var n=t(208),r=t(198);e.exports={computed:{clickable:function(){return this.get("enabled")&&!this.get("state")?!0:!1},enabled:function(){return this.get("config.status")===n.UI_INTERACTIVE?!0:!1},styles:function(){var t=this.get("state"),e=this.get("style");return this.get("enabled")?t?"inactive "+t:"active normal "+[e]:"inactive disabled"}},oninit:function(){var t=this;this.on("press",function(e){var n=t.get(),i=n.action,o=n.params;(0,r.act)(t.get("config.ref"),i,o),e.node.blur()})}}}(i),i.exports.template={v:3,t:[" ",{p:[42,1,964],t:7,e:"span",a:{"class":["button ",{t:2,r:"styles",p:[42,21,984]}," ",{t:4,f:["gridable"],r:"grid",p:[42,32,995]}],unselectable:"on"},m:[{t:4,f:["tabindex='0'"],r:"clickable",p:[44,3,1043]}],v:{"click-enter":{n:[{t:4,f:["press"],r:"clickable",p:[45,19,1094]}],d:[]}},f:[{t:4,f:[{p:[47,5,1142],t:7,e:"i",a:{"class":["fa fa-",{t:2,r:"icon",p:[47,21,1158]}]}}],n:50,r:"icon",p:[46,3,1124]}," ",{t:16,p:[49,3,1187]}]}]},e.exports=r.extend(i.exports)},{196:196,198:198,208:208}],201:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"display"},f:[{t:4,f:[{p:[3,5,44],t:7,e:"header",f:[{p:[4,7,60],t:7,e:"h3",f:[{t:2,r:"title",p:[4,11,64]}]}," ",{t:4,f:[{p:[6,9,110],t:7,e:"div",a:{"class":"buttonRight"},f:[{t:16,n:"button",p:[6,34,135]}]}],n:50,r:"button",p:[5,7,86]}]}],n:50,r:"title",p:[2,3,25]}," ",{p:[10,3,202],t:7,e:"article",f:[{t:16,p:[11,5,217]}]}]}]},e.exports=r.extend(i.exports)},{196:196}],202:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"notice"},f:[{t:16,p:[2,3,24]}]}]},e.exports=r.extend(i.exports)},{196:196}],203:[function(t,e,n){var r=t(196),i={exports:{}};!function(e){"use strict";var n=t(198);e.exports={oninit:function(){var t=this;this.observe("config.fancy",function(e,r,i){(0,n.winset)(t.get("config.window"),"can-resize",!e)})}}}(i),i.exports.template={v:3,t:[" ",{t:4,f:[{p:[14,3,279],t:7,e:"div",a:{"class":"resize"},v:{mousedown:"resize"}}],n:50,r:"config.fancy",p:[13,1,255]}]},e.exports=r.extend(i.exports)},{196:196,198:198}],204:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"section",f:[{t:4,f:[{p:[3,5,32],t:7,e:"span",a:{"class":"label"},f:[{t:2,r:"label",p:[3,25,52]},":"]}," ",{t:4,f:[{t:16,p:[5,7,97]}],n:50,r:"nowrap",p:[4,5,75]},{t:4,n:51,f:[{p:[7,7,128],t:7,e:"div",a:{"class":"content"},f:[{t:16,p:[8,9,159]}]}],r:"nowrap"}],n:50,r:"label",p:[2,3,13]},{t:4,n:51,f:[{t:16,p:[12,5,213]}],r:"label"}]}]},e.exports=r.extend(i.exports)},{196:196}],205:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"subdisplay"},f:[{t:4,f:[{p:[3,5,47],t:7,e:"header",f:[{p:[4,7,63],t:7,e:"h4",f:[{t:2,r:"title",p:[4,11,67]}]}," ",{t:4,f:[{t:16,n:"button",p:[5,21,103]}],n:50,r:"button",p:[5,7,89]}]}],n:50,r:"title",p:[2,3,28]}," ",{p:[8,3,156],t:7,e:"article",f:[{t:16,p:[9,5,171]}]}]}]},e.exports=r.extend(i.exports)},{196:196}],206:[function(t,e,n){var r=t(196),i={exports:{}};!function(e){"use strict";var n=t(208),r=t(198);e.exports={computed:{visualStatus:function(){switch(this.get("config.status")){case n.UI_INTERACTIVE:return"good";case n.UI_UPDATE:return"average";case n.UI_DISABLED:return"bad";default:return"bad"}}},oninit:function(){var t=this;this.observe("config.fancy",function(e,n,i){(0,r.winset)(t.get("config.window"),"titlebar",!e)}),this.on({close:function(){(0,r.winset)(t.get("config.window"),"is-visible",!1),window.location.href=(0,r.href)({command:"uiclose "+t.get("config.ref")},"winset")},minimize:function(){(0,r.winset)(t.get("config.window"),"is-minimized",!0)}})}}}(i),i.exports.template={v:3,t:[" ",{p:[34,1,915],t:7,e:"header",a:{"class":"titlebar"},v:{mousedown:"drag"},f:[{p:[35,3,964],t:7,e:"i",a:{"class":["statusicon fa fa-eye fa-2x ",{t:2,r:"visualStatus",p:[35,40,1001]}]}}," ",{p:[36,3,1027],t:7,e:"span",a:{"class":"title"},f:[{t:16,p:[36,23,1047]}]}," ",{t:4,f:[{p:[38,5,1093],t:7,e:"i",a:{"class":"minimize fa fa-minus fa-2x"},v:{click:"minimize"}}," ",{p:[39,5,1161],t:7,e:"i",a:{"class":"close fa fa-close fa-2x"},v:{click:"close"}}],n:50,r:"config.fancy",p:[37,3,1067]}]}]},e.exports=r.extend(i.exports)},{196:196,198:198,208:208}],207:[function(t,e,n){var r=t(196),i={exports:{}};!function(t){"use strict";var e=[11,10,9,8];t.exports={data:{userAgent:navigator.userAgent},computed:{ie:function(){if(document.documentMode)return document.documentMode;for(var t in e)if(div=document.createElement("div"),div.innerHTML="",div.getElementsByTagName("span").length)return t}},oninit:function(){var t=this;this.on("debug",function(){return t.toggle("debug")})}}}(i),i.exports.template={v:3,t:[" ",{t:4,f:[{p:[27,3,636],t:7,e:"ui-notice",f:[{p:[28,5,653],t:7,e:"span",f:["You have an old (IE",{t:2,r:"ie",p:[28,30,678]},") end-of-life (click 'EOL Info' for more information) version of Internet Explorer installed."]},{p:[28,137,785],t:7,e:"br"}," ",{p:[29,5,796],t:7,e:"span",f:["To upgrade click 'Upgrade IE' to download IE11 from Microsoft."]},{p:[29,81,872],t:7,e:"br"}," ",{p:[30,5,883],t:7,e:"span",f:["If you are unable to upgrade directly click 'IE VMs' to download a VM with IE11 or Edge from Microsoft."]},{p:[30,122,1e3],t:7,e:"br"}," ",{p:[31,5,1011],t:7,e:"span",f:["Otherwise click 'No Frills' below to disable potentially incompatible features (and this message)."]}," ",{p:[32,5,1129],t:7,e:"hr"}," ",{p:[33,5,1140],t:7,e:"ui-button",a:{icon:"close",action:"tgui:nofrills"},f:["No Frills"]}," ",{p:[34,5,1214],t:7,e:"ui-button",a:{icon:"internet-explorer",action:"tgui:link",params:'{"url": "http://windows.microsoft.com/en-us/internet-explorer/download-ie"}'},f:["Upgrade IE"]}," ",{p:[36,5,1390],t:7,e:"ui-button",a:{icon:"edge",action:"tgui:link",params:'{"url": "https://dev.windows.com/en-us/microsoft-edge/tools/vms"}'},f:["IE VMs"]}," ",{p:[38,5,1539],t:7,e:"ui-button",a:{icon:"info",action:"tgui:link",params:'{"url": "https://support.microsoft.com/en-us/lifecycle#gp/Microsoft-Internet-Explorer"}'},f:["EOL Info"]}," ",{p:[40,5,1712],t:7,e:"ui-button",a:{icon:"bug"},v:{press:"debug"},f:["Debug Info"]}," ",{t:4,f:[{p:[42,7,1800],t:7,e:"hr"}," ",{p:[43,7,1813],t:7,e:"span",f:["Detected: IE",{t:2,r:"ie",p:[43,25,1831]}]},{p:[43,38,1844],t:7,e:"br"}," ",{p:[44,7,1857],t:7,e:"span",f:["User Agent: ",{t:2,r:"userAgent",p:[44,25,1875]}]}],n:50,r:"debug",p:[41,5,1779]}]}],n:50,x:{r:["config.fancy","ie"],s:"_0&&_1&&_1<11"},p:[26,1,595]}]},e.exports=r.extend(i.exports)},{196:196}],208:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],209:[function(t,e,n){"use strict";function r(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function i(t){if(t.preventDefault(),this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var i=r(e,n);e=i.x,n=i.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}function o(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function a(t){if(t.preventDefault(),this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,r=o(e,n);e=r.x,n=r.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}Object.defineProperty(n,"__esModule",{value:!0}),n.resize=n.drag=void 0;var s=t(198);n.drag=i,n.resize=a},{198:198}],210:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[" "," "," "," "," "," ",{p:[8,1,327],t:7,e:"ui-notice",f:[{t:4,f:[{p:[10,5,372],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[11,7,415],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[11,24,432]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[11,75,483]}]}]}],n:50,r:"data.siliconUser",p:[9,3,342]},{t:4,n:51,f:[{p:[14,5,574],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[14,31,600]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[17,1,685],t:7,e:"status"}," ",{t:4,f:[{t:4,f:[{p:[20,5,770],t:7,e:"controls"}],n:50,x:{r:["data.screen"],s:"_0==1"},p:[19,3,740]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:"_0==2"},f:[{p:[22,5,817],t:7,e:"vents"}]},{t:4,n:50,x:{r:["data.screen"],s:"(!(_0==2))&&(_0==3)"},f:[" ",{p:[24,5,862],t:7,e:"scrubbers"}]},{t:4,n:50,x:{r:["data.screen"],s:"(!(_0==2))&&((!(_0==3))&&(_0==4))"},f:[" ",{p:[26,5,911],t:7,e:"modes"}]},{t:4,n:50,x:{r:["data.screen"],s:"(!(_0==2))&&((!(_0==3))&&((!(_0==4))&&(_0==5)))"},f:[" ",{p:[28,5,956],t:7,e:"thresholds"}]}],x:{r:["data.screen"],s:"_0==1"}}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[18,1,696]}]},i.exports.components=i.exports.components||{};var o={vents:t(217),modes:t(213),thresholds:t(216),status:t(215),scrubbers:t(214),controls:t(212)};for(var a in o)o.hasOwnProperty(a)&&(i.exports.components[a]=o[a]);e.exports=r.extend(i.exports)},{196:196,212:212,213:213,214:214,215:215,216:216,217:217}],211:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-button",a:{icon:"arrow-left",action:"screen",params:'{"screen": 1}'},f:["Back"]}]},e.exports=r.extend(i.exports)},{196:196}],212:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Air Controls"},f:[{p:[2,3,37],t:7,e:"ui-section",f:[{p:[3,5,55],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"exclamation-triangle":"exclamation"'},p:[3,22,72]}],style:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"caution":null'},p:[3,92,142]}],action:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"reset":"alarm"'},p:[4,17,200]}]},f:["Area Atmosphere Alarm"]}]}," ",{p:[6,3,296],t:7,e:"ui-section",f:[{p:[7,5,314],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==3?"exclamation-triangle":"exclamation"'},p:[7,22,331]}],style:[{t:2,x:{r:["data.mode"],s:'_0==3?"danger":null'},p:[7,90,399]}],action:"mode",params:['{"mode": ',{t:2,x:{r:["data.mode"],s:"_0==3?1:3"},p:[8,38,475]},"}"]},f:["Panic Siphon"]}]}," ",{p:[10,3,549],t:7,e:"br"}," ",{p:[11,3,558],t:7,e:"ui-section",f:[{p:[12,5,576],t:7,e:"ui-button",a:{icon:"sign-out",action:"screen",params:'{"screen": 2}'},f:["Vent Controls"]}]}," ",{p:[14,3,688],t:7,e:"ui-section",f:[{p:[15,5,706],t:7,e:"ui-button",a:{icon:"filter",action:"screen",params:'{"screen": 3}'},f:["Scrubber Controls"]}]}," ",{p:[17,3,820],t:7,e:"ui-section",f:[{p:[18,5,838],t:7,e:"ui-button",a:{icon:"cog",action:"screen",params:'{"screen": 4}'},f:["Operating Mode"]}]}," ",{p:[20,3,946],t:7,e:"ui-section",f:[{p:[21,5,964],t:7,e:"ui-button",a:{icon:"bar-chart",action:"screen",params:'{"screen": 5}'},f:["Alarm Thresholds"]}]}]}]},e.exports=r.extend(i.exports)},{196:196}],213:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,115],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Operating Modes",button:0},f:[" ",{t:4,f:[{p:[8,5,168],t:7,e:"ui-section",f:[{p:[9,7,188],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["selected"],s:'_0?"check-square-o":"square-o"'},p:[9,24,205]}],state:[{t:2,x:{r:["selected","danger"],s:'_0?_1?"danger":"selected":null'},p:[10,16,267]}],action:"mode",params:['{"mode": ',{t:2,r:"mode",p:[11,40,361]},"}"]},f:[{t:2,r:"name",p:[11,51,372]}]}]}],n:52,r:"data.modes",p:[7,3,142]}]}]},i.exports.components=i.exports.components||{};var o={back:t(211)};for(var a in o)o.hasOwnProperty(a)&&(i.exports.components[a]=o[a]);e.exports=r.extend(i.exports)},{196:196,211:211}],214:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,117],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Scrubber Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,174],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,196]}]},f:[{p:[9,7,219],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,255],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,272]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,314]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,391]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,411]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,425]}]}]}," ",{p:[13,7,490],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,525],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["scrubbing"],s:'_0?"filter":"sign-in"'},p:[14,26,542]}],style:[{t:2,x:{r:["scrubbing"],s:'_0?null:"danger"'},p:[14,71,587]}],action:"scrubbing",params:['{"id_tag": "',{t:2,r:"id_tag",p:[15,50,670]},'", "val": ',{t:2,x:{r:["scrubbing"],s:"+!_0"},p:[15,70,690]},"}"]},f:[{t:2,x:{r:["scrubbing"],s:'_0?"Scrubbing":"Siphoning"'},p:[15,88,708]}]}]}," ",{p:[17,7,790],t:7,e:"ui-section",a:{label:"Range"},f:[{p:[18,9,826],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["widenet"],s:'_0?"expand":"compress"'},p:[18,26,843]}],style:[{t:2,x:{r:["widenet"],s:'_0?"selected":null'},p:[18,70,887]}],action:"widenet",params:['{"id_tag": "',{t:2,r:"id_tag",p:[19,48,968]},'", "val": ',{t:2,x:{r:["widenet"],s:"+!_0"},p:[19,68,988]},"}"]},f:[{t:2,x:{r:["widenet"],s:'_0?"Expanded":"Normal"'},p:[19,84,1004]}]}]}," ",{p:[21,7,1080],t:7,e:"ui-section",a:{label:"Filters"},f:[{p:[22,9,1118],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_co2"],s:'_0?"check-square-o":"square-o"'},p:[22,26,1135]}],style:[{t:2,x:{r:["filter_co2"],s:'_0?"selected":null'},p:[22,81,1190]}],action:"co2_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[23,50,1276]},'", "val": ',{t:2,x:{r:["filter_co2"],s:"+!_0"},p:[23,70,1296]},"}"]},f:["CO2"]}," ",{p:[24,9,1340],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_n2o"],s:'_0?"check-square-o":"square-o"'},p:[24,26,1357]}],style:[{t:2,x:{r:["filter_n2o"],s:'_0?"selected":null'},p:[24,81,1412]}],action:"n2o_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[25,50,1498]},'", "val": ',{t:2,x:{r:["filter_n2o"],s:"+!_0"},p:[25,70,1518]},"}"]},f:["N2O"]}," ",{p:[26,9,1562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_toxins"],s:'_0?"check-square-o":"square-o"'},p:[26,26,1579]}],style:[{t:2,x:{r:["filter_toxins"],s:'_0?"selected":null'},p:[26,84,1637]}],action:"tox_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[27,50,1726]},'", "val": ',{t:2,x:{r:["filter_toxins"],s:"+!_0"},p:[27,70,1746]},"}"]},f:["Plasma"]}]}]}],n:52,r:"data.scrubbers",p:[7,3,144]},{t:4,n:51,f:[{p:[31,5,1847],t:7,e:"span",a:{"class":"bad"},f:["Error: No scrubbers connected."]}],r:"data.scrubbers"}]}]},i.exports.components=i.exports.components||{};var o={back:t(211)};for(var a in o)o.hasOwnProperty(a)&&(i.exports.components[a]=o[a]);e.exports=r.extend(i.exports)},{196:196,211:211}],215:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Air Status"},f:[{t:4,f:[{t:4,f:[{p:[4,7,110],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[4,26,129]}]},f:[{p:[5,6,146],t:7,e:"span",a:{"class":[{t:2,x:{r:["danger_level"],s:'_0==2?"bad":_0==1?"average":"good"'},p:[5,19,159]}]},f:[{t:2,x:{r:["value"],s:"Math.fixed(_0,2)"},p:[6,5,237]},{t:2,r:"unit",p:[6,29,261]}]}]}],n:52,r:"adata.environment_data",p:[3,5,70]}," ",{p:[10,5,322],t:7,e:"ui-section",a:{label:"Local Status"},f:[{p:[11,7,363],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.danger_level"],s:'_0==2?"bad bold":_0==1?"average bold":"good"'},p:[11,20,376]}]},f:[{t:2,x:{r:["data.danger_level"],s:'_0==2?"Danger (Internals Required)":_0==1?"Caution":"Optimal"'},p:[12,6,475]}]}]}," ",{p:[15,5,619],t:7,e:"ui-section",a:{label:"Area Status"},f:[{p:[16,7,659],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.atmos_alarm","data.fire_alarm"],s:'_0||_1?"bad bold":"good"'},p:[16,20,672]}]},f:[{t:2,x:{r:["data.atmos_alarm","fire_alarm"],s:'_0?"Atmosphere Alarm":_1?"Fire Alarm":"Nominal"'},p:[17,8,744]}]}]}],n:50,r:"data.environment_data",p:[2,3,35]},{t:4,n:51,f:[{p:[21,5,876],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[22,7,912],t:7,e:"span",a:{"class":"bad bold"},f:["Cannot obtain air sample for analysis."]}]}],r:"data.environment_data"}," ",{t:4,f:[{p:[26,5,1040],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[27,7,1076],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[25,3,1014]}]}]},e.exports=r.extend(i.exports)},{196:196}],216:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.css=" th, td {\r\n padding-right: 16px;\r\n text-align: left;\r\n }",i.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,116],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Alarm Thresholds",button:0},f:[" ",{p:[7,3,143],t:7,e:"table",f:[{p:[8,5,156],t:7,e:"thead",f:[{p:[8,12,163],t:7,e:"tr",f:[{p:[9,7,175],t:7,e:"th"}," ",{p:[10,7,192],t:7,e:"th",f:[{p:[10,11,196],t:7,e:"span",a:{"class":"bad"},f:["min2"]}]}," ",{p:[11,7,238],t:7,e:"th",f:[{p:[11,11,242],t:7,e:"span",a:{"class":"average"},f:["min1"]}]}," ",{p:[12,7,288],t:7,e:"th",f:[{p:[12,11,292],t:7,e:"span",a:{"class":"average"},f:["max1"]}]}," ",{ -p:[13,7,338],t:7,e:"th",f:[{p:[13,11,342],t:7,e:"span",a:{"class":"bad"},f:["max2"]}]}]}]}," ",{p:[15,5,401],t:7,e:"tbody",f:[{t:4,f:[{p:[16,32,441],t:7,e:"tr",f:[{p:[17,9,455],t:7,e:"th",f:[{t:3,r:"name",p:[17,13,459]}]}," ",{t:4,f:[{p:[18,27,502],t:7,e:"td",f:[{p:[19,11,518],t:7,e:"ui-button",a:{action:"threshold",params:['{"env": "',{t:2,r:"env",p:[19,58,565]},'", "var": "',{t:2,r:"val",p:[19,76,583]},'"}']},f:[{t:2,x:{r:["selected"],s:"Math.fixed(_0,2)"},p:[19,87,594]}]}]}],n:52,r:"settings",p:[18,9,484]}]}],n:52,r:"data.thresholds",p:[16,7,416]}]}," ",{p:[23,3,697],t:7,e:"table",f:[]}]}]}," "]},i.exports.components=i.exports.components||{};var o={back:t(211)};for(var a in o)o.hasOwnProperty(a)&&(i.exports.components[a]=o[a]);e.exports=r.extend(i.exports)},{196:196,211:211}],217:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,113],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Vent Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,166],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,188]}]},f:[{p:[9,7,211],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,264]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,306]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,383]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,403]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,417]}]}]}," ",{p:[13,7,482],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,517],t:7,e:"span",f:[{t:2,x:{r:["direction"],s:'_0=="release"?"Pressurizing":"Siphoning"'},p:[14,15,523]}]}]}," ",{p:[16,7,616],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[17,9,665],t:7,e:"ui-button",a:{icon:"sign-in",style:[{t:2,x:{r:["incheck"],s:'_0?"selected":null'},p:[17,42,698]}],action:"incheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[18,48,779]},'", "val": ',{t:2,r:"checks",p:[18,68,799]},"}"]},f:["Internal"]}," ",{p:[19,9,842],t:7,e:"ui-button",a:{icon:"sign-out",style:[{t:2,x:{r:["excheck"],s:'_0?"selected":null'},p:[19,43,876]}],action:"excheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,957]},'", "val": ',{t:2,r:"checks",p:[20,68,977]},"}"]},f:["External"]}]}," ",{p:[22,7,1039],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,9,1085],t:7,e:"ui-button",a:{icon:"pencil",action:"external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[24,31,1168]},'" "pressure": "custom"}']},f:[{t:2,x:{r:["external"],s:"Math.fixed(_0)"},p:[24,67,1204]}]}," ",{p:[25,9,1250],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["extdefault"],s:'_0?"disabled":null'},p:[25,42,1283]}],action:"external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[26,31,1377]},'" "pressure": "reset"}']},f:["Reset"]}]}]}],n:52,r:"data.vents",p:[7,3,140]},{t:4,n:51,f:[{p:[30,5,1490],t:7,e:"span",a:{"class":"bad"},f:["Error: No vents connected."]}],r:"data.vents"}]}]},i.exports.components=i.exports.components||{};var o={back:t(211)};for(var a in o)o.hasOwnProperty(a)&&(i.exports.components[a]=o[a]);e.exports=r.extend(i.exports)},{196:196,211:211}],218:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.css=" table {\r\n width: 100%;\r\n border-spacing: 2px;\r\n }\r\n th {\r\n text-align: left;\r\n }\r\n td {\r\n vertical-align: top;\r\n }\r\n td .button {\r\n margin-top: 4px\r\n }",i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",f:[{p:[3,5,34],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oneAccess"],s:'_0?"unlock":"lock"'},p:[3,22,51]}],action:"one_access"},f:[{t:2,x:{r:["data.oneAccess"],s:'_0?"One":"All"'},p:[3,82,111]}," Required"]}," ",{p:[4,5,172],t:7,e:"ui-button",a:{icon:"refresh",action:"clear"},f:["Clear"]}]}," ",{p:[6,3,251],t:7,e:"hr"}," ",{p:[7,3,260],t:7,e:"table",f:[{p:[8,3,271],t:7,e:"thead",f:[{p:[9,4,283],t:7,e:"tr",f:[{t:4,f:[{p:[10,5,315],t:7,e:"th",f:[{p:[10,9,319],t:7,e:"span",a:{"class":"highlight bold"},f:[{t:2,r:"name",p:[10,38,348]}]}]}],n:52,r:"data.regions",p:[9,8,287]}]}]}," ",{p:[13,3,403],t:7,e:"tbody",f:[{p:[14,4,415],t:7,e:"tr",f:[{t:4,f:[{p:[15,5,447],t:7,e:"td",f:[{t:4,f:[{p:[16,11,481],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["req"],s:'_0?"check-square-o":"square-o"'},p:[16,28,498]}],style:[{t:2,x:{r:["req"],s:'_0?"selected":null'},p:[16,76,546]}],action:"set",params:['{"access": "',{t:2,r:"id",p:[17,46,621]},'"}']},f:[{t:2,r:"name",p:[17,56,631]}]}," ",{p:[18,9,661],t:7,e:"br"}],n:52,r:"accesses",p:[15,9,451]}]}],n:52,r:"data.regions",p:[14,8,419]}]}]}]}]}," "]},e.exports=r.extend(i.exports)},{196:196}],219:[function(t,e,n){var r=t(196),i={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}},computed:{malfAction:function(){switch(this.get("data.malfStatus")){case 1:return"hack";case 2:return"occupy";case 3:return"deoccupy"}},malfButton:function(){switch(this.get("data.malfStatus")){case 1:return"Override Programming";case 2:case 4:return"Shunt Core Process";case 3:return"Return to Main Core"}},malfIcon:function(){switch(this.get("data.malfStatus")){case 1:return"terminal";case 2:case 4:return"caret-square-o-down";case 3:return"caret-square-o-left"}},powerCellStatusState:function(){var t=this.get("data.powerCellStatus");return t>50?"good":t>25?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{p:[46,1,1150],t:7,e:"ui-notice",f:[{t:4,f:[{p:[48,5,1195],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[49,7,1238],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[49,24,1255]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[49,75,1306]}]}]}],n:50,r:"data.siliconUser",p:[47,3,1165]},{t:4,n:51,f:[{p:[52,5,1397],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[52,31,1423]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[55,1,1508],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[56,3,1545],t:7,e:"ui-section",a:{label:"Main Breaker"},f:[{t:4,f:[{p:[58,7,1632],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isOperating"],s:'_0?"good":"bad"'},p:[58,20,1645]}]},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[58,59,1684]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[57,5,1584]},{t:4,n:51,f:[{p:[60,7,1748],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[60,24,1765]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[60,77,1818]}],action:"breaker"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[61,26,1886]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}," ",{p:[64,3,1967],t:7,e:"ui-section",a:{label:"External Power"},f:[{p:[65,5,2008],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.externalPower"],s:"_0(_1)"},p:[65,18,2021]}]},f:[{t:2,x:{r:["data.externalPower"],s:'_0==2?"Good":_0==1?"Low":"None"'},p:[65,54,2057]}]}]}," ",{p:[67,3,2164],t:7,e:"ui-section",a:{label:"Power Cell"},f:[{t:4,f:[{p:[69,7,2245],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerCellStatus",p:[69,40,2278]}],state:[{t:2,r:"powerCellStatusState",p:[69,73,2311]}]},f:[{t:2,x:{r:["adata.powerCellStatus"],s:"Math.fixed(_0)"},p:[69,99,2337]},"%"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[68,5,2201]},{t:4,n:51,f:[{p:[71,7,2406],t:7,e:"span",a:{"class":"bad"},f:["Power cell removed."]}],x:{r:["data.powerCellStatus"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[75,5,2526],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{t:4,f:[{p:[77,9,2616],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.chargeMode"],s:'_0?"good":"bad"'},p:[77,22,2629]}]},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[77,60,2667]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[76,7,2566]},{t:4,n:51,f:[{p:[79,9,2736],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.chargeMode"],s:'_0?"refresh":"close"'},p:[79,26,2753]}],style:[{t:2,x:{r:["data.chargeMode"],s:'_0?"selected":null'},p:[79,76,2803]}],action:"charge"},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[80,27,2871]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}," [",{p:[83,8,2957],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.chargingStatus"],s:"_0(_1)"},p:[83,21,2970]}]},f:[{t:2,x:{r:["data.chargingStatus"],s:'_0==2?"Fully Charged":_0==1?"Charging":"Not Charging"'},p:[83,58,3007]}]},"]"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[74,3,2484]}]}," ",{p:[87,1,3165],t:7,e:"ui-display",a:{title:"Power Channels"},f:[{t:4,f:[{p:[89,5,3238],t:7,e:"ui-section",a:{label:[{t:2,r:"title",p:[89,24,3257]}],nowrap:0},f:[{p:[90,7,3283],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.powerChannels"],s:"Math.round(_1[_0].powerLoad)"},p:[90,28,3304]}," W"]}," ",{p:[91,7,3373],t:7,e:"div",a:{"class":"content"},f:[{p:[91,28,3394],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0>=2?"good":"bad"'},p:[91,41,3407]}]},f:[{t:2,x:{r:["status"],s:'_0>=2?"On":"Off"'},p:[91,75,3441]}]}]}," ",{p:[92,7,3492],t:7,e:"div",a:{"class":"content"},f:["[",{p:[92,29,3514],t:7,e:"span",f:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"Auto":"Manual"'},p:[92,35,3520]}]},"]"]}," ",{p:[93,7,3592],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{t:4,f:[{p:[95,11,3695],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"selected":null'},p:[95,44,3728]}],action:"channel",params:[{t:2,r:"topicParams.auto",p:[96,38,3818]}]},f:["Auto"]}," ",{p:[97,11,3868],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["status"],s:'_0==2?"selected":null'},p:[97,46,3903]}],action:"channel",params:[{t:2,r:"topicParams.on",p:[98,21,3978]}]},f:["On"]}," ",{p:[99,11,4024],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["status"],s:'_0==0?"selected":null'},p:[99,42,4055]}],action:"channel",params:[{t:2,r:"topicParams.off",p:[100,21,4130]}]},f:["Off"]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[94,9,3643]}]}]}],n:52,r:"data.powerChannels",p:[88,3,3204]}," ",{p:[105,3,4233],t:7,e:"ui-section",a:{label:"Total Load"},f:[{p:[106,5,4270],t:7,e:"span",a:{"class":"bold"},f:[{t:2,x:{r:["adata.totalLoad"],s:"Math.round(_0)"},p:[106,24,4289]}," W"]}]}]}," ",{t:4,f:[{p:[110,3,4391],t:7,e:"ui-display",a:{title:"System Overrides"},f:[{p:[111,5,4434],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"overload"},f:["Overload"]}," ",{t:4,f:[{p:[113,7,4539],t:7,e:"ui-button",a:{icon:[{t:2,r:"malfIcon",p:[113,24,4556]}],state:[{t:2,x:{r:["data.malfStatus"],s:'_0==4?"disabled":null'},p:[113,45,4577]}],action:[{t:2,r:"malfAction",p:[113,99,4631]}]},f:[{t:2,r:"malfButton",p:[113,115,4647]}]}],n:50,r:"data.malfStatus",p:[112,5,4508]}]}],n:50,r:"data.siliconUser",p:[109,1,4363]},{p:[117,1,4714],t:7,e:"ui-notice",f:[{p:[118,3,4729],t:7,e:"ui-section",a:{label:"Cover Lock"},f:[{t:4,f:[{p:[120,7,4814],t:7,e:"span",f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[120,13,4820]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[119,5,4766]},{t:4,n:51,f:[{p:[122,7,4896],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.coverLocked"],s:'_0?"lock":"unlock"'},p:[122,24,4913]}],action:"cover"},f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[122,81,4970]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}]},e.exports=r.extend(i.exports)},{196:196}],220:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "custom"}'},f:["Set"]}," ",{p:[8,5,361],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,391]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,523],t:7,e:"span",a:{"class":"buttoninfo"},f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,30,548]}," kPa"]}]}," ",{p:[11,3,614],t:7,e:"ui-section",a:{label:"Filter"},f:[{p:[12,5,647],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0==-1?"selected":null'},p:[12,23,665]}],action:"filter",params:'{"mode": -1}'},f:["Nothing"]}," ",{p:[14,5,783],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0==0?"selected":null'},p:[14,23,801]}],action:"filter",params:'{"mode": 0}'},f:["Plasma"]}," ",{p:[16,5,916],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0==1?"selected":null'},p:[16,23,934]}],action:"filter",params:'{"mode": 1}'},f:["O2"]}," ",{p:[18,5,1045],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0==2?"selected":null'},p:[18,23,1063]}],action:"filter",params:'{"mode": 2}'},f:["N2"]}," ",{p:[20,5,1174],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0==3?"selected":null'},p:[20,23,1192]}],action:"filter",params:'{"mode": 3}'},f:["CO2"]}," ",{p:[22,5,1304],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0==4?"selected":null'},p:[22,23,1322]}],action:"filter",params:'{"mode": 4}'},f:["N2O"]}]}]}]},e.exports=r.extend(i.exports)},{196:196}],221:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "custom"}'},f:["Set"]}," ",{p:[8,5,361],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,391]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,523],t:7,e:"span",a:{"class":"buttoninfo"},f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,30,548]}," kPa"]}]}," ",{p:[11,3,614],t:7,e:"ui-section",a:{label:"Node 1"},f:[{p:[12,5,647],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[12,44,686]}],action:"node1",params:'{"concentration": -0.1}'}}," ",{p:[14,5,803],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[14,39,837]}],action:"node1",params:'{"concentration": -0.01}'}}," ",{p:[16,5,955],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[16,38,988]}],action:"node1",params:'{"concentration": 0.01}'}}," ",{p:[18,5,1107],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[18,43,1145]}],action:"node1",params:'{"concentration": 0.1}'}}," ",{p:[20,5,1263],t:7,e:"span",a:{"class":"buttoninfo"},f:[{t:2,x:{r:["adata.node1_concentration"],s:"Math.round(_0)"},p:[20,30,1288]},"%"]}]}," ",{p:[22,3,1358],t:7,e:"ui-section",a:{label:"Node 2"},f:[{p:[23,5,1391],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[23,44,1430]}],action:"node2",params:'{"concentration": -0.1}'}}," ",{p:[25,5,1547],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[25,39,1581]}],action:"node2",params:'{"concentration": -0.01}'}}," ",{p:[27,5,1699],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[27,38,1732]}],action:"node2",params:'{"concentration": 0.01}'}}," ",{p:[29,5,1851],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[29,43,1889]}],action:"node2",params:'{"concentration": 0.1}'}}," ",{p:[31,5,2007],t:7,e:"span",a:{"class":"buttoninfo"},f:[{t:2,x:{r:["adata.node2_concentration"],s:"Math.round(_0)"},p:[31,30,2032]},"%"]}]}]}]},e.exports=r.extend(i.exports)},{196:196}],222:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{t:4,f:[{p:[7,5,250],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{p:[8,7,292],t:7,e:"ui-button",a:{icon:"pencil",action:"transfer",params:'{"rate": "custom"}'},f:["Set"]}," ",{p:[9,7,386],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.transfer_rate","data.max_rate"],s:'_0==_1?"disabled":null'},p:[9,37,416]}],action:"transfer",params:'{"rate": "max"}'},f:["Max"]}," ",{p:[10,7,543],t:7,e:"span",a:{"class":"buttoninfo"},f:[{t:2,x:{r:["adata.transfer_rate"],s:"Math.round(_0)"},p:[10,32,568]}," L/s"]}]}],n:50,r:"data.max_rate",p:[6,3,223]},{t:4,n:51,f:[{p:[13,5,651],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,695],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "custom"}'},f:["Set"]}," ",{p:[15,7,793],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[15,37,823]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,957],t:7,e:"span",a:{"class":"buttoninfo"},f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[16,32,982]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=r.extend(i.exports)},{196:196}],223:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:{button:[{p:[6,5,185],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.canLabel"],s:'_0?null:"disabled"'},p:[6,37,217]}],action:"relable"},f:["Relabel"]}]},t:7,e:"ui-display",a:{title:"Canister",button:0},f:[" ",{p:[8,3,312],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[9,5,347],t:7,e:"span",f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[9,11,353]}," kPa"]}]}," ",{p:[11,3,419],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[12,5,450],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.portConnected"],s:'_0?"good":"average"'},p:[12,18,463]}]},f:[{t:2,x:{r:["data.portConnected"],s:'_0?"Connected":"Not Connected"'},p:[12,63,508]}]}]}]}," ",{p:[15,1,603],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[16,3,633],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[17,5,676],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[17,18,689]}],max:[{t:2,r:"data.maxReleasePressure",p:[17,52,723]}],value:[{t:2,r:"data.releasePressure",p:[18,14,766]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[18,40,792]}," kPa"]}]}," ",{p:[20,3,863],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[21,5,908],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[21,38,941]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[23,5,1097],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[23,36,1128]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[25,5,1275],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "custom"}'},f:["Set"]}," ",{p:[26,5,1371],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[26,35,1401]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[29,3,1563],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[30,5,1595],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[30,22,1612]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[31,14,1666]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[32,22,1760]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[38,7,1948],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[38,38,1979]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[37,5,1913]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[42,3,2113],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[43,4,2144]}]}," ",{p:[45,3,2190],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[46,4,2224]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[41,3,2082]},{t:4,n:51,f:[{p:[49,3,2306],t:7,e:"ui-section",f:[{p:[50,4,2323],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=r.extend(i.exports)},{196:196}],224:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,64],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,85]}],value:[{t:2,r:"data.energy",p:[3,53,112]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,129]}," Units"]}]}]}," ",{p:{button:[{t:4,f:[{p:[9,7,315],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[9,37,345]}],action:"amount",params:['{"amount": ',{t:2,r:".",p:[9,114,422]},"}"]},f:[{t:2,r:".",p:[9,122,430]}]}],n:52,r:"data.beakerTransferAmounts",p:[8,5,271]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[12,3,482],t:7,e:"ui-section",f:[{t:4,f:[{p:[14,7,532],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[14,74,599]},'"}']},f:[{t:2,r:"title",p:[14,84,609]}]}],n:52,r:"data.chemicals",p:[13,5,500]}]}]}," ",{p:{button:[{t:4,f:[{p:[21,7,786],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[21,66,845]},"}"]},f:[{t:2,r:".",p:[21,74,853]}]}],n:52,r:"data.beakerTransferAmounts",p:[20,5,742]}," ",{p:[23,5,891],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[23,36,922]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[25,3,1019],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[27,7,1089],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[27,13,1095]},"/",{t:2,r:"data.beakerMaxVolume",p:[27,55,1137]}," Units"]}," ",{p:[28,7,1182],t:7,e:"br"}," ",{t:4,f:[{p:[30,9,1235],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[30,52,1278]}," units of ",{t:2,r:"name",p:[30,87,1313]}]},{p:[30,102,1328],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[29,7,1195]},{t:4,n:51,f:[{p:[32,9,1359],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[26,5,1054]},{t:4,n:51,f:[{p:[35,7,1435],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=r.extend(i.exports)},{196:196}],225:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,35],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,84]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,137]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,186]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,249]}]}]}," ",{p:[8,3,314],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,346],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature"},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,50,392]}," K"]}]}]}," ",{p:{button:[{p:[14,5,535],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,566]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,663],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,733],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,752]}," K"]}," ",{p:[19,7,802],t:7,e:"br"}," ",{t:4,f:[{p:[21,9,856],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[21,52,899]}," units of ",{t:2,r:"name",p:[21,87,934]}]},{p:[21,102,949],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[20,7,816]},{t:4,n:51,f:[{p:[23,9,980],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,698]},{t:4,n:51,f:[{p:[26,7,1056],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=r.extend(i.exports)},{196:196}],226:[function(t,e,n){var r=t(196),i={exports:{}};!function(t){"use strict";t.exports={computed:{cellTemperatureState:function(){var t=this.get("data.cellTemperature");return 225>t?"good":273.15>t?"average":"bad"},occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(i),i.exports.template={v:3,t:[" ",{p:[21,1,488],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[22,3,521],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[23,3,554],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[23,9,560]}]}]}," ",{t:4,f:[{p:[26,5,677],t:7,e:"ui-section",a:{label:"State"},f:[{p:[27,7,711],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[27,20,724]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[27,43,747]}]}]}," ",{p:[29,4,868],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[30,6,907],t:7,e:"span",f:[{t:2,x:{r:["adata.occupant.bodyTemperature"],s:"Math.round(_0)"},p:[30,12,913]}," K"]}]}," ",{p:[32,5,992],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[33,7,1027],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[33,20,1040]}],max:[{t:2,r:"data.occupant.maxHealth",p:[33,54,1074]}],value:[{t:2,r:"data.occupant.health",p:[33,90,1110]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[34,16,1152]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[34,68,1204]}]}]}," ",{t:4,f:[{p:[37,7,1441],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[37,26,1460]}]},f:[{p:[38,9,1481],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[38,30,1502]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[38,66,1538]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[38,103,1575]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[36,5,1275]}],n:50,r:"data.hasOccupant",p:[25,3,647]}]}," ",{p:[43,1,1684],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[44,3,1713],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[45,5,1745],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[45,22,1762]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[46,14,1822]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[47,14,1878]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[48,22,1937]}]}]}," ",{p:[50,3,2005],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[51,3,2041],t:7,e:"span",a:{"class":[{t:2,r:"cellTemperatureState",p:[51,16,2054]}]},f:[{t:2,x:{r:["adata.cellTemperature"],s:"Math.round(_0)"},p:[51,42,2080]}," K"]}]}," ",{p:[53,2,2145],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[54,5,2176],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[54,22,2193]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[54,73,2244]}]}," ",{p:[55,5,2297],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[55,22,2314]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[55,86,2378]}]}]}]}," ",{p:{button:[{p:[60,5,2524],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[60,36,2555]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[62,3,2658],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[65,9,2768],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[65,52,2811]}," units of ",{t:2,r:"name",p:[65,87,2846]}]},{p:[65,102,2861],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[64,7,2728]},{t:4,n:51,f:[{p:[67,9,2892],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[63,5,2693]},{t:4,n:51,f:[{p:[70,7,2968],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=r.extend(i.exports)},{196:196}],227:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=r.extend(i.exports)},{196:196}],228:[function(t,e,n){var r=t(196),i={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{p:[24,1,653],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,685],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,725],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,758]}],state:[{t:2,r:"capacityPercentState",p:[26,71,791]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,817]},"%"]}]}]}," ",{p:[29,1,898],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,928],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,966],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,983]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1035]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1103]}]},"   [",{p:[34,6,1172],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1185]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1201]}]},"]"]}," ",{p:[36,3,1325],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1364],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1385]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1416]}]},f:[{t:2,x:{r:["adata.inputLevel"],s:"Math.round(_0)"},p:[37,78,1437]},"W"]}]}," ",{p:[39,3,1499],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1538],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1577]}],action:"input",params:'{"input": "min"}'}}," ",{p:[41,5,1671],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1705]}],action:"input",params:'{"input": "minus"}'}}," ",{p:[42,5,1801],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"input": "custom"}'},f:["Set"]}," ",{p:[43,5,1891],t:7,e:"ui-button",a:{icon:"forward", -state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1924]}],action:"input",params:'{"input": "plus"}'}}," ",{p:[44,5,2036],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2074]}],action:"input",params:'{"input": "max"}'}}]}," ",{p:[46,3,2200],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2234],t:7,e:"span",f:[{t:2,x:{r:["adata.inputAvailable"],s:"Math.round(_0)"},p:[47,9,2240]},"W"]}]}]}," ",{p:[50,1,2317],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2348],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2386],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2403]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2458]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2528]}]},"   [",{p:[55,6,2596],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2609]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2626]}]},"]"]}," ",{p:[57,3,2733],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2773],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2794]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2826]}]},f:[{t:2,x:{r:["adata.outputLevel"],s:"Math.round(_0)"},p:[58,80,2848]},"W"]}]}," ",{p:[60,3,2911],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2951],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,2990]}],action:"output",params:'{"output": "min"}'}}," ",{p:[62,5,3087],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3121]}],action:"output",params:'{"output": "minus"}'}}," ",{p:[63,5,3220],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"output": "custom"}'},f:["Set"]}," ",{p:[64,5,3312],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3345]}],action:"output",params:'{"output": "plus"}'}}," ",{p:[65,5,3461],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3499]}],action:"output",params:'{"output": "max"}'}}]}," ",{p:[67,3,3629],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3664],t:7,e:"span",f:[{t:2,x:{r:["adata.outputUsed"],s:"Math.round(_0)"},p:[68,9,3670]},"W"]}]}]}]},e.exports=r.extend(i.exports)},{196:196}],229:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"control",params:'{"cdir": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"control",params:'{"cdir": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"control",params:'{"cdir": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"control",params:'{"cdir": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"control",params:'{"tdir": -180}'},f:["180°"]}," ",{p:[29,5,1536],t:7,e:"ui-button",a:{icon:"step-backward",action:"control",params:'{"tdir": -30}'},f:["30°"]}," ",{p:[30,5,1633],t:7,e:"ui-button",a:{icon:"backward",action:"control",params:'{"tdir": -5}'},f:["5°"]}," ",{p:[31,5,1723],t:7,e:"ui-button",a:{icon:"forward",action:"control",params:'{"tdir": 5}'},f:["5°"]}," ",{p:[32,5,1811],t:7,e:"ui-button",a:{icon:"step-forward",action:"control",params:'{"tdir": 30}'},f:["30°"]}," ",{p:[33,5,1906],t:7,e:"ui-button",a:{icon:"fast-forward",action:"control",params:'{"tdir": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2094],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2175],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2215],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2228]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2273]},"Found"]}]}," ",{p:[43,2,2344],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2381],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2394]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2438]}," Panels Connected"]}]}]}]},e.exports=r.extend(i.exports)},{196:196}],230:[function(t,e,n){var r=t(196),i={exports:{}};!function(e){"use strict";e.exports={data:{text:t(234)}}}(i),i.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[12,7,182],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[11,5,157]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[15,3,271],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[16,5,303],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[16,22,320]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[17,14,371]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[18,22,426]}]}]}," ",{p:[20,3,485],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[22,7,549],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[22,40,582]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[22,61,603]},"%"]}],n:50,r:"data.hasPowercell",p:[21,5,516]},{t:4,n:51,f:[{p:[24,4,662],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[28,1,739],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[29,3,774],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[30,3,818],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[30,9,824]},"°C"]}]}," ",{p:[32,2,889],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[33,3,932],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[33,9,938]},"°C"]}]}," ",{t:4,f:[{p:[36,2,1023],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[37,7,1065],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[37,46,1104]}],action:"target",params:'{"target": -20}'}}," ",{p:[38,7,1210],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[38,41,1244]}],action:"target",params:'{"target": -5}'}}," ",{p:[39,7,1349],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "custom"}'},f:["Set"]}," ",{p:[40,7,1443],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[40,40,1476]}],action:"target",params:'{"target": 5}'}}," ",{p:[41,7,1580],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[41,45,1618]}],action:"target",params:'{"target": 20}'}}]}],n:50,r:"data.open",p:[35,3,1003]}," ",{p:[44,3,1747],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[46,7,1801],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[46,46,1840]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[47,7,1949],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[47,48,1990]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[48,7,2099],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[48,41,2133]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[45,3,1776]},{t:4,n:51,f:[{p:[50,4,2251],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[50,10,2257]}]}],r:"data.open"}]}]}]},e.exports=r.extend(i.exports)},{196:196,234:234}],231:[function(t,e,n){var r=t(196),i={exports:{}};!function(t){"use strict";t.exports={data:{tankPressureState:function(){var t=this.get("data.tankPressureState");return t>=200?"good":t>=100?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{p:[14,1,286],t:7,e:"ui-notice",f:[{p:[15,3,301],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[15,23,321]}," connected to a mask."]}]}," ",{p:[17,1,406],t:7,e:"ui-display",f:[{p:[18,3,422],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,464],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,498]}],state:[{t:2,r:"tankPressureState",p:[20,16,537]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,560]}," kPa"]}]}," ",{p:[22,3,628],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,671],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,684]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,718]}],value:[{t:2,r:"data.releasePressure",p:[24,14,761]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,787]}," kPa"]}]}," ",{p:[26,3,858],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,903],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,936]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1092],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1123]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1270],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "custom"}'},f:["Set"]}," ",{p:[32,5,1366],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1396]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[36,5,1590],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[36,22,1607]}],state:[{t:2,x:{r:["data.maskConnected"],s:'_0?null:"disabled"'},p:[36,69,1654]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[37,22,1720]}]}]}]}]},e.exports=r.extend(i.exports)},{196:196}],232:[function(t,e,n){(function(e){"use strict";var n=t(196),r=e.interopRequireDefault(n);t(192),t(1),t(190),t(191);var i=t(197),o=e.interopRequireDefault(i),a=t(235),s=e.interopRequireDefault(a),u=t(198);r["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(233)),o["default"].load({custom:{families:["FontAwesome"],urls:["https://netdna.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css"],testStrings:{FontAwesome:""}}}),window.initialize=function(t){window.tgui||(window.tgui=new s["default"]({el:"#container",data:function(){return JSON.parse(t)}}))};var c=document.getElementById("data");"{}"!==c.textContent?window.initialize(c.textContent):((0,u.act)(c.getAttribute("data-ref"),"tgui:initialize"),c.remove())}).call(this,t("babel/external-helpers"))},{1:1,190:190,191:191,192:192,196:196,197:197,198:198,233:233,235:235,"babel/external-helpers":"babel/external-helpers"}],233:[function(t,e,n){"use strict";function r(t,e,n){return Math.max(t,Math.min(n,e))}function i(t){var e=arguments.length<=1||void 0===arguments[1]?1:arguments[1];return+(Math.round(t+"e"+e)+"e-"+e)}Object.defineProperty(n,"__esModule",{value:!0}),n.clamp=r,n.fixed=i},{}],234:[function(t,e,n){"use strict";function r(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function i(t){return t.replace(/\w\S*/g,r)}Object.defineProperty(n,"__esModule",{value:!0}),n.upperCaseFirst=r,n.titleCase=i},{}],235:[function(t,e,n){var r=t(196),i={exports:{}};!function(e){"use strict";var n=t(198),r=t(209);e.exports={components:{"ui-bar":t(199),"ui-button":t(200),"ui-display":t(201),"ui-notice":t(202),"ui-section":t(204),"ui-subdisplay":t(205)},events:{enter:t(194).enter,space:t(194).space},transitions:{fade:t(195)},onconfig:function(){var e=this.get("config.interface"),n={air_alarm:t(210),airlock_electronics:t(218),apc:t(219),atmos_filter:t(220),atmos_mixer:t(221),atmos_pump:t(222),canister:t(223),chem_dispenser:t(224),chem_heater:t(225),cryo:t(226),error:t(227),smes:t(228),solar_control:t(229),space_heater:t(230),tanks:t(231)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){var t=this;this.on("titlebar.drag",function(){return t.toggle("drag"),!1}),this.on("resize.resize",function(){return t.toggle("resize"),!1}),document.addEventListener("mousemove",function(e){t.get("drag")?r.drag.bind(t)(e):t.get("resize")&&r.resize.bind(t)(e)}),document.addEventListener("mouseup",function(e){t.set({drag:!1,resize:!1,x:null,y:null})})},onrender:function(){var t=this;this.observe("config.style",function(e,n,r){n&&(document.body.classList.remove(n),t.el.classList.remove(n)),e&&document.body.classList.add(e),t.el.classList.add(e)})},oncomplete:function(){(0,n.winset)("mapwindow.map","focus",!0)}}}(i),i.exports.template={v:3,t:[" "," "," "," ",{p:[71,1,2245],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[71,11,2255]}]}," ",{p:[72,1,2286],t:7,e:"main",f:[{p:[73,3,2296],t:7,e:"warnings"}," ",{p:[74,3,2311],t:7,e:"interface"}]}," ",{p:[76,1,2334],t:7,e:"resize"}]},i.exports.components=i.exports.components||{};var o={warnings:t(207),titlebar:t(206),resize:t(203)};for(var a in o)o.hasOwnProperty(a)&&(i.exports.components[a]=o[a]);e.exports=r.extend(i.exports)},{194:194,195:195,196:196,198:198,199:199,200:200,201:201,202:202,203:203,204:204,205:205,206:206,207:207,209:209,210:210,218:218,219:219,220:220,221:221,222:222,223:223,224:224,225:225,226:226,227:227,228:228,229:229,230:230,231:231}],"babel/external-helpers":[function(t,e,n){var r={};!function(t){var e=t.babelHelpers={};e["typeof"]="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t},e.jsx=function(){var t="function"==typeof Symbol&&Symbol["for"]&&Symbol["for"]("react.element")||60103;return function(e,n,r,i){var o=e&&e.defaultProps,a=arguments.length-3;if(n||0===a||(n={}),n&&o)for(var s in o)void 0===n[s]&&(n[s]=o[s]);else n||(n=o||{});if(1===a)n.children=i;else if(a>1){for(var u=Array(a),c=0;a>c;c++)u[c]=arguments[c+3];n.children=u}return{$$typeof:t,type:e,key:void 0===r?null:""+r,ref:null,props:n,_owner:null}}}(),e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function r(i,o){try{var a=e[i](o),s=a.value}catch(u){return void n(u)}a.done?t(s):Promise.resolve(s).then(function(t){r("next",t)},function(t){r("throw",t)})}r("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function r(t,e,n,i){var o=Object.getOwnPropertyDescriptor(t,e);if(void 0===o){var a=Object.getPrototypeOf(t);null!==a&&r(a,e,n,i)}else if("value"in o&&o.writable)o.value=n;else{var s=o.set;void 0!==s&&s.call(i,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],r=!0,i=!1,o=void 0;try{for(var a,s=t[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!e||n.length!==e);r=!0);}catch(u){i=!0,o=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw o}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,r=[],i=t[Symbol.iterator]();!(n=i.next()).done&&(r.push(n.value),!e||r.length!==e););return r}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e50?"good":t>25?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{p:[46,1,1150],t:7,e:"ui-notice",f:[{t:4,f:[{p:[48,5,1195],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[49,7,1238],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[49,24,1255]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[49,75,1306]}]}]}],n:50,r:"data.siliconUser",p:[47,3,1165]},{t:4,n:51,f:[{p:[52,5,1397],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[52,31,1423]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[55,1,1508],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[56,3,1545],t:7,e:"ui-section",a:{label:"Main Breaker"},f:[{t:4,f:[{p:[58,7,1632],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isOperating"],s:'_0?"good":"bad"'},p:[58,20,1645]}]},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[58,59,1684]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[57,5,1584]},{t:4,n:51,f:[{p:[60,7,1748],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[60,24,1765]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[60,77,1818]}],action:"breaker"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[61,26,1886]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}," ",{p:[64,3,1967],t:7,e:"ui-section",a:{label:"External Power"},f:[{p:[65,5,2008],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.externalPower"],s:"_0(_1)"},p:[65,18,2021]}]},f:[{t:2,x:{r:["data.externalPower"],s:'_0==2?"Good":_0==1?"Low":"None"'},p:[65,54,2057]}]}]}," ",{p:[67,3,2164],t:7,e:"ui-section",a:{label:"Power Cell"},f:[{t:4,f:[{p:[69,7,2245],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerCellStatus",p:[69,40,2278]}],state:[{t:2,r:"powerCellStatusState",p:[69,73,2311]}]},f:[{t:2,x:{r:["adata.powerCellStatus"],s:"Math.fixed(_0)"},p:[69,99,2337]},"%"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[68,5,2201]},{t:4,n:51,f:[{p:[71,7,2406],t:7,e:"span",a:{"class":"bad"},f:["Power cell removed."]}],x:{r:["data.powerCellStatus"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[75,5,2526],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{t:4,f:[{p:[77,9,2616],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.chargeMode"],s:'_0?"good":"bad"'},p:[77,22,2629]}]},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[77,60,2667]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[76,7,2566]},{t:4,n:51,f:[{p:[79,9,2736],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.chargeMode"],s:'_0?"refresh":"close"'},p:[79,26,2753]}],style:[{t:2,x:{r:["data.chargeMode"],s:'_0?"selected":null'},p:[79,76,2803]}],action:"charge"},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[80,27,2871]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}," [",{p:[83,8,2957],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.chargingStatus"],s:"_0(_1)"},p:[83,21,2970]}]},f:[{t:2,x:{r:["data.chargingStatus"],s:'_0==2?"Fully Charged":_0==1?"Charging":"Not Charging"'},p:[83,58,3007]}]},"]"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[74,3,2484]}]}," ",{p:[87,1,3165],t:7,e:"ui-display",a:{title:"Power Channels"},f:[{t:4,f:[{p:[89,5,3238],t:7,e:"ui-section",a:{label:[{t:2,r:"title",p:[89,24,3257]}],nowrap:0},f:[{p:[90,7,3283],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.powerChannels"],s:"Math.round(_1[_0].powerLoad)"},p:[90,28,3304]}," W"]}," ",{p:[91,7,3373],t:7,e:"div",a:{"class":"content"},f:[{p:[91,28,3394],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0>=2?"good":"bad"'},p:[91,41,3407]}]},f:[{t:2,x:{r:["status"],s:'_0>=2?"On":"Off"'},p:[91,75,3441]}]}]}," ",{p:[92,7,3492],t:7,e:"div",a:{"class":"content"},f:["[",{p:[92,29,3514],t:7,e:"span",f:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"Auto":"Manual"'},p:[92,35,3520]}]},"]"]}," ",{p:[93,7,3592],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{t:4,f:[{p:[95,11,3695],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"selected":null'},p:[95,44,3728]}],action:"channel",params:[{t:2,r:"topicParams.auto",p:[96,38,3818]}]},f:["Auto"]}," ",{p:[97,11,3868],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["status"],s:'_0==2?"selected":null'},p:[97,46,3903]}],action:"channel",params:[{t:2,r:"topicParams.on",p:[98,21,3978]}]},f:["On"]}," ",{p:[99,11,4024],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["status"],s:'_0==0?"selected":null'},p:[99,42,4055]}],action:"channel",params:[{t:2,r:"topicParams.off",p:[100,21,4130]}]},f:["Off"]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[94,9,3643]}]}]}],n:52,r:"data.powerChannels",p:[88,3,3204]}," ",{p:[105,3,4233],t:7,e:"ui-section",a:{label:"Total Load"},f:[{p:[106,5,4270],t:7,e:"span",a:{"class":"bold"},f:[{t:2,x:{r:["adata.totalLoad"],s:"Math.round(_0)"},p:[106,24,4289]}," W"]}]}]}," ",{t:4,f:[{p:[110,3,4391],t:7,e:"ui-display",a:{title:"System Overrides"},f:[{p:[111,5,4434],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"overload"},f:["Overload"]}," ",{t:4,f:[{p:[113,7,4539],t:7,e:"ui-button",a:{icon:[{t:2,r:"malfIcon",p:[113,24,4556]}],state:[{t:2,x:{r:["data.malfStatus"],s:'_0==4?"disabled":null'},p:[113,45,4577]}],action:[{t:2,r:"malfAction",p:[113,99,4631]}]},f:[{t:2,r:"malfButton",p:[113,115,4647]}]}],n:50,r:"data.malfStatus",p:[112,5,4508]}]}],n:50,r:"data.siliconUser",p:[109,1,4363]},{p:[117,1,4714],t:7,e:"ui-notice",f:[{p:[118,3,4729],t:7,e:"ui-section",a:{label:"Cover Lock"},f:[{t:4,f:[{p:[120,7,4814],t:7,e:"span",f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[120,13,4820]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[119,5,4766]},{t:4,n:51,f:[{p:[122,7,4896],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.coverLocked"],s:'_0?"lock":"unlock"'},p:[122,24,4913]}],action:"cover"},f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[122,81,4970]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}]},e.exports=r.extend(i.exports)},{196:196}],220:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "custom"}'},f:["Set"]}," ",{p:[8,5,361],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,391]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,523],t:7,e:"span",a:{"class":"buttoninfo"},f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,30,548]}," kPa"]}]}," ",{p:[11,3,614],t:7,e:"ui-section",a:{label:"Filter"},f:[{p:[12,5,647],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0==""?"selected":null'},p:[12,23,665]}],action:"filter",params:'{"mode": ""}'},f:["Nothing"]}," ",{p:[14,5,783],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="plasma"?"selected":null'},p:[14,23,801]}],action:"filter",params:'{"mode": "plasma"}'},f:["Plasma"]}," ",{p:[16,5,930],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="o2"?"selected":null'},p:[16,23,948]}],action:"filter",params:'{"mode": "o2"}'},f:["O2"]}," ",{p:[18,5,1065],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="n2"?"selected":null'},p:[18,23,1083]}],action:"filter",params:'{"mode": "n2"}'},f:["N2"]}," ",{p:[20,5,1200],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="co2"?"selected":null'},p:[20,23,1218]}],action:"filter",params:'{"mode": "co2"}'},f:["CO2"]}," ",{p:[22,5,1338],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="n2o"?"selected":null'},p:[22,23,1356]}],action:"filter",params:'{"mode": "n2o"}'},f:["N2O"]}]}]}]},e.exports=r.extend(i.exports)},{196:196}],221:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "custom"}'},f:["Set"]}," ",{p:[8,5,361],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,391]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,523],t:7,e:"span",a:{"class":"buttoninfo"},f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,30,548]}," kPa"]}]}," ",{p:[11,3,614],t:7,e:"ui-section",a:{label:"Node 1"},f:[{p:[12,5,647],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[12,44,686]}],action:"node1",params:'{"concentration": -0.1}'}}," ",{p:[14,5,803],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[14,39,837]}],action:"node1",params:'{"concentration": -0.01}'}}," ",{p:[16,5,955],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[16,38,988]}],action:"node1",params:'{"concentration": 0.01}'}}," ",{p:[18,5,1107],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[18,43,1145]}],action:"node1",params:'{"concentration": 0.1}'}}," ",{p:[20,5,1263],t:7,e:"span",a:{"class":"buttoninfo"},f:[{t:2,x:{r:["adata.node1_concentration"],s:"Math.round(_0)"},p:[20,30,1288]},"%"]}]}," ",{p:[22,3,1358],t:7,e:"ui-section",a:{label:"Node 2"},f:[{p:[23,5,1391],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[23,44,1430]}],action:"node2",params:'{"concentration": -0.1}'}}," ",{p:[25,5,1547],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[25,39,1581]}],action:"node2",params:'{"concentration": -0.01}'}}," ",{p:[27,5,1699],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[27,38,1732]}],action:"node2",params:'{"concentration": 0.01}'}}," ",{p:[29,5,1851],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[29,43,1889]}],action:"node2",params:'{"concentration": 0.1}'}}," ",{p:[31,5,2007],t:7,e:"span",a:{"class":"buttoninfo"},f:[{t:2,x:{r:["adata.node2_concentration"],s:"Math.round(_0)"},p:[31,30,2032]},"%"]}]}]}]},e.exports=r.extend(i.exports)},{196:196}],222:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{t:4,f:[{p:[7,5,250],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{p:[8,7,292],t:7,e:"ui-button",a:{icon:"pencil",action:"transfer",params:'{"rate": "custom"}'},f:["Set"]}," ",{p:[9,7,386],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.transfer_rate","data.max_rate"],s:'_0==_1?"disabled":null'},p:[9,37,416]}],action:"transfer",params:'{"rate": "max"}'},f:["Max"]}," ",{p:[10,7,543],t:7,e:"span",a:{"class":"buttoninfo"},f:[{t:2,x:{r:["adata.transfer_rate"],s:"Math.round(_0)"},p:[10,32,568]}," L/s"]}]}],n:50,r:"data.max_rate",p:[6,3,223]},{t:4,n:51,f:[{p:[13,5,651],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,695],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "custom"}'},f:["Set"]}," ",{p:[15,7,793],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[15,37,823]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,957],t:7,e:"span",a:{"class":"buttoninfo"},f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[16,32,982]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=r.extend(i.exports)},{196:196}],223:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:{button:[{p:[6,5,185],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.canLabel"],s:'_0?null:"disabled"'},p:[6,37,217]}],action:"relable"},f:["Relabel"]}]},t:7,e:"ui-display",a:{title:"Canister",button:0},f:[" ",{p:[8,3,312],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[9,5,347],t:7,e:"span",f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[9,11,353]}," kPa"]}]}," ",{p:[11,3,419],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[12,5,450],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.portConnected"],s:'_0?"good":"average"'},p:[12,18,463]}]},f:[{t:2,x:{r:["data.portConnected"],s:'_0?"Connected":"Not Connected"'},p:[12,63,508]}]}]}]}," ",{p:[15,1,603],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[16,3,633],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[17,5,676],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[17,18,689]}],max:[{t:2,r:"data.maxReleasePressure",p:[17,52,723]}],value:[{t:2,r:"data.releasePressure",p:[18,14,766]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[18,40,792]}," kPa"]}]}," ",{p:[20,3,863],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[21,5,908],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[21,38,941]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[23,5,1097],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[23,36,1128]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[25,5,1275],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "custom"}'},f:["Set"]}," ",{p:[26,5,1371],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[26,35,1401]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[29,3,1563],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[30,5,1595],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[30,22,1612]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[31,14,1666]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[32,22,1760]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[38,7,1948],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[38,38,1979]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[37,5,1913]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[42,3,2113],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[43,4,2144]}]}," ",{p:[45,3,2190],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[46,4,2224]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[41,3,2082]},{t:4,n:51,f:[{p:[49,3,2306],t:7,e:"ui-section",f:[{p:[50,4,2323],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=r.extend(i.exports)},{196:196}],224:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,64],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,85]}],value:[{t:2,r:"data.energy",p:[3,53,112]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,129]}," Units"]}]}]}," ",{p:{button:[{t:4,f:[{p:[9,7,315],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[9,37,345]}],action:"amount",params:['{"amount": ',{t:2,r:".",p:[9,114,422]},"}"]},f:[{t:2,r:".",p:[9,122,430]}]}],n:52,r:"data.beakerTransferAmounts",p:[8,5,271]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[12,3,482],t:7,e:"ui-section",f:[{t:4,f:[{p:[14,7,532],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[14,74,599]},'"}']},f:[{t:2,r:"title",p:[14,84,609]}]}],n:52,r:"data.chemicals",p:[13,5,500]}]}]}," ",{p:{button:[{t:4,f:[{p:[21,7,786],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[21,66,845]},"}"]},f:[{t:2,r:".",p:[21,74,853]}]}],n:52,r:"data.beakerTransferAmounts",p:[20,5,742]}," ",{p:[23,5,891],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[23,36,922]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[25,3,1019],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[27,7,1089],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[27,13,1095]},"/",{t:2,r:"data.beakerMaxVolume",p:[27,55,1137]}," Units"]}," ",{p:[28,7,1182],t:7,e:"br"}," ",{t:4,f:[{p:[30,9,1235],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[30,52,1278]}," units of ",{t:2,r:"name",p:[30,87,1313]}]},{p:[30,102,1328],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[29,7,1195]},{t:4,n:51,f:[{p:[32,9,1359],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[26,5,1054]},{t:4,n:51,f:[{p:[35,7,1435],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=r.extend(i.exports)},{196:196}],225:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,35],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,84]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,137]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,186]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,249]}]}]}," ",{p:[8,3,314],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,346],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature"},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,50,392]}," K"]}]}]}," ",{p:{button:[{p:[14,5,535],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,566]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,663],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,733],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,752]}," K"]}," ",{p:[19,7,802],t:7,e:"br"}," ",{t:4,f:[{p:[21,9,856],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[21,52,899]}," units of ",{t:2,r:"name",p:[21,87,934]}]},{p:[21,102,949],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[20,7,816]},{t:4,n:51,f:[{p:[23,9,980],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,698]},{t:4,n:51,f:[{p:[26,7,1056],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=r.extend(i.exports)},{196:196}],226:[function(t,e,n){var r=t(196),i={exports:{}};!function(t){"use strict";t.exports={computed:{cellTemperatureState:function(){var t=this.get("data.cellTemperature");return 225>t?"good":273.15>t?"average":"bad"},occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(i),i.exports.template={v:3,t:[" ",{p:[21,1,488],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[22,3,521],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[23,3,554],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[23,9,560]}]}]}," ",{t:4,f:[{p:[26,5,677],t:7,e:"ui-section",a:{label:"State"},f:[{p:[27,7,711],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[27,20,724]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[27,43,747]}]}]}," ",{p:[29,4,868],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[30,6,907],t:7,e:"span",f:[{t:2,x:{r:["adata.occupant.bodyTemperature"],s:"Math.round(_0)"},p:[30,12,913]}," K"]}]}," ",{p:[32,5,992],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[33,7,1027],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[33,20,1040]}],max:[{t:2,r:"data.occupant.maxHealth",p:[33,54,1074]}],value:[{t:2,r:"data.occupant.health",p:[33,90,1110]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[34,16,1152]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[34,68,1204]}]}]}," ",{t:4,f:[{p:[37,7,1441],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[37,26,1460]}]},f:[{p:[38,9,1481],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[38,30,1502]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[38,66,1538]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[38,103,1575]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[36,5,1275]}],n:50,r:"data.hasOccupant",p:[25,3,647]}]}," ",{p:[43,1,1684],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[44,3,1713],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[45,5,1745],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[45,22,1762]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[46,14,1822]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[47,14,1878]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[48,22,1937]}]}]}," ",{p:[50,3,2005],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[51,3,2041],t:7,e:"span",a:{"class":[{t:2,r:"cellTemperatureState",p:[51,16,2054]}]},f:[{t:2,x:{r:["adata.cellTemperature"],s:"Math.round(_0)"},p:[51,42,2080]}," K"]}]}," ",{p:[53,2,2145],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[54,5,2176],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[54,22,2193]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[54,73,2244]}]}," ",{p:[55,5,2297],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[55,22,2314]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[55,86,2378]}]}]}]}," ",{p:{button:[{p:[60,5,2524],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[60,36,2555]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[62,3,2658],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[65,9,2768],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[65,52,2811]}," units of ",{t:2,r:"name",p:[65,87,2846]}]},{p:[65,102,2861],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[64,7,2728]},{t:4,n:51,f:[{p:[67,9,2892],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[63,5,2693]},{t:4,n:51,f:[{p:[70,7,2968],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=r.extend(i.exports)},{196:196}],227:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=r.extend(i.exports)},{196:196}],228:[function(t,e,n){var r=t(196),i={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{p:[24,1,653],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,685],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,725],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,758]}],state:[{t:2,r:"capacityPercentState",p:[26,71,791]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,817]},"%"]}]}]}," ",{p:[29,1,898],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,928],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,966],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,983]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1035]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1103]}]},"   [",{p:[34,6,1172],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1185]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1201]}]},"]"]}," ",{p:[36,3,1325],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1364],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1385]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1416]}]},f:[{t:2,x:{r:["adata.inputLevel"],s:"Math.round(_0)"},p:[37,78,1437]},"W"]}]}," ",{p:[39,3,1499],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1538],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1577]}],action:"input",params:'{"input": "min"}'}}," ",{p:[41,5,1671],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1705]}],action:"input",params:'{"input": "minus"}'}}," ",{p:[42,5,1801],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"input": "custom"}'},f:["Set"]}," ",{p:[43,5,1891], +t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1924]}],action:"input",params:'{"input": "plus"}'}}," ",{p:[44,5,2036],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2074]}],action:"input",params:'{"input": "max"}'}}]}," ",{p:[46,3,2200],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2234],t:7,e:"span",f:[{t:2,x:{r:["adata.inputAvailable"],s:"Math.round(_0)"},p:[47,9,2240]},"W"]}]}]}," ",{p:[50,1,2317],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2348],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2386],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2403]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2458]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2528]}]},"   [",{p:[55,6,2596],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2609]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2626]}]},"]"]}," ",{p:[57,3,2733],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2773],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2794]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2826]}]},f:[{t:2,x:{r:["adata.outputLevel"],s:"Math.round(_0)"},p:[58,80,2848]},"W"]}]}," ",{p:[60,3,2911],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2951],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,2990]}],action:"output",params:'{"output": "min"}'}}," ",{p:[62,5,3087],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3121]}],action:"output",params:'{"output": "minus"}'}}," ",{p:[63,5,3220],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"output": "custom"}'},f:["Set"]}," ",{p:[64,5,3312],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3345]}],action:"output",params:'{"output": "plus"}'}}," ",{p:[65,5,3461],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3499]}],action:"output",params:'{"output": "max"}'}}]}," ",{p:[67,3,3629],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3664],t:7,e:"span",f:[{t:2,x:{r:["adata.outputUsed"],s:"Math.round(_0)"},p:[68,9,3670]},"W"]}]}]}]},e.exports=r.extend(i.exports)},{196:196}],229:[function(t,e,n){var r=t(196),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"control",params:'{"cdir": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"control",params:'{"cdir": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"control",params:'{"cdir": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"control",params:'{"cdir": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"control",params:'{"tdir": -180}'},f:["180°"]}," ",{p:[29,5,1536],t:7,e:"ui-button",a:{icon:"step-backward",action:"control",params:'{"tdir": -30}'},f:["30°"]}," ",{p:[30,5,1633],t:7,e:"ui-button",a:{icon:"backward",action:"control",params:'{"tdir": -5}'},f:["5°"]}," ",{p:[31,5,1723],t:7,e:"ui-button",a:{icon:"forward",action:"control",params:'{"tdir": 5}'},f:["5°"]}," ",{p:[32,5,1811],t:7,e:"ui-button",a:{icon:"step-forward",action:"control",params:'{"tdir": 30}'},f:["30°"]}," ",{p:[33,5,1906],t:7,e:"ui-button",a:{icon:"fast-forward",action:"control",params:'{"tdir": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2094],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2175],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2215],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2228]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2273]},"Found"]}]}," ",{p:[43,2,2344],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2381],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2394]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2438]}," Panels Connected"]}]}]}]},e.exports=r.extend(i.exports)},{196:196}],230:[function(t,e,n){var r=t(196),i={exports:{}};!function(e){"use strict";e.exports={data:{text:t(234)}}}(i),i.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[12,7,182],t:7,e:"ui-button",a:{icon:"eject",action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[11,5,157]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[15,3,271],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[16,5,303],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[16,22,320]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[17,14,371]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[18,22,426]}]}]}," ",{p:[20,3,485],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[22,7,549],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[22,40,582]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[22,61,603]},"%"]}],n:50,r:"data.hasPowercell",p:[21,5,516]},{t:4,n:51,f:[{p:[24,4,662],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[28,1,739],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[29,3,774],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[30,3,818],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[30,9,824]},"°C"]}]}," ",{p:[32,2,889],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[33,3,932],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[33,9,938]},"°C"]}]}," ",{t:4,f:[{p:[36,2,1023],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[37,7,1065],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[37,46,1104]}],action:"target",params:'{"target": -20}'}}," ",{p:[38,7,1210],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[38,41,1244]}],action:"target",params:'{"target": -5}'}}," ",{p:[39,7,1349],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "custom"}'},f:["Set"]}," ",{p:[40,7,1443],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[40,40,1476]}],action:"target",params:'{"target": 5}'}}," ",{p:[41,7,1580],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[41,45,1618]}],action:"target",params:'{"target": 20}'}}]}],n:50,r:"data.open",p:[35,3,1003]}," ",{p:[44,3,1747],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[46,7,1801],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[46,46,1840]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[47,7,1949],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[47,48,1990]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[48,7,2099],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[48,41,2133]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[45,3,1776]},{t:4,n:51,f:[{p:[50,4,2251],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[50,10,2257]}]}],r:"data.open"}]}]}]},e.exports=r.extend(i.exports)},{196:196,234:234}],231:[function(t,e,n){var r=t(196),i={exports:{}};!function(t){"use strict";t.exports={data:{tankPressureState:function(){var t=this.get("data.tankPressureState");return t>=200?"good":t>=100?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{p:[14,1,286],t:7,e:"ui-notice",f:[{p:[15,3,301],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[15,23,321]}," connected to a mask."]}]}," ",{p:[17,1,406],t:7,e:"ui-display",f:[{p:[18,3,422],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,464],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,498]}],state:[{t:2,r:"tankPressureState",p:[20,16,537]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,560]}," kPa"]}]}," ",{p:[22,3,628],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,671],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,684]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,718]}],value:[{t:2,r:"data.releasePressure",p:[24,14,761]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,787]}," kPa"]}]}," ",{p:[26,3,858],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,903],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,936]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1092],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1123]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1270],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "custom"}'},f:["Set"]}," ",{p:[32,5,1366],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1396]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[36,5,1590],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[36,22,1607]}],state:[{t:2,x:{r:["data.maskConnected"],s:'_0?null:"disabled"'},p:[36,69,1654]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[37,22,1720]}]}]}]}]},e.exports=r.extend(i.exports)},{196:196}],232:[function(t,e,n){(function(e){"use strict";var n=t(196),r=e.interopRequireDefault(n);t(192),t(1),t(190),t(191);var i=t(197),o=e.interopRequireDefault(i),a=t(235),s=e.interopRequireDefault(a),u=t(198);r["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(233)),o["default"].load({custom:{families:["FontAwesome"],urls:["https://netdna.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css"],testStrings:{FontAwesome:""}}}),window.initialize=function(t){window.tgui||(window.tgui=new s["default"]({el:"#container",data:function(){return JSON.parse(t)}}))};var c=document.getElementById("data");"{}"!==c.textContent?window.initialize(c.textContent):((0,u.act)(c.getAttribute("data-ref"),"tgui:initialize"),c.remove())}).call(this,t("babel/external-helpers"))},{1:1,190:190,191:191,192:192,196:196,197:197,198:198,233:233,235:235,"babel/external-helpers":"babel/external-helpers"}],233:[function(t,e,n){"use strict";function r(t,e,n){return Math.max(t,Math.min(n,e))}function i(t){var e=arguments.length<=1||void 0===arguments[1]?1:arguments[1];return+(Math.round(t+"e"+e)+"e-"+e)}Object.defineProperty(n,"__esModule",{value:!0}),n.clamp=r,n.fixed=i},{}],234:[function(t,e,n){"use strict";function r(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function i(t){return t.replace(/\w\S*/g,r)}Object.defineProperty(n,"__esModule",{value:!0}),n.upperCaseFirst=r,n.titleCase=i},{}],235:[function(t,e,n){var r=t(196),i={exports:{}};!function(e){"use strict";var n=t(198),r=t(209);e.exports={components:{"ui-bar":t(199),"ui-button":t(200),"ui-display":t(201),"ui-notice":t(202),"ui-section":t(204),"ui-subdisplay":t(205)},events:{enter:t(194).enter,space:t(194).space},transitions:{fade:t(195)},onconfig:function(){var e=this.get("config.interface"),n={air_alarm:t(210),airlock_electronics:t(218),apc:t(219),atmos_filter:t(220),atmos_mixer:t(221),atmos_pump:t(222),canister:t(223),chem_dispenser:t(224),chem_heater:t(225),cryo:t(226),error:t(227),smes:t(228),solar_control:t(229),space_heater:t(230),tanks:t(231)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){var t=this;this.on("titlebar.drag",function(){return t.toggle("drag"),!1}),this.on("resize.resize",function(){return t.toggle("resize"),!1}),document.addEventListener("mousemove",function(e){t.get("drag")?r.drag.bind(t)(e):t.get("resize")&&r.resize.bind(t)(e)}),document.addEventListener("mouseup",function(e){t.set({drag:!1,resize:!1,x:null,y:null})})},onrender:function(){var t=this;this.observe("config.style",function(e,n,r){n&&(document.body.classList.remove(n),t.el.classList.remove(n)),e&&document.body.classList.add(e),t.el.classList.add(e)})},oncomplete:function(){(0,n.winset)("mapwindow.map","focus",!0)}}}(i),i.exports.template={v:3,t:[" "," "," "," ",{p:[71,1,2245],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[71,11,2255]}]}," ",{p:[72,1,2286],t:7,e:"main",f:[{p:[73,3,2296],t:7,e:"warnings"}," ",{p:[74,3,2311],t:7,e:"interface"}]}," ",{p:[76,1,2334],t:7,e:"resize"}]},i.exports.components=i.exports.components||{};var o={warnings:t(207),titlebar:t(206),resize:t(203)};for(var a in o)o.hasOwnProperty(a)&&(i.exports.components[a]=o[a]);e.exports=r.extend(i.exports)},{194:194,195:195,196:196,198:198,199:199,200:200,201:201,202:202,203:203,204:204,205:205,206:206,207:207,209:209,210:210,218:218,219:219,220:220,221:221,222:222,223:223,224:224,225:225,226:226,227:227,228:228,229:229,230:230,231:231}],"babel/external-helpers":[function(t,e,n){var r={};!function(t){var e=t.babelHelpers={};e["typeof"]="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t},e.jsx=function(){var t="function"==typeof Symbol&&Symbol["for"]&&Symbol["for"]("react.element")||60103;return function(e,n,r,i){var o=e&&e.defaultProps,a=arguments.length-3;if(n||0===a||(n={}),n&&o)for(var s in o)void 0===n[s]&&(n[s]=o[s]);else n||(n=o||{});if(1===a)n.children=i;else if(a>1){for(var u=Array(a),c=0;a>c;c++)u[c]=arguments[c+3];n.children=u}return{$$typeof:t,type:e,key:void 0===r?null:""+r,ref:null,props:n,_owner:null}}}(),e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function r(i,o){try{var a=e[i](o),s=a.value}catch(u){return void n(u)}a.done?t(s):Promise.resolve(s).then(function(t){r("next",t)},function(t){r("throw",t)})}r("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function r(t,e,n,i){var o=Object.getOwnPropertyDescriptor(t,e);if(void 0===o){var a=Object.getPrototypeOf(t);null!==a&&r(a,e,n,i)}else if("value"in o&&o.writable)o.value=n;else{var s=o.set;void 0!==s&&s.call(i,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],r=!0,i=!1,o=void 0;try{for(var a,s=t[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!e||n.length!==e);r=!0);}catch(u){i=!0,o=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw o}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,r=[],i=t[Symbol.iterator]();!(n=i.next()).done&&(r.push(n.value),!e||r.length!==e););return r}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e{{Math.round(adata.set_pressure)}} kPa - Nothing - Plasma - O2 - N2 - CO2 - N2O + Nothing + Plasma + O2 + N2 + CO2 + N2O - + \ No newline at end of file