diff --git a/.travis.yml b/.travis.yml
index 4df59432014..75272bdaf2f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,8 +3,8 @@ sudo: false
env:
global:
- - BYOND_MAJOR="509"
- - BYOND_MINOR="1319"
+ - BYOND_MAJOR="510"
+ - BYOND_MINOR="1322"
- NODE_VERSION="4"
matrix:
- DM_MAPFILE="tgstation2"
diff --git a/README.md b/README.md
index dfbbcebd098..93a95e3af6b 100644
--- a/README.md
+++ b/README.md
@@ -73,11 +73,6 @@ specified in the config.txt, and set the Security box to 'Safe'. Then press GO
and the server should start up and be ready to join. It is also recommended that
you set up the SQL backend (see below).
-###HOSTING ON LINUX
-We use BYGEX for some of our text replacement related code. Unfortunately, we
-only have a windows dll included right now. You can find a version known to compile on linux, along with some basic install instructions here
-https://github.com/optimumtact/byond-regex
-
##UPDATING
To update an existing installation, first back up your /config and /data folders
@@ -91,16 +86,22 @@ the new version.
##MAPS
-/tg/station currently comes equipped with three maps.
+/tg/station currently comes equipped with seven maps.
* [tgstation2 (default)](http://tgstation13.org/wiki/Boxstation)
+* [MetaStation](https://tgstation13.org/wiki/MetaStation)
* [MiniStation](http://tgstation13.org/wiki/MiniStation)
* [AsteroidStation](https://tgstation13.org/wiki/AsteroidStation)
+* [BirdStation](https://tgstation13.org/wiki/BirdStation)
+* [DreamStation](https://tgstation13.org/wiki/Dreamstation)
+* [EfficiencyStation](https://tgstation13.org/wiki/Efficiency_Station)
All maps have their own code file that is in the base of the _maps directory. Instead of loading the map directly we instead use a code file to include the map and then include any other code changes that are needed for it; for example MiniStation changes the uplink items for the map. Follow this guideline when adding your own map, to your fork, for easy compatibility.
If you want to load a different map, just open the corresponding map's code file in Dream Maker, make sure all of the other map code files are unticked in the file tree, in the left side of the screen, and then make sure the map code file you want is ticked.
+If you are hosting a server, and want randomly picked maps to be played each round, you can enable map rotation in [config.txt](config/config.txt) and then set the maps to be picked in the [maps.txt](config/maps.txt) file.
+
Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](http://tgstation13.org/wiki/Map_Merger)
##AWAY MISSIONS
diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm
index 1db28441f9c..930bd267c15 100644
--- a/_maps/RandomZLevels/Academy.dmm
+++ b/_maps/RandomZLevels/Academy.dmm
@@ -115,8 +115,8 @@
"ck" = (/obj/machinery/door/airlock/plasma,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"cl" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/academy/headmaster)
"cm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/academy/headmaster)
-"cn" = (/obj/machinery/computer/area_atmos/area,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/academy/headmaster)
-"co" = (/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/turf/simulated/floor/plating,/area/awaymission/academy/headmaster)
+"cn" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/academy/headmaster)
+"co" = (/obj/machinery/portable_atmospherics/scrubber/huge,/turf/simulated/floor/plating,/area/awaymission/academy/headmaster)
"cp" = (/obj/structure/bed/stool,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/academy/headmaster)
"cq" = (/obj/structure/table,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/item/weapon/pen/red,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms)
"cr" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms)
diff --git a/_maps/RandomZLevels/centcomAway.dmm b/_maps/RandomZLevels/centcomAway.dmm
index 876fea31083..2731714e96e 100644
--- a/_maps/RandomZLevels/centcomAway.dmm
+++ b/_maps/RandomZLevels/centcomAway.dmm
@@ -669,7 +669,7 @@
"mS" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/hangar)
"mT" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/hangar)
"mU" = (/obj/structure/rack,/obj/item/weapon/storage/secure/briefcase,/obj/item/weapon/storage/belt/utility/full,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
-"mV" = (/obj/machinery/computer/area_atmos,/turf/simulated/floor/plasteel{icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"mV" = (/turf/simulated/floor/plasteel{icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"mW" = (/obj/structure/bed/stool{pixel_y = 8},/turf/simulated/floor/plasteel{icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"mX" = (/obj/machinery/door/airlock/centcom{name = "Thunderdome Administration"; opacity = 1; req_access_txt = "102"},/turf/simulated/floor/plasteel{icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"mY" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
diff --git a/_maps/map_files/AsteroidStation/AsteroidStation.dmm b/_maps/map_files/AsteroidStation/AsteroidStation.dmm
index 635debf3985..4e58ab8d885 100644
--- a/_maps/map_files/AsteroidStation/AsteroidStation.dmm
+++ b/_maps/map_files/AsteroidStation/AsteroidStation.dmm
@@ -821,7 +821,7 @@
"apO" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/quartermaster/office)
"apP" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/quartermaster/office)
"apQ" = (/obj/effect/landmark/start{name = "Quartermaster"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/obj/structure/bed/chair,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/quartermaster/qm)
-"apR" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel{icon_state = "brown"},/area/quartermaster/qm)
+"apR" = (/obj/machinery/computer/cargo,/turf/simulated/floor/plasteel{icon_state = "brown"},/area/quartermaster/qm)
"apS" = (/obj/machinery/photocopier,/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "brown"},/area/quartermaster/qm)
"apT" = (/turf/simulated/floor/plasteel{icon_state = "brown"},/area/quartermaster/qm)
"apU" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "brown"},/area/quartermaster/qm)
@@ -1004,7 +1004,7 @@
"atp" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/hallway/secondary/construction{name = "Fore Central Hallway"})
"atq" = (/obj/structure/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"atr" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"ats" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"ats" = (/obj/machinery/computer/cargo/request,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"att" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "packageExternal"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
"atu" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"atv" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
@@ -1112,7 +1112,7 @@
"avt" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/hallway/secondary/construction{name = "Fore Central Hallway"})
"avu" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
"avv" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"avw" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel{dir = 1; icon_state = "browncorner"},/area/quartermaster/office)
+"avw" = (/obj/machinery/computer/cargo,/turf/simulated/floor/plasteel{dir = 1; icon_state = "browncorner"},/area/quartermaster/office)
"avx" = (/obj/item/weapon/stamp,/obj/item/weapon/stamp/denied{force = 15; pixel_x = 3; pixel_y = 2},/obj/structure/table/glass,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"avy" = (/obj/structure/table/glass,/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"avz" = (/obj/machinery/atmospherics/components/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office)
@@ -2322,7 +2322,6 @@
"aSH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless{icon_state = "warnplatecorner"; dir = 1},/area/engine/engineering)
"aSI" = (/turf/simulated/wall,/area/engine/engineering)
"aSJ" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating{icon_state = "warnplatecorner"; dir = 4},/area/engine/engineering)
-"aSK" = (/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/engine/engineering)
"aSL" = (/turf/simulated/floor/plasteel,/area/engine/engineering)
"aSM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"aSN" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering)
@@ -2655,7 +2654,7 @@
"aZc" = (/obj/machinery/light{dir = 1},/obj/machinery/airalarm{pixel_y = 24},/turf/simulated/floor/wood,/area/crew_quarters/heads)
"aZd" = (/obj/structure/table/wood,/obj/item/weapon/hand_labeler,/obj/machinery/camera{c_tag = "Head of Personnel's Office"},/turf/simulated/floor/wood,/area/crew_quarters/heads)
"aZe" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/extinguisher_cabinet{pixel_y = 30},/turf/simulated/floor/wood,/area/crew_quarters/heads)
-"aZf" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/wood,/area/crew_quarters/heads)
+"aZf" = (/obj/machinery/computer/cargo/request,/turf/simulated/floor/wood,/area/crew_quarters/heads)
"aZg" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/wood,/area/crew_quarters/heads)
"aZh" = (/obj/machinery/light{dir = 8},/obj/structure/fireaxecabinet{pixel_x = -32},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/bridge)
"aZi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/bridge)
@@ -3073,7 +3072,6 @@
"bhe" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/drinks/bottle/wine,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bhf" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 5; pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -6; pixel_y = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bhg" = (/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"bhh" = (/obj/structure/flora/tree/pine/xmas,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bhi" = (/obj/structure/bed/chair/wood/normal{dir = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bhj" = (/obj/machinery/airalarm{pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bhk" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
@@ -5723,7 +5721,7 @@
"cgc" = (/obj/structure/cable/pink{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/toxins/storage)
"cgd" = (/obj/machinery/portable_atmospherics/canister/nitrous_oxide,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/toxins/storage)
"cge" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/toxins/storage)
-"cgf" = (/obj/machinery/computer/area_atmos,/turf/simulated/floor/plasteel,/area/toxins/storage)
+"cgf" = (/turf/simulated/floor/plasteel,/area/toxins/storage)
"cgg" = (/obj/structure/cable/pink{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cgh" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cgi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research)
@@ -6380,7 +6378,7 @@
"csJ" = (/turf/simulated/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/supply)
"csK" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/shuttle/supply)
"csL" = (/obj/machinery/door/poddoor{id = "QMLoaddoor"; name = "Supply Dock Loading Door"},/obj/machinery/conveyor{dir = 2; id = "QMLoad"},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/supply)
-"csM" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dir = 1; dwidth = 7; width = 12},/obj/docking_port/stationary{dir = 1; dwidth = 7; height = 7; id = "supply_home"; name = "supply bay"; width = 12},/turf/simulated/floor/plating,/area/shuttle/supply)
+"csM" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dir = 1; dwidth = 7; width = 12},/obj/docking_port/stationary{dir = 1; dwidth = 7; height = 7; id = "supply_home"; name = "Cargo Bay"; width = 12},/turf/simulated/floor/plating,/area/shuttle/supply)
"csN" = (/turf/simulated/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/supply)
"csO" = (/turf/simulated/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/supply)
"csP" = (/turf/simulated/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
@@ -6714,8 +6712,6 @@
"czf" = (/obj/machinery/camera{c_tag = "Atmospherics South"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
"czg" = (/obj/machinery/camera{c_tag = "Atmospherics South East"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
"czh" = (/obj/machinery/camera{c_tag = "Escape Hallway East"; dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/hallway/secondary/exit)
-"czi" = (/obj/structure/flora/tree/festivus,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor)
-"czj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/flora/tree/pine/xmas,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"czk" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{tag = "icon-4-8"; icon_state = "4-8"},/turf/simulated/floor/plating/airless{icon_state = "warnplate"; dir = 4},/area/engine/engineering)
"czl" = (/obj/item/weapon/screwdriver,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/tesla_coil,/turf/simulated/floor/plating/airless,/area/engine/engineering)
"czm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{tag = "icon-2-8"; icon_state = "2-8"},/turf/simulated/floor/plating/airless{icon_state = "warnplate"; dir = 8},/area/engine/engineering)
@@ -6880,7 +6876,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaaeaaeaIiaIiaOoaOpaOpaOqaOraJjaOsaOtaOuaJjaOvaOwaOxaJjaPRaOzaOAaOBaSFaODaOEaOFaOGaOHaLXaOIaOJaOKaOLaOMaONaOObexaOQaORaOSaOTaOUaHBaOVaOWaCdaDeaCdaeHbmSaeHbmSaeHaeHaeHaeGaeGaeGaIyaeHaeGaeHaeHaeHaeHaeGaeHaeHaeHaeHaeGaeHaLaaOXaOXaOXaNzaNzaOYaLbaOZaPaaPbaPcaPdaPeaPfaPgaPhaPiaPhaPjaHIaeHaeHaCFaPkaPlaACaCFaPmaPnaGPaLpaPoaMDaPoaPqaPoaLqaLraMEaPsaPtaPtaPuaPvaPwaPxaFzaLwaPyaGkaGlaGlaGlaGlaGlaGlaGlaGlaGlaGlaGlaPzaPAaGlaMTaMTaPBaPCaPDaPEaPFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaaeaaeaaeaPGaPHaOpaOpaOpaOpaOpaPIaPJaPKaPLaPMaPLaPKaPNaJjaZCaPPaPQaPPbaXaPSaPTaPUaPVaPUaJvaPVaPWbeKaPYaPZaQaaQbaMcaMcaMcaQcaOTaOUaHBaOVaQdaCdaDeaCdaeGbmSaeHbmSaeHaeHaeHaeGaeGaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaLaaQeaQeaLaaLbaQfaQgaQhaQiaQjaQkaLbaQlaNJaQmaNHaMraHIaeGaeGaCFaQnayeaQoaQpaQpaQpaQpaQqaPoaQraQsaQtaQuaLqaQvaLsaQwaLuaLuaQxaQyaQzaQAaEBaQBaCFaGkapjapjapjapjapjapjapjapjapjaQCaQDaQEaQFaQGaQDaQHaQIaQJaOmaOmaQKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaaeaaeaaeaQLaQMaQNaQOaQPaQQaQRaLOaQSaQTaQUaLOaQVaOpaQWaJjaJjaJjaJjaJjaJjaJjaQXaQYaQZaRaaRaaRbaRcbiMaReaRfaONaRgaRhbiNaRjaRkaRlaRmaRnaRoaCdaCdaEfaCdaICboGaeGboGaeGaeGaLaaLaaLaaLaaRqaRraRsaRraRraRraRraRtaRuaRraRraRraRsaRvaRwaRxaRyaRzaRAaRBaRCaLbaLbaRDaREaRFaRGaLbaLbaMraMraRHaMraMraHIaHHaHHaCFawIayeaACaNSaRJaRKaRLaRMaPoaRNaROaQtaQtaLqaRPaRQaRRaRSaRSaRTaRUaLqaRVaFzaRWaRXaPpaRXaRZaRXaRXaRXaRXaRXaRXaRXaSaaSbaQEaScaSdaSeaMTaMTaMTaMTaMTaeGaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaSfaaeaaeaQLaQMaSgaShaSiaOpaSjaJjaJjaJjaJjaSkaSlaOpaSmaSnaSoaSpaJjaSqaSraJjaENaSsaSsaStaSsaSsaSsaSsaSuaSvaTSbjIbkZbkkaSxaOSaOTaOUaHBaHCaCdaSyaFZaSzaeGbnPaeHbnPaeHaeHaSAaSBaSAaSCaRraSDaSEbeRaTYaSGaSGaTYaSGaSGaSGaSGaSGaSHaSIaSJaSIaSKaSLaSMaSNaSOaSPaSQaSRaSSbBfaSUaLaaHIaHIaHIaHIaHIaHIaSVaSVaCdawIayeaACaQpaSWaSXaSYaSZaTaaTbaTcaQtaQtaLqaTdaLsaQwaLuaLuaTeaTfaLqaTgaThaTiaTjaTkaTlaRZbcKaTnaToaTmaRXaTpaTqaSaaTraTsaScaTtaTuaTvaeGaeGaeGboHaHHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaSfaaeaaeaQLaQMaSgaShaSiaOpaSjaJjaJjaJjaJjaSkaSlaOpaSmaSnaSoaSpaJjaSqaSraJjaENaSsaSsaStaSsaSsaSsaSsaSuaSvaTSbjIbkZbkkaSxaOSaOTaOUaHBaHCaCdaSyaFZaSzaeGbnPaeHbnPaeHaeHaSAaSBaSAaSCaRraSDaSEbeRaTYaSGaSGaTYaSGaSGaSGaSGaSGaSHaSIaSJaSIbiYaSLaSMaSNaSOaSPaSQaSRaSSbBfaSUaLaaHIaHIaHIaHIaHIaHIaSVaSVaCdawIayeaACaQpaSWaSXaSYaSZaTaaTbaTcaQtaQtaLqaTdaLsaQwaLuaLuaTeaTfaLqaTgaThaTiaTjaTkaTlaRZbcKaTnaToaTmaRXaTpaTqaSaaTraTsaScaTtaTuaTvaeGaeGaeGboHaHHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaadaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaaeaaeaaeaaeaQLaTxaSgaTyaTzaQOaTAaJjaTBaTCaTDaLOaTEaTFaTGaTHaTIaPKaTJaTKaTLaTMaTNaTOaTOaTOaTOaTOaTOaTPaTQaTRaTSaTTaMcaMcaTUaQcaTVaOUaHBaTWaCdaDeaFZaSzaeHbmSaeHbmSaeHaeHaLaaTXaLaaUdaRraTZaXfaVBbbpaVBaVBbbpaVBaVBaVBbbqaUcbbraSIaSIaUeaUfaUgaUhaUiaUiaUjaUkaUlaUmaUnaUoaUpaUqaUraUsaUtaUuaUvaEkaDkaCdaUwaUxaUyaQpaUzaUAaUBaUCaPoaUDaUEaUFaUFaUGaUHaLsaQwaLuaLuaLuaUIaLqaUJaUKaULaUMaUNaUOaUPaUQaURaUOaUQaUSaUTaUUaUVaUWaUXaUYaUZaVaaVbaaaaaaaaaboHaeGaeGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaadaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaaeaaeaaeaaeaVcaVdaVeaQMaVfaQMaQMaVgaVhaViaViaVjaVkaVlaVmaVnaVoaQMaVpaQMaVqaVraVsaNoaNoaNoaVtaNoaNoaVuaVvaVwaTSblOaNoaVyaVzaVAaNsaNtaNuaJKaCdaDeaFZaSzaeHbmSaeHbmSbnQaeGaLaaLaaLaaRraRrbbsbhRaVCaVDaVDaVDaVDaVCaVDaVDaVCaTZaVEaVFaSIaVGaVHaSLaVIaVJaVKaVLaVMaVNaVOaVPaVQaVRaUqaVSaVTaVUaCdaVVaVWaVXaCdaVYaVZaWaaWbaWcaWdblRaWfaPoaWgaWhaQtaWiaLqaWjaWkaWlaWmaWmaWmaWnaLqaWoaFzaWpaWqaWraWsaWtaWuaWvaWwaWxaWsaWyaWzaWAaWBaWCaWDaTtaWEaVbaaaaaaaaaboHaeGaHHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaadaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaaeaWFaaeaQLaQMaWGaOpaOpaOpaWHaJjaWIaWJaWKaJjaWLaQQaWMaWNaWOaQQaWPaWQaWRaWSaWTaRhaRhaRhaRhaRhaRhaRhaWUaWVaONaOObmGaWWaORaOSaWXaWYaHBaHCaCdaWZaXaaCdaeHbmSaeHbmSbnQaeHaaiaaiaXbaXcaXdaXebhUaVDaXgaXgaXgaVDaXgaXgaXgaVDaTZaXhaSIaSIaSIaSIaXiaSIaSIaSIaXjaXkaXlaXmaXnaXoaXpaUqaXqaXraXsaCdaXtaXuaXuaXvaXwaXxaXyaQpaQpaXzaQpaQpaPoaPoaPoaXAaPoaLqaLqaXBaLqaXCaXDaLqaLqaLqayRaFzaXEaXFaXFaRZaRZaXGaRXaRXaRXaRXaRXaRXaSaaXHaXIaWDaXJaXKaVbaVbaVbaeGboHaeGaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6890,7 +6886,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaLHaIiaIibcpbcqbcrbcsbctaJjaWIaWJaWKaJjbcubcvbcwaZwbcxbcybczbcybcybcybcybcAbcBbcCbcDbcEbcFbcGbcHbcIbcJbeTbcLbcMbcMbcNbcObcPaNuaJKaCdaDeaFZaSzaeHbmSaeHboGbnQaeHaaaaaiaYmaRraYnaYoaYpaVDaXgaVDbcQcztbcRaVDaXgaVDaTZaYraYsaNzbcSbcTaSLaSLbcUbcVaSIbcWbcXbcYbcZbdabdbbdcbddbdebdfbdgbdhbdibdjbdkbdlayebbObajbakbdmbdnbakbdmbyGaPobdpbdqbdrbdsbdtbdubdvbaqbdwbdxbdybdzaEBbbZbaubdAaRZbdBbdCbazbazbdDbdEbaCbdFaSabdGbdHbdIbdJbdKbdLbdMaVbaeHboHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaLHaIiaIiaIiaIiaIiaIiaJjaJjaJjaJjaJjbdOaOpbdPaZwbdQbcybdSbdRbdTbdUbdVbdWbdXbdYbdZbeabebbecaPYbedbeeaMabefbegbefaQcaMabbkaHBaHCaCdaDeaFZaSzaeHbnPaeHbnPbnQaeHaaaaaiaYmaRraYnaYoaYpaVDaXgaVDaVDaVDaVDaVDaXgaVDaTZaYraYsaNzaNzbehbeibejbekaSIaSIbelbembenbeobepbeqaLaberaSIaSIbesbetbeuaSIaSIbevayebbObanbanbajbewbajbajbyHaPoaPoaPobeybeybezaPoaPoaYQbyIbeAaPobeBaUKbeCbeDbeEbeFbeGbdCbazbeHbeIbeJbyJbeLaSabeMbeNbpBbePaQDbcnbeQaVbaeHboHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHbiGbiGbiGbgibghbgjbeUbeVbeWbeXaJjaSlaOpbeYaZwbeZbcybfabfbbfbbfbbfbbfcbfdbfebffbfgbfhbfibfjbfkbflbfmaNobfnaNobfobfpbfqaHBaHCaCdaDeaFZaSzaeHbmSaeHbmSbnQaeHaaiaaiaXbbfrbfsbftaYpaVDaXgaXgaXgaVDaXgaXgbfuaVDaTZaXhaSIaSIaSIaSIbfvaSIaSIaSIbfwbfxbembfybfzbfAbfBaSIbfCaSIbfDbfEbfFbfGbfHbfIbfJayebbObanbfKbfLbfMbfNbfNbfNbfNbfObfPbfQbfRbfSbfTaPobfUbfVbfWaPobfXaHbbfYaXFaXFaRZaRZbfZaRXaRXaRXaRXaRXaRXaSabgabgbbgcbgdbgebgfbggaVbaeGboHaeGaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbiGbiGbiGbiGbhAbhzbhBbgkaQMbglbgmbgnbgoaQMbgpaZwbgqbcybgrbgsbgtbgubgvbgwbgxbgybgzbgAbgBbgCbgDaZAbgEbgFbgGbgHbgIbgJaOTaOUaHBbgKaCdbgLaXaaCdaeHbmSaeHbmSbnQaeGaLaaLaaLaaRraRrbbsczmaVCaVDaVDaVCaVDaVDaVDaVDaVCaTZbgMaVFaSIaVGbgNbgObgPbgQbgRbgSaVObgTbgUbgVbgWbgXaSIbgYaSIbgZbhaaSLbhbbhcbfIbhdaPlbbObanbhebhfbbPbanbanbanbhhbhgbanbanbanbanbanbhjbanbanbanbhkbhlbhmbhnbhoaWsaWsbhpbhqbhrbhsaWsaWsbhtaWzaWAbhubhvaWDaQDbhwbhxbhyaVbaeHboHaeGaeGaHHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbiGbiGbiGbiGbhAbhzbhBbgkaQMbglbgmbgnbgoaQMbgpaZwbgqbcybgrbgsbgtbgubgvbgwbgxbgybgzbgAbgBbgCbgDaZAbgEbgFbgGbgHbgIbgJaOTaOUaHBbgKaCdbgLaXaaCdaeHbmSaeHbmSbnQaeGaLaaLaaLaaRraRrbbsczmaVCaVDaVDaVCaVDaVDaVDaVDaVCaTZbgMaVFaSIaVGbgNbgObgPbgQbgRbgSaVObgTbgUbgVbgWbgXaSIbgYaSIbgZbhaaSLbhbbhcbfIbhdaPlbbObanbhebhfbbPbanbanbanbanbhgbanbanbanbanbanbhjbanbanbanbhkbhlbhmbhnbhoaWsaWsbhpbhqbhrbhsaWsaWsbhtaWzaWAbhubhvaWDaQDbhwbhxbhyaVbaeHboHaeGaeGaHHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbiGbiGbiGbiGbiTbiCbjEbhCbhDaPJbhEaJoaPKaPKbhFaZwbcybcybcybcybcybcybhGaZwbhHbhIbhJbhKbhLbhMbhNaTRaTSbhOaMcaMcaMcaQcaTVaOUaHBaHCaCdbhPaDeaCdaeHbmSaeHbmSaeHaeHaLabhQaLaczoaRraTZbhSaSEbhTczpaSEaSEczpaSEaSEczpbcRczqaSIaSIaUebhVbhWbhXbhYbhZbhZbhZbiabibbicbidbieaLaajUaSIbifbigbihbihbiibfIbfJayebbObanbijbijbfMbikbanbanbanbanbilbimbimbimbimbimbinbfKbfKbanbhlbioaWpaWqaTmaTmbipbiqbirbirbirbisbitbiubivbiwbixbiybizbiAaVbaVbaVbaeHboHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbiGbiGbiGbiGbiHaIiaIiaIiaIibiDbiEbiFaJjaOpaOpaOpaZwbkobjCbkpbiIbiJbiIbiKaZwaZxaZxaZxaZxaZxaZxbiLaSvaONbyKaRhbyLaRjaRkaRlaRmbiObiPaCdaDeaDeaCdaeHbnPaeHbnPaeHaeHaSAbiQaSAaSCaRrbiRbiSbljbiUczrbiUbiUczrbiUbiUczrbiVbiWaSIbiXaSIbiYbiZbjabjbbjcbjdbjebjfbjgaLaaLaaLaaLaajUaSIaSIbfIbfIbfIaSIaSIbjhayebbObanbanbanbbPbanbanbjibjjbjkbanbjibjlbhibanbanbjmbjnbjlbjkbhlbiobjoaRXbjpaTpaRZbjqbjrbjsaTmaRXaTmbjtaMTbjuaQDaWDbjvbjwaVbaaaaaaaeGboHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbiGbiGbiGbiGbiGbiGbiGbiGaIibjxbjybjzaJjaJjbjAaJjaIiaIibjBbjBbjBbjBbjBbjBbjBbkrbjDbsEbjFbjGaMcbjHaSvaTSbjIbyNbyMaSxbjJaOTbjKbjLaIvaCdaDeaEfaCdaICboGaeGboGaeGaeGaLaaLaaLaaLaaRqaRrbjMbjNbjNczsbjNbjOczsbjNbjNczsbjPbjNbjQbjRbjSbjTbjUbjVbjWaSIbjXaSIbjYaSIaLaaHHaeGaeGaeGaeGaeGaeHaeHaeGaeGaCFbjZayebbObanbfLbfKbbPbanbkabkbbkbbkbbkbbkbbkbbkbbkcbanbjmbjlbjlbhibkdbkebkfaRXaRXaRXaRXaRXaRXaRXaRXaRXaRXbkgaMTaQEaQDaWDbkhbkiaVbaaiaaiaeHbnQaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6927,7 +6923,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIebIebIebIebMcbIebMdbMebMfbMgbMhbMiaaebKfaaeaaeaabaabaabaabaabaaeaaeaaeaaeaabaabaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaabaabbrvbLqbMjbvtbMkbMlbMmbMnbIkbIkbIkbIkbWkbsebRCbWmbWlbWmbJobMubMvbWpbWobWqbMzbJobWrbCtbDvbCpbWsbCrbWubDzbXkbMAbBmbGpbHrbMBbMCbMDbMEbMFbMGbHubLIbAebMHbMIbMJbMKbMKbMLbMMbMNbMObMPbMQbMRbMSbMTbMUbMVbMWbMXbMYbMZbNabNbbNcbNdbNebNfbNgbNhbNibNjbNkbNcbNlbNmbNnbNobNpbMBbNqbNqbNqbNrbNqbNqbNqbNqbBXbNsbNtbNubNubNubNubNubNvbNvbNvbNvbNvbNvbNvbNvbNvbNvbNvbNvbNvbNvbNvcwRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIebIebNxbNybIebNzbIebIebIebIebIeavbbNAaaeaaeaabaabaabaabaabaabaabaabaabaabaabaabaabaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaabaabbrvbrvbrvbrvbrvbrvbrvbrvbsebsebsebsebNBbJobJobNHbXlbNHbJobXpbXobXrbXqbXsbNZbJobXtbCtbDvbYVbYibDybWubCubYWbGobBmbGpbHrbAebKxbHubNNbNObNPbHubNQbJxbNRbNSbNTbNUbNVbNWbNXbNYbOpbOabObbOcbOdbOebOfbOgbLUbUWbOhbOibOjbOkbMVbOlbOmbMVbMQbMVbMQbOnbMKbMKbMKbOobODbAebOqbOrbOrbOrbOrbOsbOrbOrbOrbOrbOtbOubHuaabaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOvbOwbLibKdbIebOxbOybOzbOAbIeaabaabaabaabaabaabaabaadaadaadaadaadaabaabaabaabaabaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaabaabaabbrvbKjbKkbKlbKmbYYbYXbrvbrvbrvbrvbrvbNBbJocamcaAcaqcaXbNKbNKbNKccScccbNKbOLbJobWebCtbEvccxcdYcfsceHcfwbXkbOMbONbOObHrbCDbKxbHubHubOPbHubHubKxbAebOQbOQbOQbOQbORbOQbOQbOQbOSbOTbOUbOSbOVbOSbOWbOXbOYbPcbOZbPabPkbPcbOYbPdbPebPfbPgbPhbLObPibPjbMKbPSbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbHUbPmbHuaabaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPnbPobPpbPqbPrbPsbIebPtbPubIeaabaabaabaabaabaadaadaadaacaacaacaadaadaadaadaadaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaabaabaabaabbrvbsebsebLxbsebsebsebsebsebsebsebrvbNBbJocfxbNKbNKcglbNKbNKczibQBcgmcgGbPCbPDchwchAchAchAchAchAchVciPbTxbPEbBmbPFbHrbPGbPHbPIbPIbTIbTHbPIbPLbAebOSbPMbPNbPObPPckKckBbOSbQYbPTbPUbPVbPWbOSbNnbPXbPYcdObNnbNnbPZbQabQbbQcbNnbNnbQdbMKbQebQfbMKbMKbQgbQhbQibQjbQkbPlbQlbQmbQnbQobQpbQqbQrbPlbHUbPmbHuaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPnbPobPpbPqbPrbPsbIebPtbPubIeaabaabaabaabaabaadaadaadaacaacaacaadaadaadaadaadaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaabaabaabaabbrvbsebsebLxbsebsebsebsebsebsebsebrvbNBbJocfxbNKbNKcglbNKbNKbNKbQBcgmcgGbPCbPDchwchAchAchAchAchAchVciPbTxbPEbBmbPFbHrbPGbPHbPIbPIbTIbTHbPIbPLbAebOSbPMbPNbPObPPckKckBbOSbQYbPTbPUbPVbPWbOSbNnbPXbPYcdObNnbNnbPZbQabQbbQcbNnbNnbQdbMKbQebQfbMKbMKbQgbQhbQibQjbQkbPlbQlbQmbQnbQobQpbQqbQrbPlbHUbPmbHuaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQsbJcbJcbQtbIebQubIebIebIebIeaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaacaacaacaacaacaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbrvbMrbsebsebMsbsdbMtbsebsebsebsebPvbNBbJobJobJobJobJobJobJobJobJobJobJobJobJockMbFDcmRbFFcngbFIcnKcnLbGncnNbBmbQGbQHbQIbKzbKzbKzbKzbTJbKzbKzbKzbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbOSbScbQZbRabRdbRbbNnbRcbRdbRebRfbRgbNnbRhbRibLObMKbMKbMKbRjbRkbRlbRmbRnbRobRpbRqbRrbRsbRtbRubRvbPlbHUbPmbHuaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaibRwbIebIebIebGhbIeaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbrvbNCbsecopbrvbrvbrvbrvcorcorcorbrvbRxbMpbRybRybRybMpbMpcosbQxbRAbRBcoAbRBcoPbQxbQxcpnbQxbQxccNcbPceIbGnbGobBmbGpbUEbUEbUEbUEbUEbAebKxbOSbOSbOSbOSbRHbRIbRIbRIbRJbRKbRLbRIbRMbRNbRIbRObOSbRPbMKbRQbRTbRRbPXbRSbRTbRQbRUbRVbNnbRWbRXbRYbRZbSabSbbTFbPlbSdbSebSfbSgbShbSibSjcvKbSlbSmbSnbSobSpbSqbSrbSsbSsbSsbSsaeFaeFbStaeFbStbStbStbSubStbStbStaeFbStbStbStbStaeFaeFaeFaeFaeFaeFbSvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaajaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbrvbOBbsecpNbrvbPbcgDbrvcqnbsebsebrvbNBcqocqobQxbQxbQxbQxbSwbQxbSxcqpcqLcqKcvYcgFcwycwbbSEbQxbIpcgHcwzbIqbGobBmbGpbUEbUGbWwbWwbUEbAebKxbOSbSKbSLbSMbSNbSObSPbSPbSPbSQbSRbSSbSTbSUbSVbSWbSRbSXbOnbQfbRTbRRbPXbSYbRTbMKbRUbSZbTabTabTbbTcbTbbTabTdbTabPlbPlbPlbPlbTebTfbTgbThbTibTjbTkbTlbPlbTmbTnbHuaabaabaabaabaaeaaeagnaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagnaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6945,7 +6941,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbWbbWbbWbbYLcdKcdKcdLbZScdMcdKcdKcdKcdKcdKcdKbVtaaeaaeaaeaaeaaeaaeaaeaaecdNcdNcdNcdNbQybVubVubVubVubVubYhbYhcahcahcbfcahbYhcylbIpcbTbYhcdPcdQcdRcdScbYcdTcdUcdVcdWcdXcymbIqcdZbBmbTGbYsbYsbYsbYsbYsbYsbYsbYsbYsceacebceccedbYsceebYscefccrccrcegcehccrccrccrccrccrccrccrccrccrccrceiceYcljcelcfTcelcgxcfSceoccrcdvbNocepcbCcctceqcercescescetceucevceucewcdJccDccEccEcbGaaeaaeaaeaaeaaeagmaaebUncbHbUpaaebUncbHbUpaaebUncbHbUpaaeagmaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVsbVtbWbbWbbZVbZWbZXbZRbZSbZTcexbZWbZWbZWbZWceybVsaaeaaeaaeaaebWdaaeaaeaaecdNcezcezceAcezcezceBceCceCceCceBbSHbIpceDceEceFcyncyobIpcbTbYhcbicwBcbibYhbYhceJceKbYhbYhceLbYhbIqceMbBmbUDbYsceNceOcePceQbYsbZnbZnceRceSbZobZnceTceUbZnbZnbZnccrceVceWcelcdxceXcfUceZceZceZcelcelcdxcelcelcfdcelcelchccelcelcfebIrccrcfgcfgcfgcbGcbGcbCcbCcbCcbCcbCcbGcbGcbGcbGcbGcbGcbGcbGcbGaaeaaeaaeaaeaaeagmaaebUncfhbUpaaebUncfhbUpaaebUncfhbUpaaeagmaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbWbbZQbZRbZSbZTbZUbWbbWbbYLcaTcaUbVtaabaaeaaeaaeaaeaaeaaeaaecdNcficfjcfjcfkcflcfmcflcflcflcfncfocfocfpcfqcfrcfqcypcfqcftcfucfvcyqcyrcfycfzcfAbVCbYhcfBcfCcfDbIqbGobBmcfEbYscfFcawcckcfGcfHcfIcckcckcfJcfKcfLcfMcfNcfOcfOcfOccrcfPcfQcfRcfRcfRcfRcfRcfRcfRcfRcfRcfRcfRcfRcfVcfRcfRcencfRcfWcenchgchdcelcfXcfYchTaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagnaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbZVcgabWbbZVcgabWbbWbbVtbVtbVtbVtaabaabaabaaeaaeaaeaaeaaecdNcgbcgbcgbcgccgdcgdcgecgfcficeBbIpbIpcggcdUcghcgicghcarcarcgjcgkcytcarcarbUBcarcasbYhcfCcfCcfDbIqbGobBmbGpcecbZnbZncgncdicgocdiczjcdicgpcgqbZncgrcgscfOcgtcguccrcgvcgwcelcelcelcelcelcelcelcelcnXciDciNciMciEciMciMciMciMciFciMciMciGcelcgBcfYchTaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagmagmagnaaeagmagmagmagmagmagmagmagmaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbZVcgabWbbZVcgabWbbWbbVtbVtbVtbVtaabaabaabaaeaaeaaeaaeaaecdNcgbcgbcgbcgccgdcgdcgecgfcficeBbIpbIpcggcdUcghcgicghcarcarcgjcgkcytcarcarbUBcarcasbYhcfCcfCcfDbIqbGobBmbGpcecbZnbZncgncdicgocdicdicdicgpcgqbZncgrcgscfOcgtcguccrcgvcgwcelcelcelcelcelcelcelcelcnXciDciNciMciEciMciMciMciMciFciMciMciGcelcgBcfYchTaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagmagmagnaaeagmagmagmagmagmagmagmagmaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbWbbWbbWbbWbbWbbVtbVtaabaabaabaabaabaabaabaabaabbrvbrvcdNcdNcdNcdNcyIcdNcdNcdNcdNcdNcdNcgEcbiczccbjcgEbIqbIqbIqbIqbIqbIqcggbIpbIpbVCcgIcgJbYhcfBcgKcfDbIqcgLbBmcgMcgNcgOcgPcgQcgPcgRcgPcgPcgPcgScgPcgPcgTcfOcfOcgUcgVccrcgWcgXcgYcgZcgZcgZcgZcffcgZcgZcejchaciHciLcejcgZcgZcgZcgZchbcgZciOcjCcelcgBcfZccraaeaaeaaeaaeaaeaaeavbaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbWbbWbbWbbVtbVtaabaabaabaabaabaabaabaabaabaabbrvchkchlchlchlbrvchmchnchochpchpchqchrcyuchschuckHcyvchxchychzchzchzchncywchBchBchCchBchBchDchDchDchDchDbGochEchFchGbZncfOchHcfOchIcfOcfOcfOchJchKcfOcfOcfOcfOchLchMccrcelcgwcgzchNchOchOchOchOchOchOchOcgzcjCchOchOchOchOchOchOchQchOciRcjCcelcgBcfYccraaeccrccrccrccrccraaecgCaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbchWbWbbVtbVtaabaabaabaabaabaabaabaabaabaabaabbrvchXchYchYchYbrvbsechnchZciachzcibciccidciecifcigcihciicijchzchzcikchncyxchBcilcimcinchBciocipciqciqchDbCxcirciscitcgOcgOciucgOcitcivbZnbZnciwcfNbZncixcfNcfOcgtcguccrcelcgwcgzciychOcizciAciBciCciCchOcgzcjCchOcjAcjDcjBciIciJciKchOckccjIcgZckgchechfcyychfclpcllclqccraaeagnaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/BirdStation/BirdStation.dmm b/_maps/map_files/BirdStation/BirdStation.dmm
index 05482243770..654f570eaf9 100644
--- a/_maps/map_files/BirdStation/BirdStation.dmm
+++ b/_maps/map_files/BirdStation/BirdStation.dmm
@@ -701,7 +701,7 @@
"any" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/wall,/area/engine/engineering)
"anz" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 8},/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor/plasteel,/area/hallway/primary/port{name = "\improper Northwest Hallway"})
"anA" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/hallway/primary/port{name = "\improper Northwest Hallway"})
-"anB" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 8},/obj/machinery/portable_atmospherics/scrubber{name = "heavy duty air scrubber"; volume = 3000; widenet = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port{name = "\improper Northwest Hallway"})
+"anB" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 8},/obj/machinery/portable_atmospherics/scrubber/huge/movable,/turf/simulated/floor/plasteel,/area/hallway/primary/port{name = "\improper Northwest Hallway"})
"anC" = (/turf/simulated/floor/plasteel,/area/hallway/primary/port{name = "\improper Northwest Hallway"})
"anD" = (/obj/structure/cable/cyan{icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/cyan/hidden,/turf/simulated/floor/plasteel,/area/hallway/primary/port{name = "\improper Northwest Hallway"})
"anE" = (/obj/machinery/door/airlock/command{name = "teleporter door"; req_access_txt = "17"},/obj/structure/cable/cyan{icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/teleporter{name = "\improper Teleporter Room"})
@@ -730,7 +730,7 @@
"aob" = (/obj/machinery/door/airlock/glass_engineering{name = "engineering door"; req_access_txt = "10"; req_one_access_txt = "0"},/obj/structure/cable/cyan{icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"aoc" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/wall,/area/engine/engineering)
"aod" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 8},/obj/machinery/portable_atmospherics/pump,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel,/area/hallway/primary/port{name = "\improper Northwest Hallway"})
-"aoe" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 8},/obj/machinery/portable_atmospherics/scrubber{name = "heavy duty air scrubber"; volume = 3000; widenet = 1},/obj/machinery/camera/autoname{icon_state = "camera"; dir = 9},/turf/simulated/floor/plasteel,/area/hallway/primary/port{name = "\improper Northwest Hallway"})
+"aoe" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 8},/obj/machinery/portable_atmospherics/scrubber/huge/movable,/obj/machinery/camera/autoname{icon_state = "camera"; dir = 9},/turf/simulated/floor/plasteel,/area/hallway/primary/port{name = "\improper Northwest Hallway"})
"aof" = (/turf/simulated/wall,/area/hallway/primary/port{name = "\improper Northwest Hallway"})
"aog" = (/obj/machinery/power/apc{dir = 8; name = "Northwest Hallway APC"; pixel_x = -24},/obj/structure/cable/cyan{icon_state = "0-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/port{name = "\improper Northwest Hallway"})
"aoh" = (/obj/structure/cable/cyan{icon_state = "1-2"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/cyan/hidden,/turf/simulated/floor/plasteel,/area/hallway/primary/port{name = "\improper Northwest Hallway"})
@@ -854,7 +854,7 @@
"aqv" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/cable/cyan{icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/bridge)
"aqw" = (/obj/machinery/computer/crew,/turf/simulated/floor/plasteel/black,/area/bridge)
"aqx" = (/obj/machinery/computer/communications,/turf/simulated/floor/plasteel/black,/area/bridge)
-"aqy" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel/black,/area/bridge)
+"aqy" = (/obj/machinery/computer/cargo,/turf/simulated/floor/plasteel/black,/area/bridge)
"aqz" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel,/area/bridge)
"aqA" = (/obj/structure/table,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/weapon/paper/monitorkey{pixel_x = 5; pixel_y = 5},/obj/item/weapon/phone{force = 1},/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/bridge)
"aqB" = (/obj/structure/closet/cardboard,/obj/item/clothing/suit/toggle/owlwings,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
@@ -1054,7 +1054,7 @@
"aun" = (/obj/machinery/navbeacon{codes = ""; codes_txt = "delivery;dir=1"; freq = 1400; location = "Dorm Maint"; name = "navigation beacon"},/turf/simulated/floor/carpet,/area/maintenance/fsmaint)
"auo" = (/obj/structure/flora/ausbushes/pointybush{icon_state = "pointybush_2"; layer = 4.1; name = "tree"; pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plating/asteroid{name = "dirt"},/area/maintenance/fsmaint)
"aup" = (/obj/machinery/button/door{dir = 2; id = "QMLoaddoor2"; name = "Loading Doors"; pixel_x = 24; pixel_y = 8},/obj/machinery/button/door{id = "QMLoaddoor"; name = "Loading Doors"; pixel_x = 24; pixel_y = -8},/obj/machinery/conveyor_switch/oneway{id = "cargoshuttle"},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/supply)
-"auq" = (/obj/machinery/button/door{id = "cargo blast"; name = "cargo blast door button"; pixel_x = -24; pixel_y = 0},/obj/machinery/light{dir = 8},/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"auq" = (/obj/machinery/button/door{id = "cargo blast"; name = "cargo blast door button"; pixel_x = -24; pixel_y = 0},/obj/machinery/light{dir = 8},/obj/machinery/computer/cargo,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"aur" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "cargo"; name = "shuttle conveyor switch"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"aus" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"aut" = (/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor/plasteel/yellow/side{icon_state = "yellow"; dir = 4},/area/quartermaster/storage)
@@ -1084,7 +1084,7 @@
"auR" = (/obj/structure/cable/cyan{icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "Dormitory Maintenance APC"; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/cyan/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"auS" = (/obj/machinery/atmospherics/pipe/simple/cyan/hidden{icon_state = "intact"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"auT" = (/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"auU" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 3; width = 10},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 7; id = "supply_home"; name = "supply bay"; width = 10},/turf/simulated/floor/plating,/area/shuttle/supply)
+"auU" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 3; width = 10},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 7; id = "supply_home"; name = "Cargo Bay"; width = 10},/turf/simulated/floor/plating,/area/shuttle/supply)
"auV" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"auW" = (/turf/simulated/floor/plasteel/yellow/side{icon_state = "yellow"; dir = 4},/area/quartermaster/storage)
"auX" = (/obj/machinery/navbeacon{codes = ""; codes_txt = "delivery;dir=4"; freq = 1400; location = "Cargo #2"; name = "navigation beacon"},/turf/simulated/floor/plasteel/delivery,/area/quartermaster/storage)
@@ -1199,7 +1199,7 @@
"axc" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_y = 5},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"axd" = (/obj/structure/table,/obj/item/weapon/stamp/denied{pixel_x = 6; pixel_y = 6},/obj/item/weapon/stamp,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"axe" = (/obj/structure/bed/chair/office/light,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"axf" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"axf" = (/obj/machinery/computer/cargo,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"axg" = (/obj/structure/cable/cyan{icon_state = "1-2"},/obj/machinery/camera/autoname{dir = 8},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"axh" = (/obj/structure/cable/cyan{icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"axi" = (/obj/machinery/libraryscanner,/turf/simulated/floor/wood,/area/library)
@@ -1351,7 +1351,7 @@
"azY" = (/obj/machinery/conveyor{dir = 8; id = "cargoOUT"; name = "cargo conveyor belt"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"azZ" = (/obj/machinery/conveyor{dir = 8; id = "cargoOUT"; name = "cargo conveyor belt"},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"aAa" = (/obj/structure/plasticflaps,/obj/machinery/conveyor{dir = 8; id = "cargoOUT"; name = "cargo conveyor belt"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"aAb" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"aAb" = (/obj/machinery/computer/cargo/request,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"aAc" = (/obj/effect/spawner/structure/window,/turf/simulated/floor/wood,/area/hallway/primary/central)
"aAd" = (/obj/structure/flora/kirbyplants{icon_state = "plant-22"},/obj/machinery/camera/autoname{dir = 1; network = list("SS13")},/turf/simulated/floor/wood,/area/library)
"aAe" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/turf/simulated/floor/wood,/area/library)
@@ -1871,7 +1871,6 @@
"aJY" = (/obj/machinery/door/airlock/glass_security{name = "security airlock"; req_access_txt = "63"},/obj/structure/cable/cyan{icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/brig)
"aJZ" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/flora/kirbyplants{icon_state = "plant-02"; layer = 4.1},/turf/simulated/floor/plasteel/black,/area/hallway/primary/central)
"aKa" = (/turf/simulated/floor/plasteel/black,/area/hallway/primary/central)
-"aKb" = (/obj/structure/flora/tree/pine/xmas,/turf/simulated/floor/plasteel/black,/area/hallway/primary/central)
"aKd" = (/obj/structure/flora/kirbyplants{icon_state = "plant-02"; layer = 4.1},/turf/simulated/floor/plasteel/black,/area/hallway/primary/central)
"aKe" = (/turf/simulated/wall/r_wall,/area/medical/genetics_cloning)
"aKf" = (/turf/simulated/wall,/area/medical/genetics_cloning)
@@ -3095,7 +3094,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHfaDZbahaEaaDoaDoaDYaDZaHgaDZaEaaDoaEQaHhaHhaHiaHjaDYaFLaFLaFLaFLaFLaElaHkaFOaFPaEiaEmaBqaElaElaHlaBqaAJaAJaHmaAJaDyaDyaDyaAJaxhawwaFeaGEaGEaHnaEraHoaHpaHqaHraHsaAlaAMaAlaHtatSaGKaGLatSaHtawAayIawwaEFaHuaHvaHwaHxaHyaGRaHzaHAaHBaHCaHDaHEaHFazLaAxaHGaCyaFuaFuaHaaHIaHJaHKaHLaHMaHNaHNaHNaHOaFxaHNaJFaHNaHNaHNaHNaAxazLaHQaHRaAxazLaFxaFxaFxaFxaFxaFxaFxaFxaAxazLaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDZaHSaHTaHUaHVaHWaHTaHSaHTaHTaHTaHTaHTaHTaHTaHXaHTaHXaHYaHZaIaaElaIbaIcaIdaIeaIfaIgaIgaIgaIgaIgaIgaIgaIgaIgaIhaIgaIgaIiaIgaIjbaxbavavJavJavJavJaImavJaInavUaIoazkaIpavJaIqavJavJavJavJavJavJaIraIsbayaGWaGWaIuaIvaIwaIxaIyaIzaIAaEDaAlaAlaAlaAlaAlaAlaIBaCyaZQaGlaHaaICaIDaIEaIFaIGaIHaIHaIIaIIaJGaIIaJHaHNaHNaJIaHNaAxazLaILaAxaAxazLaFxaFuaFuaIMaFyaFuaFuaFxaAxazLaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDZaINaHTaHUaHVaIOaHTaHTaHTaHTaHTaHTaHTaHTaHTaHXaHTaIPaHYaHZaIaaElaIbaIQbazaISaITaIUaIVaIWaIXaIYaIXaIZaIXaIXaJaaJbaJcaJdaJeaJfaJgaJhaJhaJiaJhaJhaJjaJhaJhaJkaJlaJmaJnaJhaJoaJhaJhaJlaJhaJhaJhaJhbbbbaXaJqaJraHvaJsaJtaJtaJuaJvbbcaJwaAlaEBaJxaFoaFoaAlaHGaCyaFtaFuaHaaJzaJAaJBaJBaJCaHNaHNaHNaHNaFxaKxaKyaHNaLgaKYaJyazMazLaLhaBhaLiazLaFxaFuaJJaFuaJKaJJaFuaFxaAxazLaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDZaINaHTaHWaJLaHWaHTaHTaJMaJMaJMaJMaJNaHhaHhaGvaDpaDYaFLaFLaFLaFLaFLaIQaFOaJOaJPaJQaJRaJSaJTaJUaJVaJWaJXaJXaJXaJWaJYaJXaJYaJWaJXaJXaJXaJWaJZaKaaKbaKaaKaaKdaKeaKeaKeaKeaKeaKeaKeaKfaKgaKhaKiaKjaKkaKlaEFaKmaJqaKnaKnaKnaJqaKoaKpaKqaDKaBzaBAaBzaBzaKraHGaCyaJyaJyaJybbdbdEbdDaJyaHaaHaaHaaHaaHaaFxaLjaKyaJyaJyaJyaJyaAxaBhaBhaLlaLkazLaFxaFuaFuaJJaFuaFuaFuaFxaAxazLaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDZaINaHTaHWaJLaHWaHTaHTaJMaJMaJMaJMaJNaHhaHhaGvaDpaDYaFLaFLaFLaFLaFLaIQaFOaJOaJPaJQaJRaJSaJTaJUaJVaJWaJXaJXaJXaJWaJYaJXaJYaJWaJXaJXaJXaJWaJZaKaaKaaKaaKaaKdaKeaKeaKeaKeaKeaKeaKeaKfaKgaKhaKiaKjaKkaKlaEFaKmaJqaKnaKnaKnaJqaKoaKpaKqaDKaBzaBAaBzaBzaKraHGaCyaJyaJyaJybbdbdEbdDaJyaHaaHaaHaaHaaHaaFxaLjaKyaJyaJyaJyaJyaAxaBhaBhaLlaLkazLaFxaFuaFuaJJaFuaFuaFuaFxaAxazLaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDZaINaHTaHTaHTaHTaHTaHTaKzaKzaKzaKzaEUaKAaEeaHiaGwaDqaaaaayaaaaaaaFLaIQaFOaKBaKCaJQaJRaKDaKEaJUaKFaJWaKGaKHaKIaKJaKKaKLaKMaKJaKNaKOaKPaJWatSatSatSatSatSatSaKeaKQaKRaKSaKTaKUaKVaKfaKWaKXaLZaKiaKkaKZaEFaGMaHuaHuaLaaHuaHuaHuaLbaGMaAlaFnaFnaLcaLcaAlaQVbdFbdHbdGbdJbdIaLeaLfaJyaFuaFuaHaaFuaFuaFxaMNaNQaMOaOLaNRaJyaAxaONaOMaBhaOOaCyaFxaLmaLnaFuaFuaLnaLmaFxaLoaJyaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDZaHSaHTaHTaHTaHTaHTaHTaHTaHTaHTaHTaHhaEeaEeaLpaEfaEgaaaaayaayaayaFLaIQaFOaLqaLraLsaLtaLuaJVaLvaJVaJWaLwaKHaLxaKJaLyaLzaLAaKJaLBaKOaLCaJWaLDaLEaLDaLFaLGaLDaKeaLHaLIaLJaLKbdKaLMaLNaLOaKXaKXaLPaKkaKZaEFaEFaEFaEFaEFaEFaEFaEFaEFaEFaLQaAlaAlaAlaAlaAlaHGaCybdMbdLbdObdNaLeaLVaJyaLWbdPaHabdPaLWaFxaHNaKyaOPaHNaNRaJyaFxaNUaFxaFxaFxaFxaMaaMbaHcaMcaMdaHcaMbaMaaMeaFxaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMfaMgaMhaMhaMhaMhaHTaHTaHTaHTaHTaHTaDZaEeaEeaMiaEfaEXaaaaayaaaaaaaFLaIQaMjaAIaAIaAIaJWaMkaJWaJWaJWaJWaMlaMmaMlaKJaJYaMlaJYaKJaMlaMnaMlaJWatSatSatSatSatSatSaKeaMoaMpaMqaMraMsaMtaLNaMuaMvaMwaKiaKkaKZaMxaMyaMzaMAaMBaMCaMDaMEaMEaMFaMGaMHaMIaMJaMKazLaMLaCyaCyaFxaFxaFxaMMaFxaFxaFxaFxaFxaFxaFxaFxaHNaOVaMPaMPaMPaMPaOWaMPaMQaMRaMSaMTaMUaMVaMWaMXaMYaMZaNaaNbaJCaFxaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm
index a33b2f874a4..13c8b9f16e8 100644
--- a/_maps/map_files/DreamStation/dreamstation04.dmm
+++ b/_maps/map_files/DreamStation/dreamstation04.dmm
@@ -3913,7 +3913,7 @@
"bxm" = (/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central)
"bxn" = (/turf/simulated/floor/plasteel/vault{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/hallway/primary/central)
"bxo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel/neutral/side{dir = 8},/area/hallway/primary/central)
-"bxp" = (/obj/machinery/computer/supplycomp,/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/turf/simulated/floor/plasteel/black,/area/crew_quarters/heads)
+"bxp" = (/obj/machinery/computer/cargo,/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/turf/simulated/floor/plasteel/black,/area/crew_quarters/heads)
"bxq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel/black,/area/crew_quarters/heads)
"bxr" = (/obj/structure/cable/blue{tag = "icon-1-2"; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel/black,/area/crew_quarters/heads)
"bxs" = (/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel/black,/area/crew_quarters/heads)
@@ -5724,8 +5724,8 @@
"cgd" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{layer = 2.4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"cge" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel/bot,/area/quartermaster/office)
"cgf" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"cgg" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel/brown/corner,/area/quartermaster/office)
-"cgh" = (/obj/structure/cable/orange{tag = "icon-1-2"; icon_state = "1-2"},/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel/brown/corner{tag = "icon-browncorner (WEST)"; icon_state = "browncorner"; dir = 8},/area/quartermaster/office)
+"cgg" = (/obj/machinery/computer/cargo,/turf/simulated/floor/plasteel/brown/corner,/area/quartermaster/office)
+"cgh" = (/obj/structure/cable/orange{tag = "icon-1-2"; icon_state = "1-2"},/obj/machinery/computer/cargo/request,/turf/simulated/floor/plasteel/brown/corner{tag = "icon-browncorner (WEST)"; icon_state = "browncorner"; dir = 8},/area/quartermaster/office)
"cgi" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"cgj" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (EAST)"; dir = 4},/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"cgk" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
@@ -6729,7 +6729,7 @@
"czu" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"czv" = (/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/qm)
"czw" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/computer/security/mining,/turf/simulated/floor/plasteel/darkbrown/side{tag = "icon-darkbrown (NORTHWEST)"; icon_state = "darkbrown"; dir = 9},/area/quartermaster/qm)
-"czx" = (/obj/machinery/airalarm{pixel_y = 23},/obj/machinery/computer/supplycomp,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/darkbrown/side{tag = "icon-darkbrown (NORTH)"; icon_state = "darkbrown"; dir = 1},/area/quartermaster/qm)
+"czx" = (/obj/machinery/airalarm{pixel_y = 23},/obj/machinery/computer/cargo,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/darkbrown/side{tag = "icon-darkbrown (NORTH)"; icon_state = "darkbrown"; dir = 1},/area/quartermaster/qm)
"czy" = (/obj/machinery/computer/shuttle/mining,/obj/machinery/light_switch{pixel_y = 24; tag = "n"},/turf/simulated/floor/plasteel/darkbrown/side{tag = "icon-darkbrown (NORTHEAST)"; icon_state = "darkbrown"; dir = 5},/area/quartermaster/qm)
"czz" = (/turf/space,/turf/simulated/wall/shuttle{icon_state = "swall_f5"; dir = 2},/area/shuttle/mining)
"czA" = (/obj/structure/shuttle/engine/propulsion/burst,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/plating/airless,/area/shuttle/mining)
@@ -7085,7 +7085,7 @@
"cGm" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/plasteel/bot,/area/toxins/storage)
"cGn" = (/obj/machinery/portable_atmospherics/canister/nitrous_oxide,/turf/simulated/floor/plasteel/bot,/area/toxins/storage)
"cGo" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel/bot,/area/toxins/storage)
-"cGp" = (/obj/machinery/computer/area_atmos,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_x = 26; pixel_y = -2; tag = "EAST"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
+"cGp" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_x = 26; pixel_y = -2; tag = "EAST"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
"cGq" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (WEST)"; dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"cGr" = (/turf/simulated/floor/plasteel/purple/side{tag = "icon-purple (SOUTHEAST)"; icon_state = "purple"; dir = 6},/obj/machinery/portable_atmospherics/canister,/obj/structure/window/reinforced,/turf/simulated/floor/plasteel/warningline{tag = "icon-warningline (SOUTHEAST)"; icon_state = "warningline"; dir = 6},/area/toxins/mixing)
"cGs" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
@@ -7219,7 +7219,7 @@
"cIQ" = (/turf/simulated/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/supply)
"cIR" = (/obj/machinery/door/poddoor{id = "QMLoaddoor2"; name = "supply dock loading door"},/obj/machinery/conveyor{dir = 1; id = "QMLoad"; tag = "cargoshuttledown"},/turf/simulated/floor/plating,/area/shuttle/supply)
"cIS" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/shuttle/supply)
-"cIT" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dir = 2; dwidth = 5; width = 12},/obj/docking_port/stationary{dir = 2; dwidth = 5; height = 7; id = "supply_home"; name = "supply bay"; width = 12},/turf/simulated/floor/plating,/area/shuttle/supply)
+"cIT" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dir = 2; dwidth = 5; width = 12},/obj/docking_port/stationary{dir = 2; dwidth = 5; height = 7; id = "supply_home"; name = "Cargo Bay"; width = 12},/turf/simulated/floor/plating,/area/shuttle/supply)
"cIU" = (/obj/structure/cable/green{tag = "icon-4-8"; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/atmos_control)
"cIV" = (/turf/simulated/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/supply)
"cIW" = (/turf/simulated/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/supply)
diff --git a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
index 9c8c0624788..05665702bed 100644
--- a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
+++ b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
@@ -1563,7 +1563,7 @@
"aEc" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/genetics)
"aEd" = (/obj/structure/bed/chair/office/light,/obj/effect/landmark/start{name = "Geneticist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"aEe" = (/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"aEf" = (/obj/machinery/computer/area_atmos,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
+"aEf" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
"aEg" = (/obj/structure/extinguisher_cabinet{pixel_x = 27},/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/toxins/storage)
"aEh" = (/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/research{name = "Toxins Lab"; req_access_txt = "8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"aEi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"},/area/maintenance/fore)
@@ -3699,7 +3699,7 @@
"btg" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #2"},/mob/living/simple_animal/bot/mulebot{home_destination = "QM #2"; suffix = "#2"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"bth" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bti" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/clipboard,/obj/item/weapon/pen/red,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"btj" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/storage)
+"btj" = (/obj/machinery/computer/cargo/request,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/storage)
"btk" = (/obj/structure/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"btl" = (/obj/structure/window/fulltile,/obj/structure/grille,/turf/simulated/floor/plating,/area/quartermaster/storage)
"btm" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/hallway/primary/port{name = "Aft Port Primary Hallway"})
@@ -3848,7 +3848,7 @@
"bvZ" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #4"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"bwa" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/stack/wrapping_paper{pixel_x = 3; pixel_y = 4},/obj/item/stack/packageWrap{pixel_x = -1; pixel_y = -1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bwb" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bwc" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bwc" = (/obj/machinery/computer/cargo,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bwd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bwe" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bwf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/port{name = "Aft Port Primary Hallway"})
@@ -3974,7 +3974,7 @@
"byv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/space)
"byw" = (/obj/machinery/power/tesla_coil,/obj/structure/cable,/turf/simulated/floor/plating/airless,/area/space)
"byx" = (/turf/simulated/wall,/area/engine/engineering)
-"byy" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 5; width = 12},/obj/docking_port/stationary{dir = 8; dwidth = 5; height = 7; id = "supply_home"; name = "supply bay"; width = 12},/turf/simulated/floor/plating,/area/shuttle/supply)
+"byy" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 5; width = 12},/obj/docking_port/stationary{dir = 8; dwidth = 5; height = 7; id = "supply_home"; name = "Cargo Bay"; width = 12},/turf/simulated/floor/plating,/area/shuttle/supply)
"byz" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"byA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"byB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "QMLoad"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
@@ -4248,7 +4248,7 @@
"bDJ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/shuttle/supply)
"bDK" = (/turf/simulated/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/supply)
"bDL" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/oil,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"},/area/maintenance/port{name = "Chapel Maintenance"})
-"bDM" = (/obj/machinery/computer/supplycomp,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30},/obj/machinery/camera{c_tag = "Quartermaster's Office"; dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/qm)
+"bDM" = (/obj/machinery/computer/cargo,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30},/obj/machinery/camera{c_tag = "Quartermaster's Office"; dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/qm)
"bDN" = (/mob/living/simple_animal/mouse/brown/Tom,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"bDO" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"bDP" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Quartermaster"},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
@@ -4427,7 +4427,7 @@
"bHg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
"bHh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
"bHi" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
-"bHj" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel{icon_state = "darkblue"; dir = 4},/area/crew_quarters/heads)
+"bHj" = (/obj/machinery/computer/cargo/request,/turf/simulated/floor/plasteel{icon_state = "darkblue"; dir = 4},/area/crew_quarters/heads)
"bHk" = (/obj/machinery/door/poddoor/shutters/preopen{id = "hopqueue"; name = "HoP Queue Shutters"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "loadingarea"},/area/hallway/primary/aft{name = "Aft Starboard Primary Hallway"})
"bHl" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/hallway/primary/aft{name = "Aft Starboard Primary Hallway"})
"bHm" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/clothing/gloves/color/fyellow,/turf/simulated/floor/plasteel,/area/storage/primary)
@@ -5176,7 +5176,7 @@
"bVB" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"bVC" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"bVD" = (/obj/structure/bed/chair{dir = 4; name = "Logistics Station"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
-"bVE" = (/obj/machinery/computer/ordercomp,/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_x = 30},/turf/simulated/floor/plasteel{icon_state = "darkbrown"; dir = 8},/area/bridge)
+"bVE" = (/obj/machinery/computer/cargo/request,/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_x = 30},/turf/simulated/floor/plasteel{icon_state = "darkbrown"; dir = 8},/area/bridge)
"bVF" = (/obj/item/weapon/hand_tele,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/table,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"})
"bVG" = (/obj/structure/bed/stool,/obj/machinery/power/apc{name = "Teleporter APC"; pixel_y = -25},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"})
"bVH" = (/obj/machinery/light,/obj/structure/closet/crate,/obj/item/weapon/crowbar,/obj/machinery/airalarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/camera{c_tag = "Teleporter"; dir = 1},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"})
diff --git a/_maps/map_files/MetaStation/MetaStation.v41I.dmm b/_maps/map_files/MetaStation/MetaStation.v41I.dmm
index dfa8ada1a5e..6512889a60e 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41I.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41I.dmm
@@ -948,7 +948,7 @@
"asl" = (/obj/machinery/door/airlock/glass{name = "space-bridge access"},/obj/machinery/button/door{id = "supplybridge"; name = "Shuttle Bay Space Bridge Control"; pixel_x = 0; pixel_y = 27; req_access_txt = "0"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"asm" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"asn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"aso" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Supply Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aso" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Cargo Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"asp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"asq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{icon_state = "platingdmg3"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"asr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
@@ -1010,7 +1010,7 @@
"atv" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard)
"atw" = (/turf/simulated/wall/r_wall,/area/maintenance/starboard)
"atx" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"aty" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/maintenance_hatch{name = "Supply Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aty" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/maintenance_hatch{name = "Cargo Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"atz" = (/obj/machinery/door/poddoor/shutters{id = "supplybridge"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"atA" = (/obj/machinery/door/poddoor/shutters{id = "supplybridge"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"atB" = (/obj/machinery/door/poddoor/shutters{id = "supplybridge"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/fpmaint2{name = "Port Maintenance"})
@@ -2110,7 +2110,7 @@
"aOD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/construction)
"aOE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/construction)
"aOF" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/plasteel,/area/construction)
-"aOG" = (/obj/machinery/button/door{id = "QMLoaddoor"; layer = 4; name = "Loading Doors"; pixel_x = -27; pixel_y = -5},/obj/machinery/button/door{dir = 2; id = "QMLoaddoor2"; layer = 4; name = "Loading Doors"; pixel_x = -27; pixel_y = 5},/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
+"aOG" = (/obj/machinery/button/door{id = "QMLoaddoor"; layer = 4; name = "Loading Doors"; pixel_x = -27; pixel_y = -5},/obj/machinery/button/door{dir = 2; id = "QMLoaddoor2"; layer = 4; name = "Loading Doors"; pixel_x = -27; pixel_y = 5},/obj/machinery/computer/cargo,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"aOH" = (/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"aOI" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/storage)
"aOJ" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
@@ -2333,7 +2333,7 @@
"aSS" = (/obj/machinery/conveyor{dir = 1; id = "QMLoad"; movedir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage)
"aST" = (/obj/structure/disposalpipe/segment,/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"aSU" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/obj/item/weapon/paper,/obj/item/weapon/paper,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/quartermaster/storage)
-"aSV" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/quartermaster/qm)
+"aSV" = (/obj/machinery/computer/cargo,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/quartermaster/qm)
"aSW" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/qm)
"aSX" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/qm)
"aSY" = (/obj/structure/table,/obj/item/weapon/cartridge/quartermaster{pixel_x = 6; pixel_y = 5},/obj/item/weapon/cartridge/quartermaster,/obj/item/weapon/cartridge/quartermaster{pixel_x = -4; pixel_y = 7},/obj/item/device/gps{gpstag = "QM0"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/qm)
@@ -2804,7 +2804,7 @@
"bbV" = (/obj/item/weapon/stamp{pixel_x = -3; pixel_y = 3},/obj/item/weapon/stamp/denied{pixel_x = 4; pixel_y = -2},/obj/structure/table/reinforced,/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; name = "requests board"; pixel_x = 32; pixel_y = 32},/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 9; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"})
"bbW" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/red,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{dir = 5; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"})
"bbX" = (/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the Cargo department is."; icon_state = "direction_supply"; name = "cargo department"; pixel_y = -5},/turf/simulated/wall,/area/quartermaster/office{name = "\improper Cargo Office"})
-"bbY" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/primary/port)
+"bbY" = (/obj/machinery/computer/cargo/request,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/primary/port)
"bbZ" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/status_display{density = 0; pixel_x = 0; pixel_y = 32; supply_display = 1},/obj/structure/table,/obj/item/weapon/folder/yellow,/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/hallway/primary/port)
"bca" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/hallway/primary/port)
"bcb" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/hallway/primary/port)
@@ -2957,7 +2957,7 @@
"beS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/quartermaster/office{name = "\improper Cargo Office"})
"beT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/quartermaster/office{name = "\improper Cargo Office"})
"beU" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office{name = "\improper Cargo Office"})
-"beV" = (/obj/machinery/computer/supplycomp,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"})
+"beV" = (/obj/machinery/computer/cargo,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"})
"beW" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/quartermaster/office{name = "\improper Cargo Office"})
"beX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/primary/port)
"beY" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
@@ -3348,7 +3348,7 @@
"bmt" = (/obj/item/device/radio/beacon,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"bmu" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/recharger{pixel_y = 3},/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkredcorners"},/area/bridge)
"bmv" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/computer/security/mining,/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkblue"},/area/bridge)
-"bmw" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_x = 32; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel{dir = 5; icon_state = "darkblue"},/area/bridge)
+"bmw" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_x = 32; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/computer/cargo/request,/turf/simulated/floor/plasteel{dir = 5; icon_state = "darkblue"},/area/bridge)
"bmx" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/shower{icon_state = "shower"; dir = 4},/obj/machinery/door/window/westright{dir = 4},/obj/item/weapon/soap/deluxe,/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bmy" = (/obj/structure/mirror{pixel_y = 28},/obj/structure/sink{pixel_y = 17},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bmz" = (/obj/structure/toilet{pixel_y = 13},/obj/machinery/light{dir = 2; icon_state = "tube1"},/obj/effect/landmark/start{name = "Captain"},/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
@@ -3665,7 +3665,7 @@
"bsy" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bsz" = (/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/pen,/obj/structure/window/reinforced,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/heads)
"bsA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/window{dir = 2; name = "HoP's Desk"; pixel_y = 0; req_access_txt = "57"},/turf/simulated/floor/wood,/area/crew_quarters/heads)
-"bsB" = (/obj/structure/window/reinforced,/obj/machinery/computer/ordercomp,/turf/simulated/floor/wood,/area/crew_quarters/heads)
+"bsB" = (/obj/structure/window/reinforced,/obj/machinery/computer/cargo/request,/turf/simulated/floor/wood,/area/crew_quarters/heads)
"bsC" = (/obj/machinery/vending/cart{req_access_txt = "57"},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/wood,/area/crew_quarters/heads)
"bsD" = (/obj/structure/transit_tube{dir = 4; icon_state = "Block"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"; dir = 4},/area/engine/break_room)
"bsE" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "D-SW"},/turf/space,/area/space)
@@ -4534,7 +4534,7 @@
"bJj" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bJk" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/bed/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bJl" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bJm" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/obj/structure/flora/tree/pine/xmas,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bJm" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bJn" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
"bJo" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
"bJp" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
@@ -6514,10 +6514,10 @@
"cvn" = (/obj/machinery/computer/aifixer,/obj/structure/window/reinforced{dir = 4},/obj/machinery/requests_console{announcementConsole = 1; department = "Research Director's Desk"; departmentType = 5; name = "Research Director RC"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"cvo" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/crew_quarters/hor)
"cvp" = (/obj/structure/displaycase/labcage,/obj/machinery/light/small{dir = 1},/obj/structure/sign/biohazard{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor)
-"cvq" = (/obj/item/weapon/storage/secure/safe{pixel_x = 32; pixel_y = 0},/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/flora/tree/festivus,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/crew_quarters/hor)
+"cvq" = (/obj/item/weapon/storage/secure/safe{pixel_x = 32; pixel_y = 0},/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/crew_quarters/hor)
"cvr" = (/obj/machinery/portable_atmospherics/scrubber/huge,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/storage)
"cvs" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/storage)
-"cvt" = (/obj/machinery/computer/area_atmos,/obj/machinery/light/small{dir = 1},/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/storage)
+"cvt" = (/obj/machinery/light/small{dir = 1},/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/storage)
"cvu" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Toxins Storage APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/toxins/storage)
"cvv" = (/obj/machinery/portable_atmospherics/scrubber/huge,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/storage)
"cvw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"})
@@ -7615,7 +7615,7 @@
"cQw" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "Chapel APC"; pixel_x = -25},/turf/simulated/floor/carpet,/area/chapel/main)
"cQx" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/chapel/main)
"cQy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/carpet,/area/chapel/main)
-"cQz" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/flora/tree/pine/xmas,/turf/simulated/floor/carpet,/area/chapel/main)
+"cQz" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/carpet,/area/chapel/main)
"cQA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/carpet,/area/chapel/main)
"cQB" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/centcom{name = "Chapel"; opacity = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cQC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
@@ -8051,7 +8051,7 @@
"cYQ" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/poddoor{id = "QMLoaddoor2"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/shuttle/supply)
"cYR" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/shuttle/supply)
"cYS" = (/obj/machinery/button/door{dir = 2; id = "QMLoaddoor2"; name = "Loading Doors"; pixel_x = 24; pixel_y = 8},/obj/machinery/button/door{id = "QMLoaddoor"; name = "Loading Doors"; pixel_x = 24; pixel_y = -8},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/supply)
-"cYT" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 5; roundstart_move = "supply_away"; width = 12},/obj/docking_port/stationary{dir = 8; dwidth = 5; height = 7; id = "supply_home"; name = "supply bay"; width = 12},/turf/simulated/floor/plating,/area/shuttle/supply)
+"cYT" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 5; roundstart_move = "supply_away"; width = 12},/obj/docking_port/stationary{dir = 8; dwidth = 5; height = 7; id = "supply_home"; name = "Cargo Bay"; width = 12},/turf/simulated/floor/plating,/area/shuttle/supply)
"cYU" = (/obj/machinery/computer/camera_advanced/xenobio,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cYV" = (/turf/simulated/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/supply)
"cYW" = (/turf/simulated/floor/plasteel/shuttle,/turf/simulated/wall/shuttle/interior{icon_state = "swall_f10"},/area/shuttle/supply)
diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm
index 42be3cbcda0..231c1946603 100644
--- a/_maps/map_files/MiniStation/MiniStation.dmm
+++ b/_maps/map_files/MiniStation/MiniStation.dmm
@@ -264,7 +264,7 @@
"fd" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"fe" = (/obj/structure/closet/secure_closet/miner,/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/quartermaster/storage)
"ff" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/filingcabinet,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"fg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/quartermaster/storage)
+"fg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/computer/cargo,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/quartermaster/storage)
"fh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/security/brig)
"fi" = (/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/security/brig)
"fj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
@@ -292,7 +292,7 @@
"fF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/quartermaster/storage)
"fG" = (/obj/structure/table/reinforced,/obj/machinery/door/window/westleft{name = "Cargo Desk"; req_access_txt = "50"},/obj/item/weapon/folder/yellow,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"fH" = (/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/primary/central)
-"fI" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
+"fI" = (/obj/machinery/computer/cargo/request,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"fJ" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/hallway/primary/central)
"fK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/security/brig)
"fL" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
@@ -870,8 +870,8 @@
"qL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
"qM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Head of Personnel Office"; req_access = null; req_access_txt = "57"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
"qN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay)
-"qO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"qP" = (/obj/machinery/atmospherics/components/unary/thermomachine/freezer,/obj/machinery/airalarm{frequency = 1441; pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/medbay)
+"qO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
+"qP" = (/obj/machinery/atmospherics/components/unary/thermomachine/freezer,/obj/machinery/airalarm{frequency = 1441; pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/medbay)
"qQ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"qR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/camera/autoname,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"qS" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
@@ -1372,9 +1372,9 @@
"At" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
"Au" = (/obj/machinery/camera/autoname{dir = 8},/obj/machinery/light/small{dir = 4},/obj/machinery/newscaster{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; frequency = 1441; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"Av" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/hallway/primary/central)
-"Aw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"Aw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ax" = (/obj/machinery/airalarm{dir = 4; frequency = 1441; pixel_x = -24},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
-"Ay" = (/obj/machinery/airalarm{frequency = 1440; pixel_y = 23},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"Ay" = (/obj/machinery/airalarm{frequency = 1440; pixel_y = 23},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Az" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
"AA" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
"AB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/plasteel,/area/engine/engineering)
@@ -1393,7 +1393,6 @@
"AO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 1},/area/engine/engineering)
"AP" = (/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 4; name = "Engineering RC"; pixel_y = 30},/turf/simulated/floor/plasteel,/area/engine/engineering)
"AQ" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 2; frequency = 1440; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"AR" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 2; frequency = 1441; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
"AS" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible,/turf/simulated/floor/plating,/area/engine/engineering)
"AT" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/components/unary/portables_connector/visible,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engineering)
"AU" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/wrench,/obj/item/weapon/weldingtool,/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/turf/simulated/floor/plasteel,/area/engine/engineering)
@@ -1403,9 +1402,8 @@
"AY" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/engine/engineering)
"AZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Ba" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/camera/autoname,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Bb" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/cyan/visible{icon_state = "intact"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering)
-"Bc" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{frequency = 1441; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"Bd" = (/obj/machinery/airalarm{dir = 1; frequency = 1441; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"Bb" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/cyan/visible{icon_state = "intact"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering)
+"Bd" = (/obj/machinery/airalarm{dir = 1; frequency = 1441; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel,/area/engine/engineering)
"Be" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engine/engineering)
"Bf" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/yellow/visible{icon_state = "intact"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engineering)
"Bg" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/obj/machinery/atmospherics/components/unary/portables_connector/visible,/turf/simulated/floor/plating,/area/engine/engineering)
@@ -1731,7 +1729,7 @@
"Ho" = (/turf/simulated/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/supply)
"Hp" = (/turf/simulated/floor/plasteel/shuttle,/area/shuttle/supply)
"Hq" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/shuttle/supply)
-"Hr" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 3; width = 9},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 7; id = "supply_home"; name = "supply bay"; width = 9},/turf/simulated/floor/plating,/area/shuttle/supply)
+"Hr" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 3; width = 9},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 7; id = "supply_home"; name = "Cargo Bay"; width = 9},/turf/simulated/floor/plating,/area/shuttle/supply)
"Hs" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/escape)
"Ht" = (/turf/space,/turf/simulated/wall/shuttle{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape)
"Hu" = (/turf/space,/turf/simulated/wall/shuttle{icon_state = "swall_f10"; dir = 2},/area/shuttle/escape)
@@ -1802,7 +1800,6 @@
"IH" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/transport)
"II" = (/turf/simulated/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/transport)
"IJ" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; frequency = 1441; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"IK" = (/obj/structure/flora/tree/pine/xmas,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1956,7 +1953,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIkHJHJHJHJHJIqaaaaaafWtyfWlklKlKtAfWtyfWkftBqMqLtEtFtGtHtItJtKtLtMtNtNtOkssBkhtdtQtRtStTtdtUtWtVsetYsugafXfXfXyLbxaanPuaubucpaudrLrnoXugnPnPnPnPnPnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWlJfWujukulumfWlJfWkfkfsrunuounupuqurusutsruubxuvfXfXfXkhtdtTuxtdtTtdtUtWuyuzuAsugauBuCuDeLfwaanPuEpfsdpauFhxsxpaszsDtpuKuLtDuMhxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaofuOoffWfWfWfWofuOofamamsruSuountuununtXuWsruubxuXfXfXfXkhtdtTuYtdtTtdtUtWuZuzvasuyNvbvbvbzbbxaanPvdpfpfvevftftevivjkLuJpfvlpfpfhxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcvmjdvmvmsPsPvmvmvqvpvramsrsrvtsrsrvuvvsrsqsruubxbxfXfXfXkhtdvxtRtStTIKvyvAvzvBvCvDgauBuCuDzQfwaanPuUtisNvIvJqotgoVtnnPvNvOvPvQvRnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcvmjdvmvmsPsPvmvmvqvpvramsrsrvtsrsrvuvvsrsqsruubxbxfXfXfXkhtdvxtRtStTtdvyvAvzvBvCvDgauBuCuDzQfwaanPuUtisNvIvJqotgoVtnnPvNvOvPvQvRnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcvpvmvsvSvSvUvTvWvVvXvUvSvYvZambxbNbSwbwcsrsrsrbGwduubNbxfXfXfXsuwewfwgtjwiwjwktWuVvCvCwnAlvbvbvbAubxamnPhxhxhxhxnPnPoGtsoOnPnPnPnPnPnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavYwawvwuvSwwvSwwvSwwvSwwvSwxvZambxbNbSbNbxwAAvwCwDwEwFlPbxfXfXfXsusuwGsususuttwIsusuvGtCsuAxwLwMwNwObxaaaaaaaaamamnPwPwQwRwSvknPamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaphvSvSvqvSwwvSwwwzwwvSwwvSwxvZambxbNbSbNbxbNwWwXwYwZnDbObxfXfXiUsuxaxbueufxeuGxgvHxixjuHsuidbxbxbxbxbxaaaaaaaaaaamhxxmvFpfIJxphxamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1976,7 +1973,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaayBzqAMyBAWAOAPAUyBqIqIqIyBAUzaAVAWyBAXALyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamamyBzqAYyBzazRAZAZAZAZBazayMzazazazayBAIALyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaayBqIyBxcxdqIxfzazaBextxoBhxPxQBkzazaxkqIxYxnyBqIyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaqIBozazqBpqIAnARzaBqxTBsBtBuxXBwzaBcAqqIBxALByBzqIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaqIBozazqBpqIAnBizaBqxTBsBtBuxXBwzaBmAqqIBxALByBzqIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaqIBozaAssHsysOAezaBAyeycBDzezhBGzaAwtksQtxBUzaBHqIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaqIBozazqzayByBtzBdBLzKzpBOzMzNBRzauiyByBzaALBVBWqIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaayBqIyBzqzaBXyByByByBuNuNAKuPuPyByByByBCczaALyBtPyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 0757e74208e..f8b96b73867 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -2394,7 +2394,7 @@
"aUb" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/bridge)
"aUc" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel,/area/bridge)
"aUd" = (/obj/machinery/computer/security/mining,/turf/simulated/floor/plasteel{dir = 6; icon_state = "brown"},/area/bridge)
-"aUe" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/bridge)
+"aUe" = (/obj/machinery/computer/cargo/request,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/bridge)
"aUf" = (/obj/machinery/airalarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera{c_tag = "Bar West"; dir = 4; network = list("SS13")},/obj/structure/bed/chair,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aUg" = (/obj/structure/bed/chair,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aUh" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastleft{name = "Hydroponics Desk"; req_access_txt = "35"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/crew_quarters/kitchen)
@@ -3412,7 +3412,7 @@
"bnF" = (/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 30},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bnG" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/clipboard,/obj/item/weapon/pen/red,/obj/structure/table,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bnH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
-"bnI" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bnI" = (/obj/machinery/computer/cargo/request,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bnJ" = (/obj/machinery/firealarm{pixel_y = 27},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bnK" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/quartermaster/office)
"bnL" = (/turf/simulated/floor/plasteel{icon_state = "loadingarea"},/area/quartermaster/office)
@@ -3508,7 +3508,7 @@
"bpx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bpy" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bpz" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bpA" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bpA" = (/obj/machinery/computer/cargo,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bpB" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bpC" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"bpD" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Chemistry Lab"; req_access_txt = "5; 33"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
@@ -3780,7 +3780,7 @@
"buJ" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"buK" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/primary/central)
"buL" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"buM" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/crew_quarters/heads)
+"buM" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/computer/cargo,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/crew_quarters/heads)
"buN" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
"buO" = (/obj/structure/table,/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/hop,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
"buP" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/wall,/area/engine/gravity_generator)
@@ -3910,7 +3910,7 @@
"bxj" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office."; name = "Research Monitor"; network = list("RD","MiniSat"); pixel_x = 0; pixel_y = 2},/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bxk" = (/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 1},/area/crew_quarters/hor)
"bxl" = (/obj/structure/rack,/obj/item/weapon/circuitboard/aicore{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/crew_quarters/hor)
-"bxm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/flora/tree/pine/xmas,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"bxm" = (/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/crew_quarters/hor)
"bxn" = (/turf/simulated/wall,/area/toxins/explab)
"bxo" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/explab)
"bxp" = (/obj/machinery/computer/rdconsole/experiment,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/toxins/explab)
@@ -4043,7 +4043,7 @@
"bzM" = (/obj/structure/rack,/obj/item/device/taperecorder{pixel_x = -3},/obj/item/device/paicard{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/crew_quarters/hor)
"bzN" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"},/area/crew_quarters/hor)
"bzO" = (/turf/simulated/floor/engine,/area/toxins/explab)
-"bzP" = (/obj/machinery/computer/supplycomp,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/qm)
+"bzP" = (/obj/machinery/computer/cargo,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/qm)
"bzQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"bzR" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"bzS" = (/obj/structure/table,/obj/item/weapon/cautery{pixel_x = 4},/turf/simulated/floor/plasteel,/area/medical/sleeper)
@@ -4498,7 +4498,7 @@
"bIz" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/toxins/storage)
"bIA" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/toxins/storage)
"bIB" = (/obj/machinery/portable_atmospherics/canister/nitrous_oxide,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/toxins/storage)
-"bIC" = (/obj/machinery/computer/area_atmos,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
+"bIC" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
"bID" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"bIE" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bIF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,/turf/simulated/floor/plasteel,/area/atmos)
@@ -6699,7 +6699,7 @@
"cyQ" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/shuttle/supply)
"cyR" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/shuttle/abandoned)
"cyS" = (/obj/machinery/button/door{dir = 2; id = "QMLoaddoor2"; name = "Loading Doors"; pixel_x = 24; pixel_y = 8},/obj/machinery/button/door{id = "QMLoaddoor"; name = "Loading Doors"; pixel_x = 24; pixel_y = -8},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/supply)
-"cyT" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 5; width = 12},/obj/docking_port/stationary{dir = 8; dwidth = 5; height = 7; id = "supply_home"; name = "supply bay"; width = 12},/turf/simulated/floor/plating,/area/shuttle/supply)
+"cyT" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 5; width = 12},/obj/docking_port/stationary{dir = 8; dwidth = 5; height = 7; id = "supply_home"; name = "Cargo Bay"; width = 12},/turf/simulated/floor/plating,/area/shuttle/supply)
"cyU" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
"cyV" = (/obj/machinery/door/window,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor5"},/area/shuttle/abandoned)
"cyW" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor5"},/area/shuttle/abandoned)
@@ -6746,8 +6746,6 @@
"czL" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 3; pixel_x = 0; pixel_y = 32},/obj/machinery/computer/shuttle/pod{pixel_y = -32; possible_destinations = "pod_asteroid4"; shuttleId = "pod4"},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/pod_4)
"czM" = (/obj/structure/bed/chair{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/obj/item/weapon/storage/pod{pixel_x = 6; pixel_y = -32},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/pod_4)
"czN" = (/obj/docking_port/stationary/random{dir = 4; id = "pod_asteroid4"; name = "asteroid"},/turf/space,/area/space)
-"czO" = (/obj/structure/flora/tree/pine/xmas,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"czP" = (/obj/structure/flora/tree/festivus,/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/crew_quarters/hor)
"czQ" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"czR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"czS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plating{icon_state = "platingdmg3"},/area/maintenance/asmaint2)
@@ -6931,14 +6929,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCVaIGaIGaIHaEraFEaEraFEaEraFEaEraFEaEraEyaFFawWazzaylaNhaIMaIJaIMaILaylaIOaIQaIPaIRazFaISaAQaAQaITazFaINaDdaDoaIXaIWaIZaIYaJbaIUaJcaBRaaaaafaaaaJdaJeaJdaaaaafaaaayEayHayGaJaaIVaHJaJhaJiayGaqRaqZayWaJjazWaEZaEZaEZaJfaJlayWaaaaaaaJnaJpaJoaJraJqaJtaJsaJuaJnaaaaaaaJwaJvaJyaJgaAhaJzaByaByaByaDNaByaByaByaAhaCraJkaCraCraCraBBaJDaJCaJCaJEaJxaJmaJCaJHaJIaJIaJAaQjaJKaJIaJLaIpaIpaJBaIqaIpaIpaIpaJOaJNaIqaIoaFubavaJQaJPaJSaJRaJFaFwaJJaJGaLoaJMaJUaJTaJWaJVaIDaFzaFBaEjaHpaKeaHqaaaaaaaaaaaaaaaaafaaaaaaaaaaaacwIcwKcwJcwLcwLcwLcwMcwNcwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKfaCSaCSaEpaKgaEraEraEraEraEraEraKhaEraEyaKiawWazzaylaKjaKkaJXaKkaJYaKkaKkaKkaKlaylazFaKnaKmaKnazFazFaKpaJZaKpaBQaBQaBQaBQaKpaKaaKsaBRaKuaKtaKtaKvaKwaKbaKtaKtaKxayEaKyayGaKcayGaKdaKAaKBayGarPapgayWayWayWaBtaEXaBtayWayWayWaJnaJnaJnaKEaJqaJqaJqaJqaJqaKFaJnaJnaJnaJwaKGaJyaKoaAhaAhaAhaAhaAhaAhaAhaAhaAhaAhaKJaMraKraKqaKNaKMaKPaKOaJCaKQaJxaKzaKSaKRaJIaKTaKCaQjaKVaJIaKXaKWaKHaKDaKKaKIaKIaKLaKUaLdaIqaIoaFuaLfaJQaLgaJSaJRaLhaFwaKZcAzaLbaLaaLeaLcaMXaFwaFwaTeaFBaEjaIFaIEaHqaaaaafaafaafaafaafaafaafaaaaaacwIcwPcwOcwRcwQcwLcwMcwScwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKfaCSaLsaCSaCVaCVaCVaCVaCSaCUaLuaLtarBaLvaylaLwaLyaLiaLzaLjaLAasEaLCaLBaylaLDaLFaLEaLEaLGaLEaLEaLkaLEaLEaLEaLEaLEaLEaLHaLKaLJaLMaLLaLNaLNaLPaLNaLNaLNaLNaLlaLnaLmaLpaLNaLqaLNaLTaHPaLIaLxaLWaLVaLXaJsaJsaJsaJraJqaJqaLYaJqaJqaMaaLZaMcaMbaMeaMdaMfaJqaJqaLYaMhaMgaMjaLOaLRaLQaMnaMmaJqaMoaJqaCraMqaMpaMraMraMraLSaMvaMuaMxaMwaJCaLUaMicAAaMCaMBaJIaMDaKCaMkaMlaJIaJIaMGaMIaMsaMyaMtaMAaMzaMEaMNaIqaIoaFuaItaItaMHaMJaItaItaFwaMWaMKaFwaMXaMXaMXaMXaFwaMMaMLaLraEjaCRaCRaCRaMZaMZaMZaNaaNaaNaaafaafaaacrycwTcwUcwUcwVcwUcwXcwWcwUcwTcrzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawWazyawWawWawWawWawWawWazyawWaaaarBaBHaNbaLwaNdaMOaNeaMPaNfasEaNgaLBaNiaNhaLFaNjaNlaNkaNnaNmaNoaLEaLEaLEaLEaLEaLEaLEaLKaLEaLFaLEaLEaLEaMRaMQaMSaMSaMSaMTaMUaMSaMVaMSaMYaMSaNpaNcaNraNqaNsaJqaJqaJqaJqaJqaJqaJqaJqaLYaJqaJqaNwaNvaNyaNxaNAaNzaNBaJqaJqaLYaJqaJqaJqaJqaJqaJqaJqaJqaJqaNCaJqaCraMraMraMraNtaNFaNFaNHaNGaNJaNIaJCaNuaNEaNDaJCaJCaJIaNMcABaNKaMFaNOaJIaIpaIpaNLaIpaIpaIpaNQaNNaNQaIqaIoaFuaNSaItaItaNPaItaNVaFwaFwaFwaFwaFwaFwaFwaNWaFwaFzaFzbxmaEjaNYaNXaCRaNZaObaOaaOdaOcaNaaafaaaaaacwIcwYcwYcwYcrxcwZcwLcxacxccxbcrxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawWazyawWawWawWawWawWawWazyawWaaaarBaBHaNbaLwaNdaMOaNeaMPaNfasEaNgaLBaNiaNhaLFaNjaNlaNkaNnaNmaNoaLEaLEaLEaLEaLEaLEaLEaLKaLEaLFaLEaLEaLEaMRaMQaMSaMSaMSaMTaMUaMSaMVaMSaMYaMSaNpaNcaNraNqaNsaJqaJqaJqaJqaJqaJqaJqaJqaLYaJqaJqaNwaNvaNyaNxaNAaNzaNBaJqaJqaLYaJqaJqaJqaJqaJqaJqaJqaJqaJqaNCaJqaCraMraMraMraNtaNFaNFaNHaNGaNJaNIaJCaNuaNEaNDaJCaJCaJIaNMcABaNKaMFaNOaJIaIpaIpaNLaIpaIpaIpaNQaNNaNQaIqaIoaFuaNSaItaItaNPaItaNVaFwaFwaFwaFwaFwaFwaFwaNWaFwaFzaFzaFBaEjaNYaNXaCRaNZaObaOaaOdaOcaNaaafaaaaaacwIcwYcwYcwYcrxcwZcwLcxacxccxbcrxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaACarBawWauPawWaOfaOeaOhaOgawWauPawWawWarBazzaylaLwaOjaNRaNeaMPaNfasEaOkaLBaylaNhaLFaLEaOmaOlaOlaOlaOoaOnaOpaOlaOqaOlaOlaOlaOraOlaOsaOlaOlaOlaNUaNTaOtaOiaOiaOuaOwaOvaOyaOxaOAaOzaOCaOBbBoaODaJqaOEaOEaOEaOEaOEaOEaOEaOEaOFaOEaOEaOEaOEaOEaOEaOEaOEaOEaOEaOEaOGaOEaOEaOEaOEaOEaOEaOEaOEaJqaJqaJqaCraOHaOHaOHaOHaOHaOHaOJaKMaOLaOKaJCaJCaOOaJCaJCaOPaJIaOIaONaOMaMFaOTaJIaIpaOVaOQaOXaOWaOXaOXaORaOZaIqaIoaFuaPbaPbaYWaOSaPdaPdaPfaFuaPgaPiaPhaCRaPjaPlaPkaFzaFzaPnaPmaCRaPoaCRaPpaPraVXaOUaPsaNaaNaaNaaNacwIcxdcxecxecxfcwLcwLcwLcwLcxacwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafasEawWazyawWazzaylaylazAawWazyawWaPtaPvaPuaylaLwaPxaOYaLzaPaaLAasEaPyaLBaylaPzaPzaPzaPBaPAaPAaPAaPAaPAaPAaPCaPDaPAaPEaPAaPAaPAaPGaPFaPHaPFaPJaPIaPKaLEaLEaPLaPNaPMaLEaPcaPOaLEaPQaPQaJqaPeaLXaJnaJnaJnaJnaJnaJnaJnaJnaPRaPTaPSaPUaPSaPSaPSaPVaPSaPWaPSaPXaPRaJnaJnaJnaJnaJnaJnaJnaJnaJraJqaJqaJCaPZaPYaQbaQaaQbaQbaQcaKMaQeaQdaQgaPwaQiaPPaJIaJIaJIaJIaQkaQjaJIaJIaJIaJIaOXaQfaQmaQmaQmaQmaQhaOXaIqaIoaFuaQpaItaYWaOSaItaItaQqaFuaQraQtaQsaCRaFzaQvaQuaQwaQwaQyaQxaQAaQzaCRaQBaQCaTmaPqaPqaQFaQEaQEaQFcxgcxecxhcxhcrxcxicxkcxjcwLcxacrxaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawWaQGaylawVaPuaylaylaQHawVaylaQGaPuaylaylaylaQIaQJaQlaQoaQnaQDaQDaRdaQKaylaPzaQLaPzaQMaPAaQOaQNaQQaQPaQRaQNaQTaQSaQVaQUaQXaQWaPGaQYaRaaQZaPJaRbaPKaPKaRcaPKaPKaPQaPQaReaRfaPQaPQaPQaRhaJqaLXaJnaaaaaaaaaaaaaaaaaaaaaaPRaRjaRiaRlaRkaRnaRmaRpaRoaRraRqaRsaPRaaaaaaaaaaaaaaaaaaaaaaJnaJraJqaRtaJCaRuaQcaRwaRvaRvaRvaQcaKMaQeaRxaPYaQcaRzaRgaJIaRAaRCaRyaRDaRBaRGaRFaRHaJIaOXaREaRJaRJaRJaRJaRIaOXaIqaRKaFuaRNaRNaYWaOSaROaROaRPaFuaFuaRQaFuaCRaRRaPlaPkaRSaRSaPnaPmaCRaCRaCRaNaaRUaRLaNaaNaaNaaNaaNaaRWcxlcwUcwUcwUcxmcxjcxjcxjcwLcxacwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaawWaRXaRYaRYaRYaRYaRYaRYaRYaRYaRXaRYaRZaylaylaNhaylbcDaSbaylaSdaylaRMaSeaSfaPzaSgaPzaQMaPAaShaQNaQNaQNaQNaQNaQTaSjaQNaQNaQNaQWaPGaSkaRaaRaaPJaRbaPKaSlaSmaSmaSnaPQaRVaRTaScaSaaStaSsaJqaJqaLXaJnaaaaaaaaaaaaaPRaPRaPRaPRaSvaSuaSxaSwaSzaSyaSBaSAaSDaSCaSEaPRaPRaPRaPRaaaaaaaaaaaaaJnaJraJqaJqaOKaQcaQcaQcaQcaSoaSHaSGaSpaQeaQdaSqaQcaSFaQcaSIaVzaSKaSJaSMaSLaSOaSNaVzaSPaSRaSQaRJaSSaSTaRJaSUaOXaIqaIoaFuaItaItaYWaOSaItaItaItaTcaTbaItaTdaCRaTeaTgaTfaRSaRSaTiaThaTjaCRaTlaTkaQCaTmaPqaPqaTnaQEaQEaTocxncwLcxocwLcwLcwLcwLcwLcwLcxpcwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafarBarBawWawWawWawWawWawWawWawWarBarBasEaNhaTraTqaTqaTsaTqaTqaTqaTqaTtaTqaTqaPzaSgaTuaTvaPAaTwaQNaSVaTxaTAaTzaTCaTBaSiaQNaQNaTDaPGaTEaTGaTFaPJaRbaPKaTHaTJaTIaTKaPQaSWaTLaSXaSraTPaSsaJqaJqaLXaJnaJnaJwaTQaPRaPRaTRaTTaTSaTVaTUaTXaTWaTYaTXaTZaTXaTXaUaaUcaUbaUeaUdaPRaPRaTQaJwaJnaJnaJraJqaJqaJCaUfaQcaQcaQcaUgaUgaQcaQcaMxaSYaQcaSZaQcaTaaJIaVzaVzaTMaVGaTNaTOaVFaVzaUhaUiaVIaRJaUjaUkaRJaXoaUzaIqaIoaFuaUBaUBaYWaOSaUCaItaItaUDaItaUFaUEaCRaUGaUIaUHaRSaRSaUKaUJaFzaCRaULaPqaQCaTmaPqaPsaNaaNaaNaaNacwIcxkcwLcxqcxrcwLcxqcxrcwLcxscwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxtcxucxucxvcxucxucxucxwcxucxucxxaaaawWaAFaymaUMaTqaUOaUNaUQaUPaUQaUlaUmaUQaTqaSgaSgaUSaUTaPAaUUaUnaUoaUVaUqaUpaUsaUraUuaUtaUvaQWaPGaPGaPGaPGaPJaRbaPKaPKaPKaPKaPKaPQaVaaSraUwaSraSraSsaJqaJqaLXaJsaJsaVbaVdaVcaPRaVeaVgaVfaViaVhaViaVjaVlaVkaVnaVmaVpaVoaVmaVqaVsaVraPRaVtaVdaVuaVvaJsaJraJqaJqaOKaQbaQcczOaQcaVxaVwaQcaQcaQeaVyaQcaQcaQcaQcaVAaVzaVzaVBaVEaVDaVGaVFaVHaJIaVJaVIaVKaRJaRJaRJaXoaVMaIqaUxaFuaFuaFuaYWaOSaVPaVQaItaVSaVRaLgaVTaCRaFzaTgaTfaRSaRSaVUaThaVVaCRaVWaPqaQCaTmaPqaPsaNaaaaaafaaacrxcxkcwLcxqcxrcwLcxqcxrcwLcxscrxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxtcxycxAcxzcxBcxBcxBcxBcxBcxBcxBcxvaWaawWawWazzaylaTqaUybaHaUAaUOaUWaURaUmaUQaTqaWjaWlaWkaPzaPAaWnaTyaUXaWoaWqaWqaUYaWqaWqaWqaWpaUZaPAaWuaWwaWvaVCaWxaWAaWzaWBaPzaWCaPQaWEaWDaWGaWFaWFaSsaJqaJqaJqaJqaJqaWHaWJaWIaWLaWKaWNaWMaWPaWOaWRaWQaWTaWSaWVaWUaWXaWWaWYaWMaXaaWZaXcaXbaXeaXdaXgaXfaXhaJqaJqaJCaXiaQcaQcaQcaRwaRvaQcaQcaQeaVyaXjaVyaXlaXkaJIaVzcACaVzaXmaVzaVzaVFaXnaJIaOXaVIaRJaRJaRJaRJaXoaOXaIqaVLaVOaVNaVZaVYaWbaXuaXuaWdaYWaYWaYWaYWaWeaRSaRSaRSaRSaRSaWgaXzaXBaXyaXDaXCaXFaWhaOUaXGaNaaafaafaaacrxcxkcwLcxqcxrcwLcxqcxrcwLcxscrxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafarBarBawWawWawWawWawWawWawWawWarBarBasEaNhaTraTqaTqaTsaTqaTqaTqaTqaTtaTqaTqaPzaSgaTuaTvaPAaTwaQNaSVaTxaTAaTzaTCaTBaSiaQNaQNaTDaPGaTEaTGaTFaPJaRbaPKaTHaTJaTIaTKaPQaSWaTLaSXaSraTPaSsaJqaJqaLXaJnaJnaJwaTQaPRaPRaTRaTTaTSaTVaTUaTXaTWaTYaTXaTZaTXaTXaUaaUcaUbaUeaUdaPRaPRaTQaJwaJnaJnaJraJqaJqaJCaUfaQcaUgaUgaUgaUgaQcaQcaMxaSYaQcaSZaQcaTaaJIaVzaVzaTMaVGaTNaTOaVFaVzaUhaUiaVIaRJaUjaUkaRJaXoaUzaIqaIoaFuaUBaUBaYWaOSaUCaItaItaUDaItaUFaUEaCRaUGaUIaUHaRSaRSaUKaUJaFzaCRaULaPqaQCaTmaPqaPsaNaaNaaNaaNacwIcxkcwLcxqcxrcwLcxqcxrcwLcxscwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxtcxucxucxvcxucxucxucxwcxucxucxxaaaawWaAFaymaUMaTqaUOaUNaUQaUPaUQaUlaUmaUQaTqaSgaSgaUSaUTaPAaUUaUnaUoaUVaUqaUpaUsaUraUuaUtaUvaQWaPGaPGaPGaPGaPJaRbaPKaPKaPKaPKaPKaPQaVaaSraUwaSraSraSsaJqaJqaLXaJsaJsaVbaVdaVcaPRaVeaVgaVfaViaVhaViaVjaVlaVkaVnaVmaVpaVoaVmaVqaVsaVraPRaVtaVdaVuaVvaJsaJraJqaJqaOKaQbaQcaQbaQbaVxaVwaQcaQcaQeaVyaQcaQcaQcaQcaVAaVzaVzaVBaVEaVDaVGaVFaVHaJIaVJaVIaVKaRJaRJaRJaXoaVMaIqaUxaFuaFuaFuaYWaOSaVPaVQaItaVSaVRaLgaVTaCRaFzaTgaTfaRSaRSaVUaThaVVaCRaVWaPqaQCaTmaPqaPsaNaaaaaafaaacrxcxkcwLcxqcxrcwLcxqcxrcwLcxscrxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxtcxycxAcxzcxBcxBcxBcxBcxBcxBcxBcxvaWaawWawWazzaylaTqaUybaHaUAaUOaUWaURaUmaUQaTqaWjaWlaWkaPzaPAaWnaTyaUXaWoaWqaWqaUYaWqaWqaWqaWpaUZaPAaWuaWwaWvaVCaWxaWAaWzaWBaPzaWCaPQaWEaWDaWGaWFaWFaSsaJqaJqaJqaJqaJqaWHaWJaWIaWLaWKaWNaWMaWPaWOaWRaWQaWTaWSaWVaWUaWXaWWaWYaWMaXaaWZaXcaXbaXeaXdaXgaXfaXhaJqaJqaJCaXiaQcaRvaRvaRwaRvaQcaQcaQeaVyaXjaVyaXlaXkaJIaVzcACaVzaXmaVzaVzaVFaXnaJIaOXaVIaRJaRJaRJaRJaXoaOXaIqaVLaVOaVNaVZaVYaWbaXuaXuaWdaYWaYWaYWaYWaWeaRSaRSaRSaRSaRSaWgaXzaXBaXyaXDaXCaXFaWhaOUaXGaNaaafaafaaacrxcxkcwLcxqcxrcwLcxqcxrcwLcxscrxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxDcxCcxCcxCcxCcxCcxCcxCcxCcxCcxCcxEaXIauPaXIaylaylaTqaWmaWiaWraXLaXLaWsaWtaXNaTqaXPaSgaWkaXQaXQaXQaWyaXpaXQaXsaXraXvaXtaXwaXwaXAaXxaPAaYaaYcaYbaXJaXEaXMaXKaYhaYgaYgaYiaYiaYiaYiaYiaYjaPQaJqaJqaYlaYkaYnaYmaYpaYoaPRaYqaYsaYraYuaYtaYvaYvaYxaYwaYzaYyaYBaYAaYCaYraYDaYqaPRaYoaYpaYEaYFaYkaYGaJqaJqaOKaQcaQcaQcaQcaQcaQcaQcaQcaXOaPYaYIaPYaQcaQcaYKaYJaYLaVzaVzaVzaVzaYMaYNaJIaYPaYOaRJaYQaYQaYRaYOaYTaXSaXRbdpbdpaXTaYYaXUaYWaYWaXVaYWaYWaYWaYWaWeaXWaZfaZfaZfaZfaZfaZgaZhaZeaZjaZiaZlaZkaPqaZmaNaaaaaafaaacrxcxkcwLcxqcxrcwLcxqcxrcwLcxscrxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxGcxFcxHcxHcxIcxIcxIcxIcxIcxIcxIcxvawWawWawWazzaWcaXXaWfaXYaXZaXZaXZaXZaYdaUOaTqaZraZsaWkaXQaZtaZvaYebaOaXQaYHaZxaYSaPAaZBaZAaYXaYUaPAaZDaZFaZEaYZaZEaZEaZaaZEaZEaZIaZHaZHaZHaZJaZHaZLaZKaLYaLYaZNaZMaZMaZMaZMaZMaZMaZOaZQaZPaYtaYxaZSaZRaZRaZTaZRaZRaZUaYzaYAaZVaZXaZWaZVaZVaZVaZVaZVaZVaZYaLYaLYaJCbaaaZZbacbabaQcaQcaQcbadaZbbaeaQcbagbaibahaJIaJIaJIbajbakbakbakaJIaJIaJIbalaRJaRJbambambanbapbamaIqaZcaYVbaraFubasbaubataVQaItbaxaUDaVQaZdaCRbazaFzbaAaRSaRSbaAaFzbaBaCRbaDbaCbaEaTmaPqaPsaNaaNaaNaaNacwIcxkcwLcxqcxrcwLcxqcxrcwLcxscwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxGcxucxucxvcxucxucxucxwcxucxucxJaaaawWbaFaPubaGaTqaUQbaHaUQaUObaJaUQaZnaUQaTqbaLbaNbaMaXQaXQaXQaZwaZoaXQaZxaZxaZxaPAaZBaZAaYXaYUaPAaZDaZFaZEaZpbaSbaSbfibaUaZEbaWbaVbaYbaXaZKaZKaZKaZKaJqaJqaYlaZMaZuaZqaZzaZybbXaZCbbibbhbbkbbjaZRaZRbbmbblbbmaZRaZRbbnbbpbbobafaZGbaqbaobbvbbubbwaZVaYGaJqaJqaJCaJCaJCaJCaJCbbxaOKbbxbbyaJCaJCaJCaJCaJCaJCaJIbbzbbzbbzbbzbbzbbzbbAbbzaJIbambbBbbBbamaYVaYVaYVaYVaIqaZcaYVbaraFuaFuaFubbDaFubbDaFubbDaFuaFuaCRaCRbbFbbFbbFbbFbbFbbFaCRaCRbbGaPqbbHaTmaPqaPqaToaQEaQEaTocxKcwLcxLcwLcwLcwLcwLcwLcwLcxpcwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6957,7 +6955,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacypcyccyhcyicyicyicyMcygcyccyccyecyEcypcywcyicyOcyOcyPcylaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyQbrJbrKbrJbrLbjrbjrbjrboKboKboKboKbjrbjrbrNbrMaZEbrObbRbtvbpBbqpbfmbqsbbRbbRbbRbqubmEbrTaJqbqvbqybrUbrWbqqbqqbqrbrZbmraafaafbsbbsabsdbscbsfbsebsgaafaafbshbsjbsibslbskbsnbsmbsobqHbspaJqbqNbqMbqRbqObqTbqSbqVbqUbsybqXbqYbsxbsxbsxbsxbsxbrgbrfbsxbsxbsxbrhbhgbribrjbpEbsKbrkbsLbsLbsNbpKbonbPvbdPbsObsQbsPbsRbsRbfVbsSbCIbsTboxbrlbiLbsWboxbsXbsZbrmbtbbtabrobrnbrpbtebthbrrbtjbrubrwbrvbrvbrvbrPbrybrQbhGbtqbtpcAKbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyEcygcywcyicylcyicyicyicyicyicyicyicyicyMcyhcyicyicyicyicyicyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyScyCboIblWblWbtrbjrbjrbjrbjrbjrbjrbjrbjrbjrbrNbtsaZEbttbtubjvbrRbkMbkNbkMbuIbbRbtybnKbtzbrTaJqbqvbqybmrbtBbrSbtDbtCbtEbmraaaaaaaafbgObtGbtFbtGbijaafaaaaaabshbtIbtHbtKbtJbtLbtLbtNbtMbtObAkaNrbrVbrXbLXbFDbrYbEebsqbEebEebssbsrbtXbtVbtVbtVbtZbhhbhhbhhbstbuabuabsubpEbpEbpEbsvbugbufbrebpKbonbdObdPbuhbuhbuhbuhbuhbfVboxboxboxboxbujbswbujboxbszcdXbsAbuobuobuobsCbsDbupbusbsEbuubsFbuwbuvbuvbsGbsIbsHbsMbsJbtqbtpbtpbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyEcyccyccyccyccyccyccyccyEcybaaacyacypcywcyicyicyicylcyicyicyDcyccyccyecyKcyicyicylcyicyicyicyicyicyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyTbrJbrKbrJbnwbuBbjrbjrbuCbjrbuBbjrbjrbjrbrNbuDaZEbuEbbRbtvbsVbbRbfmbbRbbRbbRbuJbnKbtzbrTaYlbqvbuKbmrbuMbsYbuObuNbnSbmraaaaaaaafbuPbuQbphbuSbuRaafaaaaaabshbtdbtcbuWbuVbuYbuXbuZbqHbvaaJqaJqbofbofbtfbJGbwzbBLbvjbvhbtgbtgbvhbvjbvhbvjbvhbvjbvhbvjbfJbfJbuabvnbsLbtkbtibpEbsvbtlbvsbvvbvubonbtmbtobtnbtxbtwbuobuobtAbuobuobtPbtSbtQbtUbvEbuobtWceXbvHbvJbvJbvJbvKbvKbvKbvKbvKbvMbtYbvObvNbvObvPbvObqebuzbhGbvQbrGbvRbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacypcywcyicyicyicyicyicyicyicyMcypcyccypcywcyicyicyicyicyUcyicyicylcyVcyWcyicylcyicyicyRcyicyicyicyXcyYcyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyZbvSbvTbvSbvVbvUbvVbvVbvVbvVbvVbubbvXbjrbrNbvYaZEbvZbbRbucbwcbudbwebwdbwdbwdbwebwebwfbrTaKFbwgbqybmrbwibuebwkbwjbwlbmraaaaaaaafbwmbwnbscbwpbwoaafaaaaaabshbwrbwqbwtbwsbuYbuXbuZbqHbwuaJqaJqbwvbwxbuibJGbwybwAbvjbwCbDRbukbwDbwGbwFbwIbwHbwIbwJbvjbhhbhhbuabwLbsLbumbulbuqbunbutburburbuxbuGbuybuLbuHbuUbuTbxdbvbbxdbxdbvcbxdbxdbvebxebxdbxdbxfbvgbvfbvJbCkbxjbxibxlbxkczPbvKbxobxnbxqbxpbxrbxnbxsbqebuzbhGbxtbtpbtpbkyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacypcywcyicyicyicyicyicyicyicyMcypcyccypcywcyicyicyicyicyUcyicyicylcyVcyWcyicylcyicyicyRcyicyicyicyXcyYcyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyZbvSbvTbvSbvVbvUbvVbvVbvVbvVbvVbubbvXbjrbrNbvYaZEbvZbbRbucbwcbudbwebwdbwdbwdbwebwebwfbrTaKFbwgbqybmrbwibuebwkbwjbwlbmraaaaaaaafbwmbwnbscbwpbwoaafaaaaaabshbwrbwqbwtbwsbuYbuXbuZbqHbwuaJqaJqbwvbwxbuibJGbwybwAbvjbwCbDRbukbwDbwGbwFbwIbwHbwIbwJbvjbhhbhhbuabwLbsLbumbulbuqbunbutburburbuxbuGbuybuLbuHbuUbuTbxdbvbbxdbxdbvcbxdbxdbvebxebxdbxdbxfbvgbvfbvJbCkbxjbxibxlbxkbxmbvKbxobxnbxqbxpbxrbxnbxsbqebuzbhGbxtbtpbtpbkyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyecyicyicyicyicyicyicyicyicyicyecyicyecyicyicyicyicyiczacyicyicylcyicyicyicylcyicyiczacyicyicyiczbczccyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyCboIblWblWblWaZEblWblWblWbxubxubxubxubxwbxxbxxbxubxubxybxzbxAbxybwebxBbxDbxCbxEbwebtzbrTaLXaJwaJwbmrbmrbmrbmrbmrbxGbmraJnaJnaJnbxHbxIbtFbxKbxJaJnaJnaJnbqHbqHbqHbqHbqHbqHbqHbqHbqHbwuaJqbxLbvjbvjbvibvlbvjbvjbvjbxNbDRbvmbDRbxRbxQbxTbxSbxVbxUbxRbhhbhhbuabxXbvobvqbvpbvtbvrbvwbvpbvpbvybvAbvzbvBbyfbyfbyfbyfbyhbyfbyfbyfbyibyibyjbvCbykbykbzEbvDbrtbvJbyobyqbypbysbyrbyubytbqebqebyvbyvbyvbqebywbqebuzbhGbvQbrGbyxbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacypcyKcyicyicyicyicyicyiczdcyDcypcyccypcyKcyicyicyicyicyUcyicyicylcyiczecyicylcyicyicyRcyicyicyicyXcyXcyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczgczfcyBcyBcyBczhcziaaaaaaaaaaaaaafaaaaaaaaaaaabxubvFbyAbyzbyCbyBbyDbxxbyFbBabvIbvGbwdbvLbyLbyKbyMbwebtzbrTaJqaJqaJqbyNaMmaMnaLYbyPbyRbyQaXfaXfaXfbySbwabvWbwhbwbaJqaJqaJqaJqaMmaJqaLYaJqaJqaJqbyNaJqbwuaJqbyXbvjbwBbwwbwEbzabAlbvjbzebDRbDTbDRbxRbxQbxQbzhbzjbzibxRbhhbwKbuabsLbzlbznbzmbyebzobzqbzpbzrbonbonbdOcbKbyfbzubztbzwbzvbzybzxbyfbzzbwNbwMbzDbzCbykbzEbvDbwObwQaDHbwRbzJbzMbzLbzNbytbzObzObzObzObzObzObzObqebuzbhGbtqbtpbtpbkyaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHraaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczjcygcyccyccyccyccyccyccyccygczkaaaczjcypcyKcyicyicyicylcyicyicylcyiczmczlcylcyicyicylcyicyicyicyicyicyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczocznczpczpczpcznczqaaaaaaaaaaaaaafaaaaaaaaaaaabxxbzPbzRbzQbzTbwSbwUbwTbwWbwVbwXbAZbwYbyIbyKbyKbAdbwebtzbAeaJqaJqaJqaJqaJqaJqaLYaJqbrTaJqaJqaJqaJqaJqbAgbAfbAhaJqaJqaJqaJqaJqaJqaJqaLYaJqaJqaJqaJqaJqbwubAjaJqbvjbxabwZbxcbxbbAlbvjbApbDRbukbAqbvjbArbAtbAsbAvbAubvjbhhbhhbuabuabuabuabuabonbonbonbonbonbonbAwbPvbxgbyfbAzbAybABbAAbADbACbyfbAEbAGbAFbxvbAHbykbzEbxMbxFbxWbxPbxYbxYbyabxZbybbytbzObzObARbAQbzObzObzObqebuzbhGbtqbtpbtpbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm
index 8ba60c17050..f3c43e60a2e 100644
--- a/_maps/map_files/generic/z2.dmm
+++ b/_maps/map_files/generic/z2.dmm
@@ -399,9 +399,9 @@
"hI" = (/obj/machinery/door/airlock/centcom{name = "Centcom Docks"; opacity = 1; req_access_txt = "101"},/turf/simulated/floor/plasteel/black,/area/centcom/control)
"hJ" = (/obj/machinery/door/poddoor/preopen{id = "CentComPort"; name = "security door"},/turf/simulated/floor/plasteel/loadingarea{dir = 8},/area/centcom/control)
"hK" = (/turf/simulated/floor/plasteel/warning{dir = 8},/area/centcom/evac)
-"hL" = (/obj/structure/flora/tree/pine/xmas,/turf/simulated/floor/plasteel,/area/centcom/evac)
+"hL" = (/obj/structure/cult/talisman{desc = "A altar dedicated to the Wizard's Federation"},/obj/item/weapon/kitchen/knife/ritual,/turf/simulated/floor/plasteel/cult,/area/wizard_station)
"hM" = (/obj/structure/flora/bush,/turf/simulated/floor/plating/asteroid/snow,/area/syndicate_mothership)
-"hN" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel/warning{dir = 8},/area/centcom/supply)
+"hN" = (/obj/machinery/computer/cargo,/turf/simulated/floor/plasteel/warning{dir = 8},/area/centcom/supply)
"hO" = (/turf/simulated/floor/plasteel/green/corner{dir = 8},/area/centcom/control)
"hP" = (/turf/simulated/floor/plasteel/warning/corner{dir = 4},/area/centcom/evac)
"hQ" = (/obj/docking_port/stationary{dir = 8; dwidth = 5; height = 7; id = "supply_away"; name = "Centcom"; width = 12},/turf/space,/area/space)
@@ -650,7 +650,6 @@
"mz" = (/turf/indestructible/fakeglass{color = "#008000"; dir = 1; icon_state = "fakewindows2"},/area/wizard_station)
"mA" = (/obj/structure/bookcase,/turf/simulated/floor/plasteel/cult,/area/wizard_station)
"mB" = (/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/wizard_station)
-"mC" = (/obj/structure/cult/talisman{desc = "A altar dedicated to the Wizard's Federation"},/obj/item/weapon/kitchen/knife/ritual,/obj/item/clothing/suit/wizrobe/santa,/obj/item/clothing/head/wizard/santa,/turf/simulated/floor/plasteel/cult,/area/wizard_station)
"mD" = (/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/simulated/floor/plasteel/cult,/area/wizard_station)
"mE" = (/obj/effect/decal/cleanable/blood/splatter,/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/simulated/floor/plasteel/cult/airless,/area/wizard_station)
"mF" = (/obj/machinery/door/poddoor/preopen,/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plating/airless,/area/wizard_station)
@@ -1078,7 +1077,7 @@ abababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhbhbhbhbhbhbhbgShcgTgCgCgChdgrgNgrgrgWhefNgOgKgKgKgKhfhfhfhggKgKgLgRhhabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababhihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihiababababababababababababababababababababababababababababababababababababababhbhjhkhlhkhmhbgSgBgTgCgCgChngNgSgrhohphqfNhrgKgKgKgKgKgKgKgKgKgKgLgRababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshshshshshthshshshuhvhshshshshshuhshshshshshwhuhshshiababababababababababababababababababababababababababababababababababababababhxhyhzhzhzhzhbgNgrhAgCgCgChBgrgNgrgNhCgNfNhDgKgKgKgKgKgKgKgKgKgKgLgRababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshthshshshshshshshshshshshuhshshshshshshshuhshEhshshshiababababababababababababababababababababababababababababababababababababababhFhyhzhzhzhzhGhHgCgCgCgCgCgCgCgUhIgWgWgWhJhKgKgKgKgKgKhLgKgKgKgKgLgRababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshthshshshshshshshshshshshuhshshshshshshshuhshEhshshshiababababababababababababababababababababababababababababababababababababababhFhyhzhzhzhzhGhHgCgCgCgCgCgCgCgUhIgWgWgWhJhKgKgKgKgKgKgKgKgKgKgKgLgRababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshshshMhshshshshshthshshvhshshuhshshuhshshuhvhshuhshiababababababababababababababababababababababababababababababababababababababhxhNhzhzhzhzhbgNgrhOgCgCgChdgrgNgrgrgrgrfNhPgKgKgKgKgKgKgKgKgKgKgLgRababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshshshshshshshshshshshshshuhshshthshshuhvhshshuhshvhiabababababababababababababababababababababababababababababababababababababhQhFhyhzhzhzhzhbgSgugTgCgCgChRgugSgrabababfNhSgKgKgKgKgKgKgKgKgKgKgLgRababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshshshshshshshshshshshthshshshshshshshvhshuhvhshuhshiababababababababababababababababababababababababababababababababababababababhThyhzhzhzhzhbgShcgTgCgCgChRhcgSgrabababfNhUgKgKgKgKhVhVhVhWgKgKgLgRababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
@@ -1099,7 +1098,7 @@ ababababababababababaaaaaaaaaaaaaaaaaakVjuaaaajulGlHlIlJlIkVjujuaaaaaaaaaaaaaaaa
ababababababababababaaaaaaaaaaaaaajcjclQjcjcjcjcjcjclRjcjcjcjcjcjcaajuaaaaaaaaaaababababababhihshXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshshshMhshilLlLlLlLlLlLhiiRiRiRlululululuiRiRhiabababababababababababababababababababablTlTlTlTlTlTlTlTlTlUlVlVlVlVlVlVlVlVlVlVlVlVlVlUlTlTlTlTlTlTlTlTlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaajclWkGkGlWjclXlYkGkGkGlZmajcmbmcmdmejujuaaaaaaababababababhihshXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshthshshvkLlLlLlLlLlLmfhihihihihihihihihihihihiabababababababababababababababababababablTmgmhmimimimimimjmklVlVlVlVlVlVlVlVlVlVlVlVlVmlmjmmmmmmmmmmmhmnlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaamompkGkGmpmomqmqkGkGkGkGmrmomsmtlxlxmuaaaaaaaaababababababhihshXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshMhuhthMhimvmvmvmvmvmwhiababababababababababababababababababababababababababababababablTmgmhmimxmimxmimjmklVlVlVlVlVlVlVlVlVlVlVlVlVmlmjmmmymmmymmmhmnlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaamzmAkGlnkGmBlzlnkGmCkGkGmDmzmEmFmGmHmImJaaaaaaababababababhihshXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshshshuhshihihihihihihihiababababababababababababababababababababababababababababababablTmgmhmimimKmimimjmklVlVlVlVlVmLmMmLlVlVlVlVlVmlmjmmmmmNmmmmmhmnlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaamzmAkGlnkGmBlzlnkGhLkGkGmDmzmEmFmGmHmImJaaaaaaababababababhihshXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshshshuhshihihihihihihihiababababababababababababababababababababababababababababababablTmgmhmimimKmimimjmklVlVlVlVlVmLmMmLlVlVlVlVlVmlmjmmmmmNmmmmmhmnlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaamOmpkGlIlzmPlIkGkGmQkGkGkGmOmRmSmumTkPaaaaaaaaababababababhihshXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshuhshMhshiabababababababababababababababababababababababababababababababababababababablTmgmhmimimimimimjmklVlVlVlVlVmLmUmLlVlVlVlVlVmlmjmmmmmmmmmmmhmnlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaajcmVkGkGmVjcmWkGlnlIkGkGmWjcmXmYmZnaaaaaaaaaaaababababababhihshXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshshshshshiabababababababababababababababababababababababababababababababababababababablTmgmhmimxmimxmimjmklVlVlVlVlVlVlVlVlVlVlVlVlVmlmjmmmymmmymmmhmnlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaajcjcnbjcjcjcjcjckunckujcjcjcjcjcjujujuaaaaaaaaababababababhihshXhXhXhXhXhshXhXhXhXhXhshXhXhXhXhXhshshshshEhshshiabababababababababababababababababababababababababababababababababababababablTmgmhmimimimimimjmklVlVlVlVlVlVlVlVlVlVlVlVlVmlmjmmmmmmmmmmmhmnlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
diff --git a/code/__HELPERS/510.dm b/code/__HELPERS/510.dm
new file mode 100644
index 00000000000..6bca2a51721
--- /dev/null
+++ b/code/__HELPERS/510.dm
@@ -0,0 +1,253 @@
+// Helpers for running 510 code on older versions of BYOND.
+#if DM_VERSION < 510
+#define BYGEX "code/__HELPERS/bygex"
+/proc/replacetext(text, replace, replacement)
+ if(istype(replace, /regex))
+ var/regex/R = replace
+ return R.Replace(text, replacement)
+ else
+ return call(BYGEX, "regex_replaceallliteral")(text, replace, replacement)
+
+/proc/replacetextEx(text, replace, replacement)
+ return call(BYGEX, "regEx_replaceallliteral")(text, replace, replacement)
+
+/proc/regex(pattern, flags)
+ return new /regex(pattern, flags)
+
+/regex
+ var/pattern
+ var/list/flags
+ var/list/group
+
+/regex/New(pattern, flags)
+ src.pattern = pattern
+ src.flags = splittext(flags, "")
+ group = list()
+
+/regex/proc/Find(text) // Does not support Start/End.
+ var/method
+ if("i" in flags)
+ method = "regex_find"
+ else
+ method = "regEx_find"
+
+ var/results = call(BYGEX, method)(text, pattern)
+ var/list/L = params2list(results)
+ var/list/M
+ var/i
+ var/j
+
+ for(i in L)
+ M = L[i]
+ for(j = 2, j <= M.len, j += 2)
+ var/pos = text2num(M[j-1])
+ var/len = text2num(M[j])
+ group += copytext(text, pos, pos + len)
+
+/regex/proc/Replace(text, replacement)
+ var/method
+ if("g" in flags)
+ if("i" in flags)
+ method = "regex_replaceall"
+ else
+ method = "regEx_replaceall"
+ else
+ if("i" in flags)
+ method = "regex_replace"
+ else
+ method = "regEx_replace"
+ return call(BYGEX, method)(text, pattern, replacement)
+#undef BYGEX
+
+// Formerly list2text
+/proc/jointext(list/ls, sep)
+ if(ls.len <= 1) // Early-out code for empty or singleton lists.
+ return ls.len ? ls[1] : ""
+
+ var/l = ls.len // Made local for sanic speed.
+ var/i = 0 // Incremented every time a list index is accessed.
+
+ if(sep != null)
+ // Macros expand to long argument lists like so: sep, ls[++i], sep, ls[++i], sep, ls[++i], etc...
+ #define S1 sep, ls[++i]
+ #define S4 S1, S1, S1, S1
+ #define S16 S4, S4, S4, S4
+ #define S64 S16, S16, S16, S16
+
+ . = "[ls[++i]]" // Make sure the initial element is converted to text.
+
+ // Having the small concatenations come before the large ones boosted speed by an average of at least 5%.
+ if(l-1 & 0x01) // 'i' will always be 1 here.
+ . = text("[][][]", ., S1) // Append 1 element if the remaining elements are not a multiple of 2.
+ if(l-i & 0x02)
+ . = text("[][][][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4.
+ if(l-i & 0x04)
+ . = text("[][][][][][][][][]", ., S4) // And so on....
+ if(l-i & 0x08)
+ . = text("[][][][][][][][][][][][][][][][][]", ., S4, S4)
+ if(l-i & 0x10)
+ . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16)
+ if(l-i & 0x20)
+ . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16)
+ if(l-i & 0x40)
+ . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64)
+ while(l > i) // Chomp through the rest of the list, 128 elements at a time.
+ . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64)
+
+ #undef S64
+ #undef S16
+ #undef S4
+ #undef S1
+
+ else
+ // Macros expand to long argument lists like so: ls[++i], ls[++i], ls[++i], etc...
+ #define S1 ls[++i]
+ #define S4 S1, S1, S1, S1
+ #define S16 S4, S4, S4, S4
+ #define S64 S16, S16, S16, S16
+
+ . = "[ls[++i]]" // Make sure the initial element is converted to text.
+
+ if(l-1 & 0x01) // 'i' will always be 1 here.
+ . += "[S1]" // Append 1 element if the remaining elements are not a multiple of 2.
+ if(l-i & 0x02)
+ . = text("[][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4.
+ if(l-i & 0x04)
+ . = text("[][][][][]", ., S4) // And so on...
+ if(l-i & 0x08)
+ . = text("[][][][][][][][][]", ., S4, S4)
+ if(l-i & 0x10)
+ . = text("[][][][][][][][][][][][][][][][][]", ., S16)
+ if(l-i & 0x20)
+ . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16)
+ if(l-i & 0x40)
+ . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64)
+ while(l > i) // Chomp through the rest of the list, 128 elements at a time.
+ . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
+ [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64)
+
+ #undef S64
+ #undef S16
+ #undef S4
+ #undef S1
+
+// Formerly text2list
+/proc/splittext(text, delim = "\n")
+ var/delim_len = length(delim)
+ . = list()
+ var/last_found = 1
+ var/found = 1
+ if(delim_len < 1)
+ var/text_len = length(text)
+ while(found++ <= text_len)
+ . += copytext(text,found-1, found)
+ else
+ do
+ found = findtext(text, delim, last_found, 0)
+ . += copytext(text, last_found, found)
+ last_found = found + delim_len
+ while(found)
+
+// Formerly JSON.stringify
+/proc/json_encode(value)
+ return jointext(json_encode_value(list(), value))
+
+/proc/json_encode_value(list/json, value)
+ . = json
+ if(isnum(value))
+ json += value // Consider num2text(value, 20) for maximum accuracy.
+ else if(isnull(value))
+ json += "null"
+ else if(istext(value))
+ json_encode_string(json, value)
+ else if(istype(value, /list))
+ json_encode_list(json, value)
+ else
+ json_encode_string(json, "[value]")
+ // 510 just encodes the name of a datum.
+ //throw EXCEPTION("Datums cannot be converted to JSON.")
+
+/proc/json_encode_string(list/json, str)
+ . = json
+ var/quotePos = findtextEx(str, "\"")
+ var/bsPos = findtextEx(str, "\\")
+ if (quotePos == 0 && bsPos == 0)
+ json.Add("\"", str, "\"")
+ else
+ json += "\""
+ var/lastStop = 1
+ while(quotePos != 0 || bsPos != 0)
+ var/escPos
+ if(quotePos < bsPos && quotePos != 0 || bsPos == 0)
+ escPos = quotePos
+ else
+ escPos = bsPos
+ json.Add(copytext(str, lastStop, escPos), "\\")
+ lastStop = escPos
+ if(escPos == quotePos)
+ quotePos = findtextEx(str, "\"", escPos + 1)
+ else if(escPos == bsPos)
+ bsPos = findtextEx(str, "\\", escPos + 1)
+ json.Add(copytext(str, lastStop), "\"")
+
+/proc/json_encode_list(list/json, list/listVal)
+ . = json
+ #define Either 0
+ #define CannotBeArray 1
+ #define CannotBeObject 2
+ #define BadList (CannotBeArray | CannotBeObject)
+ var/listType = Either
+ for(var/key in listVal)
+ if(istext(key))
+ if(!isnull(listVal[key]))
+ listType |= CannotBeArray
+ else
+ if(!isnum(key) && !isnull(listVal[key]))
+ listType = BadList
+ else
+ listType |= CannotBeObject
+
+ if(listType == BadList)
+ throw EXCEPTION("The given list cannot be converted to JSON.")
+
+ if(listType == CannotBeArray)
+ json += "{"
+ var/addComma
+ for(var/key in listVal)
+ if(addComma)
+ json += ","
+ else
+ addComma = TRUE
+ json_encode_string(json, key)
+ json += ":"
+ json_encode_value(json, listVal[key])
+ json += "}"
+ else
+ json += "\["
+ var/addComma
+ for(var/key in listVal)
+ if(addComma)
+ json += ","
+ else
+ addComma = TRUE
+ json_encode_value(json, key)
+ json += "]"
+ #undef Either
+ #undef CannotBeFlat
+ #undef CannotBeAssoc
+ #undef BadList
+#endif
\ No newline at end of file
diff --git a/code/__HELPERS/_string_lists.dm b/code/__HELPERS/_string_lists.dm
index b2b31ab36e4..969b46ebda7 100644
--- a/code/__HELPERS/_string_lists.dm
+++ b/code/__HELPERS/_string_lists.dm
@@ -12,11 +12,11 @@ var/global/list/string_cache
var/list/stringsList = list()
fileList = file2list("strings/[filename]")
for(var/s in fileList)
- stringsList = text2list(s, "@=")
+ stringsList = splittext(s, "@=")
if(stringsList.len != 2)
CRASH("Invalid string list in strings/[filename]")
if(findtext(stringsList[2], "@,"))
- string_cache[filename][stringsList[1]] = text2list(stringsList[2], "@,")
+ string_cache[filename][stringsList[1]] = splittext(stringsList[2], "@,")
else
string_cache[filename][stringsList[1]] = stringsList[2] // Its a single string!
else
diff --git a/bin/bygex.dll b/code/__HELPERS/bygex.dll
similarity index 100%
rename from bin/bygex.dll
rename to code/__HELPERS/bygex.dll
diff --git a/code/__HELPERS/bygex/bygex.dm b/code/__HELPERS/bygex/bygex.dm
deleted file mode 100644
index 69ebbd8dbb4..00000000000
--- a/code/__HELPERS/bygex/bygex.dm
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- This file is part of bygex.
-
- bygex is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of
- the License, or (at your option) any later version.
-
- bygex is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with bygex. If not, see
Total power: [powernet.avail] W" - - //user << browse(t, "window=powcomp;size=420x900") - //onclose(user, "powcomp") - var/datum/browser/popup = new(user, "powcomp", name, 500, 450) - popup.set_content(t) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - -/obj/machinery/computer/monitor/Topic(href, href_list) - if(..()) - return - if( href_list["close"] ) - usr << browse(null, "window=powcomp") - usr.unset_machine() - return - if( href_list["update"] ) - src.updateDialog() - return \ No newline at end of file diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index a4d72f15c59..70442f0dbbc 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -13,7 +13,7 @@ ui = new(user, src, ui_key, "station_alert", name, 300, 500, master_ui, state) ui.open() -/obj/machinery/computer/station_alert/get_ui_data(mob/user) +/obj/machinery/computer/station_alert/ui_data(mob/user) var/list/data = list() data["alarms"] = list() diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index f1e00b5aa5b..9771c917638 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -12,7 +12,7 @@ ui = new(user, src, ui_key, "airlock_electronics", name, 975, 420, master_ui, state) ui.open() -/obj/item/weapon/electronics/airlock/get_ui_data() +/obj/item/weapon/electronics/airlock/ui_data() var/list/data = list() var/list/regions = list() diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index f5bc1cbad20..0965843654a 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -107,7 +107,7 @@ ui = new(user, src, ui_key, "firealarm", name, 300, 150, master_ui, state) ui.open() -/obj/machinery/firealarm/get_ui_data(mob/user) +/obj/machinery/firealarm/ui_data(mob/user) var/list/data = list() data["emagged"] = emagged data["seclevel"] = get_security_level() diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index ee18baacda4..42383ec471a 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -45,7 +45,7 @@ codes = new() - var/list/entries = text2list(codes_txt, ";") // entries are separated by semicolons + var/list/entries = splittext(codes_txt, ";") // entries are separated by semicolons for(var/e in entries) var/index = findtext(e, "=") // format is "key=value" diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 910bd136256..05915bc884c 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -240,6 +240,21 @@ var/global/list/pipeID2State = list( qdel(src) +/obj/item/pipe/suicide_act(mob/user) + if (pipe_type in list(PIPE_PUMP, PIPE_PASSIVE_GATE, PIPE_VOLUME_PUMP)) + user.visible_message("[user] shoved the [src] in \his mouth and turned it on! It looks like \he's trying to commit suicide.") + if(istype(user, /mob/living/carbon)) + var/mob/living/carbon/C = user + for(var/i=1 to 20) + C.vomit(0,1,0,4,0) + sleep(5) + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = C + H.vessel.remove_reagent("blood",560) + return(OXYLOSS|BRUTELOSS) + else + return ..() + /obj/item/pipe_meter name = "meter" desc = "A meter that can be laid on pipes" diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 9e83915fa7c..fa9ef9f6b21 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -173,7 +173,7 @@ ui = new(user, src, ui_key, "space_heater", name, 400, 305, master_ui, state) ui.open() -/obj/machinery/space_heater/get_ui_data() +/obj/machinery/space_heater/ui_data() var/list/data = list() data["open"] = panel_open data["on"] = on diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index f3a0089d1b9..097ca74cc44 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -290,13 +290,13 @@ return /obj/machinery/suit_storage_unit/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ - datum/tgui/master_ui = null, datum/ui_state/state = physical_state) + datum/tgui/master_ui = null, datum/ui_state/state = notcontained_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "suit_storage_unit", name, 400, 305, master_ui, state) ui.open() -/obj/machinery/suit_storage_unit/get_ui_data() +/obj/machinery/suit_storage_unit/ui_data() var/list/data = list() data["locked"] = locked data["open"] = state_open diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 23d4b36cbc5..21b238c95ea 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -71,7 +71,7 @@ build_inventory(contraband, 1) build_inventory(premium, 0, 1) - slogan_list = text2list(product_slogans, ";") + slogan_list = splittext(product_slogans, ";") // So not all machines speak at the exact same time. // The first time this machine says something will be at slogantime + this random value, // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is crated. diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm index c6a3a347726..1dc45391ca1 100644 --- a/code/game/mecha/combat/honker.dm +++ b/code/game/mecha/combat/honker.dm @@ -29,8 +29,9 @@ /obj/mecha/combat/honker/get_stats_part() var/integrity = health/initial(health)*100 var/cell_charge = get_charge() - var/tank_pressure = internal_tank ? round(internal_tank.return_pressure(),0.01) : "None" - var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown" + var/datum/gas_mixture/int_tank_air = internal_tank.return_air() + var/tank_pressure = internal_tank ? round(int_tank_air.return_pressure(),0.01) : "None" + var/tank_temperature = internal_tank ? int_tank_air.temperature : "Unknown" var/cabin_pressure = round(return_pressure(),0.01) var/output = {"[report_internal_damage()] [integrity<30?"DAMAGE LEVEL CRITICAL
Total load: [num2text(powernet.viewload,10)] W
" - - t += "" - - if(L.len > 0) - - t += "Area Eqp./Lgt./Env. Load Cell
" - - var/list/S = list(" Off","AOff"," On", " AOn") - var/list/chg = list("N","C","F") - - var/percent = 0 - var/c = "" - - for(var/obj/machinery/power/apc/A in L) - - t += copytext(add_tspace("[format_text(A.area.name)]", 30), 1, 30) - t += " [S[A.equipment+1]] [S[A.lighting+1]] [S[A.environ+1]] [add_lspace(A.lastused_total, 6)]" - - if (A.cell) - percent = round(A.cell.percent()) - - c = "bad" - if (percent > 50) - c = "good" - else if (percent > 25) - c = "average" - - t += "[add_lspace(percent, 4)]% [chg[A.charging+1]]
" - else - t += " N/C
" - - t += "
Total power: [powmonitor.powernet.avail] W
Total load: [num2text(powmonitor.powernet.viewload,10)] W
" + menu += "Total power: [powmonitor.attached.powernet.viewavail] W
Total load: [num2text(powmonitor.attached.powernet.viewload,10)] W
" menu += "" diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 19fec171d6d..ebc9d68c184 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -44,7 +44,7 @@ ui = new(user, src, ui_key, "intellicard", name, 500, 500, master_ui, state) ui.open() -/obj/item/device/aicard/get_ui_data() +/obj/item/device/aicard/ui_data() var/list/data = list() if(AI) data["name"] = AI.name diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 4dbf44c4ea5..ec2b3e47140 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -61,8 +61,7 @@ return if(M == user) //they're using it on themselves - if(!M.eye_blind) - flick("flash", M.flash) + if(M.flash_eyes(visual = 1)) M.visible_message("[M] directs [src] to \his eyes.", \ "You wave the light in front of your eyes! Trippy!") else @@ -80,8 +79,7 @@ else if(M.dna.check_mutation(XRAY)) //mob has X-RAY vision user << "[M] pupils give an eerie glow!" else //they're okay! - if(!M.eye_blind) - flick("flash", M.flash) //flash the affected mob + if(M.flash_eyes(visual = 1)) user << "[M]'s pupils narrow." else return ..() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 12107b3cdfc..a5a5e2f5d0b 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -119,7 +119,7 @@ var/mob/living/silicon/S = target //20% chance to actually hit the sensors if(prob(effectchance * diode.rating)) - flick("e_flash", S.flash) + S.flash_eyes(affect_silicon = 1) S.Weaken(rand(5,10)) S << "Your sensors were overloaded by a laser!" outmsg = "You overload [S] by shining [src] at their sensors." diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index ad64b7a7390..bf69eb8bada 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -120,7 +120,7 @@ ui = new(user, src, ui_key, "radio", name, 370, 220 + channels.len * 22, master_ui, state) ui.open() -/obj/item/device/radio/get_ui_data(mob/user) +/obj/item/device/radio/ui_data(mob/user) var/list/data = list() data["broadcasting"] = broadcasting diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 7c9eb724098..ae8d23b9ecb 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -121,7 +121,7 @@ MASS SPECTROMETER var/tox_loss = M.getToxLoss() var/fire_loss = M.getFireLoss() var/brute_loss = M.getBruteLoss() - var/mob_status = (M.stat > 1 ? "Deceased" : "[M.health] % healthy") + var/mob_status = (M.stat > 1 ? "Deceased" : "[round(M.health/M.maxHealth,0.01)*100] % healthy") if(M.status_flags & FAKEDEATH) mob_status = "Deceased" @@ -409,7 +409,7 @@ MASS SPECTROMETER else if (T.nutrition < T.get_hunger_nutrition()) user << "Warning: slime is hungry" user << "Electric change strength: [T.powerlevel]" - user << "Health: [T.health]" + user << "Health: [round(T.health/T.maxHealth,0.01)*100]" if (T.slime_mutation[4] == T.colour) user << "This slime does not evolve any further." else diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 434f2715ecd..390ab2612bd 100755 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -384,12 +384,12 @@ dat = "" /obj/item/toy/crayon/proc/crayon_text_strip(text) - var/list/base = text2list(lowertext(text),"") + var/list/base = splittext(lowertext(text),"") var/list/out = list() for(var/a in base) if(a in (letters|numerals)) out += a - return list2text(out) + return jointext(out, null) /obj/item/toy/crayon/Topic(href, href_list, hsrc) var/temp = "a" diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index c761431995a..1f79d8c98d9 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -113,7 +113,7 @@ ui = new(user, src, ui_key, "tanks", name, 420, 200, master_ui, state) ui.open() -/obj/item/weapon/tank/get_ui_data() +/obj/item/weapon/tank/ui_data() var/list/data = list() data["tankPressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) data["releasePressure"] = round(distribute_pressure ? distribute_pressure : 0) @@ -127,16 +127,16 @@ else if(istype(loc.loc, /mob/living/carbon)) user = loc.loc - if(user && user.internal == src) - data["valveOpen"] = TRUE - else - data["valveOpen"] = FALSE + data["valveOpen"] = FALSE + data["maskConnected"] = FALSE + if(!istype(user)) + return data + + if(user.internal == src) + data["valveOpen"] = TRUE + if(user.wear_mask && (user.wear_mask.flags & MASKINTERNALS) && user.internal == src) + data["maskConnected"] = TRUE - if(user.wear_mask && (user.wear_mask.flags & MASKINTERNALS)) - if(data["valveOpen"] || ((src in user) && !user.internal)) - data["maskConnected"] = TRUE - else - data["maskConnected"] = FALSE return data /obj/item/weapon/tank/ui_act(action, params) diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index b497f7e3e6b..0e40cd810a7 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -84,10 +84,10 @@ for(var/line in lines) //world << line - for(var/beat in text2list(lowertext(line), ",")) + for(var/beat in splittext(lowertext(line), ",")) //world << "beat: [beat]" - var/list/notes = text2list(beat, "/") - for(var/note in text2list(notes[1], "-")) + var/list/notes = splittext(beat, "/") + for(var/note in splittext(notes[1], "-")) //world << "note: [note]" if(!playing || shouldStopPlaying(user))//If the instrument is playing, or special case playing = 0 @@ -204,7 +204,7 @@ //split into lines spawn() - lines = text2list(t, "\n") + lines = splittext(t, "\n") if(copytext(lines[1],1,6) == "BPM: ") tempo = sanitize_tempo(600 / text2num(copytext(lines[1],6))) lines.Cut(1,2) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 91b38217e01..7e6793ca1bb 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -44,16 +44,28 @@ smooth_icon_neighbors(src) /obj/structure/table/ex_act(severity, target) - ..() - if(severity == 3) - if(prob(25)) - table_destroy(1) + switch(severity) + if(1) + qdel(src) + if(2) + if(prob(50)) + table_destroy(1) + else + qdel(src) + if(3) + if(prob(25)) + table_destroy(1) /obj/structure/table/blob_act() if(prob(75)) table_destroy(1) return +/obj/structure/table/mech_melee_attack(obj/mecha/M) + visible_message("[M.name] smashes [src] apart!") + playsound(src.loc, 'sound/weapons/punch4.ogg', 50, 1) + table_destroy(1) + /obj/structure/table/attack_alien(mob/living/user) user.do_attack_animation(src) playsound(src.loc, 'sound/weapons/bladeslice.ogg', 50, 1) @@ -447,6 +459,10 @@ rack_destroy() return +/obj/structure/rack/mech_melee_attack(obj/mecha/M) + visible_message("[M.name] smashes [src] apart!") + rack_destroy(1) + /obj/structure/rack/CanPass(atom/movable/mover, turf/target, height=0) if(height==0) return 1 if(src.density == 0) //Because broken racks -Agouri |TODO: SPRITE!| diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index bdcf195fce7..c3a46195ab1 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -68,7 +68,7 @@ ui = new(user, src, ui_key, "tank_dispenser", name, 275, 100, master_ui, state) ui.open() -/obj/structure/tank_dispenser/get_ui_data(mob/user) +/obj/structure/tank_dispenser/ui_data(mob/user) var/list/data = list() data["oxygen"] = oxygentanks data["plasma"] = plasmatanks diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index 28e788c0c2f..1928b6be6e7 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -262,7 +262,7 @@ obj/structure/transit_tube/ex_act(severity, target) if(text in direction_table) return direction_table[text] - var/list/split_text = text2list(text, "-") + var/list/split_text = splittext(text, "-") // If the first token is D, the icon_state represents // a purely decorative tube, and doesn't actually diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index d10ffe89303..efc12760e79 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -16,19 +16,19 @@ //wrapper for turn that changes the transit tube formatted icon_state instead of the dir /obj/structure/c_transit_tube/proc/tube_turn(angle) var/list/badtubes = list("W-E", "W-E-Pass", "S-N", "S-N-Pass", "SW-NE", "SE-NW") - var/list/split_text = text2list(icon_state, "-") + var/list/split_text = splittext(icon_state, "-") for(var/i=1; i<=split_text.len; i++) var/curdir = text2dir_extended(split_text[i]) //0 if not a valid direction (e.g. Pass, Block) if(curdir) split_text[i] = dir2text_short(turn(curdir, angle)) - var/newdir = list2text(split_text, "-") + var/newdir = jointext(split_text, "-") if(badtubes.Find(newdir)) split_text.Swap(1,2) - newdir = list2text(split_text, "-") + newdir = jointext(split_text, "-") icon_state = newdir /obj/structure/c_transit_tube/proc/tube_flip() - var/list/split_text = text2list(icon_state, "-") + var/list/split_text = splittext(icon_state, "-") //skip straight pipes if(length(split_text[2]) < 2) return @@ -44,7 +44,7 @@ split_text[2] = copytext(split_text[2],1,2) + ((copytext(split_text[2],2,3) == "E") ? "W" : "E") else split_text[2] = ((copytext(split_text[2],1,2) == "N") ? "S" : "N") + copytext(split_text[2],2,3) - icon_state = list2text(split_text, "-") + icon_state = jointext(split_text, "-") // disposals-style flip and rotate verbs /obj/structure/c_transit_tube/verb/rotate() diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index 499e28d8823..8eb131f5648 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -13,6 +13,14 @@ icon_state = "bcircuit" floor_tile = /obj/item/stack/tile/plasteel +/turf/simulated/floor/bluegrid/New() + ..() + nuke_tiles += src + +/turf/simulated/floor/bluegrid/Destroy() + nuke_tiles -= src + return ..() + /turf/simulated/floor/greengrid icon = 'icons/turf/floors.dmi' icon_state = "gcircuit" diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index d7ad8f5fbc3..3d7f31004cf 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -91,7 +91,7 @@ if(M.damtype == "brute") playsound(src, 'sound/weapons/punch4.ogg', 50, 1) visible_message("[M.name] has hit [src]!") - if(prob(5) && M.force > 20) + if(prob(hardness) && M.force > 20) dismantle_wall(1) visible_message("[src.name] smashes through the wall!") playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 0df0147c3e4..22b33f93b1d 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -177,7 +177,7 @@ var/list/admin_ranks = list() //list of all admin_rank datums continue //Split the line at every "=" - var/list/List = text2list(line, "=") + var/list/List = splittext(line, "=") if(!List.len) continue diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index b878b5d5ccc..cab1e1afa9f 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -596,7 +596,7 @@ var/list/admin_verbs_hideable = list( //load text from file var/list/Lines = file2list("config/admins.txt") for(var/line in Lines) - var/list/splitline = text2list(line, " = ") + var/list/splitline = splittext(line, " = ") if(ckey(splitline[1]) == ckey) if(splitline.len >= 2) rank = ckeyEx(splitline[2]) diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 0f7fdd5c6e0..d2f35bb1a80 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -2,7 +2,7 @@ /datum/admins/proc/create_mob(mob/user) if (!create_mob_html) var/mobjs = null - mobjs = list2text(typesof(/mob), ";") + mobjs = jointext(typesof(/mob), ";") create_mob_html = file2text('html/create_object.html') create_mob_html = replacetext(create_mob_html, "null /* object types */", "\"[mobjs]\"") diff --git a/code/modules/admin/create_object.dm b/code/modules/admin/create_object.dm index 9c6e54335e9..708b6a9e74b 100644 --- a/code/modules/admin/create_object.dm +++ b/code/modules/admin/create_object.dm @@ -7,7 +7,7 @@ var/list/create_object_forms = list( /datum/admins/proc/create_object(mob/user) if (!create_object_html) var/objectjs = null - objectjs = list2text(typesof(/obj), ";") + objectjs = jointext(typesof(/obj), ";") create_object_html = file2text('html/create_object.html') create_object_html = replacetext(create_object_html, "null /* object types */", "\"[objectjs]\"") @@ -19,7 +19,7 @@ var/list/create_object_forms = list( var/html_form = create_object_forms[path] if (!html_form) - var/objectjs = list2text(typesof(path), ";") + var/objectjs = jointext(typesof(path), ";") html_form = file2text('html/create_object.html') html_form = replacetext(html_form, "null /* object types */", "\"[objectjs]\"") create_object_forms[path] = html_form diff --git a/code/modules/admin/create_turf.dm b/code/modules/admin/create_turf.dm index c9e5f1f69f3..4bfa6a0a09d 100644 --- a/code/modules/admin/create_turf.dm +++ b/code/modules/admin/create_turf.dm @@ -2,7 +2,7 @@ /datum/admins/proc/create_turf(mob/user) if (!create_turf_html) var/turfjs = null - turfjs = list2text(typesof(/turf), ";") + turfjs = jointext(typesof(/turf), ";") create_turf_html = file2text('html/create_object.html') create_turf_html = replacetext(create_turf_html, "null /* object types */", "\"[turfjs]\"") diff --git a/code/modules/admin/sql_notes.dm b/code/modules/admin/sql_notes.dm index 89d3fbdef51..c38ed7d242b 100644 --- a/code/modules/admin/sql_notes.dm +++ b/code/modules/admin/sql_notes.dm @@ -169,9 +169,6 @@ output += ruler usr << browse(output, "window=show_notes;size=900x500") -/proc/regex_note_sql_extract(str, exp) - return new /datum/regex(str, exp, call(LIBREGEX_LIBRARY, "regEx_find")(str, exp)) - #define NOTESFILE "data/player_notes.sav" //if the AUTOCONVERT_NOTES is turned on, anytime a player connects this will be run to try and add all their notes to the databas /proc/convert_notes_sql(ckey) @@ -184,13 +181,13 @@ var/notetext notesfile >> notetext var/server - if (config && config.server_name) + if(config && config.server_name) server = config.server_name - var/regex = "^(\\d{2}-\\w{3}-\\d{4}) \\| (.+) ~(\\w+)$" - var/datum/regex/results = regex_note_sql_extract(notetext, regex) - var/timestamp = results.str(2) - notetext = results.str(3) - var/adminckey = results.str(4) + var/regex/note = new("^(\\d{2}-\\w{3}-\\d{4}) \\| (.+) ~(\\w+)$", "i") + note.Find(notetext) + var/timestamp = note.group[2] + notetext = note.group[3] + var/adminckey = note.group[4] var/DBQuery/query_convert_time = dbcon.NewQuery("SELECT ADDTIME(STR_TO_DATE('[timestamp]','%d-%b-%Y'), '0')") if(!query_convert_time.Execute()) var/err = query_convert_time.ErrorMsg() @@ -217,4 +214,4 @@ this proc can take several minutes to execute fully if converting and cause DD t world << "Deleting NOTESFILE" fdel(NOTESFILE) world << "Finished mass note conversion, remember to turn off AUTOCONVERT_NOTES"*/ -#undef NOTESFILE +#undef NOTESFILE \ No newline at end of file diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm index 7723a138bdb..e570fa89fb3 100644 --- a/code/modules/admin/stickyban.dm +++ b/code/modules/admin/stickyban.dm @@ -175,10 +175,10 @@ if (!ban) return null . = params2list(ban) - .["keys"] = text2list(.["keys"], ",") - .["type"] = text2list(.["type"], ",") - .["IP"] = text2list(.["IP"], ",") - .["computer_id"] = text2list(.["computer_id"], ",") + .["keys"] = splittext(.["keys"], ",") + .["type"] = splittext(.["type"], ",") + .["IP"] = splittext(.["IP"], ",") + .["computer_id"] = splittext(.["computer_id"], ",") /proc/list2stickyban(var/list/ban) @@ -186,13 +186,13 @@ return null . = ban.Copy() if (.["keys"]) - .["keys"] = list2text(.["keys"], ",") + .["keys"] = jointext(.["keys"], ",") if (.["type"]) - .["type"] = list2text(.["type"], ",") + .["type"] = jointext(.["type"], ",") if (.["IP"]) - .["IP"] = list2text(.["IP"], ",") + .["IP"] = jointext(.["IP"], ",") if (.["computer_id"]) - .["computer_id"] = list2text(.["computer_id"], ",") + .["computer_id"] = jointext(.["computer_id"], ",") . = list2params(.) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 7c0501aa0fd..32615dd8fdc 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1882,7 +1882,7 @@ alert("Select fewer object types, (max 5)") return - var/list/offset = text2list(href_list["offset"],",") + var/list/offset = splittext(href_list["offset"],",") var/number = Clamp(text2num(href_list["object_count"]), 1, 100) var/X = offset.len > 0 ? text2num(offset[1]) : 0 var/Y = offset.len > 1 ? text2num(offset[2]) : 0 diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 6c119205314..5215f9cc485 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -4,7 +4,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as", "i") //explode the input msg into a list - var/list/msglist = text2list(msg, " ") + var/list/msglist = splittext(msg, " ") //generate keywords lookup var/list/surnames = list() @@ -16,7 +16,7 @@ indexing += M.mind.name for(var/string in indexing) - var/list/L = text2list(string, " ") + var/list/L = splittext(string, " ") var/surname_found = 0 //surnames for(var/i=L.len, i>=1, i--) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 8ed8d72c737..eecfb9537d1 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -688,19 +688,19 @@ var/global/list/g_fancy_list_of_types = null switch(input("Which list?") in list("Players","Admins","Mobs","Living Mobs","Dead Mobs","Clients","Joined Clients")) if("Players") - usr << list2text(player_list,",") + usr << jointext(player_list,",") if("Admins") - usr << list2text(admins,",") + usr << jointext(admins,",") if("Mobs") - usr << list2text(mob_list,",") + usr << jointext(mob_list,",") if("Living Mobs") - usr << list2text(living_mob_list,",") + usr << jointext(living_mob_list,",") if("Dead Mobs") - usr << list2text(dead_mob_list,",") + usr << jointext(dead_mob_list,",") if("Clients") - usr << list2text(clients,",") + usr << jointext(clients,",") if("Joined Clients") - usr << list2text(joined_player_list,",") + usr << jointext(joined_player_list,",") /client/proc/cmd_display_del_log() set category = "Debug" diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index b37bfe16618..dea173e1ac0 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -8,91 +8,92 @@ What are the archived variables for? 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 */ var/list/meta_gas_info = meta_gas_list() //see ATMOSPHERICS/gas_types.dm -var/list/cached_gases_list = null -/proc/gaslist(gasid) - if(!cached_gases_list) - cached_gases_list = new /list(meta_gas_info.len) +var/list/gaslist_cache = null +/proc/gaslist(id) + var/list/cached_gas - if(!cached_gases_list[gasid]) - if(!meta_gas_info[gasid]) - CRASH("Error: no such gas type! Type : [gasid]") + if(!gaslist_cache) + gaslist_cache = new(meta_gas_info.len) - 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 + if(!gaslist_cache[id]) + if(!meta_gas_info[id]) + CRASH("Gas [id] does not exist!") + cached_gas = new(3) + gaslist_cache[id] = cached_gas - var/list/gas = cached_gases_list[gasid] - . = gas.Copy() + cached_gas[MOLES] = 0 + cached_gas[ARCHIVE] = 0 + cached_gas[GAS_META] = meta_gas_info[id] + else + cached_gas = gaslist_cache[id] + return cached_gas.Copy() /datum/gas_mixture var/list/gases - var/temperature //in Kelvin + var/temperature // degrees Kelvin var/tmp/temperature_archived var/volume var/last_share var/tmp/fuel_burnt -/datum/gas_mixture/New(Volume = CELL_VOLUME) - . = ..() +/datum/gas_mixture/New(volume = CELL_VOLUME) + ..() gases = new temperature = 0 temperature_archived = 0 - volume = Volume + src.volume = volume last_share = 0 fuel_burnt = 0 - //listmos procs +//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. +//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. +//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(). +//add_gas(gas_id) - similar to assert_gas(), but does not check for an existing +//gas list for this id. This can clobber existing gases. +//Used instead of assert_gas() when you know the gas does not exist. Faster than assert_gas(). /datum/gas_mixture/proc/add_gas(gas_id) gases[gas_id] = gaslist(gas_id) - //add_gases(args) - shorthand for calling add_gas() once for each gas_type. +//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. +//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) + if(cached_gases[id][MOLES] <= 0 && cached_gases[id][ARCHIVE] <= 0) cached_gases -= id - //PV=nRT - related procedures +//PV = nRT /datum/gas_mixture/proc/heat_capacity() var/list/cached_gases = gases . = 0 for(var/id in cached_gases) - . += cached_gases[id][MOLES]*cached_gases[id][GAS_META][META_GAS_SPECIFIC_HEAT] + . += cached_gases[id][MOLES] * cached_gases[id][GAS_META][META_GAS_SPECIFIC_HEAT] /datum/gas_mixture/proc/heat_capacity_archived() var/list/cached_gases = gases . = 0 for(var/id in cached_gases) - . += cached_gases[id][ARCHIVE]*cached_gases[id][GAS_META][META_GAS_SPECIFIC_HEAT] + . += cached_gases[id][ARCHIVE] * cached_gases[id][GAS_META][META_GAS_SPECIFIC_HEAT] /datum/gas_mixture/proc/total_moles() var/list/cached_gases = gases @@ -101,40 +102,38 @@ var/list/cached_gases_list = null . += cached_gases[id][MOLES] /datum/gas_mixture/proc/return_pressure() - if(volume>0) - return total_moles()*R_IDEAL_GAS_EQUATION*temperature/volume + if(volume > 0) // to prevent division by zero + return total_moles() * R_IDEAL_GAS_EQUATION * temperature / volume return 0 /datum/gas_mixture/proc/return_temperature() return temperature - /datum/gas_mixture/proc/return_volume() return max(0, volume) - /datum/gas_mixture/proc/thermal_energy() - return temperature*heat_capacity() - + return temperature * heat_capacity() //Procedures used for very specific events - /datum/gas_mixture/proc/react(atom/dump_location) - var/list/procgases = gases //this speeds things up because >byond + var/list/cached_gases = 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(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) - procgases["co2"][MOLES] -= reaction_rate + if(cached_gases["agent_b"] && temperature > 900 && cached_gases["plasma"] && cached_gases["co2"]) + if(cached_gases["plasma"][MOLES] > MINIMUM_HEAT_CAPACITY && cached_gases["co2"][MOLES] > MINIMUM_HEAT_CAPACITY) + var/reaction_rate = min(cached_gases["co2"][MOLES]*0.75, cached_gases["plasma"][MOLES]*0.25, cached_gases["agent_b"][MOLES]*0.05) + + cached_gases["co2"][MOLES] -= reaction_rate assert_gas("o2") //only need to assert oxygen, as this reaction doesn't occur without the other gases existing - procgases["o2"][MOLES] += reaction_rate + cached_gases["o2"][MOLES] += reaction_rate - procgases["agent_b"][MOLES] -= reaction_rate*0.05 + cached_gases["agent_b"][MOLES] -= reaction_rate*0.05 temperature -= (reaction_rate*20000)/heat_capacity() @@ -143,26 +142,26 @@ var/list/cached_gases_list = null reacting = 1 /* if(thermal_energy() > (PLASMA_BINDING_ENERGY*10)) - 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]] + if(cached_gases["plasma"] && cached_gases["co2"] && cached_gases["plasma"][MOLES] > MINIMUM_HEAT_CAPACITY && cached_gases["co2"][MOLES] > MINIMUM_HEAT_CAPACITY && (cached_gases["plasma"][MOLES]+cached_gases["co2"][MOLES])/total_moles() >= FUSION_PURITY_THRESHOLD)//Fusion wont occur if the level of impurities is too high. + //world << "pre [temperature, [cached_gases["plasma"][MOLES]], [cached_gases["co2"][MOLES]] var/old_heat_capacity = heat_capacity() - var/carbon_efficency = min(procgases["plasma"][MOLES]/procgases["co2"][MOLES],MAX_CARBON_EFFICENCY) + var/carbon_efficency = min(cached_gases["plasma"][MOLES]/cached_gases["co2"][MOLES],MAX_CARBON_EFFICENCY) var/reaction_energy = thermal_energy() - var/moles_impurities = total_moles()-(procgases["plasma"][MOLES]+procgases["co2"][MOLES]) + var/moles_impurities = total_moles()-(cached_gases["plasma"][MOLES]+cached_gases["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*procgases["plasma"][MOLES])/((moles_impurities/carbon_efficency)+2)*10)+((plasma_fused/(moles_impurities/carbon_efficency))*PLASMA_BINDING_ENERGY),0) + reaction_energy = max(reaction_energy+((carbon_efficency*cached_gases["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 + cached_gases["plasma"][MOLES] -= plasma_fused + cached_gases["co2"][MOLES] -= carbon_catalyzed + cached_gases["o2"][MOLES] += oxygen_added + cached_gases["n2"][MOLES] += nitrogen_added garbage_collect() @@ -172,45 +171,46 @@ var/list/cached_gases_list = null 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], [procgases["plasma"][MOLES]], [procgases["co2"][MOLES]] + //world << "post [temperature], [cached_gases["plasma"][MOLES]], [cached_gases["co2"][MOLES]] */ fuel_burnt = 0 if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - //world << "pre [temperature], [procgases["o2"][MOLES]], [procgases["plasma"][MOLES]]" + //world << "pre [temperature], [cached_gases["o2"][MOLES]], [cached_gases["plasma"][MOLES]]" if(fire()) reacting = 1 - //world << "post [temperature], [procgases["o2"][MOLES]], [procgases["plasma"][MOLES]]" + //world << "post [temperature], [cached_gases["o2"][MOLES]], [cached_gases["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/list/cached_gases = gases //this speeds things up because accessing datum vars is slow - if(procgases["v_fuel"] && procgases["v_fuel"][MOLES]) //General volatile gas burn + //General volatile gas burn + if(cached_gases["v_fuel"] && cached_gases["v_fuel"][MOLES]) var/burned_fuel - if(!procgases["o2"]) + if(!cached_gases["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 if(cached_gases["o2"][MOLES] < cached_gases["v_fuel"][MOLES]) + burned_fuel = cached_gases["o2"][MOLES] + cached_gases["v_fuel"][MOLES] -= burned_fuel + cached_gases["o2"][MOLES] = 0 else - burned_fuel = procgases["v_fuel"][MOLES] - procgases["o2"][MOLES] -= procgases["v_fuel"][MOLES] + burned_fuel = cached_gases["v_fuel"][MOLES] + cached_gases["o2"][MOLES] -= cached_gases["v_fuel"][MOLES] if(burned_fuel) energy_released += FIRE_CARBON_ENERGY_RELEASED * burned_fuel assert_gas("co2") - procgases["co2"][MOLES] += burned_fuel + cached_gases["co2"][MOLES] += burned_fuel fuel_burnt += burned_fuel //Handle plasma burning - if(procgases["plasma"] && procgases["plasma"][MOLES] > MINIMUM_HEAT_CAPACITY) + if(cached_gases["plasma"] && cached_gases["plasma"][MOLES] > MINIMUM_HEAT_CAPACITY) var/plasma_burn_rate = 0 var/oxygen_burn_rate = 0 //more plasma released at higher temperatures @@ -221,16 +221,16 @@ var/list/cached_gases_list = null 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(procgases["o2"][MOLES] > procgases["plasma"][MOLES]*PLASMA_OXYGEN_FULLBURN) - plasma_burn_rate = (procgases["plasma"][MOLES]*temperature_scale)/PLASMA_BURN_RATE_DELTA + if(cached_gases["o2"][MOLES] > cached_gases["plasma"][MOLES]*PLASMA_OXYGEN_FULLBURN) + plasma_burn_rate = (cached_gases["plasma"][MOLES]*temperature_scale)/PLASMA_BURN_RATE_DELTA else - plasma_burn_rate = (temperature_scale*(procgases["o2"][MOLES]/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA + plasma_burn_rate = (temperature_scale*(cached_gases["o2"][MOLES]/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY) - procgases["plasma"][MOLES] -= plasma_burn_rate - procgases["o2"][MOLES] -= plasma_burn_rate*oxygen_burn_rate - procgases["co2"][MOLES] += plasma_burn_rate + assert_gas("co2") + cached_gases["plasma"][MOLES] = QUANTIZE(cached_gases["plasma"][MOLES] - plasma_burn_rate) + cached_gases["o2"][MOLES] = QUANTIZE(cached_gases["o2"][MOLES] - (plasma_burn_rate * oxygen_burn_rate)) + cached_gases["co2"][MOLES] += plasma_burn_rate energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate) @@ -260,12 +260,20 @@ var/list/cached_gases_list = null //Proportionally removes amount of gas from the gas_mixture //Returns: gas_mixture with the gases removed +/datum/gas_mixture/proc/copy() + //Creates new, identical gas mixture + //Returns: duplicate gas mixture + /datum/gas_mixture/proc/copy_from(datum/gas_mixture/sample) //Copies variables from sample +/datum/gas_mixture/proc/copy_from_turf(turf/model) + //Copies all gas info from the turf into the gas list along with temperature + /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) //Similar to share(...), except the model is not modified //Return: amount of gas exchanged @@ -283,138 +291,148 @@ var/list/cached_gases_list = null //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() var/list/cached_gases = gases + + temperature_archived = temperature for(var/id in cached_gases) cached_gases[id][ARCHIVE] = cached_gases[id][MOLES] - temperature_archived = temperature - . = 1 + + return 1 /datum/gas_mixture/merge(datum/gas_mixture/giver) if(!giver) return 0 - if(abs(temperature-giver.temperature)>MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + if(abs(temperature - giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) var/self_heat_capacity = heat_capacity() var/giver_heat_capacity = giver.heat_capacity() var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity if(combined_heat_capacity) - temperature = (giver.temperature*giver_heat_capacity + temperature*self_heat_capacity)/combined_heat_capacity + 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] - . = 1 + return 1 /datum/gas_mixture/remove(amount) - var/sum = total_moles() - amount = min(amount,sum) //Can not take more air than tile has! - + amount = min(amount, sum) //Can not take more air than tile has! if(amount <= 0) return null + var/list/cached_gases = gases 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 - - 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 - + for(var/id in cached_gases) + removed.add_gas(id) + removed_gases[id][MOLES] = QUANTIZE((cached_gases[id][MOLES] / sum) * amount) + cached_gases[id][MOLES] -= removed_gases[id][MOLES] garbage_collect() - . = removed + return removed /datum/gas_mixture/remove_ratio(ratio) if(ratio <= 0) return null - ratio = min(ratio, 1) + var/list/cached_gases = gases 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 - - 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 - + for(var/id in cached_gases) + removed.add_gas(id) + removed_gases[id][MOLES] = QUANTIZE(cached_gases[id][MOLES] * ratio) + cached_gases[id][MOLES] -= removed_gases[id][MOLES] garbage_collect() - . = removed + return removed + +/datum/gas_mixture/copy() + var/list/cached_gases = gases + var/datum/gas_mixture/copy = new + var/list/copy_gases = copy.gases + + copy.temperature = temperature + for(var/id in cached_gases) + add_gas(id) + copy_gases[id][MOLES] = cached_gases[id][MOLES] + + return copy /datum/gas_mixture/copy_from(datum/gas_mixture/sample) 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 - - garbage_collect() temperature = sample.temperature + for(var/id in sample_gases) + assert_gas(id) + cached_gases[id][MOLES] = sample_gases[id][MOLES] + cached_gases &= sample_gases + + return 1 + +/datum/gas_mixture/copy_from_turf(turf/model) + var/list/cached_gases = gases + + temperature = model.temperature + assert_gases(arglist(hardcoded_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 + cached_gases &= hardcoded_gases return 1 /datum/gas_mixture/check_turf(turf/model, atmos_adjacent_turfs = 4) var/datum/gas_mixture/copied = new copied.copy_from_turf(model) - . = compare(copied, datatype = ARCHIVE, adjacents = atmos_adjacent_turfs) + return compare(copied, datatype = ARCHIVE, adjacents = atmos_adjacent_turfs) /datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) - . = 0 if(!sharer) - return + return 0 - 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/list/cached_gases = gases + var/list/sharer_gases = sharer.gases - var/delta_temperature = (temperature_archived - sharer.temperature_archived) + var/temperature_delta = temperature_archived - sharer.temperature_archived + var/abs_temperature_delta = abs(temperature_delta) var/old_self_heat_capacity = 0 var/old_sharer_heat_capacity = 0 - - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) old_self_heat_capacity = heat_capacity() old_sharer_heat_capacity = sharer.heat_capacity() var/heat_capacity_self_to_sharer = 0 //heat capacity of the moles transferred from us to the sharer var/heat_capacity_sharer_to_self = 0 //heat capacity of the moles transferred from the sharer to us - 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 + var/moved_moles = 0 + var/abs_moved_moles = 0 //GAS TRANSFER - for(var/id in selfcache) - if(!sharercache[id]) //checking here prevents an uneeded proc call if the check fails. + for(var/id in sharer_gases - cached_gases) // create gases not in our cache + add_gas(id) + for(var/id in cached_gases) // transfer gases + if(!sharer_gases[id]) //checking here prevents an uneeded proc call if the check fails. sharer.add_gas(id) - var/gas = selfcache[id] - var/sharergas = sharercache[id] + var/gas = cached_gases[id] + var/sharergas = sharer_gases[id] var/delta = QUANTIZE(gas[ARCHIVE] - sharergas[ARCHIVE])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures - if(delta && abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + if(delta && abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) var/gas_heat_capacity = delta * gas[GAS_META][META_GAS_SPECIFIC_HEAT] if(delta > 0) heat_capacity_self_to_sharer += gas_heat_capacity @@ -429,7 +447,7 @@ var/list/cached_gases_list = null last_share = abs_moved_moles //THERMAL ENERGY TRANSFER - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self @@ -445,9 +463,9 @@ var/list/cached_gases_list = null if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.10) // <10% change in sharer heat capacity temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT) - if((delta_temperature > MINIMUM_TEMPERATURE_TO_MOVE) || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) + if(temperature_delta > 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) - . = delta_pressure*R_IDEAL_GAS_EQUATION/volume + . = delta_pressure * R_IDEAL_GAS_EQUATION / volume garbage_collect() sharer.garbage_collect() @@ -455,17 +473,17 @@ var/list/cached_gases_list = null /datum/gas_mixture/mimic(turf/model, atmos_adjacent_turfs = 4) var/datum/gas_mixture/copied = new copied.copy_from_turf(model) - . = share(copied, atmos_adjacent_turfs) + return 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/temperature_delta = temperature_archived - sharer.temperature_archived + if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) var/self_heat_capacity = heat_capacity_archived() var/sharer_heat_capacity = sharer.heat_capacity_archived() if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ + var/heat = conduction_coefficient*temperature_delta* \ (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) temperature = max(temperature - heat/self_heat_capacity, TCMB) @@ -473,39 +491,38 @@ var/list/cached_gases_list = null //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) - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/temperature_delta = temperature - model.temperature + if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) var/self_heat_capacity = heat_capacity() if((model.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ + var/heat = conduction_coefficient*temperature_delta* \ (self_heat_capacity*model.heat_capacity/(self_heat_capacity+model.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) - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/temperature_delta = temperature_archived - sharer.temperature + if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) var/self_heat_capacity = heat_capacity() if((sharer.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ + var/heat = conduction_coefficient*temperature_delta* \ (self_heat_capacity*sharer.heat_capacity/(self_heat_capacity+sharer.heat_capacity)) temperature = max(temperature - heat/self_heat_capacity, TCMB) sharer.temperature = max(sharer.temperature + heat/sharer.heat_capacity, TCMB) /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) + for(var/id in cached_gases | sample_gases) // compare gases from either mixture 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) + delta > gas_moles * MINIMUM_AIR_RATIO_TO_SUSPEND) return id if(total_moles() > MINIMUM_AIR_TO_SUSPEND) @@ -520,50 +537,30 @@ var/list/cached_gases_list = null temp = temperature_archived sample_temp = sample.temperature_archived - var/delta_temperature = abs(temp-sample_temp) - if((delta_temperature > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) && \ - delta_temperature > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND*temp) + var/temperature_delta = abs(temp - sample_temp) + if((temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) && \ + temperature_delta > 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 + return "" - 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 - //eg: //Tox_PP = get_partial_pressure(gas_mixture.toxins) //O2_PP = get_partial_pressure(gas_mixture.oxygen) - //Does handle trace gases! - /datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure) - return (gas_pressure*R_IDEAL_GAS_EQUATION*temperature)/BREATH_VOLUME - - -//Reverse of the above -/datum/gas_mixture/proc/get_true_breath_pressure(breath_pp) - return (breath_pp*BREATH_VOLUME)/(R_IDEAL_GAS_EQUATION*temperature) + return (gas_pressure * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME +//inverse +/datum/gas_mixture/proc/get_true_breath_pressure(partial_pressure) + return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * temperature) //Mathematical proofs: /* - get_breath_partial_pressure(gas_pp) --> gas_pp/total_moles()*breath_pp = pp get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() 10/20*5 = 2.5 10 = 2.5/5*20 - */ diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index a7c40accf62..5a3871292d6 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -1,19 +1,17 @@ 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 + . = new /list for(var/gas_path in subtypesof(/datum/gas)) var/list/gas_info = new(4) - var/datum/gas/g = gas_path + var/datum/gas/gas = gas_path - gas_info[META_GAS_SPECIFIC_HEAT] = initial(g.specific_heat) - gas_info[META_GAS_NAME] = initial(g.name) - gas_info[META_GAS_MOLES_VISIBLE] = initial(g.moles_visible) - if(gas_info[META_GAS_MOLES_VISIBLE] != null) - gas_info[META_GAS_OVERLAY] = new /obj/effect/overlay/gas(initial(g.gas_overlay)) - - meta_list[initial(g.id)] = gas_info - . = meta_list + gas_info[META_GAS_SPECIFIC_HEAT] = initial(gas.specific_heat) + gas_info[META_GAS_NAME] = initial(gas.name) + gas_info[META_GAS_MOLES_VISIBLE] = initial(gas.moles_visible) + if(initial(gas.moles_visible) != null) + gas_info[META_GAS_OVERLAY] = new /obj/effect/overlay/gas(initial(gas.gas_overlay)) + .[initial(gas.id)] = gas_info /*||||||||||||||/----------\||||||||||||||*\ ||||||||||||||||[GAS DATUMS]|||||||||||||||| diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 1ed8eee6826..d1dd417493d 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -42,12 +42,6 @@ #define AALARM_MODE_CONTAMINATED 8 //Turns on all filtering and widenet scrubbing. #define AALARM_MODE_REFILL 9 //just like normal, but with triple the air output -#define AALARM_SCREEN_MAIN 1 -#define AALARM_SCREEN_VENT 2 -#define AALARM_SCREEN_SCRUB 3 -#define AALARM_SCREEN_MODE 4 -#define AALARM_SCREEN_SENSORS 5 - #define AALARM_REPORT_TIMEOUT 100 /obj/machinery/airalarm @@ -74,7 +68,6 @@ var/mode = AALARM_MODE_SCRUBBING - var/screen = AALARM_SCREEN_MAIN var/area_uid var/area/alarm_area var/danger_level = 0 @@ -179,148 +172,126 @@ ui = new(user, src, ui_key, "airalarm", name, 440, 650, master_ui, state) ui.open() -/obj/machinery/airalarm/get_ui_data(mob/user) +/obj/machinery/airalarm/ui_data(mob/user) var/data = list( "locked" = locked, "siliconUser" = user.has_unlimited_silicon_privilege, - "screen" = screen, - "emagged" = emagged + "emagged" = emagged, + "atmos_alarm" = alarm_area.atmosalm, + "fire_alarm" = alarm_area.fire, + "danger_level" = danger_level, ) - populate_status(data) + + var/turf/T = get_turf(src) + var/datum/gas_mixture/environment = T.return_air() + var/datum/tlv/cur_tlv + + data["environment_data"] = list() + var/pressure = environment.return_pressure() + cur_tlv = TLV["pressure"] + data["environment_data"] += list(list( + "name" = "Pressure", + "value" = pressure, + "unit" = "kPa", + "danger_level" = cur_tlv.get_danger_level(pressure) + )) + var/temperature = environment.temperature + cur_tlv = TLV["temperature"] + data["environment_data"] += list(list( + "name" = "Temperature", + "value" = temperature, + "unit" = "K ([round(temperature - T0C, 0.1)]C)", + "danger_level" = cur_tlv.get_danger_level(temperature) + )) + var/total_moles = environment.total_moles() + var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume + for(var/gas_id in environment.gases) + if(!(gas_id in TLV)) // We're not interested in this gas, it seems. + continue + cur_tlv = TLV[gas_id] + data["environment_data"] += list(list( + "name" = environment.gases[gas_id][GAS_META][META_GAS_NAME], + "value" = environment.gases[gas_id][MOLES] / total_moles * 100, + "unit" = "%", + "danger_level" = cur_tlv.get_danger_level(environment.gases[gas_id][MOLES] * partial_pressure) + )) + if(!locked || user.has_unlimited_silicon_privilege) - populate_controls(data) - return data + data["vents"] = list() + for(var/id_tag in alarm_area.air_vent_names) + var/long_name = alarm_area.air_vent_names[id_tag] + var/list/info = alarm_area.air_vent_info[id_tag] + if(!info || info["frequency"] != frequency) + continue + data["vents"] += list(list( + "id_tag" = id_tag, + "long_name" = sanitize(long_name), + "power" = info["power"], + "checks" = info["checks"], + "excheck" = info["checks"]&1, + "incheck" = info["checks"]&2, + "direction" = info["direction"], + "external" = info["external"], + "extdefault"= (info["external"] == ONE_ATMOSPHERE) + )) + data["scrubbers"] = list() + for(var/id_tag in alarm_area.air_scrub_names) + var/long_name = alarm_area.air_scrub_names[id_tag] + var/list/info = alarm_area.air_scrub_info[id_tag] + if(!info || info["frequency"] != frequency) + continue + data["scrubbers"] += list(list( + "id_tag" = id_tag, + "long_name" = sanitize(long_name), + "power" = info["power"], + "scrubbing" = info["scrubbing"], + "widenet" = info["widenet"], + "filter_co2" = info["filter_co2"], + "filter_toxins" = info["filter_toxins"], + "filter_n2o" = info["filter_n2o"] + )) + data["mode"] = mode + data["modes"] = list() + data["modes"] += list(list("name" = "Filtering - Scrubs out contaminants", "mode" = AALARM_MODE_SCRUBBING, "selected" = mode == AALARM_MODE_SCRUBBING, "danger" = 0)) + data["modes"] += list(list("name" = "Contaminated - Scrubs out ALL contaminants quickly","mode" = AALARM_MODE_CONTAMINATED, "selected" = mode == AALARM_MODE_CONTAMINATED, "danger" = 0)) + data["modes"] += list(list("name" = "Draught - Siphons out air while replacing", "mode" = AALARM_MODE_VENTING, "selected" = mode == AALARM_MODE_VENTING, "danger" = 0)) + data["modes"] += list(list("name" = "Refill - Triple vent output", "mode" = AALARM_MODE_REFILL, "selected" = mode == AALARM_MODE_REFILL, "danger" = 0)) + data["modes"] += list(list("name" = "Cycle - Siphons air before replacing", "mode" = AALARM_MODE_REPLACEMENT, "selected" = mode == AALARM_MODE_REPLACEMENT, "danger" = 1)) + data["modes"] += list(list("name" = "Siphon - Siphons air out of the room", "mode" = AALARM_MODE_SIPHON, "selected" = mode == AALARM_MODE_SIPHON, "danger" = 1)) + data["modes"] += list(list("name" = "Panic Siphon - Siphons air out of the room quickly","mode" = AALARM_MODE_PANIC, "selected" = mode == AALARM_MODE_PANIC, "danger" = 1)) + data["modes"] += list(list("name" = "Off - Shuts off vents and scrubbers", "mode" = AALARM_MODE_OFF, "selected" = mode == AALARM_MODE_OFF, "danger" = 0)) + if(emagged) + data["modes"] += list(list("name" = "Flood - Shuts off scrubbers and opens vents", "mode" = AALARM_MODE_FLOOD, "selected" = mode == AALARM_MODE_FLOOD, "danger" = 1)) -/obj/machinery/airalarm/proc/populate_status(list/data) - var/turf/location = get_turf(src) - if(!location) - return - var/datum/gas_mixture/environment = location.return_air() - var/list/env_gases = environment.gases - var/total = environment.total_moles() + var/datum/tlv/selected + var/list/thresholds = list() - var/list/environment_data = list() - data["atmos_alarm"] = alarm_area.atmosalm - data["fire_alarm"] = (alarm_area.fire != null && alarm_area.fire) - data["danger_level"] = danger_level - if(total) - var/datum/tlv/cur_tlv + selected = TLV["pressure"] + thresholds += list(list("name" = "Pressure", "settings" = list())) + thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min2", "selected" = selected.min2)) + thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min1", "selected" = selected.min1)) + thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max1", "selected" = selected.max1)) + thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max2", "selected" = selected.max2)) - var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume + selected = TLV["temperature"] + thresholds += list(list("name" = "Temperature", "settings" = list())) + thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min2", "selected" = selected.min2)) + thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min1", "selected" = selected.min1)) + thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max1", "selected" = selected.max1)) + thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max2", "selected" = selected.max2)) - var/pressure = environment.return_pressure() - cur_tlv = TLV["pressure"] - environment_data += list(list( - "name" = "Pressure", - "value" = pressure, - "unit" = "kPa", - "danger_level" = cur_tlv.get_danger_level(pressure) - )) - - var/temperature = environment.temperature - cur_tlv = TLV["temperature"] - environment_data += list(list( - "name" = "Temperature", - "value" = temperature, - "unit" = "K ([round(temperature - T0C, 0.1)]C)", - "danger_level" = cur_tlv.get_danger_level(temperature) - )) - - for(var/gas_id in env_gases) + for(var/gas_id in meta_gas_info) if(!(gas_id in TLV)) // We're not interested in this gas, it seems. continue - cur_tlv = TLV[gas_id] - environment_data += list(list( - "name" = env_gases[gas_id][GAS_META][META_GAS_NAME], - "value" = env_gases[gas_id][MOLES] / total * 100, - "unit" = "%", - "danger_level" = cur_tlv.get_danger_level(env_gases[gas_id][MOLES] * partial_pressure) - )) + selected = TLV[gas_id] + thresholds += list(list("name" = meta_gas_info[gas_id][META_GAS_NAME], "settings" = list())) + thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min2", "selected" = selected.min2)) + thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min1", "selected" = selected.min1)) + thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max1", "selected" = selected.max1)) + thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max2", "selected" = selected.max2)) - - data["environment_data"] = environment_data - -/obj/machinery/airalarm/proc/populate_controls(list/data) - switch(screen) - if(AALARM_SCREEN_MAIN) - data["mode"] = mode - if(AALARM_SCREEN_VENT) - data["vents"] = list() - for(var/id_tag in alarm_area.air_vent_names) - var/long_name = alarm_area.air_vent_names[id_tag] - var/list/info = alarm_area.air_vent_info[id_tag] - if(!info || info["frequency"] != frequency) - continue - data["vents"] += list(list( - "id_tag" = id_tag, - "long_name" = sanitize(long_name), - "power" = info["power"], - "checks" = info["checks"], - "excheck" = info["checks"]&1, - "incheck" = info["checks"]&2, - "direction" = info["direction"], - "external" = info["external"], - "extdefault"= (info["external"] == ONE_ATMOSPHERE) - )) - if(AALARM_SCREEN_SCRUB) - data["scrubbers"] = list() - for(var/id_tag in alarm_area.air_scrub_names) - var/long_name = alarm_area.air_scrub_names[id_tag] - var/list/info = alarm_area.air_scrub_info[id_tag] - if(!info || info["frequency"] != frequency) - continue - data["scrubbers"] += list(list( - "id_tag" = id_tag, - "long_name" = sanitize(long_name), - "power" = info["power"], - "scrubbing" = info["scrubbing"], - "widenet" = info["widenet"], - "filter_co2" = info["filter_co2"], - "filter_toxins" = info["filter_toxins"], - "filter_n2o" = info["filter_n2o"] - )) - if(AALARM_SCREEN_MODE) - data["mode"] = mode - data["modes"] = list() - data["modes"] += list(list("name" = "Filtering - Scrubs out contaminants", "mode" = AALARM_MODE_SCRUBBING, "selected" = mode == AALARM_MODE_SCRUBBING, "danger" = 0)) - data["modes"] += list(list("name" = "Contaminated - Scrubs out ALL contaminants quickly","mode" = AALARM_MODE_CONTAMINATED, "selected" = mode == AALARM_MODE_CONTAMINATED, "danger" = 0)) - data["modes"] += list(list("name" = "Draught - Siphons out air while replacing", "mode" = AALARM_MODE_VENTING, "selected" = mode == AALARM_MODE_VENTING, "danger" = 0)) - data["modes"] += list(list("name" = "Refill - Triple vent output", "mode" = AALARM_MODE_REFILL, "selected" = mode == AALARM_MODE_REFILL, "danger" = 0)) - data["modes"] += list(list("name" = "Cycle - Siphons air before replacing", "mode" = AALARM_MODE_REPLACEMENT, "selected" = mode == AALARM_MODE_REPLACEMENT, "danger" = 1)) - data["modes"] += list(list("name" = "Siphon - Siphons air out of the room", "mode" = AALARM_MODE_SIPHON, "selected" = mode == AALARM_MODE_SIPHON, "danger" = 1)) - data["modes"] += list(list("name" = "Panic Siphon - Siphons air out of the room quickly","mode" = AALARM_MODE_PANIC, "selected" = mode == AALARM_MODE_PANIC, "danger" = 1)) - data["modes"] += list(list("name" = "Off - Shuts off vents and scrubbers", "mode" = AALARM_MODE_OFF, "selected" = mode == AALARM_MODE_OFF, "danger" = 0)) - if (src.emagged) - data["modes"] += list(list("name" = "Flood - Shuts off scrubbers and opens vents", "mode" = AALARM_MODE_FLOOD, "selected" = mode == AALARM_MODE_FLOOD, "danger" = 1)) - if(AALARM_SCREEN_SENSORS) - var/datum/tlv/selected - var/list/thresholds = list() - - selected = TLV["pressure"] - thresholds += list(list("name" = "Pressure", "settings" = list())) - thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min2", "selected" = selected.min2)) - thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min1", "selected" = selected.min1)) - thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max1", "selected" = selected.max1)) - thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max2", "selected" = selected.max2)) - - selected = TLV["temperature"] - thresholds += list(list("name" = "Temperature", "settings" = list())) - thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min2", "selected" = selected.min2)) - thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min1", "selected" = selected.min1)) - thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max1", "selected" = selected.max1)) - thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max2", "selected" = selected.max2)) - - for (var/gas_id in meta_gas_info) - if(!(gas_id in TLV)) // We're not interested in this gas, it seems. - continue - selected = TLV[gas_id] - thresholds += list(list("name" = meta_gas_info[gas_id][META_GAS_NAME], "settings" = list())) - thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min2", "selected" = selected.min2)) - thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min1", "selected" = selected.min1)) - thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max1", "selected" = selected.max1)) - thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max2", "selected" = selected.max2)) - - data["thresholds"] = thresholds + data["thresholds"] = thresholds + return data /obj/machinery/airalarm/ui_act(action, params) if(..() || buildstage != 2) @@ -363,9 +334,6 @@ else tlv.vars[name] = round(value, 0.01) . = TRUE - if("screen") - screen = text2num(params["screen"]) - . = TRUE if("mode") mode = text2num(params["mode"]) apply_mode() @@ -667,7 +635,6 @@ if(src.allowed(usr) && !wires.is_cut(WIRE_IDSCAN)) locked = !locked user << "You [ locked ? "lock" : "unlock"] the air alarm interface." - src.updateUsrDialog() else user << "Access denied." return @@ -727,19 +694,12 @@ return ..() /obj/machinery/airalarm/power_change() - if(powered(power_channel)) - stat &= ~NOPOWER - else - stat |= NOPOWER - spawn(rand(0,15)) - if(loc) - update_icon() - + ..() + update_icon() /obj/machinery/airalarm/emag_act(mob/user) - if(!emagged) - src.emagged = 1 - if(user) - user.visible_message("Sparks fly out of the [src]!", "You emag the [src], disabling its safeties.") - playsound(src.loc, 'sound/effects/sparks4.ogg', 50, 1) + if(emagged) return + emagged = TRUE + visible_message("Sparks fly out of the [src]!", "You emag the [src], disabling its safeties.") + playsound(src.loc, 'sound/effects/sparks4.ogg', 50, 1) \ No newline at end of file diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index da9a5d86b74..b73d3aa5dea 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -27,10 +27,11 @@ Pipelines + Other Objects -> Pipe network var/device_type = 0 var/list/obj/machinery/atmospherics/nodes = list() -/obj/machinery/atmospherics/New() +/obj/machinery/atmospherics/New(process = TRUE) nodes.len = device_type ..() - SSair.atmos_machinery += src + if(process) + SSair.atmos_machinery += src SetInitDirections() if(can_unwrench) stored = new(src, make_from=src) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 7a9f04b041f..7ddc1f518c9 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -99,7 +99,7 @@ Passive gate is similar to the regular pump except: ui = new(user, src, ui_key, "atmos_pump", name, 335, 115, master_ui, state) ui.open() -/obj/machinery/atmospherics/components/binary/passive_gate/get_ui_data() +/obj/machinery/atmospherics/components/binary/passive_gate/ui_data() var/data = list() data["on"] = on data["pressure"] = round(target_pressure) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 83922c7fcdd..1304c1b12ca 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -26,14 +26,15 @@ Thus, the two variables affect pump operation are set in New(): var/id = null var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/components/binary/pump/on + on = 1 + /obj/machinery/atmospherics/components/binary/pump/Destroy() if(SSradio) SSradio.remove_object(src,frequency) if(radio_connection) radio_connection = null return ..() -/obj/machinery/atmospherics/components/binary/pump/on - on = 1 /obj/machinery/atmospherics/components/binary/pump/update_icon_nopipes() if(stat & NOPOWER) @@ -105,7 +106,7 @@ Thus, the two variables affect pump operation are set in New(): ui = new(user, src, ui_key, "atmos_pump", name, 335, 115, master_ui, state) ui.open() -/obj/machinery/atmospherics/components/binary/pump/get_ui_data() +/obj/machinery/atmospherics/components/binary/pump/ui_data() var/data = list() data["on"] = on data["pressure"] = round(target_pressure) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index 6407033909f..8a09e99b93e 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -101,7 +101,7 @@ Thus, the two variables affect pump operation are set in New(): ui = new(user, src, ui_key, "atmos_pump", name, 310, 115, master_ui, state) ui.open() -/obj/machinery/atmospherics/components/binary/volume_pump/get_ui_data() +/obj/machinery/atmospherics/components/binary/volume_pump/ui_data() var/data = list() data["on"] = on data["rate"] = round(transfer_rate) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index f18d2189278..7f2d1f39187 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -112,7 +112,7 @@ ui = new(user, src, ui_key, "atmos_filter", name, 470, 140, master_ui, state) ui.open() -/obj/machinery/atmospherics/components/trinary/filter/get_ui_data() +/obj/machinery/atmospherics/components/trinary/filter/ui_data() var/data = list() data["on"] = on data["pressure"] = round(target_pressure) @@ -146,10 +146,10 @@ if("filter") filter_type = "" var/filter_name = "nothing" - var/mode = params["mode"] - if(mode in meta_gas_info) - filter_type = mode - filter_name = meta_gas_info[mode][META_GAS_NAME] + var/gas = params["mode"] + if(gas in meta_gas_info) + filter_type = gas + filter_name = meta_gas_info[gas][META_GAS_NAME] investigate_log("was set to filter [filter_name] by [key_name(usr)]", "atmos") . = TRUE update_icon() diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index dcf452b93cb..9b14d15087b 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -123,7 +123,7 @@ ui = new(user, src, ui_key, "atmos_mixer", name, 370, 165, master_ui, state) ui.open() -/obj/machinery/atmospherics/components/trinary/mixer/get_ui_data() +/obj/machinery/atmospherics/components/trinary/mixer/ui_data() var/data = list() data["on"] = on data["set_pressure"] = round(target_pressure) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 7882568fe07..bead3040a35 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -162,7 +162,7 @@ user << "[src] seems empty." /obj/machinery/atmospherics/components/unary/cryo_cell/MouseDrop_T(mob/target, mob/user) - if(user.stat || user.lying || !Adjacent(user) || !Adjacent(target)) + if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target)) return close_machine(target) @@ -198,7 +198,7 @@ ui = new(user, src, ui_key, "cryo", name, 400, 550, master_ui, state) ui.open() -/obj/machinery/atmospherics/components/unary/cryo_cell/get_ui_data() +/obj/machinery/atmospherics/components/unary/cryo_cell/ui_data() var/list/data = list() data["isOperating"] = on data["hasOccupant"] = occupant ? 1 : 0 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index eac0c535cbd..3ac314d3b6b 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -116,7 +116,7 @@ ui = new(user, src, ui_key, "thermomachine", name, 400, 240, master_ui, state) ui.open() -/obj/machinery/atmospherics/components/unary/thermomachine/get_ui_data(mob/user) +/obj/machinery/atmospherics/components/unary/thermomachine/ui_data(mob/user) var/list/data = list() data["on"] = on diff --git a/code/modules/atmospherics/machinery/other/area_atmos_computer.dm b/code/modules/atmospherics/machinery/other/area_atmos_computer.dm deleted file mode 100644 index 53aa393b48d..00000000000 --- a/code/modules/atmospherics/machinery/other/area_atmos_computer.dm +++ /dev/null @@ -1,176 +0,0 @@ -/obj/machinery/computer/area_atmos - name = "area air control computer" - desc = "A computer used to control the stationary scrubbers and pumps in the area." - icon_screen = "area_atmos" - icon_keyboard = "atmos_key" - circuit = "/obj/item/weapon/circuitboard/area_atmos" - - var/list/connectedscrubbers = new() - var/status = "" - - var/range = 25 - - //Simple variable to prevent me from doing attack_hand in both this and the child computer - var/zone = "This computer is working on a wireless range, the range is currently limited to 25 meters." - -/obj/machinery/computer/area_atmos/New() - ..() - //So the scrubbers have time to spawn - spawn(10) - scanscrubbers() - -/obj/machinery/computer/area_atmos/attack_hand(mob/user) - if(..()) - return - src.add_fingerprint(usr) - var/dat = {" - - - - - -- [status] Area Air Control
- Scan -
| [scrubber.name] | -Turn On Turn Off | -
"
dat += "General Settings" dat += "UI Style: [UI_style]" + dat += "Keybindings: [(hotkeys) ? "Hotkeys" : "Default"] " dat += "tgui Style: [(tgui_fancy) ? "Fancy" : "No Frills"] " dat += "tgui Monitors: [(tgui_lock) ? "Primary" : "All"] " dat += "Play admin midis: [(toggles & SOUND_MIDI) ? "Yes" : "No"] " @@ -1021,6 +1023,9 @@ var/list/preferences_datums = list() else UI_style = "Midnight" + if("hotkeys") + hotkeys = !hotkeys + if("tgui_fancy") tgui_fancy = !tgui_fancy if("tgui_lock") diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 2ebae5c1065..cc0bad052bf 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -194,6 +194,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["ooccolor"] >> ooccolor S["lastchangelog"] >> lastchangelog S["UI_style"] >> UI_style + S["hotkeys"] >> hotkeys S["tgui_fancy"] >> tgui_fancy S["tgui_lock"] >> tgui_lock @@ -222,6 +223,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor))) lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) UI_style = sanitize_inlist(UI_style, list("Midnight", "Plasmafire", "Retro", "Slimecore", "Operative"), initial(UI_style)) + hotkeys = sanitize_integer(hotkeys, 0, 1, initial(hotkeys)) tgui_fancy = sanitize_integer(tgui_fancy, 0, 1, initial(tgui_fancy)) tgui_lock = sanitize_integer(tgui_lock, 0, 1, initial(tgui_lock)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) @@ -245,6 +247,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["ooccolor"] << ooccolor S["lastchangelog"] << lastchangelog S["UI_style"] << UI_style + S["hotkeys"] << hotkeys S["tgui_fancy"] << tgui_fancy S["tgui_lock"] << tgui_lock S["be_special"] << be_special diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index 01a41abc9fd..fdb4d7eb748 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -25,7 +25,7 @@ var/obj/item/weapon/paper/P = new(get_turf(src)) P.name = "paper- 'Scanner Report'" P.info = " " - P.info += list2text(log, " ") + P.info += jointext(log, " ") P.info += " Notes: " P.info_links = P.info diff --git a/code/modules/flufftext/TextFilters.dm b/code/modules/flufftext/TextFilters.dm index f7f6929d2e1..b529aec9059 100644 --- a/code/modules/flufftext/TextFilters.dm +++ b/code/modules/flufftext/TextFilters.dm @@ -4,7 +4,7 @@ /proc/NewStutter(phrase,stunned) phrase = html_decode(phrase) - var/list/split_phrase = text2list(phrase," ") //Split it up into words. + var/list/split_phrase = splittext(phrase," ") //Split it up into words. var/list/unstuttered_words = split_phrase.Copy() var/i = rand(1,3) @@ -35,7 +35,7 @@ split_phrase[index] = word - return sanitize(list2text(split_phrase," ")) + return sanitize(jointext(split_phrase," ")) /proc/Stagger(mob/M,d) //Technically not a filter, but it relates to drunkenness. step(M, pick(d,turn(d,90),turn(d,-90))) @@ -45,7 +45,7 @@ if(chance >= 100) return original_msg var/list - words = text2list(original_msg," ") + words = splittext(original_msg," ") new_words = list() var/new_msg = "" @@ -57,6 +57,6 @@ continue new_words += w - new_msg = list2text(new_words," ") + new_msg = jointext(new_words," ") return new_msg diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index 6f31a22f717..5f08f86d952 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -150,29 +150,25 @@ /obj/machinery/computer/holodeck/Topic(href, list/href_list) if(..()) return - if(Adjacent(usr) || istype(usr, /mob/living/silicon)) - usr.set_machine(src) - src.add_fingerprint(usr) - if(href_list["loadarea"]) - var/typepath = text2path(href_list["loadarea"]) - if(ispath(typepath,/area)) - var/area/target = locate(typepath) - if(istype(target)) - load_program(target) - else - world.log << "area not ready: [typepath]" - else - world.log << "bad area argument: [href_list["loadarea"]]" - else if("safety" in href_list) - var/oe = emagged - emagged = !text2num(href_list["safety"]) - if(oe == emagged) return - if(program && !stat) - if(!emagged && program.restricted) - load_program(offline_program) - else - nerf(!emagged) - src.updateUsrDialog() + if(!Adjacent(usr) && !istype(usr, /mob/living/silicon)) + return + usr.set_machine(src) + src.add_fingerprint(usr) + if(href_list["loadarea"]) + var/areapath = text2path(href_list["loadarea"]) + if(!ispath(areapath, /area/holodeck)) + return + var/area/holodeck/area = locate(areapath) + if(!istype(area)) + return + if((area in program_cache) || (emagged && (area in emag_programs))) + load_program(area) + else if("safety" in href_list) + var/safe = text2num(href_list["safety"]) + if(!program) + return + nerf(safe) + src.updateUsrDialog() /obj/machinery/computer/holodeck/proc/nerf(active) for(var/obj/item/I in spawned) diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 92a623c69f7..64bef84887e 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -124,7 +124,7 @@ if(!src.req_access) src.req_access = list() if(src.req_access_txt) - var/list/req_access_str = text2list(req_access_txt,";") + var/list/req_access_str = splittext(req_access_txt,";") for(var/x in req_access_str) var/n = text2num(x) if(n) @@ -133,7 +133,7 @@ if(!src.req_one_access) src.req_one_access = list() if(src.req_one_access_txt) - var/list/req_one_access_str = text2list(req_one_access_txt,";") + var/list/req_one_access_str = splittext(req_one_access_txt,";") for(var/x in req_one_access_str) var/n = text2num(x) if(n) diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/civilian_chaplain.dm index ba69cf1c3af..f614fec9b14 100644 --- a/code/modules/jobs/job_types/civilian_chaplain.dm +++ b/code/modules/jobs/job_types/civilian_chaplain.dm @@ -15,8 +15,8 @@ Chaplain outfit = /datum/outfit/job/chaplain - access = list(access_morgue, access_chapel_office, access_crematorium) - minimal_access = list(access_morgue, access_chapel_office, access_crematorium) + access = list(access_morgue, access_chapel_office, access_crematorium, access_theatre) + minimal_access = list(access_morgue, access_chapel_office, access_crematorium, access_theatre) /datum/outfit/job/chaplain name = "Chaplain" diff --git a/code/modules/json/json.dm b/code/modules/json/json.dm deleted file mode 100644 index d3b80d6792d..00000000000 --- a/code/modules/json/json.dm +++ /dev/null @@ -1,284 +0,0 @@ -/* Usage: - JSON.stringify(obj) - Converts lists and values into a JSON string. - JSON.parse(json) - Converts a JSON string into lists and values. -*/ - -/var/datum/jsonHelper/JSON = new // A namespace for procs. - -// ************************************ WRITER ************************************ -/datum/jsonHelper/proc/stringify(value) - return list2text(WriteValue(list(), value)) - -/datum/jsonHelper/proc/WriteValue(list/json, value) - . = json - if(isnum(value)) - json += value // Consider num2text(value, 20) for maximum accuracy. - else if(isnull(value)) - json += "null" - else if(istext(value)) - WriteString(json, value) - else if(istype(value, /list)) - WriteList(json, value) - else - throw EXCEPTION("Datums cannot be converted to JSON.") - -/datum/jsonHelper/proc/WriteString(list/json, str) - . = json - var/quotePos = findtextEx(str, "\"") - var/bsPos = findtextEx(str, "\\") - if (quotePos == 0 && bsPos == 0) - json.Add("\"", str, "\"") - else - json += "\"" - var/lastStop = 1 - while(quotePos != 0 || bsPos != 0) - var/escPos - if(quotePos < bsPos && quotePos != 0 || bsPos == 0) - escPos = quotePos - else - escPos = bsPos - json.Add(copytext(str, lastStop, escPos), "\\") - lastStop = escPos - if(escPos == quotePos) - quotePos = findtextEx(str, "\"", escPos + 1) - else if(escPos == bsPos) - bsPos = findtextEx(str, "\\", escPos + 1) - json.Add(copytext(str, lastStop), "\"") - -/datum/jsonHelper/proc/WriteList(list/json, list/listVal) - . = json - #define Either 0 - #define CannotBeArray 1 - #define CannotBeObject 2 - #define BadList (CannotBeArray | CannotBeObject) - var/listType = Either - for(var/key in listVal) - if(istext(key)) - if(!isnull(listVal[key])) - listType |= CannotBeArray - else - if(!isnum(key) && !isnull(listVal[key])) - listType = BadList - else - listType |= CannotBeObject - - if(listType == BadList) - throw EXCEPTION("The given list cannot be converted to JSON.") - - if(listType == CannotBeArray) - json += "{" - var/addComma - for(var/key in listVal) - if(addComma) - json += "," - else - addComma = TRUE - WriteString(json, key) - json += ":" - WriteValue(json, listVal[key]) - json += "}" - else - json += "\[" - var/addComma - for(var/key in listVal) - if(addComma) - json += "," - else - addComma = TRUE - WriteValue(json, key) - json += "]" - #undef Either - #undef CannotBeFlat - #undef CannotBeAssoc - #undef BadList - -// ************************************ READER ************************************ -#define aBackspace 0x08 -#define aTab 0x09 -#define aLineBreak 0x0A -#define aVertTab 0x0B -#define aFormFeed 0x0C -#define aCarriageReturn 0x0D -#define aSpace 0x20 -#define aZero 0x30 -#define aNonBreakSpace 0xA0 - -#define Advance if(++readPos > jsonLen) { curAscii = 0; curChar = "" } else { curAscii = text2ascii(json, readPos); curChar = ascii2text(curAscii) } // Deal with it. -#define SkipWhitespace while(curAscii in whitespace) Advance -#define AdvanceWS Advance; SkipWhitespace - -/datum/jsonHelper/var - readPos - jsonLen - json - curAscii - curChar - static/list/whitespace = list(aTab, aLineBreak, aVertTab, aFormFeed, aCarriageReturn, aSpace, aNonBreakSpace) - -/datum/jsonHelper/proc/parse(json) - readPos = 0 - jsonLen = length(json) - src.json = json - curAscii = 0 - curChar = "" - AdvanceWS - var/value = ParseValue() - if(readPos < jsonLen) - throw EXCEPTION("Expected: End of JSON") - return value - -/datum/jsonHelper/proc/ParseValue() - if(curChar == "\"") - return ParseString() - else if(curChar == "-" || (curAscii >= aZero && curAscii <= aZero + 9)) - return ParseNumber() - else if(curChar == "{") - return ParseObject() - else if(curChar == "\[") - return ParseArray() - else if(curChar == "t") - if(copytext(json, readPos, readPos+4) == "true") - readPos += 3 - AdvanceWS - return TRUE - else - throw EXCEPTION("Expected: 'true'") - else if(curChar == "f") - if(copytext(json, readPos, readPos+5) == "false") - readPos += 4 - AdvanceWS - return FALSE - else - throw EXCEPTION("Expected: 'false'") - else if(curChar == "n") - if(copytext(json, readPos, readPos+4) == "null") - readPos += 3 - AdvanceWS - return null - else - throw EXCEPTION("Expected: 'null'") - else if(curChar == "") - throw EXCEPTION("Unexpected: End of JSON") - else - throw EXCEPTION("Unexpected: '[curChar]'") - - - -/datum/jsonHelper/proc/ParseString() - ASSERT(curChar == "\"") - Advance - var/list/chars = list() - while(readPos <= jsonLen) - if(curChar == "\"") - AdvanceWS - return list2text(chars) - else if(curChar == "\\") - Advance - switch(curChar) - if("\"", "\\", "/") - chars += ascii2text(curAscii) - if("b") - chars += ascii2text(aBackspace) - if("f") - chars += ascii2text(aFormFeed) - if("n") - chars += "\n" - if("r") - chars += ascii2text(aCarriageReturn) // Should we ignore these? - if("t") - chars += "\t" - if("u") - throw EXCEPTION("JSON \\uXXXX escape sequence not supported") - else - throw EXCEPTION("Invalid escape sequence") - Advance - else - chars += ascii2text(curAscii) - Advance - throw EXCEPTION("Unterminated string") - -/datum/jsonHelper/proc/ParseNumber() - var/firstPos = readPos - if(curChar == "-") - Advance - if(curAscii >= aZero + 1 && curAscii <= aZero + 9) - do - Advance - while(curAscii >= aZero && curAscii <= aZero + 9) - else if(curAscii == aZero) - Advance - else - throw EXCEPTION("Expected: digit") - - if(curChar == ".") - Advance - var/found = FALSE - while(curAscii >= aZero && curAscii <= aZero + 9) - found = TRUE - Advance - if(!found) - throw EXCEPTION("Expected: digit") - - if(curChar == "E" || curChar == "e") - Advance - var/found = FALSE - if(curChar == "-") - Advance - else if(curChar == "+") - Advance - while(curAscii >= aZero && curAscii <= aZero + 9) - found = TRUE - Advance - if(!found) - throw EXCEPTION("Expected: digit") - - SkipWhitespace - return text2num(copytext(json, firstPos, readPos)) - -/datum/jsonHelper/proc/ParseObject() - ASSERT(curChar == "{") - var/list/object = list() - AdvanceWS - while(curChar == "\"") - var/key = ParseString() - if(curChar != ":") - throw EXCEPTION("Expected: ':'") - AdvanceWS - object[key] = ParseValue() - if(curChar == ",") - AdvanceWS - else - break - if(curChar != "}") - throw EXCEPTION("Expected: string or '}'") - AdvanceWS - return object - -/datum/jsonHelper/proc/ParseArray() - ASSERT(curChar == "\[") - var/list/array = list() - AdvanceWS - while(curChar != "]") - array += list(ParseValue()) // Wrapped in a list in case ParseValue() returns a list. - if(curChar == ",") - AdvanceWS - else - break - if(curChar != "]") - throw EXCEPTION("Expected: ']'") - AdvanceWS - return array - -#undef aBackspace -#undef aTab -#undef aLineBreak -#undef aVertTab -#undef aFormFeed -#undef aCarriageReturn -#undef aSpace -#undef aZero -#undef aNonBreakSpace - -#undef Advance -#undef SkipWhitespace -#undef AdvanceWS \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index e97420afbde..26e7677aa91 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -167,9 +167,11 @@ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) -/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0) +/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) var/damage = intensity - check_eye_prot() if(..()) // we've been flashed + if(visual) + return if(weakeyes) Stun(2) switch(damage) @@ -200,7 +202,6 @@ else src << "Your eyes are really starting to hurt. This can't be good for you!" return 1 - else if(damage == 0) // just enough protection if(prob(20)) src << "Something bright flashes in the corner of your vision!" @@ -583,31 +584,44 @@ var/const/GALOSHES_DONT_HELP = 4 add_abilities_to_panel() -/mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood) +/mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1) if(src.is_muzzled()) - src << "The muzzle prevents you from vomiting!" + if(message) + src << "The muzzle prevents you from vomiting!" return 0 - Stun(4) + if(stun) + Stun(4) if(nutrition < 100 && !blood) - visible_message("[src] dry heaves!", \ - "You try to throw up, but there's nothing your stomach!") - Weaken(10) + if(message) + visible_message("[src] dry heaves!", \ + "You try to throw up, but there's nothing your stomach!") + if(stun) + Weaken(10) else - visible_message("[src] throws up!", \ - "You throw up!") + if(message) + visible_message("[src] throws up!", \ + "You throw up!") playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) var/turf/T = get_turf(src) - if(blood) - if(T) - T.add_blood_floor(src) - adjustBruteLoss(3) - else - if(T) - T.add_vomit_floor(src) - nutrition -= lost_nutrition - adjustToxLoss(-3) + for(var/i=0 to distance) + if(blood) + if(T) + T.add_blood_floor(src) + if(stun) + adjustBruteLoss(3) + else + if(T) + T.add_vomit_floor(src) + nutrition -= lost_nutrition + if(stun) + adjustToxLoss(-3) + T = get_step(T, dir) + if (is_blocked_turf(T)) + break return 1 + + /mob/living/carbon/fully_replace_character_name(oldname,newname) ..() if(dna) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 4810de6cf47..33ac914b274 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -29,7 +29,7 @@ if(!gibbed) emote("deathgasp") //let the world KNOW WE ARE DEAD - dna.species.spec_death(gibbed,src) + dna.species.spec_death(gibbed, src) if(ticker && ticker.mode) sql_report_death(src) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 272222dc8ef..4f2ef525153 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -12,7 +12,7 @@ message = dna.species.handle_speech(message,src) if(viruses.len) for(var/datum/disease/pierrot_throat/D in viruses) - var/list/temp_message = text2list(message, " ") //List each word in the message + var/list/temp_message = splittext(message, " ") //List each word in the message var/list/pick_list = list() for(var/i = 1, i <= temp_message.len, i++) //Create a second list for excluding words down the line pick_list += i @@ -22,7 +22,7 @@ if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue temp_message[H] = "HONK" pick_list -= H //Make sure that you dont HONK the same word twice - message = list2text(temp_message, " ") + message = jointext(temp_message, " ") message = ..(message) message = dna.mutations_say_mods(message) return message diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index 0d18c49084e..ba054ec21bf 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -74,14 +74,12 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H) return randname +var/regex/lizard_hiss = new("s+", "g") +var/regex/lizard_hiSS = new("S+", "g") /datum/species/lizard/handle_speech(message) - if(copytext(message, 1, 2) != "*") - message = regEx_replaceall(message, "(? 0, i--) @@ -427,7 +425,7 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H) if(prob(20) && message_list.len > 3) message_list.Insert(insertpos, "[pick("BRAINS", "Brains", "Braaaiinnnsss", "BRAAAIIINNSSS")]...") - return list2text(message_list, " ") + return jointext(message_list, " ") /datum/species/cosmetic_zombie name = "Human" diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 98b621f8671..60915c1b544 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -56,9 +56,9 @@ sleeping = 0 update_sight() update_vision_overlays() + clear_fullscreens() update_damage_hud() update_health_hud() - update_canmove() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 3dcc0f30172..a9270b6e601 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -193,8 +193,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/ex_act(severity, target) ..() - if(client && !eye_blind) - flick("flash", src.flash) + flash_eyes() /mob/living/proc/updatehealth() if(status_flags & GODMODE) @@ -720,9 +719,10 @@ Sorry Giacom. Please don't be mad :( floating = 0 //called when the mob receives a bright flash -/mob/living/proc/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0) +/mob/living/proc/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash) if(check_eye_prot() < intensity && (override_blindness_check || !(disabilities & BLIND))) - flick("e_flash", flash) + overlay_fullscreen("flash", type) + addtimer(src, "clear_fullscreen", 25, FALSE, "flash", 25) return 1 //this returns the mob's protection against eye damage (number between -1 and 2) diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 55f068eba59..4b94f89d3ac 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -15,8 +15,8 @@ anchored = 0 //unbolt floorbolts update_canmove() - if(src.eyeobj) - src.eyeobj.setLoc(get_turf(src)) + if(eyeobj) + eyeobj.setLoc(get_turf(src)) shuttle_caller_list -= src SSshuttle.autoEvac() @@ -42,7 +42,7 @@ for(var/obj/machinery/ai_status_display/O in world) //change status if(src.key) O.mode = 2 - if (istype(loc, /obj/item/device/aicard)) + if(istype(loc, /obj/item/device/aicard)) loc.icon_state = "aicard-404" return ..() diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index b43ef3552f4..bc050cfaa3b 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -109,7 +109,7 @@ var/const/VOX_DELAY = 600 src << "Wireless interface disabled, unable to interact with announcement PA." return - var/list/words = text2list(trim(message), " ") + var/list/words = splittext(trim(message), " ") var/list/incorrect_words = list() if(words.len > 30) diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index e04f992744b..b1218a210fc 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -8,6 +8,4 @@ ticker.mode.remove_gangster(mind,1,remove_bosses=1) ticker.mode.remove_thrall(mind,0) ticker.mode.remove_shadowling(mind) - ticker.mode.remove_hog_follower(mind, 0) - - winset(src, null, "mainwindow.macro=robot-default") \ No newline at end of file + ticker.mode.remove_hog_follower(mind, 0) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 08aa811cffd..f7922b9d411 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -5,6 +5,8 @@ icon_state = "robot" maxHealth = 100 health = 100 + macro_default = "robot-default" + macro_hotkeys = "robot-hotkeys" bubble_icon = "robot" var/sight_mode = 0 var/custom_name = "" @@ -676,7 +678,7 @@ /mob/living/silicon/robot/attack_slime(mob/living/simple_animal/slime/M) if(..()) //successful slime shock - flick("noise", flash) + flash_eyes() var/stunprob = M.powerlevel * 7 + 10 if(prob(stunprob) && M.powerlevel >= 8) adjustBruteLoss(M.powerlevel * rand(6,10)) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index d7b0945faa5..72a48a63fe2 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -99,11 +99,13 @@ var/obj/item/weapon/melee/baton/B = I if(B.bcell) B.bcell.charge = B.bcell.maxcharge + if(istype(I, /obj/item/weapon/tank/jetpack)) + var/obj/item/weapon/tank/jetpack/J = I + J.air_contents.assert_gas("co2") + J.air_contents.gases["co2"][MOLES] = (6 * ONE_ATMOSPHERE) * J.volume / (R_IDEAL_GAS_EQUATION * T20C) R.toner = R.tonermax - return - /obj/item/weapon/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module var/list/temp_list = modules modules = list() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 37605204ab1..5058bc292d8 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -136,9 +136,9 @@ src.take_organ_damage(20) if(2) src.take_organ_damage(10) - flick("noise", src:flash) src << "*BZZZT*" src << "Warning: Electromagnetic pulse detected." + flash_eyes(affect_silicon = 1) ..() /mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = 0) @@ -394,7 +394,7 @@ visible_message("[M] has slashed at [src]!", \ "[M] has slashed at [src]!") if(prob(8)) - flick("noise", flash) + flash_eyes(affect_silicon = 1) add_logs(M, src, "attacked") adjustBruteLoss(damage) updatehealth() @@ -467,7 +467,7 @@ /mob/living/silicon/grabbedby(mob/living/user) return -/mob/living/silicon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0) +/mob/living/silicon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash/noise) if(affect_silicon) return ..() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 92339d872e9..aaa61f49a39 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -18,6 +18,8 @@ speak_emote = list("states") bubble_icon = "machine" + faction = list("neutral, silicon") + var/obj/machinery/bot_core/bot_core = null var/bot_core_type = /obj/machinery/bot_core var/list/users = list() //for dialog updates @@ -252,6 +254,7 @@ src << "You sense your form change as you are uploaded into [src]." bot_name = name name = paicard.pai.name + faction = user.faction add_logs(user, paicard.pai, "uploaded to [src.bot_name],") else user << "[W] is inactive." @@ -857,6 +860,7 @@ Pass a positive integer as an argument to override a bot's default speed. paicard.pai << "You feel your control fade as [paicard] ejects from [bot_name]." paicard = null name = bot_name + faction = initial(faction) /mob/living/simple_animal/bot/proc/ejectpairemote(mob/user) if(bot_core.allowed(user) && paicard) @@ -881,3 +885,6 @@ Pass a positive integer as an argument to override a bot's default speed. ..() if(paicard && (!client || stat == DEAD)) ejectpai(0) + +/mob/living/simple_animal/bot/sentience_act() + faction -= "silicon" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 7ddd1dc2a74..836a0d63579 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -171,7 +171,7 @@ var/global/mulebot_count = 0 ui = new(user, src, ui_key, "mulebot", name, 600, 375, master_ui, state) ui.open() -/mob/living/simple_animal/bot/mulebot/get_ui_data(mob/user) +/mob/living/simple_animal/bot/mulebot/ui_data(mob/user) var/list/data = list() data["on"] = on data["locked"] = locked diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 59f9a7303f3..7ce2de34087 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -274,13 +274,13 @@ /mob/living/simple_animal/attack_animal(mob/living/simple_animal/M) if(..()) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - attack_threshold_check(damage,M.melee_damage_type) + apply_damage(damage, M.melee_damage_type, threshold_check = 1, threshold_message = 1) return 1 /mob/living/simple_animal/bullet_act(obj/item/projectile/Proj) if(!Proj) return - apply_damage(Proj.damage, Proj.damage_type) + apply_damage(Proj.damage, Proj.damage_type, threshold_message = 1) Proj.on_hit(src) return 0 @@ -330,7 +330,7 @@ M.do_attack_animation(src) visible_message("[M] [response_harm] [src]!") playsound(loc, "punch", 25, 1, -1) - attack_threshold_check(harm_intent_damage) + apply_damage(harm_intent_damage, threshold_check = 1, threshold_message = 1) add_logs(M, src, "attacked") updatehealth() return 1 @@ -339,7 +339,7 @@ if(..()) //successful monkey bite. if(stat != DEAD) var/damage = rand(1, 3) - attack_threshold_check(damage) + apply_damage(damage, threshold_check = 1, threshold_message = 1) return 1 if (M.a_intent == "help") if (health > 0) @@ -360,7 +360,7 @@ visible_message("[M] has slashed at [src]!", \ "[M] has slashed at [src]!") playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - attack_threshold_check(damage) + apply_damage(damage, threshold_check = 1, threshold_message = 1) add_logs(M, src, "attacked") return 1 @@ -369,7 +369,7 @@ var/damage = rand(5, 10) if(stat != DEAD) L.amount_grown = min(L.amount_grown + damage, L.max_grown) - attack_threshold_check(damage) + apply_damage(damage, threshold_check = 1, threshold_message = 1) return 1 /mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/M) @@ -377,15 +377,16 @@ var/damage = rand(15, 25) if(M.is_adult) damage = rand(20, 35) - attack_threshold_check(damage) + apply_damage(damage, threshold_check = 1, threshold_message = 1) return 1 -/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE) - if(damage <= force_threshold || !damage_coeff[damagetype]) - visible_message("[src] looks unharmed.") +/mob/living/simple_animal/apply_damage(damage = 0, damagetype = BRUTE, threshold_check = 0, threshold_message = 0) + if(!damage_coeff[damagetype] || threshold_check && damage <= force_threshold) + if(threshold_message) + visible_message("[src] looks unharmed.") + return 0 else - adjustBruteLoss(damage) - updatehealth() + return ..() /mob/living/simple_animal/attackby(obj/item/O, mob/living/user, params) //Marker -Agouri diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm index 2f28d8b1359..0a20862a574 100644 --- a/code/modules/mob/living/simple_animal/slime/death.dm +++ b/code/modules/mob/living/simple_animal/slime/death.dm @@ -18,7 +18,7 @@ return if(buckled) - Feedstop(silent=1) //releases ourselves from the mob we fed on. + Feedstop(silent = 1) //releases ourselves from the mob we fed on. stat = DEAD overlays.len = 0 diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 7f6c9fee544..e4bb256f899 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -57,4 +57,7 @@ sync_mind() - winset(src, null, "mainwindow.macro=default") \ No newline at end of file + if(client.prefs.hotkeys) + winset(src, null, "mainwindow.macro=[macro_hotkeys] mapwindow.map.focus=true input.background-color=#e0e0e0") + else + winset(src, null, "mainwindow.macro=[macro_default] input.focus=true input.background-color=#d3b5b5") diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 99a5e26cb68..5a2ea7b281b 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -10,9 +10,8 @@ var/stat = 0 //Whether a mob is alive or dead. TODO: Move this to living - Nodrak - var/obj/screen/flash = null + var/obj/screen/hands = null - var/obj/screen/damageoverlay = null /*A bunch of this stuff really needs to go under their own defines instead of being globally attached to mob. A variable should only be globally attached to turfs/objects/whatever, when it is in fact needed as such. The current method unnecessarily clusters up the variable list, especially for humans (although rearranging won't really clean it up a lot but the difference will be noticable for other mobs). @@ -21,6 +20,9 @@ */ var/zone_selected = null + var/macro_default = "default" + var/macro_hotkeys = "hotkeys" + var/damageoverlaytemp = 0 var/computer_id = null var/lastattacker = null diff --git a/code/modules/ninja/suit/mask.dm b/code/modules/ninja/suit/mask.dm index 308f94245b7..87e9255e41d 100644 --- a/code/modules/ninja/suit/mask.dm +++ b/code/modules/ninja/suit/mask.dm @@ -21,7 +21,7 @@ Contents: /obj/item/clothing/mask/gas/voice/space_ninja/speechModification(message) if(voice == "Unknown") if(copytext(message, 1, 2) != "*") - var/list/temp_message = text2list(message, " ") + var/list/temp_message = splittext(message, " ") var/list/pick_list = list() for(var/i = 1, i <= temp_message.len, i++) pick_list += i @@ -30,7 +30,7 @@ Contents: if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue temp_message[H] = ninjaspeak(temp_message[H]) pick_list -= H - message = list2text(temp_message, " ") + message = jointext(temp_message, " ") //The Alternate speech mod is now the main one. message = replacetext(message, "l", "r") diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 7efef3d01bf..98faa83bf9b 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -617,7 +617,7 @@ ui = new(user, src, ui_key, "apc", name, 535, 515, master_ui, state) ui.open() -/obj/machinery/power/apc/get_ui_data(mob/user) +/obj/machinery/power/apc/ui_data(mob/user) var/list/data = list( "locked" = locked, "isOperating" = operating, @@ -625,7 +625,7 @@ "powerCellStatus" = cell ? cell.percent() : null, "chargeMode" = chargemode, "chargingStatus" = charging, - "totalLoad" = lastused_equip + lastused_light + lastused_environ, + "totalLoad" = lastused_total, "coverLocked" = coverlocked, "siliconUser" = user.has_unlimited_silicon_privilege, "malfStatus" = get_malf_status(user), diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index cc5416f52e8..5ca4eabf1df 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -114,11 +114,6 @@ By design, d1 is the smallest direction and d2 is the highest else icon_state = "[d1]-[d2]" - -// returns the powernet this cable belongs to -/obj/structure/cable/proc/get_powernet() //TODO: remove this as it is obsolete - return powernet - //Telekinesis has no effect on a cable /obj/structure/cable/attack_tk(mob/user) return diff --git a/code/modules/power/monitor.dm b/code/modules/power/monitor.dm new file mode 100644 index 00000000000..b0f11026686 --- /dev/null +++ b/code/modules/power/monitor.dm @@ -0,0 +1,81 @@ +/obj/machinery/computer/monitor + name = "power monitoring console" + desc = "It monitors power levels across the station." + icon_screen = "power" + icon_keyboard = "power_key" + use_power = 2 + idle_power_usage = 20 + active_power_usage = 100 + circuit = /obj/item/weapon/circuitboard/powermonitor + + var/obj/structure/cable/attached + + var/list/history = list() + var/record_size = 60 + var/record_interval = 50 + var/next_record = 0 + +/obj/machinery/computer/monitor/New() + ..() + search() + history["supply"] = list() + history["demand"] = list() + +/obj/machinery/computer/monitor/process() + if(!attached) + use_power = 1 + search() + else + use_power = 2 + record() + +/obj/machinery/computer/monitor/proc/search() + var/turf/T = get_turf(src) + attached = locate() in T + +/obj/machinery/computer/monitor/proc/record() + if(world.time >= next_record) + next_record = world.time + record_interval + + var/list/supply = history["supply"] + supply += attached.powernet.viewavail + if(supply.len > record_size) + supply.Cut(1, 2) + + var/list/demand = history["demand"] + demand += attached.powernet.viewload + if(demand.len > record_size) + demand.Cut(1, 2) + +/obj/machinery/computer/monitor/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "power_monitor", name, 1200, 1000, master_ui, state) + ui.open() + +/obj/machinery/computer/monitor/ui_data() + var/list/data = list() + data["stored"] = record_size + data["interval"] = record_interval / 10 + data["attached"] = attached ? TRUE : FALSE + if(attached) + data["supply"] = attached.powernet.viewavail + data["demand"] = attached.powernet.viewload + data["history"] = history + + data["areas"] = list() + for(var/obj/machinery/power/terminal/term in attached.powernet.nodes) + var/obj/machinery/power/apc/A = term.master + if(istype(A)) + data["areas"] += list(list( + "name" = A.area.name, + "charge" = A.cell.percent(), + "load" = A.lastused_total, + "charging" = A.charging, + "eqp" = A.equipment, + "lgt" = A.lighting, + "env" = A.environ + )) + + return data diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index d1b4c5a01ec..6853d2dac26 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -34,7 +34,7 @@ /obj/machinery/power/proc/surplus() if(powernet) - return powernet.avail-powernet.load + return powernet.avail - powernet.load else return 0 @@ -50,10 +50,8 @@ // returns true if the area has power on given channel (or doesn't require power). // defaults to power_channel /obj/machinery/proc/powered(var/chan = -1) // defaults to power_channel - - if(!src.loc) + if(!loc) return 0 - if(!use_power) return 1 diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index f8e8826294d..28ef1488d02 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -3,14 +3,15 @@ // each contiguous network of cables & nodes ///////////////////////////////////// /datum/powernet + var/number // unique id var/list/cables = list() // all cables & junctions var/list/nodes = list() // all connected machines var/load = 0 // the current load on the powernet, increased by each machine at processing var/newavail = 0 // what available power was gathered last tick, then becomes... var/avail = 0 //...the current available power in the powernet + var/viewavail = 0 // the available power as it appears on the power console (gradually updated) var/viewload = 0 // the load as it appears on the power console (gradually updated) - var/number = 0 // Unused //TODEL var/netexcess = 0 // excess power on the powernet (typically avail-load)/////// /datum/powernet/New() @@ -75,7 +76,6 @@ //handles the power changes in the powernet //called every ticks by the powernet controller /datum/powernet/proc/reset() - //see if there's a surplus of power remaining in the powernet and stores unused power in the SMES netexcess = avail - load @@ -83,11 +83,11 @@ for(var/obj/machinery/power/smes/S in nodes) // find the SMESes in the network S.restore() // and restore some of the power that was used - //updates the viewed load (as seen on power computers) - viewload = 0.8*viewload + 0.2*load - viewload = round(viewload) + // update power consoles + viewavail = round(0.8 * viewavail + 0.2 * avail) + viewload = round(0.8 * viewload + 0.2 * load) - //reset the powernet + // reset the powernet load = 0 avail = newavail newavail = 0 diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index d1585e5b40f..6d27247e9a4 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -46,7 +46,7 @@ component_parts = list() component_parts += new /obj/item/weapon/circuitboard/smes(null) for(var/i in 1 to 5) - component_parts += new /obj/item/weapon/stock_parts/cell/high(null) + component_parts += new /obj/item/weapon/stock_parts/cell/high/empty(null) component_parts += new /obj/item/stack/cable_coil(null, 5) component_parts += new /obj/item/weapon/stock_parts/capacitor(null) RefreshParts() @@ -78,7 +78,7 @@ MC += PC.maxcharge C += PC.charge capacity = MC / (15000) * 1e6 - if(!initial(charge)) + if(!initial(charge) && !charge) charge = C / 15000 * 1e6 /obj/machinery/power/smes/attackby(obj/item/I, mob/user, params) @@ -333,7 +333,7 @@ ui = new(user, src, ui_key, "smes", name, 340, 440, master_ui, state) ui.open() -/obj/machinery/power/smes/get_ui_data() +/obj/machinery/power/smes/ui_data() var/list/data = list( "capacityPercent" = round(100*charge/capacity, 0.1), "capacity" = capacity, diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 97e91f6748d..d7562287e11 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -363,7 +363,7 @@ ui = new(user, src, ui_key, "solar_control", name, 500, 400, master_ui, state) ui.open() -/obj/machinery/power/solar_control/get_ui_data() +/obj/machinery/power/solar_control/ui_data() var/data = list() data["generated"] = round(lastgen) diff --git a/code/modules/procedural mapping/mapGenerator.dm b/code/modules/procedural mapping/mapGenerator.dm index ce6b5a18c89..c4bff6d8657 100644 --- a/code/modules/procedural mapping/mapGenerator.dm +++ b/code/modules/procedural mapping/mapGenerator.dm @@ -155,8 +155,8 @@ src << "Missing Input" return - var/list/startCoords = text2list(startInput, ";") - var/list/endCoords = text2list(endInput, ";") + var/list/startCoords = splittext(startInput, ";") + var/list/endCoords = splittext(endInput, ";") if(!startCoords || !endCoords) src << "Invalid Coords" src << "Start Input: [startInput]" diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 524dfa341cb..3631f1cc5ce 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -3,6 +3,12 @@ caliber = "357" projectile_type = /obj/item/projectile/bullet +/obj/item/ammo_casing/a762 + desc = "A 7.62 bullet casing." + icon_state = "762-casing" + caliber = "a762" + projectile_type = /obj/item/projectile/bullet + /obj/item/ammo_casing/a50 desc = "A .50AE bullet casing." caliber = ".50" @@ -142,6 +148,12 @@ icon_state = "mshell" projectile_type = /obj/item/projectile/bullet/meteorshot +/obj/item/ammo_casing/shotgun/breaching + name = "breaching shell" + desc = "An economic version of the meteorshot, utilizing similar technologies. Great for busting down doors." + icon_state = "mshell" + projectile_type = /obj/item/projectile/bullet/meteorshot/weak + /obj/item/ammo_casing/shotgun/pulseslug name = "pulse slug" desc = "A delicate device which can be loaded into a shotgun. The primer acts as a button which triggers the gain medium and fires a powerful \ diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index bc8bdb6f428..443eb48ff26 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -166,3 +166,14 @@ obj/item/ammo_casing/energy/net /obj/item/ammo_casing/energy/trap projectile_type = /obj/item/projectile/energy/trap select_name = "snare" + +/obj/item/ammo_casing/energy/instakill + projectile_type = /obj/item/projectile/beam/instakill + e_cost = 0 + select_name = "DESTROY" + +/obj/item/ammo_casing/energy/instakill/blue + projectile_type = /obj/item/projectile/beam/instakill/blue + +/obj/item/ammo_casing/energy/instakill/red + projectile_type = /obj/item/projectile/beam/instakill/red diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index a5ff5364b5e..390339609e5 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -304,6 +304,11 @@ obj/item/ammo_box/magazine/tommygunm45 icon_state = "m12gt" ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror +/obj/item/ammo_box/magazine/m12g/breach + name = "shotgun magazine (12g breacher slugs)" + icon_state = "m12gbc" + ammo_type = /obj/item/projectile/bullet/meteorshot/weak + /obj/item/ammo_box/magazine/toy name = "foam force META magazine" ammo_type = /obj/item/ammo_casing/caseless/foam_dart diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 0b7aaf73c5f..636fc7074ba 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -284,3 +284,27 @@ ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot) cell_type = "/obj/item/weapon/stock_parts/cell/high" pin = null + +/obj/item/weapon/gun/energy/laser/instakill + name = "instakill rifle" + icon_state = "instagib" + item_state = "instagib" + desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit." + ammo_type = list(/obj/item/ammo_casing/energy/instakill) + force = 60 + origin_tech = null + +/obj/item/weapon/gun/energy/laser/instakill/red + desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a red design." + icon_state = "instagibred" + item_state = "instagibred" + ammo_type = list(/obj/item/ammo_casing/energy/instakill/red) + +/obj/item/weapon/gun/energy/laser/instakill/blue + desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a blue design." + icon_state = "instagibblue" + item_state = "instagibblue" + ammo_type = list(/obj/item/ammo_casing/energy/instakill/blue) + +/obj/item/weapon/gun/energy/laser/instagib/emp_act() //implying you could stop the instagib + return \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/saw.dm b/code/modules/projectiles/guns/projectile/saw.dm index 7d54685f070..a924bd5b328 100644 --- a/code/modules/projectiles/guns/projectile/saw.dm +++ b/code/modules/projectiles/guns/projectile/saw.dm @@ -1,12 +1,12 @@ /obj/item/weapon/gun/projectile/automatic/l6_saw name = "\improper L6 SAW" - desc = "A heavily modified 7.62 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation." + desc = "A heavily modified 5.56x45mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation." icon_state = "l6closed100" item_state = "l6closedmag" w_class = 5 slot_flags = 0 origin_tech = "combat=5;materials=1;syndicate=2" - mag_type = /obj/item/ammo_box/magazine/m762 + mag_type = /obj/item/ammo_box/magazine/mm556x45 heavy_weapon = 1 fire_sound = 'sound/weapons/Gunshot_smg.ogg' var/cover_open = 0 @@ -27,6 +27,7 @@ /obj/item/weapon/gun/projectile/automatic/l6_saw/update_icon() icon_state = "l6[cover_open ? "open" : "closed"][magazine ? Ceiling(get_ammo(0)/12.5)*25 : "-empty"]" + item_state = "l6[cover_open ? "openmag" : "closedmag"]" /obj/item/weapon/gun/projectile/automatic/l6_saw/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) //what I tried to do here is just add a check to see if the cover is open or not and add an icon_state change because I can't figure out how c-20rs do it with overlays @@ -64,70 +65,77 @@ /obj/item/projectile/bullet/saw - damage = 35 + damage = 45 armour_penetration = 5 /obj/item/projectile/bullet/saw/bleeding - damage = 15 + damage = 20 armour_penetration = 0 /obj/item/projectile/bullet/saw/bleeding/on_hit(atom/target, blocked = 0, hit_zone) if((blocked != 100) && istype(target, /mob/living/carbon/human)) var/mob/living/carbon/human/H = target - H.drip(25) + H.drip(35) /obj/item/projectile/bullet/saw/hollow - damage = 45 - armour_penetration = 0 + damage = 60 + armour_penetration = -10 /obj/item/projectile/bullet/saw/ap - damage = 30 - armour_penetration = 35 + damage = 40 + armour_penetration = 75 /obj/item/projectile/bullet/saw/incen - damage = 5 + damage = 7 armour_penetration = 0 +obj/item/projectile/bullet/saw/incen/Move() + ..() + var/turf/location = get_turf(src) + if(location) + PoolOrNew(/obj/effect/hotspot, location) + location.hotspot_expose(700, 50, 1) + /obj/item/projectile/bullet/saw/incen/on_hit(atom/target, blocked = 0) . = ..() if(iscarbon(target)) var/mob/living/carbon/M = target - M.adjust_fire_stacks(1) + M.adjust_fire_stacks(3) M.IgniteMob() //magazines// -/obj/item/ammo_box/magazine/m762 - name = "box magazine (7.62mm)" +/obj/item/ammo_box/magazine/mm556x45 + name = "box magazine (5.56x45mm)" icon_state = "a762-50" origin_tech = "combat=2" - ammo_type = /obj/item/ammo_casing/a762 - caliber = "a762" + ammo_type = /obj/item/ammo_casing/mm556x45 + caliber = "mm55645" max_ammo = 50 -/obj/item/ammo_box/magazine/m762/bleeding - name = "box magazine (Bleeding 7.62mm)" +/obj/item/ammo_box/magazine/mm556x45/bleeding + name = "box magazine (Bleeding 5.56x45mm)" origin_tech = "combat=3" - ammo_type = /obj/item/ammo_casing/a762/bleeding + ammo_type = /obj/item/ammo_casing/mm556x45/bleeding -/obj/item/ammo_box/magazine/m762/hollow - name = "box magazine (Hollow-Point 7.62mm)" +/obj/item/ammo_box/magazine/mm556x45/hollow + name = "box magazine (Hollow-Point 5.56x45mm)" origin_tech = "combat=3" - ammo_type = /obj/item/ammo_casing/a762/hollow + ammo_type = /obj/item/ammo_casing/mm556x45/hollow -/obj/item/ammo_box/magazine/m762/ap - name = "box magazine (Armor Penetrating 7.62mm)" +/obj/item/ammo_box/magazine/mm556x45/ap + name = "box magazine (Armor Penetrating 5.56x45mm)" origin_tech = "combat=4" - ammo_type = /obj/item/ammo_casing/a762/ap + ammo_type = /obj/item/ammo_casing/mm556x45/ap -/obj/item/ammo_box/magazine/m762/incen - name = "box magazine (Incendiary 7.62mm)" +/obj/item/ammo_box/magazine/mm556x45/incen + name = "box magazine (Incendiary 5.56x45mm)" origin_tech = "combat=4" - ammo_type = /obj/item/ammo_casing/a762/incen + ammo_type = /obj/item/ammo_casing/mm556x45/incen -/obj/item/ammo_box/magazine/m762/update_icon() +/obj/item/ammo_box/magazine/mm556x45/update_icon() ..() icon_state = "a762-[round(ammo_count(),10)]" @@ -135,28 +143,27 @@ //casings// -/obj/item/ammo_casing/a762 - desc = "A 7.62mm bullet casing." +/obj/item/ammo_casing/mm556x45 + desc = "A 556x45mm bullet casing." icon_state = "762-casing" - caliber = "a762" + caliber = "mm55645" projectile_type = /obj/item/projectile/bullet/saw -/obj/item/ammo_casing/a762/bleeding - desc = "A 7.62mm bullet casing with specialized inner-casing, that when it makes contact with a target, release tiny shrapnel to induce internal bleeding." +/obj/item/ammo_casing/mm556x45/bleeding + desc = "A 556x45mm bullet casing with specialized inner-casing, that when it makes contact with a target, release tiny shrapnel to induce internal bleeding." icon_state = "762-casing" - caliber = "a762" projectile_type = /obj/item/projectile/bullet/saw/bleeding -/obj/item/ammo_casing/a762/hollow - desc = "A 7.62mm bullet casing designed to cause more damage to unarmored targets." +/obj/item/ammo_casing/mm556x45/hollow + desc = "A 556x45mm bullet casing designed to cause more damage to unarmored targets." projectile_type = /obj/item/projectile/bullet/saw/hollow -/obj/item/ammo_casing/a762/ap - desc = "A 7.62mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." +/obj/item/ammo_casing/mm556x45/ap + desc = "A 556x45mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." projectile_type = /obj/item/projectile/bullet/saw/ap -/obj/item/ammo_casing/a762/incen - desc = "A 7.62mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. " +/obj/item/ammo_casing/mm556x45/incen + desc = "A 556x45mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. " projectile_type = /obj/item/projectile/bullet/saw/incen diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index adc787c0679..083746274de 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -298,7 +298,7 @@ item_state = "bulldog" w_class = 3 origin_tech = "combat=5;materials=4;syndicate=6" - mag_type = /obj/item/ammo_box/magazine/m12g + mag_type = /obj/item/ammo_box/magazine/m12g/stun fire_sound = 'sound/weapons/Gunshot.ogg' can_suppress = 0 burst_size = 1 diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 043ba75060f..11b0f9b456d 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -11,7 +11,6 @@ /obj/item/projectile/beam/practice name = "practice laser" damage = 0 - hitsound = null nodamage = 1 /obj/item/projectile/beam/scatter @@ -92,3 +91,22 @@ /obj/item/projectile/beam/lasertag/bluetag icon_state = "bluelaser" suit_types = list(/obj/item/clothing/suit/redtag) + +/obj/item/projectile/beam/instakill + name = "instagib laser" + icon_state = "purple_laser" + damage = 200 + damage_type = BURN + +/obj/item/projectile/beam/instakill/blue + icon_state = "blue_laser" + +/obj/item/projectile/beam/instakill/red + icon_state = "red_laser" + +/obj/item/projectile/beam/instakill/on_hit(atom/target) + . = ..() + if(iscarbon(target)) + var/mob/living/carbon/M = target + M.visible_message("[M] explodes into a shower of gibs!") + M.gib() \ No newline at end of file diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 060fd1e7377..84c553c72ba 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -72,7 +72,7 @@ . = ..() if(iscarbon(target)) var/mob/living/carbon/M = target - M.adjust_fire_stacks(1) + M.adjust_fire_stacks(4) M.IgniteMob() @@ -101,6 +101,11 @@ stun = 8 hitsound = 'sound/effects/meteorimpact.ogg' +/obj/item/projectile/bullet/meteorshot/weak + damage = 10 + weaken = 4 + stun = 4 + /obj/item/projectile/bullet/meteorshot/on_hit(atom/target, blocked = 0) . = ..() if(istype(target, /atom/movable)) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 270e810c19c..07c91896be4 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -80,7 +80,7 @@ ui = new(user, src, ui_key, "chem_dispenser", name, 550, 550, master_ui, state) ui.open() -/obj/machinery/chem_dispenser/get_ui_data() +/obj/machinery/chem_dispenser/ui_data() var/data = list() data["amount"] = amount data["energy"] = energy diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index e925fde9de5..092953d1243 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -73,7 +73,7 @@ ui = new(user, src, ui_key, "chem_heater", name, 275, 400, master_ui, state) ui.open() -/obj/machinery/chem_heater/get_ui_data() +/obj/machinery/chem_heater/ui_data() var/data = list() data["targetTemp"] = target_temperature data["isActive"] = on diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm index 95f5beff14c..e8d918142f7 100644 --- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm @@ -2,6 +2,7 @@ /datum/reagent/blob name = "Unknown" description = "shouldn't exist and you should adminhelp immediately." + color = "#FFFFFF" var/shortdesc = null //just damage and on_mob effects, doesn't include special, blob-tile only effects var/blobbernaut_message = "slams" //blobbernaut attack verb var/message = "The blob strikes you" //message sent to any mob hit by the blob @@ -16,7 +17,7 @@ /datum/reagent/blob/proc/death_reaction(obj/effect/blob/B, cause) //when a blob dies, do this return -/datum/reagent/blob/proc/expand_reaction(obj/effect/blob/B, turf/T) //when the blob expands, do this +/datum/reagent/blob/proc/expand_reaction(obj/effect/blob/B, obj/effect/blob/newB, turf/T) //when the blob expands, do this return //does brute and a little stamina damage @@ -24,7 +25,7 @@ name = "Ripping Tendrils" id = "ripping_tendrils" description = "will do medium brute and stamina damage." - color = "#890000" + color = "#991010" blobbernaut_message = "rips" message_living = ", and you feel your skin ripping and tearing off" @@ -60,12 +61,12 @@ B.overmind.blob_mobs.Add(BS) return ..() -/datum/reagent/blob/sporing_pods/expand_reaction(obj/effect/blob/B, turf/T) +/datum/reagent/blob/sporing_pods/expand_reaction(obj/effect/blob/B, obj/effect/blob/newB, turf/T) if(prob(10)) var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(T) BS.overmind = B.overmind BS.update_icons() - B.overmind.blob_mobs.Add(BS) + newB.overmind.blob_mobs.Add(BS) //does brute damage but can replicate when damaged and has a chance of expanding again /datum/reagent/blob/replicating_foam @@ -82,15 +83,15 @@ /datum/reagent/blob/replicating_foam/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause) if(damage > 0 && original_health - damage > 0) - var/obj/effect/blob/newB = B.expand() + var/obj/effect/blob/newB = B.expand(null, 0) if(newB) newB.health = original_health - damage newB.check_health(cause) newB.update_icon() return ..() -/datum/reagent/blob/replicating_foam/expand_reaction(obj/effect/blob/B, turf/T) - B.expand() //do it again! +/datum/reagent/blob/replicating_foam/expand_reaction(obj/effect/blob/B, obj/effect/blob/newB, turf/T) + newB.expand() //do it again! //does low burn and a lot of stamina damage, reacts to stamina damage /datum/reagent/blob/energized_fibers @@ -98,7 +99,7 @@ id = "energized_fibers" description = "will do low burn and high stamina damage, and react to stamina damage." shortdesc = "will do low burn and high stamina damage." - color = "#FFDC73" + color = "#EFD65A" blobbernaut_message = "shocks" message_living = ", and you feel a strong tingling sensation" @@ -229,6 +230,29 @@ if(M) M.adjustStaminaLoss(0.4*reac_volume) +//does burn damage and EMPs, slightly fragile +/datum/reagent/blob/electromagnetic_web + name = "Electromagnetic Web" + id = "electromagnetic_web" + description = "will do low burn damage and EMP targets, but is somewhat fragile." + color = "#83ECEC" + blobbernaut_message = "lashes" + message = "The blob lashes you" + message_living = ", and you hear a faint buzzing" + +/datum/reagent/blob/electromagnetic_web/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + reac_volume = ..() + M.emp_act(2) + if(M) + M.apply_damage(0.6*reac_volume, BURN) + +/datum/reagent/blob/electromagnetic_web/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause) + return damage * 1.2 //a laser will do 24 damage, which will kill any recently-made normal blob + +/datum/reagent/blob/electromagnetic_web/death_reaction(obj/effect/blob/B, cause) + if(!isnull(cause)) + empulse(B.loc, 2, 3) //less than screen range, so you can stand out of range to avoid it + //does brute damage, bonus damage for each nearby blob, and spreads damage out /datum/reagent/blob/synchronous_mesh name = "Synchronous Mesh" @@ -261,9 +285,9 @@ for(var/obj/effect/blob/C in orange(1, B)) if(C.overmind && C.overmind.blob_reagent_datum == B.overmind.blob_reagent_datum && !istype(C, /obj/effect/blob/core)) //only hurt blobs that have the same overmind chemical and aren't cores C.take_damage(damage/damagesplit, CLONE, B, 0) - return damage/damagesplit + return damage / damagesplit else - return damage*1.25 + return damage * 1.25 //does low brute damage, oxygen damage, and stamina damage and wets tiles when damaged /datum/reagent/blob/pressurized_slime diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index fd3755148d1..9eeaebdd865 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -241,24 +241,24 @@ build_path = /obj/item/weapon/circuitboard/rdconsole category = list("Computer Boards") -/datum/design/ordercomp - name = "Computer Design (Supply ordering console)" - desc = "Allows for the construction of circuit boards used to build a Supply ordering console." - id = "ordercomp" - req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/ordercomp - category = list("Computer Boards") - -/datum/design/supplycomp - name = "Computer Design (Supply shuttle console)" - desc = "Allows for the construction of circuit boards used to build a Supply shuttle console." - id = "supplycomp" +/datum/design/cargo + name = "Computer Design (Supply Console)" + desc = "Allows for the construction of circuit boards used to build a Supply Console." + id = "cargo" req_tech = list("programming" = 3) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/supplycomp + build_path = /obj/item/weapon/circuitboard/cargo + category = list("Computer Boards") + +/datum/design/cargorequest + name = "Computer Design (Supply Request Console)" + desc = "Allows for the construction of circuit boards used to build a Supply Request Console." + id = "cargorequest" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/cargo/request category = list("Computer Boards") /datum/design/mining diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 742091057c5..719dbb5d8eb 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -39,12 +39,12 @@ var/list/temp_list if(!id_with_upload.len) temp_list = list() - temp_list = text2list(id_with_upload_string, ";") + temp_list = splittext(id_with_upload_string, ";") for(var/N in temp_list) id_with_upload += text2num(N) if(!id_with_download.len) temp_list = list() - temp_list = text2list(id_with_download_string, ";") + temp_list = splittext(id_with_download_string, ";") for(var/N in temp_list) id_with_download += text2num(N) diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index b81553e3de8..d4018d364ee 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -36,7 +36,7 @@ var/datum/events/keycard_events = new() ui = new(user, src, ui_key, "keycard_auth", name, 375, 125, master_ui, state) ui.open() -/obj/machinery/keycard_auth/get_ui_data() +/obj/machinery/keycard_auth/ui_data() var/list/data = list() data["waiting"] = waiting data["auth_required"] = event_source ? event_source.event : 0 diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm new file mode 100644 index 00000000000..2b5968cc068 --- /dev/null +++ b/code/modules/shuttle/computer.dm @@ -0,0 +1,78 @@ +/obj/machinery/computer/shuttle + name = "Shuttle Console" + icon_screen = "shuttle" + icon_keyboard = "tech_key" + req_access = list( ) + circuit = /obj/item/weapon/circuitboard/shuttle + var/shuttleId + var/possible_destinations = "" + var/admin_controlled + var/no_destination_swap = 0 + +/obj/machinery/computer/shuttle/New(location, obj/item/weapon/circuitboard/shuttle/C) + ..() + if(istype(C)) + possible_destinations = C.possible_destinations + shuttleId = C.shuttleId + +/obj/machinery/computer/shuttle/attack_hand(mob/user) + if(..(user)) + return + src.add_fingerprint(usr) + + var/list/options = params2list(possible_destinations) + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + var/dat = "Status: [M ? M.getStatusText() : "*Missing*"] " + if(M) + var/destination_found + for(var/obj/docking_port/stationary/S in SSshuttle.stationary) + if(!options.Find(S.id)) + continue + if(M.canDock(S)) + continue + destination_found = 1 + dat += "Send to [S.name] " + if(!destination_found) + dat += "Shuttle Locked " + if(admin_controlled) + dat += "Authorized personnel only " + dat += "Request Authorization " + dat += "Close" + + var/datum/browser/popup = new(user, "computer", M ? M.name : "shuttle", 300, 200) + popup.set_content(" " - if(M) - var/destination_found - for(var/obj/docking_port/stationary/S in SSshuttle.stationary) - if(!options.Find(S.id)) - continue - if(M.canDock(S)) - continue - destination_found = 1 - dat += "Send to [S.name] " - if(!destination_found) - dat += "Shuttle Locked " - if(admin_controlled) - dat += "Authorized personnel only " - dat += "Request Authorization " - dat += "Close" - - var/datum/browser/popup = new(user, "computer", M ? M.name : "shuttle", 300, 200) - popup.set_content("
+ 06 February 2016+LordPidey updated:+
Lzimann updated:+
neersighted updated:+
05 February 2016+Joan updated:+
Kor updated:+
MMMiracles updated:+
PKPenguin321 updated:+
bgobandit updated:+
octareenroon91 updated:+
01 February 2016Erwgd updated:
+ - #{{id}}
+ {{object}}
+ {{cost}} Points
+
+
+ #{{id}}
+ {{object}}
+ {{cost}} Points
+ By {{orderedby}}
+ Comment: {{comment}}
+ {{#if !data.requestonly}}
+
+
+ {{/if}}
+ Area
+ Charge
+ Load
+ Status
+ Equipment
+ Lighting
+ Environment
+ {{Math.round(adata.areas[@index].charge)}} %
+ {{Math.round(adata.areas[@index].load)}} W
+ {{chargingMode(charging)}}
+ {{channelPower(eqp)}} [{{channelMode(eqp)}}]
+ {{channelPower(lgt)}} [{{channelMode(lgt)}}]
+ {{channelPower(env)}} [{{channelMode(env)}}]
+ + {{else}} + Pure + {{/each}} + + {{/each}} + |