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 - - Based on code by Zac Stringham - Copyright 2009 (LGPL) - Written 6-Oct-2013 - carnie (elly1989@rocketmail.com), accreditation appreciated but not required. - Please do not remove this comment. - - Full source code is available at https://code.google.com/p/byond-regex/ - Please report any relevant issues on the tracker at the above address. - ~Carn -*/ - -#ifdef USE_BYGEX - -#ifndef LIBREGEX_LIBRARY - #define LIBREGEX_LIBRARY "bin/bygex" -#endif - -/proc/regEx_compare(str, exp) - return new /datum/regex(str, exp, call(LIBREGEX_LIBRARY, "regEx_compare")(str, exp)) - -/proc/regex_compare(str, exp) - return new /datum/regex(str, exp, call(LIBREGEX_LIBRARY, "regex_compare")(str, exp)) - -/proc/regEx_find(str, exp) - return new /datum/regex(str, exp, call(LIBREGEX_LIBRARY, "regEx_find")(str, exp)) - -/proc/regex_find(str, exp) - return new /datum/regex(str, exp, call(LIBREGEX_LIBRARY, "regex_find")(str, exp)) - -/proc/regEx_replaceall(str, exp, fmt) - return call(LIBREGEX_LIBRARY, "regEx_replaceall")(str, exp, fmt) - -/proc/regex_replaceall(str, exp, fmt) - return call(LIBREGEX_LIBRARY, "regex_replaceall")(str, exp, fmt) - -/proc/replacetextEx(str, exp, fmt) - return call(LIBREGEX_LIBRARY, "regEx_replaceallliteral")(str, exp, fmt) - -/proc/replacetext(str, exp, fmt) - return call(LIBREGEX_LIBRARY, "regex_replaceallliteral")(str, exp, fmt) - -/proc/regEx_replace(str, exp, fmt) - return call(LIBREGEX_LIBRARY, "regEx_replace")(str, exp, fmt) - -/proc/regex_replace(str, exp, fmt) - return call(LIBREGEX_LIBRARY, "regex_replace")(str, exp, fmt) - -/proc/regEx_findall(str, exp) - return new /datum/regex(str, exp, call(LIBREGEX_LIBRARY, "regEx_findall")(str, exp)) - -/proc/regex_findall(str, exp) - return new /datum/regex(str, exp, call(LIBREGEX_LIBRARY, "regex_findall")(str, exp)) - - -//upon calling a regex match or search, a /datum/regex object is created with str(haystack) and exp(needle) variables set -//it also contains a list(matches) of /datum/match objects, each of which holds the position and length of the match -//matched strings are not returned from the dll, in order to save on memory allocation for large numbers of strings -//instead, you can use regex.str(matchnum) to fetch this string as needed. -//likewise you can also use regex.pos(matchnum) and regex.len(matchnum) as shorthands -/datum/regex - var/str - var/exp - var/error - var/anchors = 0 - var/list/matches = list() - -/datum/regex/New(str, exp, results) - src.str = str - src.exp = exp - - if(findtext(results, "$Err$", 1, 6)) //error message - src.error = results - else - var/list/L = params2list(results) - var/list/M - var{i;j} - for(i in L) - M = L[i] - for(j=2, j<=M.len, j+=2) - matches += new /datum/match(text2num(M[j-1]),text2num(M[j])) - anchors = (j-2)/2 - return matches - -/datum/regex/proc/str(i) - if(!i) - return str - var/datum/match/M = matches[i] - if(i < 1 || i > matches.len) - throw EXCEPTION("str(): out of bounds") - return copytext(str, M.pos, M.pos+M.len) - -/datum/regex/proc/pos(i) - if(!i) - return 1 - if(i < 1 || i > matches.len) - throw EXCEPTION("pos(): out of bounds") - var/datum/match/M = matches[i] - return M.pos - -/datum/regex/proc/len(i) - if(!i) - return length(str) - if(i < 1 || i > matches.len) - throw EXCEPTION("len(): out of bounds") - var/datum/match/M = matches[i] - return M.len - -/datum/regex/proc/end(i) - if(!i) - return length(str) - if(i < 1 || i > matches.len) - throw EXCEPTION("end() out of bounds") - var/datum/match/M = matches[i] - return M.pos + M.len - -/datum/regex/proc/report() //debug tool - . = ":: RESULTS ::\n:: str :: [html_encode(str)]\n:: exp :: [html_encode(exp)]\n:: anchors :: [anchors]" - if(error) - . += "\n[error]" - return - for(var/i=1, i<=matches.len, ++i) - . += "\nMatch[i]\n\t[html_encode(str(i))]\n\tpos=[pos(i)] len=[len(i)]" - -/datum/match - var/pos - var/len - -/datum/match/New(pos, len) - src.pos = pos - src.len = len - -#endif \ No newline at end of file diff --git a/code/__HELPERS/bygex/demo.dm b/code/__HELPERS/bygex/demo.dm deleted file mode 100644 index fe481f93020..00000000000 --- a/code/__HELPERS/bygex/demo.dm +++ /dev/null @@ -1,53 +0,0 @@ -/mob - var/expression = "\\S+" - var/format = "*" - - var/datum/regex/results - -/mob/verb/set_expression() - var/t = input(usr,"Input Expression","title",expression) as text|null - if(t != null) - expression = t - usr << "Expression set to:\t[html_encode(t)]" - -/mob/verb/set_format() - var/t = input(usr,"Input Formatter","title",format) as text|null - if(t != null) - format = t - usr << "Format set to:\t[html_encode(t)]" - -/mob/verb/compare_casesensitive(t as text) - results = regEx_compare(t, expression) - world << results.report() - -/mob/verb/compare(t as text) - results = regex_compare(t, expression) - world << results.report() - -/mob/verb/find_casesensitive(t as text) - results = regEx_find(t, expression) - world << results.report() - -/mob/verb/find(t as text) - results = regex_find(t, expression) - world << results.report() - -/mob/verb/replaceall_casesensitive(t as text) - usr << regEx_replaceall(t, expression, format) - -/mob/verb/replaceall(t as text) - usr << regex_replaceall(t, expression, format) - -/mob/verb/replace_casesensitive(t as text) - usr << html_encode(regEx_replace(t, expression, format)) - -/mob/verb/replace(t as text) - usr << regex_replace(t, expression, format) - -/mob/verb/findall(t as text) - results = regex_findall(t, expression) - world << results.report() - -/mob/verb/findall_casesensitive(t as text) - results = regEx_findall(t, expression) - world << results.report() \ No newline at end of file diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 4f0e9158101..e127a5f3060 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -1,3 +1,10 @@ +//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a +#define RANGE_TURFS(RADIUS, CENTER) \ + block( \ + locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ + locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ + ) + //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 /proc/get_area(O) @@ -24,6 +31,20 @@ return A return 0 +/proc/get_areas_in_range(dist=0, atom/center=usr) + if(!dist) + var/turf/T = get_turf(center) + return T ? list(T.loc) : list() + if(!center) + return list() + + var/list/turfs = RANGE_TURFS(dist, center) + var/list/areas = list() + for(var/V in turfs) + var/turf/T = V + areas |= T.loc + return areas + // Like view but bypasses luminosity check /proc/get_hear(range, atom/source) @@ -423,10 +444,3 @@ new_character.key = G_found.key return new_character - -//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a -#define RANGE_TURFS(RADIUS, CENTER) \ - block( \ - locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ - locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ - ) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index bdf517b9be9..ddaf73e00ea 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -206,18 +206,6 @@ if(start) return findtextEx(text, suffix, start, null) -/* - * Text modification - */ -// See bygex.dm -#ifndef USE_BYGEX -/proc/replacetext(text, find, replacement) - return list2text(text2list(text, find), replacement) - -/proc/replacetextEx(text, find, replacement) - return list2text(text2listEx(text, find), replacement) -#endif - //Adds 'u' number of zeros ahead of the text 't' /proc/add_zero(t, u) while (length(t) < u) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index fad0c646c3d..8e90ded8dd5 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -2,7 +2,6 @@ * Holds procs designed to change one type of value, into another. * Contains: * hex2num & num2hex - * text2list & list2text * file2list * angle2dir * angle2text @@ -72,138 +71,9 @@ i++ return . - -// Concatenates a list of strings into a single string. A seperator may optionally be provided. -/proc/list2text(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 - - -//slower then list2text, but correctly processes associative lists. -/proc/tg_list2text(list/list, glue=",") - if(!istype(list) || !list.len) - return - var/output - for(var/i=1 to list.len) - output += (i!=1? glue : null)+(!isnull(list["[list[i]]"])?"[list["[list[i]]"]]":"[list[i]]") - return output - - -//Converts a string into a list by splitting the string at each delimiter found. (discarding the seperator) -/proc/text2list(text, delimiter="\n") - var/delim_len = length(delimiter) - . = 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, delimiter, last_found, 0) - . += copytext(text, last_found, found) - last_found = found + delim_len - while(found) - -//Case Sensitive! -/proc/text2listEx(text, delimiter="\n") - var/delim_len = length(delimiter) - if(delim_len < 1) - return list(text) - . = list() - var/last_found = 1 - var/found - do - found = findtextEx(text, delimiter, last_found, 0) - . += copytext(text, last_found, found) - last_found = found + delim_len - while(found) - //Splits the text of a file at seperator and returns them in a list. /proc/file2list(filename, seperator="\n") - return text2list(return_file_text(filename),seperator) + return splittext(return_file_text(filename),seperator) //Turns a direction into text @@ -679,18 +549,18 @@ for(var/t in test_times) //Find var names // "A dog said hi [name]!" - // text2list() --> list("A dog said hi ","name]!" - // list2text() --> "A dog said hi name]!" - // text2list() --> list("A","dog","said","hi","name]!") + // splittext() --> list("A dog said hi ","name]!" + // jointext() --> "A dog said hi name]!" + // splittext() --> list("A","dog","said","hi","name]!") t_string = replacetext(t_string,"\[","\[ ")//Necessary to resolve "word[var_name]" scenarios - var/list/list_value = text2list(t_string,"\[") - var/intermediate_stage = list2text(list_value) + var/list/list_value = splittext(t_string,"\[") + var/intermediate_stage = jointext(list_value, null) - list_value = text2list(intermediate_stage," ") + list_value = splittext(intermediate_stage," ") for(var/value in list_value) if(findtext(value,"]")) - value = text2list(value,"]") //"name]!" --> list("name","!") + value = splittext(value,"]") //"name]!" --> list("name","!") for(var/A in value) if(var_source.vars.Find(A)) . += A diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 20d35846a87..5dfc704757e 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -951,11 +951,11 @@ var/list/WALLITEMS_INVERSE = list( /proc/screen_loc2turf(scr_loc, turf/origin) - var/tX = text2list(scr_loc, ",") - var/tY = text2list(tX[2], ":") + var/tX = splittext(scr_loc, ",") + var/tY = splittext(tX[2], ":") var/tZ = origin.z tY = tY[1] - tX = text2list(tX[1], ":") + tX = splittext(tX[1], ":") tX = tX[1] tX = max(1, min(world.maxx, origin.x + (text2num(tX) - (world.view + 1)))) tY = max(1, min(world.maxy, origin.y + (text2num(tY) - (world.view + 1)))) @@ -1175,7 +1175,6 @@ B --><-- A return L - /atom/proc/contains(var/atom/A) if(!A) return 0 diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 320fc6d441f..c73f3774769 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -54,8 +54,6 @@ #error Your version of BYOND is too out-of-date to compile this project. Go to byond.com/download and update. #endif -#define USE_BYGEX - #ifndef SERVERTOOLS #define SERVERTOOLS 0 diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 258cb4f0847..476a1d36ba9 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -8,6 +8,7 @@ var/global/list/navbeacons = list() //list of all bot nagivation beacons, us var/global/list/deliverybeacons = list() //list of all MULEbot delivery beacons. var/global/list/deliverybeacontags = list() //list of all tags associated with delivery beacons. var/global/list/nuke_list = list() +var/global/list/nuke_tiles = list() //list of all turfs that turn to animated red grids when a nuke is triggered var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff diff --git a/code/_onclick/_defines.dm b/code/_onclick/_defines.dm new file mode 100644 index 00000000000..3c76c35e807 --- /dev/null +++ b/code/_onclick/_defines.dm @@ -0,0 +1 @@ +#define CLICKCATCHER_PLANE -99 \ No newline at end of file diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 446a31d00b0..e8297662c85 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -331,7 +331,7 @@ /obj/screen/click_catcher icon = 'icons/mob/screen_full.dmi' icon_state = "passage0" - layer = 0 + plane = CLICKCATCHER_PLANE mouse_opacity = 2 screen_loc = "CENTER-7,CENTER-7" diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 676b4b8bfae..7b11372bac4 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -126,14 +126,10 @@ alien_plasma_display = new /obj/screen/alien/plasma_display() infodisplay += alien_plasma_display - mymob.flash = new /obj/screen/flash() - screenoverlays += mymob.flash - zone_select = new /obj/screen/zone_sel/alien() zone_select.update_icon(mymob) static_inventory += zone_select - /datum/hud/alien/persistant_inventory_update() if(!mymob) return diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 77bcbb3b67b..0f50940e103 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -20,14 +20,10 @@ pull_icon.screen_loc = ui_pull_resist hotkeybuttons += pull_icon - mymob.flash = new /obj/screen/flash() - screenoverlays += mymob.flash - zone_select = new /obj/screen/zone_sel/alien() zone_select.update_icon(mymob) static_inventory += zone_select - /mob/living/carbon/alien/larva/create_mob_hud() if(client && !hud_used) hud_used = new /datum/hud/larva(src) diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm new file mode 100644 index 00000000000..c6f2fba4d80 --- /dev/null +++ b/code/_onclick/hud/fullscreen.dm @@ -0,0 +1,108 @@ +#define FULLSCREEN_LAYER 18 +#define DAMAGE_LAYER FULLSCREEN_LAYER + 0.1 +#define BLIND_LAYER DAMAGE_LAYER + 0.1 +#define CRIT_LAYER BLIND_LAYER + 0.1 + +/mob + var/list/screens = list() + +/mob/proc/overlay_fullscreen(category, type, severity) + var/obj/screen/fullscreen/screen + if(screens[category]) + screen = screens[category] + if(screen.type != type) + clear_fullscreen(category, FALSE) + return .() + else if(!severity || severity == screen.severity) + return null + else + screen = PoolOrNew(type) + + screen.icon_state = "[initial(screen.icon_state)][severity]" + screen.severity = severity + + screens[category] = screen + if(client) + client.screen += screen + return screen + +/mob/proc/clear_fullscreen(category, animate = 10) + set waitfor = 0 + var/obj/screen/fullscreen/screen = screens[category] + if(!screen) + return + + if(animate) + animate(screen, alpha = 0, time = animate) + sleep(animate) + + screens -= category + if(client) + client.screen -= screen + qdel(screen) + +/mob/proc/clear_fullscreens() + for(var/category in screens) + clear_fullscreen(category) + +/datum/hud/proc/reload_fullscreen() + var/list/screens = mymob.screens + for(var/category in screens) + mymob.client.screen |= screens[category] + +/obj/screen/fullscreen + icon = 'icons/mob/screen_full.dmi' + icon_state = "default" + screen_loc = "CENTER-7,CENTER-7" + layer = FULLSCREEN_LAYER + mouse_opacity = 0 + var/severity = 0 + +/obj/screen/fullscreen/Destroy() + ..() + severity = 0 + return QDEL_HINT_PUTINPOOL + +/obj/screen/fullscreen/brute + icon_state = "brutedamageoverlay" + layer = DAMAGE_LAYER + +/obj/screen/fullscreen/oxy + icon_state = "oxydamageoverlay" + layer = DAMAGE_LAYER + +/obj/screen/fullscreen/crit + icon_state = "passage" + layer = CRIT_LAYER + +/obj/screen/fullscreen/blind + icon_state = "blackimageoverlay" + layer = BLIND_LAYER + +/obj/screen/fullscreen/impaired + icon_state = "impairedoverlay" + +/obj/screen/fullscreen/blurry + icon = 'icons/mob/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "blurry" + +/obj/screen/fullscreen/flash + icon = 'icons/mob/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "flash" + +/obj/screen/fullscreen/flash/noise + icon = 'icons/mob/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "noise" + +/obj/screen/fullscreen/high + icon = 'icons/mob/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "druggy" + +#undef FULLSCREEN_LAYER +#undef BLIND_LAYER +#undef DAMAGE_LAYER +#undef CRIT_LAYER diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 9d271537e60..2940cac8f99 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -1,93 +1,3 @@ -/* - The global hud: - Uses the same visual objects for all players. -*/ - -var/datum/global_hud/global_hud = new() - -/datum/global_hud - var/obj/screen/druggy - var/obj/screen/blurry - var/obj/screen/blind - var/list/vimpaired - var/list/darkMask - -/datum/global_hud/New() - //420erryday psychedellic colours screen overlay for when you are high - druggy = new /obj/screen() - druggy.screen_loc = "WEST,SOUTH to EAST,NORTH" - druggy.icon_state = "druggy" - druggy.blend_mode = BLEND_MULTIPLY - druggy.layer = 17 - druggy.mouse_opacity = 0 - - //that white blurry effect you get when you eyes are damaged - blurry = new /obj/screen() - blurry.screen_loc = "WEST,SOUTH to EAST,NORTH" - blurry.icon_state = "blurry" - blurry.layer = 17 - blurry.mouse_opacity = 0 - - blind = new /obj/screen() - blind.icon = 'icons/mob/screen_full.dmi' - blind.icon_state = "blackimageoverlay" - blind.screen_loc = "CENTER-7,CENTER-7" - blind.mouse_opacity = 0 - blind.layer = 18 - - var/obj/screen/O - var/i - //that nasty looking dither you get when you're short-sighted - vimpaired = newlist(/obj/screen,/obj/screen,/obj/screen,/obj/screen) - O = vimpaired[1] - O.screen_loc = "WEST,SOUTH to CENTER-3,NORTH" //West dither - O = vimpaired[2] - O.screen_loc = "WEST,SOUTH to EAST,CENTER-3" //South dither - O = vimpaired[3] - O.screen_loc = "CENTER+3,SOUTH to EAST,NORTH" //East dither - O = vimpaired[4] - O.screen_loc = "WEST,CENTER+3 to EAST,NORTH" //North dither - - //welding mask overlay black/dither - darkMask = newlist(/obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen) - O = darkMask[1] - O.screen_loc = "CENTER-5,CENTER-5 to CENTER-3,CENTER+5" //West dither - O = darkMask[2] - O.screen_loc = "CENTER-5,CENTER-5 to CENTER+5,CENTER-3" //South dither - O = darkMask[3] - O.screen_loc = "CENTER+3,CENTER-5 to CENTER+5,CENTER+5" //East dither - O = darkMask[4] - O.screen_loc = "CENTER-5,CENTER+3 to CENTER+5,CENTER+5" //North dither - O = darkMask[5] - O.screen_loc = "WEST,SOUTH to CENTER-5,NORTH" //West black - O = darkMask[6] - O.screen_loc = "WEST,SOUTH to EAST,CENTER-5" //South black - O = darkMask[7] - O.screen_loc = "CENTER+5,SOUTH to EAST,NORTH" //East black - O = darkMask[8] - O.screen_loc = "WEST,CENTER+5 to EAST,NORTH" //North black - - - for(i = 1, i <= 4, i++) - O = vimpaired[i] - O.icon_state = "dither50" - O.blend_mode = BLEND_MULTIPLY - O.layer = 17 - O.mouse_opacity = 0 - - O = darkMask[i] - O.icon_state = "dither50" - O.blend_mode = BLEND_MULTIPLY - O.layer = 17 - O.mouse_opacity = 0 - - for(i = 5, i <= 8, i++) - O = darkMask[i] - O.icon_state = "black" - O.blend_mode = BLEND_MULTIPLY - O.layer = 17 - O.mouse_opacity = 0 - /* The hud datum Used to show and hide huds for all the different mob types, @@ -259,14 +169,12 @@ var/datum/global_hud/global_hud = new() if(infodisplay.len) mymob.client.screen -= infodisplay - if(screenoverlays.len) - mymob.client.screen += screenoverlays - mymob.client.screen += mymob.client.void hud_version = display_hud_version persistant_inventory_update() mymob.update_action_buttons() reorganize_alerts() + /datum/hud/human/show_hud(version = 0) ..() hidden_inventory_update() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 22359ff69b7..8991dd28480 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -282,11 +282,6 @@ lingstingdisplay = new /obj/screen/ling/sting() infodisplay += lingstingdisplay - mymob.damageoverlay = new /obj/screen/damageoverlay() - screenoverlays += mymob.damageoverlay - - mymob.flash = new /obj/screen/flash() - screenoverlays += mymob.flash zone_select = new /obj/screen/zone_sel() zone_select.icon = ui_style diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index bc67e0b6a29..021310f06e1 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -115,11 +115,6 @@ lingstingdisplay = new /obj/screen/ling/sting() infodisplay += lingstingdisplay - mymob.damageoverlay = new /obj/screen/damageoverlay() - screenoverlays += mymob.damageoverlay - - mymob.flash = new /obj/screen/flash() - screenoverlays += mymob.flash zone_select = new /obj/screen/zone_sel() zone_select.icon = ui_style diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index a0dc4827ba9..e8d4e4b3d73 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -27,13 +27,13 @@ return //Split screen-loc up into X+Pixel_X and Y+Pixel_Y - var/list/screen_loc_params = text2list(PM["screen-loc"], ",") + var/list/screen_loc_params = splittext(PM["screen-loc"], ",") //Split X+Pixel_X up into list(X, Pixel_X) - var/list/screen_loc_X = text2list(screen_loc_params[1],":") + var/list/screen_loc_X = splittext(screen_loc_params[1],":") //Split Y+Pixel_Y up into list(Y, Pixel_Y) - var/list/screen_loc_Y = text2list(screen_loc_params[2],":") + var/list/screen_loc_Y = splittext(screen_loc_params[2],":") if(snap2grid) //Discard Pixel Values screen_loc = "[screen_loc_X[1]],[screen_loc_Y[1]]" diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index d39ca085410..6497dc38cf4 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -138,8 +138,6 @@ pull_icon.screen_loc = ui_borg_pull hotkeybuttons += pull_icon - mymob.flash = new /obj/screen/flash() - screenoverlays += mymob.flash zone_select = new /obj/screen/zone_sel/robot() zone_select.update_icon(mymob) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index b9fde4bcb33..2faf8bf8224 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -9,7 +9,7 @@ /atom/movable/attackby(obj/item/W, mob/living/user, params) user.do_attack_animation(src) - if(W && !(W.flags&NOBLUDGEON)) + if(W && !(W.flags & NOBLUDGEON)) visible_message("[user] has hit [src] with [W]!") /mob/living/attackby(obj/item/I, mob/user, params) @@ -25,7 +25,6 @@ I.attack(src, user) /mob/living/proc/attacked_by(obj/item/I, mob/living/user, def_zone) - apply_damage(I.force, I.damtype, def_zone) if(I.damtype == "brute") if(prob(33) && I.force) var/turf/location = src.loc @@ -46,16 +45,14 @@ if(message_verb) visible_message("[attack_message]", "[attack_message]") + apply_damage(I.force, I.damtype, def_zone, threshold_check = 1, threshold_message = 1) /mob/living/simple_animal/attacked_by(var/obj/item/I, var/mob/living/user) if(!I.force) user.visible_message("[user] gently taps [src] with [I].",\ "This weapon is ineffective, it does no damage!") - else if(I.force >= force_threshold && I.damtype != STAMINA) - ..() else - visible_message("[I] bounces harmlessly off of [src].",\ - "[I] bounces harmlessly off of [src]!") + ..() diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 6e9becdeb87..0cef0b59919 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -24,7 +24,6 @@ var/datum/subsystem/air/SSair var/list/networks = list() var/list/obj/machinery/atmos_machinery = list() - //Special functions lists var/list/turf/simulated/active_super_conductivity = list() var/list/turf/simulated/high_pressure_delta = list() diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index ee4a25365ff..ea324a9f3c4 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -426,10 +426,10 @@ var/datum/subsystem/job/SSjob /datum/subsystem/job/proc/LoadJobs() var/jobstext = return_file_text("config/jobs.txt") for(var/datum/job/J in occupations) - var/regex = "[J.title]=(-1|\\d+),(-1|\\d+)" - var/datum/regex/results = regex_find(jobstext, regex) - J.total_positions = text2num(results.str(2)) - J.spawn_positions = text2num(results.str(3)) + var/regex/jobs = new("[J.title]=(-1|\\d+),(-1|\\d+)") + jobs.Find(jobstext) + J.total_positions = text2num(jobs.group[2]) + J.spawn_positions = text2num(jobs.group[3]) /datum/subsystem/job/proc/HandleFeedbackGathering() for(var/datum/job/job in occupations) diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm index d720fc02ece..9736345ad41 100644 --- a/code/controllers/subsystem/shuttles.dm +++ b/code/controllers/subsystem/shuttles.dm @@ -210,126 +210,3 @@ var/datum/subsystem/shuttle/SSshuttle S.dwidth = M.dwidth S.dheight = M.dheight moveShuttle(M.id, "[M.roundstart_move]", 0) - -/datum/supply_order - var/ordernum - var/datum/supply_packs/object = null - var/orderedby = null - var/orderedbyRank - var/comment = null - -/datum/supply_order/proc/generateRequisition(atom/_loc) - if(!object) - return - - var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(_loc) - reqform.name = "requisition form - [object.name]" - reqform.info += "

[station_name] Supply Requisition Form


" - reqform.info += "INDEX: #[ordernum]
" - reqform.info += "REQUESTED BY: [orderedby]
" - reqform.info += "RANK: [orderedbyRank]
" - reqform.info += "REASON: [comment]
" - reqform.info += "SUPPLY CRATE TYPE: [object.name]
" - reqform.info += "ACCESS RESTRICTION: [get_access_desc(object.access)]
" - reqform.info += "CONTENTS:
" - reqform.info += object.manifest - reqform.info += "
" - reqform.info += "STAMP BELOW TO APPROVE THIS REQUISITION:
" - - reqform.update_icon() //Fix for appearing blank when printed. - - return reqform - -/datum/supply_order/proc/createObject(atom/_loc, errors=0) - if(!object) - return - - //create the crate - var/atom/Crate = new object.containertype(_loc) - Crate.name = "[object.containername] [comment ? "([comment])":"" ]" - if(object.access) - Crate:req_access = list(text2num(object.access)) - - //create the manifest slip - var/obj/item/weapon/paper/manifest/slip = new /obj/item/weapon/paper/manifest() - slip.erroneous = errors - slip.points = object.cost - slip.ordernumber = ordernum - - var/stationName = (errors & MANIFEST_ERROR_NAME) ? new_station_name() : station_name() - var/packagesAmt = SSshuttle.shoppinglist.len + ((errors & MANIFEST_ERROR_COUNT) ? rand(1,2) : 0) - - slip.info = "

[command_name()] Shipping Manifest



" - slip.info +="Order #[ordernum]
" - slip.info +="Destination: [stationName]
" - slip.info +="[packagesAmt] PACKAGES IN THIS SHIPMENT
" - slip.info +="CONTENTS:

" - slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
" // And now this is actually meaningful. - slip.loc = Crate - if(istype(Crate, /obj/structure/closet/crate)) - var/obj/structure/closet/crate/CR = Crate - CR.manifest = slip - CR.update_icon() - if(istype(Crate, /obj/structure/largecrate)) - var/obj/structure/largecrate/LC = Crate - LC.manifest = slip - LC.update_icon() - - return Crate - -/datum/subsystem/shuttle/proc/generateSupplyOrder(packId, _orderedby, _orderedbyRank, _comment) - if(!packId) - return - var/datum/supply_packs/P = supply_packs["[packId]"] - if(!P) - return - - var/datum/supply_order/O = new() - O.ordernum = ordernum++ - O.object = P - O.orderedby = _orderedby - O.orderedbyRank = _orderedbyRank - O.comment = _comment - - requestlist += O - - return O - diff --git a/code/controllers/subsystem/shuttles/supply.dm b/code/controllers/subsystem/shuttles/supply.dm index 4bb2baf855e..8cd24bf8ac8 100644 --- a/code/controllers/subsystem/shuttles/supply.dm +++ b/code/controllers/subsystem/shuttles/supply.dm @@ -16,205 +16,6 @@ height = 7 roundstart_move = "supply_away" -/obj/docking_port/mobile/supply/New() - ..() - SSshuttle.supply = src - -/obj/docking_port/mobile/supply/canMove() - if(z == ZLEVEL_STATION) - return forbidden_atoms_check(areaInstance) - return ..() - -/obj/docking_port/mobile/supply/request(obj/docking_port/stationary/S) - if(mode != SHUTTLE_IDLE) - return 2 - return ..() - -/obj/docking_port/mobile/supply/dock() - . = ..() - if(.) - return . - - buy() - sell() - -/obj/docking_port/mobile/supply/proc/buy() - if(z != ZLEVEL_STATION) //we only buy when we are -at- the station - return 1 - - if(!SSshuttle.shoppinglist.len) - return 2 - - var/list/emptyTurfs = list() - for(var/turf/simulated/floor/T in areaInstance) - if(T.density || T.contents.len) - continue - emptyTurfs += T - - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) - if(!SO.object) - continue - - var/turf/T = pick_n_take(emptyTurfs) //turf we will place it in - if(!T) - SSshuttle.shoppinglist.Cut(1, SSshuttle.shoppinglist.Find(SO)) - return - - var/errors = 0 - if(prob(5)) - errors |= MANIFEST_ERROR_COUNT - if(prob(5)) - errors |= MANIFEST_ERROR_NAME - if(prob(5)) - errors |= MANIFEST_ERROR_ITEM - SO.createObject(T, errors) - - SSshuttle.shoppinglist.Cut() - - -/obj/docking_port/mobile/supply/proc/sell() - if(z != ZLEVEL_CENTCOM) //we only sell when we are -at- centcomm - return 1 - - var/plasma_count = 0 - var/intel_count = 0 - var/crate_count = 0 - - var/msg = "" - var/pointsEarned - - for(var/atom/movable/MA in areaInstance) - if(MA.anchored) - continue - SSshuttle.sold_atoms += " [MA.name]" - - // Must be in a crate (or a critter crate)! - if(istype(MA,/obj/structure/closet/crate) || istype(MA,/obj/structure/closet/critter)) - SSshuttle.sold_atoms += ":" - if(!MA.contents.len) - SSshuttle.sold_atoms += " (empty)" - ++crate_count - - var/find_slip = 1 - for(var/thing in MA) - // Sell manifests - SSshuttle.sold_atoms += " [thing:name]" - if(find_slip && istype(thing,/obj/item/weapon/paper/manifest)) - var/obj/item/weapon/paper/manifest/slip = thing - // TODO: Check for a signature, too. - if(slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense - // Did they mark it as erroneous? - var/denied = 0 - for(var/i=1,i<=slip.stamped.len,i++) - if(slip.stamped[i] == /obj/item/weapon/stamp/denied) - denied = 1 - if(slip.erroneous && denied) // Caught a mistake by Centcom (IDEA: maybe Centcom rarely gets offended by this) - pointsEarned = slip.points - SSshuttle.points_per_crate - SSshuttle.points += pointsEarned // For now, give a full refund for paying attention (minus the crate cost) - msg += "+[pointsEarned]: Station correctly denied package [slip.ordernumber]: " - if(slip.erroneous & MANIFEST_ERROR_NAME) - msg += "Destination station incorrect. " - else if(slip.erroneous & MANIFEST_ERROR_COUNT) - msg += "Packages incorrectly counted. " - else if(slip.erroneous & MANIFEST_ERROR_ITEM) - msg += "Package incomplete. " - msg += "Points refunded.
" - else if(!slip.erroneous && !denied) // Approving a proper order awards the relatively tiny points_per_slip - SSshuttle.points += SSshuttle.points_per_slip - msg += "+[SSshuttle.points_per_slip]: Package [slip.ordernumber] accorded.
" - else // You done goofed. - if(slip.erroneous) - msg += "+0: Station approved package [slip.ordernumber] despite error: " - if(slip.erroneous & MANIFEST_ERROR_NAME) - msg += "Destination station incorrect." - else if(slip.erroneous & MANIFEST_ERROR_COUNT) - msg += "Packages incorrectly counted." - else if(slip.erroneous & MANIFEST_ERROR_ITEM) - msg += "We found unshipped items on our dock." - msg += " Be more vigilant.
" - else - pointsEarned = round(SSshuttle.points_per_crate - slip.points) - SSshuttle.points += pointsEarned - msg += "[pointsEarned]: Station denied package [slip.ordernumber]. Our records show no fault on our part.
" - find_slip = 0 - continue - - // Sell plasma - if(istype(thing, /obj/item/stack/sheet/mineral/plasma)) - var/obj/item/stack/sheet/mineral/plasma/P = thing - plasma_count += P.amount - - // Sell syndicate intel - if(istype(thing, /obj/item/documents/syndicate)) - ++intel_count - - // Sell tech levels - if(istype(thing, /obj/item/weapon/disk/tech_disk)) - var/obj/item/weapon/disk/tech_disk/disk = thing - if(!disk.stored) - continue - var/datum/tech/tech = disk.stored - - var/cost = tech.getCost(SSshuttle.techLevels[tech.id]) - if(cost) - SSshuttle.techLevels[tech.id] = tech.level - SSshuttle.points += cost - msg += "+[cost]: [tech.name] - new data.
" - - // Sell max reliablity designs - if(istype(thing, /obj/item/weapon/disk/design_disk)) - var/obj/item/weapon/disk/design_disk/disk = thing - if(!disk.blueprint) - continue - var/datum/design/design = disk.blueprint - if(design.id in SSshuttle.researchDesigns) - continue - - if(initial(design.reliability) < 100 && design.reliability >= 100) - // Maxed out reliability designs only. - SSshuttle.points += SSshuttle.points_per_design - SSshuttle.researchDesigns += design.id - msg += "+[SSshuttle.points_per_design]: Reliable [design.name] design.
" - - // Sell exotic plants - if(istype(thing, /obj/item/seeds)) - var/obj/item/seeds/S = thing - if(S.rarity == 0) // Mundane species - msg += "+0: We don't need samples of mundane species \"[capitalize(S.species)]\".
" - else if(SSshuttle.discoveredPlants[S.type]) // This species has already been sent to CentComm - var/potDiff = S.potency - SSshuttle.discoveredPlants[S.type] // Compare it to the previous best - if(potDiff > 0) // This sample is better - SSshuttle.discoveredPlants[S.type] = S.potency - msg += "+[potDiff]: New sample of \"[capitalize(S.species)]\" is superior. Good work.
" - SSshuttle.points += potDiff - else // This sample is worthless - msg += "+0: New sample of \"[capitalize(S.species)]\" is not more potent than existing sample ([SSshuttle.discoveredPlants[S.type]] potency).
" - else // This is a new discovery! - SSshuttle.discoveredPlants[S.type] = S.potency - msg += "+[S.rarity]: New species discovered: \"[capitalize(S.species)]\". Excellent work.
" - SSshuttle.points += S.rarity // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later - qdel(MA) - SSshuttle.sold_atoms += "." - - if(plasma_count > 0) - pointsEarned = round(plasma_count * SSshuttle.points_per_plasma) - msg += "+[pointsEarned]: Received [plasma_count] unit(s) of exotic material.
" - SSshuttle.points += pointsEarned - - if(intel_count > 0) - pointsEarned = round(intel_count * SSshuttle.points_per_intel) - msg += "+[pointsEarned]: Received [intel_count] article(s) of enemy intelligence.
" - SSshuttle.points += pointsEarned - - if(crate_count > 0) - pointsEarned = round(crate_count * SSshuttle.points_per_crate) - msg += "+[pointsEarned]: Received [crate_count] crate(s).
" - SSshuttle.points += pointsEarned - - SSshuttle.centcom_message = msg - - -/proc/forbidden_atoms_check(atom/A) var/list/blacklist = list( /mob/living, /obj/effect/blob, @@ -230,348 +31,199 @@ /obj/machinery/telepad, /obj/machinery/clonepod ) - if(A) - if(is_type_in_list(A, blacklist)) + +/obj/docking_port/mobile/supply/New() + ..() + SSshuttle.supply = src + +/obj/docking_port/mobile/supply/canMove() + if(z == ZLEVEL_STATION) + return check_blacklist(areaInstance) + return ..() + +/obj/docking_port/mobile/supply/proc/check_blacklist(atom/A) + if(is_type_in_list(A, blacklist)) + return 1 + for(var/thing in A) + if(.(thing)) return 1 - for(var/thing in A) - if(.(thing)) - return 1 - return 0 +/obj/docking_port/mobile/supply/request() + if(mode != SHUTTLE_IDLE) + return 2 + return ..() - -/obj/machinery/computer/ordercomp/attack_hand(mob/user) - if(..()) +/obj/docking_port/mobile/supply/dock() + if(getDockedId() == "supply_away") // Buy when we leave home. + buy() + if(..()) // Fly/enter transit. return - user.set_machine(src) - var/dat - if(temp) - dat = temp - else - dat += {"
Shuttle Location: [SSshuttle.supply.name]
-
Supply Points: [SSshuttle.points]
+ if(getDockedId() == "supply_away") // Sell when we get home + sell() -
\nRequest items

- View approved orders

- View requests

- Close"} - - // Removing the old window method but leaving it here for reference - //user << browse(dat, "window=computer;size=575x450") - //onclose(user, "computer") - - // Added the new browser window method - var/datum/browser/popup = new(user, "computer", "Supply Ordering Console", 575, 450) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - -/obj/machinery/computer/ordercomp/Topic(href, href_list) - if(..()) +/obj/docking_port/mobile/supply/proc/buy() + if(!SSshuttle.shoppinglist.len) return - if( isturf(loc) && (in_range(src, usr) || istype(usr, /mob/living/silicon)) ) - usr.set_machine(src) + var/list/emptyTurfs = list() + for(var/turf/simulated/floor/T in areaInstance) + if(T.density || T.contents.len) + continue + emptyTurfs += T - if(href_list["order"]) - if(href_list["order"] == "categories") - //all_supply_groups - //Request what? - last_viewed_group = "categories" - temp = "
Supply points: [SSshuttle.points]
" - temp += "Main Menu

" - temp += "Select a category

" - for(var/cat in all_supply_groups ) - temp += "[get_supply_group_name(cat)]
" - else - last_viewed_group = href_list["order"] - var/cat = text2num(last_viewed_group) - temp = "
Supply points: [SSshuttle.points]
" - temp += "Back to all categories

" - temp += "Request from: [get_supply_group_name(cat)]

" - for(var/supply_type in SSshuttle.supply_packs ) - var/datum/supply_packs/N = SSshuttle.supply_packs[supply_type] - if(N.hidden || N.contraband || N.group != cat) - continue //Have to send the type instead of a reference to - temp += "[N.name] Cost: [N.cost]
" //the obj because it would get caught by the garbage - else if (href_list["doorder"]) - if(world.time < reqtime) - say("[world.time - reqtime] seconds remaining until another requisition form may be printed.") - return + for(var/datum/supply_order/SO in SSshuttle.shoppinglist) + if(!SO.object) + continue + if(SO.object.cost > SSshuttle.points) + continue - //Find the correct supply_pack datum - if(!SSshuttle.supply_packs["[href_list["doorder"]]"]) - return + var/errors = 0 + if(prob(5)) + errors |= MANIFEST_ERROR_COUNT + if(prob(5)) + errors |= MANIFEST_ERROR_NAME + if(prob(5)) + errors |= MANIFEST_ERROR_ITEM - var/timeout = world.time + 600 - var/reason = stripped_input(usr,"Reason:","Why do you require this item?","") - if(world.time > timeout) - return - if(!reason) - return + var/turf/T = pick_n_take(emptyTurfs) + SO.createObject(T, errors) - var/idname = "*None Provided*" - var/idrank = "*None Provided*" - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - idname = H.get_authentification_name() - idrank = H.get_assignment() - else if(issilicon(usr)) - idname = usr.real_name + SSshuttle.points -= SO.object.cost + SSshuttle.shoppinglist -= SO - var/datum/supply_order/O = SSshuttle.generateSupplyOrder(href_list["doorder"], idname, idrank, reason) - if(!O) - return - O.generateRequisition(loc) +/obj/docking_port/mobile/supply/proc/sell() + var/crates = 0 + var/plasma = 0 + var/intel = 0 - reqtime = (world.time + 5) % 1e5 + var/msg = "" + var/pointsEarned = 0 - temp = "Thanks for your request. The cargo team will process it as soon as possible.
" - temp += "
Back Main Menu" + for(var/atom/movable/AM in areaInstance) + if(AM.anchored) + continue + SSshuttle.sold_atoms += " [AM.name]" - else if (href_list["vieworders"]) - temp = "Main Menu

Current approved orders:

" - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) - temp += "[SO.object.name] approved by [SO.orderedby] [SO.comment ? "([SO.comment])":""]
" - - else if (href_list["viewrequests"]) - temp = "Main Menu

Current requests:

" - for(var/datum/supply_order/SO in SSshuttle.requestlist) - temp += "#[SO.ordernum] - [SO.object.name] requested by [SO.orderedby]
" - - else if (href_list["mainmenu"]) - temp = null - - add_fingerprint(usr) - updateUsrDialog() - return - -/obj/machinery/computer/supplycomp/attack_hand(mob/user) - if(!allowed(user)) - user << "Access Denied." - return - - if(..()) - return - user.set_machine(src) - post_signal("supply") - var/dat - if (temp) - dat = temp - else - var/atDepot = (SSshuttle.supply.getDockedId() == "supply_away") - var/inTransit = (SSshuttle.supply.mode != SHUTTLE_IDLE) - var/canOrder = atDepot && !inTransit - - dat += {"
Supply shuttle
- Location: [SSshuttle.supply.getStatusText()]
-
\nSupply Points: [SSshuttle.points]
\n

- [canOrder ? "\nOrder items
\n
" : "\n*Must be away to order items*
\n
"] - [inTransit ? "\n*Shuttle already called*
\n
": atDepot ? "\nSend to station
\n
":"\nSend to centcom
\n
"] - [SSshuttle.shuttle_loan ? (SSshuttle.shuttle_loan.dispatched ? "\n*Shuttle loaned to Centcom*
\n
" : "\nLoan shuttle to Centcom (5 mins duration)
\n
") : "\n*No pending external shuttle requests*
\n
"] - \nView requests
\n
- \nView orders
\n
- \nClose
-
\nCentral Command messages:
[SSshuttle.centcom_message ? SSshuttle.centcom_message : "Remember to stamp and send back the supply manifests."]"} - - var/datum/browser/popup = new(user, "computer", "Supply Shuttle Console", 700, 455) - popup.set_content(dat) - popup.open() - return - -/obj/machinery/computer/supplycomp/emag_act(mob/user) - if(!hacked) - user << "Special supplies unlocked." - hacked = 1 - -/obj/machinery/computer/supplycomp/Topic(href, href_list) - if(..()) - return - - if(isturf(loc) && ( in_range(src, usr) || istype(usr, /mob/living/silicon) ) ) - usr.set_machine(src) - - //Calling the shuttle - if(href_list["send"]) - if(SSshuttle.supply.canMove()) - if(SSshuttle.shuttle_loan) - temp = "The supply shuttle must be docked to send new commands.

Main Menu" + if(istype(AM, /obj/structure/closet/crate) || istype(AM, /obj/structure/closet/critter)) + crates++ + SSshuttle.sold_atoms += ":" + if(!AM.contents.len) + SSshuttle.sold_atoms += " (empty)" else - temp = "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.

Main Menu" + var/slip_found = FALSE + for(var/atom/movable/thing in AM) + SSshuttle.sold_atoms += " [thing.name]" + if(!slip_found && istype(thing, /obj/item/weapon/paper/manifest)) + var/obj/item/weapon/paper/manifest/slip = thing + if(slip.stamped && slip.stamped.len) + slip_found = TRUE + var/denied = FALSE + for(var/stamp in slip.stamped) + if(stamp == /obj/item/weapon/stamp/denied) + denied = TRUE + break + if(slip.erroneous && denied) // Caught a mistake by Centcom. + pointsEarned = slip.points - SSshuttle.points_per_crate + SSshuttle.points += pointsEarned // Give a full refund (minus the crate). + msg += "[pointsEarned]: Station correctly denied package [slip.ordernumber]: " + if(slip.erroneous & MANIFEST_ERROR_NAME) + msg += "Destination station incorrect. " + else if(slip.erroneous & MANIFEST_ERROR_COUNT) + msg += "Packages incorrectly counted. " + else if(slip.erroneous & MANIFEST_ERROR_ITEM) + msg += "Package incomplete. " + msg += "Points refunded." + else if(!slip.erroneous && !denied) // Approved a slip correctly. + pointsEarned = SSshuttle.points_per_slip + SSshuttle.points += pointsEarned + msg += "+[pointsEarned]: Package [slip.ordernumber] accorded." + else if(slip.erroneous) // You done goofed. + pointsEarned = -SSshuttle.points_per_slip + SSshuttle.points += pointsEarned + msg += "[pointsEarned]: Station erroneously approved package [slip.ordernumber]: " + if(slip.erroneous & MANIFEST_ERROR_NAME) + msg += "Destination station incorrect." + else if(slip.erroneous & MANIFEST_ERROR_COUNT) + msg += "Packages incorrectly counted." + else if(slip.erroneous & MANIFEST_ERROR_ITEM) + msg += "We found unshipped items on our dock." + msg += " Be more vigilant." + else + pointsEarned = round(SSshuttle.points_per_crate - slip.points) + SSshuttle.points += pointsEarned + msg += "[pointsEarned]: Station erroneously denied package [slip.ordernumber]." - else if(SSshuttle.supply.getDockedId() == "supply_home") - if(href_list["loan"] && SSshuttle.shuttle_loan) - if(!SSshuttle.shuttle_loan.dispatched) - SSshuttle.shuttle_loan.loan_shuttle() - temp = "The supply shuttle has been loaned to Centcom.

Main Menu" - post_signal("supply") - else - temp = "You can not loan the supply shuttle at this time.

Main Menu" - else - temp = "The supply shuttle has departed.

Main Menu" - SSshuttle.toggleShuttle("supply", "supply_home", "supply_away", 1) - investigate_log("[usr.key] has sent the supply shuttle away. Remaining points: [SSshuttle.points]. Shuttle contents:[SSshuttle.sold_atoms]", "cargo") - else - if(href_list["loan"] && SSshuttle.shuttle_loan) - if(!SSshuttle.shuttle_loan.dispatched && SSshuttle.supply.mode == SHUTTLE_IDLE) // Must either be at centcom, or at the station. No redirecting off course! - SSshuttle.shuttle_loan.loan_shuttle() - temp = "The supply shuttle has been loaned to Centcom.

Main Menu" - post_signal("supply") - else - temp = "You can not loan the supply shuttle at this time.

Main Menu" - else - if(!SSshuttle.supply.request(SSshuttle.getDock("supply_home"))) - temp = "The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.

Main Menu" - post_signal("supply") + // Sell plasma + if(istype(thing, /obj/item/stack/sheet/mineral/plasma)) + var/obj/item/stack/sheet/mineral/plasma/P = thing + plasma += P.amount - else if (href_list["order"]) - if(SSshuttle.supply.mode != SHUTTLE_IDLE) - return - if(href_list["order"] == "categories") - //all_supply_groups - //Request what? - last_viewed_group = "categories" - temp = "
Supply points: [SSshuttle.points]
" - temp += "Main Menu

" - temp += "Select a category

" - for(var/cat in all_supply_groups ) - temp += "[get_supply_group_name(cat)]
" - else - last_viewed_group = href_list["order"] - var/cat = text2num(last_viewed_group) - temp = "
Supply points: [SSshuttle.points]
" - temp += "Back to all categories

" - temp += "Request from: [get_supply_group_name(cat)]

" - for(var/supply_type in SSshuttle.supply_packs ) - var/datum/supply_packs/N = SSshuttle.supply_packs[supply_type] - if((N.hidden && !hacked) || (N.contraband && !can_order_contraband) || N.group != cat) - continue //Have to send the type instead of a reference to - temp += "[N.name] Cost: [N.cost]
" //the obj because it would get caught by the garbage + // Sell syndicate intel + if(istype(thing, /obj/item/documents/syndicate)) + intel++ - /*temp = "Supply points: [supply_shuttle.points]


Request what?

" + // Sell tech levels + if(istype(thing, /obj/item/weapon/disk/tech_disk)) + var/obj/item/weapon/disk/tech_disk/disk = thing + if(!disk.stored) + continue + var/datum/tech/tech = disk.stored - for(var/supply_name in supply_shuttle.supply_packs ) - var/datum/supply_packs/N = supply_shuttle.supply_packs[supply_name] - if(N.hidden && !hacked) continue - if(N.contraband && !can_order_contraband) continue - temp += "[supply_name] Cost: [N.cost]
" //the obj because it would get caught by the garbage - temp += "
OK"*/ + var/cost = tech.getCost(SSshuttle.techLevels[tech.id]) + if(cost) + SSshuttle.techLevels[tech.id] = tech.level + SSshuttle.points += cost + msg += "+[cost]: Data: [tech.name]." - else if (href_list["doorder"]) - if(world.time < reqtime) - say("[world.time - reqtime] seconds remaining until another requisition form may be printed.") - return + // Sell max reliablity designs + if(istype(thing, /obj/item/weapon/disk/design_disk)) + var/obj/item/weapon/disk/design_disk/disk = thing + if(!disk.blueprint) + continue + var/datum/design/design = disk.blueprint + if(design.id in SSshuttle.researchDesigns) + continue - //Find the correct supply_pack datum - if(!SSshuttle.supply_packs[href_list["doorder"]]) - return + if(initial(design.reliability) < 100 && design.reliability >= 100) + // Maxed out reliability designs only. + SSshuttle.points += SSshuttle.points_per_design + SSshuttle.researchDesigns += design.id + msg += "+[SSshuttle.points_per_design]: Design: [design.name]." - var/timeout = world.time + 600 - var/reason = stripped_input(usr,"Reason:","Why do you require this item?","") - if(world.time > timeout) - return -// if(!reason) -// return + // Sell exotic plants + if(istype(thing, /obj/item/seeds)) + var/obj/item/seeds/S = thing + if(S.rarity == 0) // Mundane species + msg += "+0: We don't need samples of mundane species \"[capitalize(S.species)]\"." + else if(SSshuttle.discoveredPlants[S.type]) // This species has already been sent to CentComm + var/potDiff = S.potency - SSshuttle.discoveredPlants[S.type] // Compare it to the previous best + if(potDiff > 0) // This sample is better + SSshuttle.discoveredPlants[S.type] = S.potency + msg += "+[potDiff]: New sample of \"[capitalize(S.species)]\" is superior. Good work." + SSshuttle.points += potDiff + else // This sample is worthless + msg += "+0: New sample of \"[capitalize(S.species)]\" is not more potent than existing sample ([SSshuttle.discoveredPlants[S.type]] potency)." + else // This is a new discovery! + SSshuttle.discoveredPlants[S.type] = S.potency + msg += "[S.rarity]: New species discovered: \"[capitalize(S.species)]\". Excellent work." + SSshuttle.points += S.rarity // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later + qdel(thing) + qdel(AM) + SSshuttle.sold_atoms += "." - var/idname = "*None Provided*" - var/idrank = "*None Provided*" - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - idname = H.get_authentification_name() - idrank = H.get_assignment() - else if(issilicon(usr)) - idname = usr.real_name + if(plasma > 0) + pointsEarned = round(plasma * SSshuttle.points_per_plasma) + msg += "[pointsEarned]: Received [plasma] unit(s) of exotic material." + SSshuttle.points += pointsEarned - var/datum/supply_order/O = SSshuttle.generateSupplyOrder(href_list["doorder"], idname, idrank, reason) - if(!O) - return - O.generateRequisition(loc) + if(intel > 0) + pointsEarned = round(intel * SSshuttle.points_per_intel) + msg += "[pointsEarned]: Received [intel] article(s) of enemy intelligence." + SSshuttle.points += pointsEarned - reqtime = (world.time + 5) % 1e5 + if(crates > 0) + pointsEarned = round(crates * SSshuttle.points_per_crate) + msg += "+[pointsEarned]: Received [crates] crate(s)." + SSshuttle.points += pointsEarned - temp = "Order request placed.
" - temp += "
Back | Main Menu | Authorize Order" - - else if(href_list["confirmorder"]) - //Find the correct supply_order datum - var/ordernum = text2num(href_list["confirmorder"]) - var/datum/supply_order/O - var/datum/supply_packs/P - temp = "Invalid Request" - for(var/i=1, i<=SSshuttle.requestlist.len, i++) - var/datum/supply_order/SO = SSshuttle.requestlist[i] - if(SO && SO.ordernum == ordernum) - O = SO - P = O.object - if(SSshuttle.points >= P.cost) - SSshuttle.requestlist.Cut(i,i+1) - SSshuttle.points -= P.cost - SSshuttle.shoppinglist += O - temp = "Thanks for your order." - investigate_log("[usr.key] has authorized an order for [P.name]. Remaining points: [SSshuttle.points].", "cargo") - else - temp = "Not enough supply points." - break - temp += "

Back Main Menu" - - else if (href_list["vieworders"]) - temp = "Main Menu

Current approved orders:

" - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) - temp += "#[SO.ordernum] - [SO.object.name] approved by [SO.orderedby][SO.comment ? " ([SO.comment])":""]
"// (Cancel)
" - temp += "
Main Menu" -/* - else if (href_list["cancelorder"]) - var/datum/supply_order/remove_supply = href_list["cancelorder"] - supply_shuttle_shoppinglist -= remove_supply - supply_shuttle_points += remove_supply.object.cost - temp += "Canceled: [remove_supply.object.name]


" - - for(var/S in supply_shuttle_shoppinglist) - var/datum/supply_order/SO = S - temp += "[SO.object.name] approved by [SO.orderedby][SO.comment ? " ([SO.comment])":""] (Cancel)
" - temp += "
Main Menu" -*/ - else if (href_list["viewrequests"]) - temp = "Main Menu

Current requests:

" - for(var/datum/supply_order/SO in SSshuttle.requestlist) - temp += "#[SO.ordernum] - [SO.object.name] requested by [SO.orderedby] [SSshuttle.supply.getDockedId() == "supply_away" ? "Approve Remove" : ""]
" - - temp += "
Clear list" - - else if (href_list["rreq"]) - var/ordernum = text2num(href_list["rreq"]) - temp = "Invalid Request.
" - for(var/i=1, i<=SSshuttle.requestlist.len, i++) - var/datum/supply_order/SO = SSshuttle.requestlist[i] - if(SO && SO.ordernum == ordernum) - SSshuttle.requestlist.Cut(i,i+1) - temp = "Request removed.
" - break - temp += "
Back Main Menu" - - else if (href_list["clearreq"]) - SSshuttle.requestlist.Cut() - temp = "List cleared.
" - temp += "
Main Menu" - - else if (href_list["mainmenu"]) - temp = null - - add_fingerprint(usr) - updateUsrDialog() - return - -/obj/machinery/computer/supplycomp/proc/post_signal(command) - - var/datum/radio_frequency/frequency = SSradio.return_frequency(1435) - - if(!frequency) - return - - var/datum/signal/status_signal = new - status_signal.source = src - status_signal.transmission_method = 1 - status_signal.data["command"] = command - - frequency.post_signal(src, status_signal) + SSshuttle.centcom_message = msg diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 9db20a588c4..49c668dbede 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -63,7 +63,7 @@ var/datum/subsystem/timer/SStimer event.thingToCall = thingToCall event.procToCall = procToCall event.timeToRun = world.time + wait - event.hash = list2text(args) + event.hash = jointext(args, null) if(args.len > 4) event.argList = args.Copy(5) diff --git a/code/datums/debug.dm b/code/datums/debug.dm deleted file mode 100644 index 28235903616..00000000000 --- a/code/datums/debug.dm +++ /dev/null @@ -1,2 +0,0 @@ -/datum/debug - var/list/debuglist \ No newline at end of file diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index ddc0ddd459f..360b261d893 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -294,7 +294,7 @@ var/list/advance_cures = list( for(var/datum/symptom/S in symptoms) L += S.id L = sortList(L) // Sort the list so it doesn't matter which order the symptoms are in. - var/result = list2text(L, ":") + var/result = jointext(L, ":") id = result return id diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index 5e9043f8d04..25c73a7f0ed 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -87,10 +87,9 @@ STI KALY - blind /datum/disease/wizarditis/proc/teleport() - var/list/theareas = list() - for(var/area/AR in ultra_range(80, affected_mob, 1)) - if(theareas.Find(AR) || istype(AR,/area/space)) continue - theareas += AR + var/list/theareas = get_areas_in_range(80, affected_mob) + for(var/area/space/S in theareas) + theareas -= S if(!theareas||!theareas.len) return diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 87cf949ae3f..0a48e574eaa 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -9,7 +9,7 @@ var/global/datum/getrev/revdata = new() var/list/head_log = file2list(".git/logs/HEAD", "\n") for(var/line=head_log.len, line>=1, line--) if(head_log[line]) - var/list/last_entry = text2list(head_log[line], " ") + var/list/last_entry = splittext(head_log[line], " ") if(last_entry.len < 2) continue revision = last_entry[2] diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index b2ec4f8b0b1..fe709ec7dda 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -514,7 +514,7 @@ else prefix="" - var/list/words = text2list(message," ") + var/list/words = splittext(message," ") var/list/rearranged = list() for(var/i=1;i<=words.len;i++) var/cword = pick(words) @@ -525,7 +525,7 @@ suffix = copytext(cword,length(cword)-1,length(cword) ) if(length(cword)) rearranged += cword - message = "[prefix][uppertext(list2text(rearranged," "))]!!" + message = "[prefix][uppertext(jointext(rearranged," "))]!!" return message /datum/mutation/human/swedish diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 98caff06ef8..8c6aa69ebdb 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -91,7 +91,6 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine cost = 35 containertype = /obj/structure/closet/crate/internals containername = "emergency crate" - group = supply_emergency /datum/supply_packs/emergency/internals name = "Internals Crate" @@ -721,21 +720,21 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine access = access_robotics /datum/supply_packs/science/robotics/mecha_ripley - name = "Circuit Crate (\"Ripley\" APLU)" + name = "Circuit Crate (Ripley APLU)" contains = list(/obj/item/weapon/book/manual/ripley_build_and_repair, /obj/item/weapon/circuitboard/mecha/ripley/main, //TEMPORARY due to lack of circuitboard printer /obj/item/weapon/circuitboard/mecha/ripley/peripherals) //TEMPORARY due to lack of circuitboard printer cost = 30 containertype = /obj/structure/closet/crate/secure - containername = "\improper APLU \"Ripley\" circuit crate" + containername = "\improper APLU Ripley circuit crate" /datum/supply_packs/science/robotics/mecha_odysseus - name = "Circuit Crate (\"Odysseus\")" + name = "Circuit Crate (Odysseus)" contains = list(/obj/item/weapon/circuitboard/mecha/odysseus/peripherals, //TEMPORARY due to lack of circuitboard printer /obj/item/weapon/circuitboard/mecha/odysseus/main) //TEMPORARY due to lack of circuitboard printer cost = 25 containertype = /obj/structure/closet/crate/secure - containername = "\improper \"Odysseus\" circuit crate" + containername = "\improper Odysseus circuit crate" /datum/supply_packs/science/plasma name = "Plasma Assembly Crate" diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index ccadb365aee..c161690b2b8 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -172,7 +172,7 @@ var/list/wire_color_directory = list() wires += dud /datum/wires/proc/randomize() - var/list/possible_colors = shuffle(wire_colors.Copy()) + var/list/possible_colors = wire_colors.Copy() for(var/wire in shuffle(wires)) colors[pick_n_take(possible_colors)] = wire @@ -291,7 +291,7 @@ var/list/wire_color_directory = list() ui = new(user, src, ui_key, "wires", "[holder.name] wires", 350, 150 + wires.len * 30, master_ui, state) ui.open() -/datum/wires/get_ui_data(mob/user) +/datum/wires/ui_data(mob/user) var/list/data = list() var/list/payload = list() for(var/color in colors) diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index ac392f1bfb9..895e025eb02 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -21,6 +21,10 @@ /mob/living/simple_animal/hostile/blob/blob_act() return +/mob/living/simple_animal/hostile/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() + adjustFireLoss(Clamp(0.01 * exposed_temperature, 1, 5)) + /mob/living/simple_animal/hostile/blob/CanPass(atom/movable/mover, turf/target, height = 0) if(istype(mover, /obj/effect/blob)) return 1 @@ -42,16 +46,12 @@ attacktext = "hits" attack_sound = 'sound/weapons/genhit1.ogg' speak_emote = list("pulses") + var/death_cloud_size = 1 //size of cloud produced from a dying spore var/obj/effect/blob/factory/factory = null var/list/human_overlays = list() var/is_zombie = 0 gold_core_spawnable = 1 -/mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - ..() - adjustBruteLoss(Clamp(0.01 * exposed_temperature, 1, 5)) - - /mob/living/simple_animal/hostile/blob/blobspore/New(loc, var/obj/effect/blob/factory/linked_node) if(istype(linked_node)) factory = linked_node @@ -80,6 +80,7 @@ desc = "A shambling corpse animated by the blob." melee_damage_lower += 8 melee_damage_upper += 11 + death_cloud_size = 0 icon = H.icon speak_emote = list("groans") icon_state = "zombie_s" @@ -106,7 +107,7 @@ // Attach the smoke spreader and setup/start it. S.attach(location) - S.set_up(reagents, 0, location, silent=1) + S.set_up(reagents, death_cloud_size, location, silent=1) S.start() ghostize() @@ -137,6 +138,7 @@ maxHealth = 20 melee_damage_lower = 1 melee_damage_upper = 2 + death_cloud_size = 0 ///////////////// // BLOBBERNAUT // @@ -148,27 +150,30 @@ icon_state = "blobbernaut" icon_living = "blobbernaut" icon_dead = "blobbernaut_dead" - health = 240 - maxHealth = 240 + health = 200 + maxHealth = 200 + damage_coeff = list(BRUTE = 0.5, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) melee_damage_lower = 20 melee_damage_upper = 20 attacktext = "slams" attack_sound = 'sound/effects/blobattack.ogg' speak_emote = list("gurgles") - minbodytemp = 0 - maxbodytemp = 360 force_threshold = 10 mob_size = MOB_SIZE_LARGE gold_core_spawnable = 1 see_invisible = SEE_INVISIBLE_MINIMUM see_in_dark = 8 +/mob/living/simple_animal/hostile/blob/blobbernaut/New() + ..() + verbs -= /mob/living/verb/pulled //no pulling people deep into the blob + /mob/living/simple_animal/hostile/blob/blobbernaut/AttackingTarget() if(isliving(target)) if(overmind) var/mob/living/L = target var/mob_protection = L.get_permeability_protection() - overmind.blob_reagent_datum.reaction_mob(L, VAPOR, 17.5, 0, mob_protection)//this will do between 7 and 17 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage. + overmind.blob_reagent_datum.reaction_mob(L, VAPOR, 20, 0, mob_protection)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage. if(target) ..() diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index a67659314ac..a489e4d5407 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -83,7 +83,7 @@ if(!B) src << "You must be on a factory blob!" return - if(B.health < B.maxhealth*0.8) //if it's at less than 80% of its health, you can't blobbernaut it + if(B.health <= B.maxhealth*0.8) //if it's at less than 80% of its health, you can't blobbernaut it src << "This factory blob is too damaged to produce a blobbernaut." return if(!can_buy(30)) @@ -92,6 +92,7 @@ B.take_damage(B.maxhealth*0.8, CLONE, null, 0) //take a bunch of damage, so you can't produce tons of blobbernauts from a single factory B.visible_message("The blobbernaut [pick("rips", "tears", "shreds")] its way out of the factory blob!") B.spore_delay = world.time + 600 //one minute before it can spawn spores again + playsound(B.loc, 'sound/effects/splat.ogg', 50, 1) blobber.overmind = src blobber.update_icons() blobber.AIStatus = AI_OFF diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 942110135f2..3b67eab6a7c 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -103,7 +103,7 @@ if(expand_range) src.expand() for(var/obj/effect/blob/B in orange(expand_range, src)) - if(prob(12)) + if(prob(20 - get_dist(get_turf(src), get_turf(B)) * 4)) //expand falls off with range but is faster near the blob causing the expansion B.expand() return @@ -173,7 +173,7 @@ B.loc = T B.update_icon() if(B.overmind) - B.overmind.blob_reagent_datum.expand_reaction(B, T) + B.overmind.blob_reagent_datum.expand_reaction(src, B, T) return B else T.blob_act() //if we can't move in hit the turf again diff --git a/code/game/gamemodes/changeling/powers/digitalcamo.dm b/code/game/gamemodes/changeling/powers/digitalcamo.dm index 79651c98a97..c992e7e0516 100644 --- a/code/game/gamemodes/changeling/powers/digitalcamo.dm +++ b/code/game/gamemodes/changeling/powers/digitalcamo.dm @@ -10,10 +10,11 @@ if(user.digitalcamo) user << "We return to normal." user.digitalinvis = 0 + user.digitalcamo = 0 else user << "We distort our form to hide from the AI" user.digitalcamo = 1 - user.digitalinvis = !user.digitalcamo + user.digitalinvis = 1 feedback_add_details("changeling_powers","CAM") diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 710cba51f48..28baf88d03e 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -680,7 +680,7 @@ var/list/teleport_other_runes = list() log_game("Talisman Imbue rune failed - no nearby runes") return var/obj/effect/rune/picked_rune = pick(nearby_runes) - var/list/split_rune_type = text2list("[picked_rune.type]", "/") + var/list/split_rune_type = splittext("[picked_rune.type]", "/") var/imbue_type = split_rune_type[split_rune_type.len] var/talisman_type = text2path("/obj/item/weapon/paper/talisman/[imbue_type]") if(ispath(talisman_type)) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 399af467888..8ad93a8b054 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -31,8 +31,9 @@ set category = "Malfunction" set name = "Doomsday Device" - for(var/turf/simulated/floor/bluegrid/T in orange(5, src)) - T.icon_state = "rcircuitanim" //Causes blue tiles near the AI to change to flashing red + for(var/N in nuke_tiles) + var/turf/T = N + T.icon_state = "rcircuitanim" //This causes all blue "circuit" tiles on the map to change to animated red icon state. src << "Nuclear device armed." priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", 'sound/AI/aimalf.ogg') @@ -59,18 +60,18 @@ var/timer = 450 /obj/machinery/doomsday_device/process() - if(z != ZLEVEL_STATION) - minor_announce("DOOMSDAY DEVICE OUT OF RANGE OF STATION, ABORTING", "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4", 1) + var/turf/T = get_turf(src) + if(!T || T.z != ZLEVEL_STATION) + minor_announce("DOOMSDAY DEVICE OUT OF STATION RANGE, ABORTING", "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4", 1) SSshuttle.emergencyNoEscape = 0 if(SSshuttle.emergency.mode == SHUTTLE_STRANDED) SSshuttle.emergency.mode = SHUTTLE_DOCKED SSshuttle.emergency.timer = world.time - priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority") - qdel(src) + priority_announce("Hostile environment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority") + qdel(src) if(!timing) return if(timer <= 0) - var/turf/T = get_turf(src) timing = 0 detonate(T.z) qdel(src) diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 0e05f8f4066..343387a546b 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -23,6 +23,7 @@ see_invisible = SEE_INVISIBLE_MINIMUM see_in_dark = 8 languages = ALL + force_threshold = 5 response_help = "passes through" response_disarm = "swings through" response_harm = "punches through" @@ -31,7 +32,6 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = INFINITY - harm_intent_damage = 0 friendly = "touches" status_flags = 0 wander = 0 diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 80cd214ec74..77306a0e167 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -391,8 +391,9 @@ This is here to make the tiles around the station mininuke change when it's arme /obj/machinery/nuclearbomb/selfdestruct/proc/SetTurfs() if(loc == initial(loc)) - for(var/turf/simulated/floor/bluegrid/T in orange(src, 1)) - T.icon_state = (timing ? "rcircuitanim" : "bcircuit") + for(var/N in nuke_tiles) + var/turf/simulated/floor/T = N + T.icon_state = (timing ? "rcircuitanim" : T.icon_regular_floor) /obj/machinery/nuclearbomb/selfdestruct/set_anchor() return @@ -401,6 +402,10 @@ This is here to make the tiles around the station mininuke change when it's arme ..() SetTurfs() +/obj/machinery/nuclearbomb/selfdestruct/set_safety() + ..() + SetTurfs() + //==========DAT FUKKEN DISK=============== /obj/item/weapon/disk/nuclear name = "nuclear authentication disk" diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 5e6ce63d62b..32b34729cbe 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -2,225 +2,177 @@ name = "sleeper console" icon = 'icons/obj/Cryogenic2.dmi' icon_state = "console" - anchored = 1 //About time someone fixed this. - density = 0 + density = FALSE + anchored = TRUE /obj/machinery/sleeper name = "sleeper" icon = 'icons/obj/Cryogenic2.dmi' icon_state = "sleeper-open" - density = 0 - anchored = 1 - state_open = 1 - var/efficiency - var/initial_bin_rating = 1 - var/min_health = 25 - var/list/injection_chems = list() //list of injectable chems except ephedrine, coz ephedrine is always avalible - var/list/possible_chems = list(list("morphine", "salbutamol", "bicaridine", "kelotane"), - list("morphine", "salbutamol", "bicaridine", "kelotane", "oculine"), - list("morphine", "salbutamol", "bicaridine", "kelotane", "oculine", "antitoxin", "mutadone", "mannitol", "pen_acid"), - list("morphine", "salbutamol", "bicaridine", "kelotane", "oculine", "antitoxin", "mutadone", "mannitol", "pen_acid", "omnizine")) + density = FALSE + anchored = TRUE + state_open = TRUE + var/efficiency = 1 + var/min_health = -25 + var/list/available_chems + var/list/possible_chems = list( + list("epinephrine", "morphine", "salbutamol", "bicaridine", "kelotane"), + list("oculine"), + list("antitoxin", "mutadone", "mannitol", "pen_acid"), + list("omnizine") + ) + /obj/machinery/sleeper/New() ..() component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/sleeper(null) - - // Customizable bin rating, used by the labor camp to stop people filling themselves with chemicals and escaping. - var/obj/item/weapon/stock_parts/matter_bin/B = new(null) - B.rating = initial_bin_rating - component_parts += B - + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) component_parts += new /obj/item/weapon/stock_parts/manipulator(null) component_parts += new /obj/item/weapon/stock_parts/console_screen(null) component_parts += new /obj/item/weapon/stock_parts/console_screen(null) component_parts += new /obj/item/stack/cable_coil(null, 1) + component_parts += new /obj/item/weapon/circuitboard/sleeper(null) RefreshParts() -/obj/machinery/sleeper/Destroy() - go_out() - . = ..() - /obj/machinery/sleeper/RefreshParts() var/E - var/I for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) E += B.rating + var/I for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) I += M.rating - injection_chems = possible_chems[I] - efficiency = E - min_health = -E * 25 + efficiency = initial(efficiency)* E + min_health = initial(min_health) * E + available_chems = list() + for(var/i in 1 to I) + available_chems |= possible_chems[i] -/obj/machinery/sleeper/MouseDrop_T(mob/target, mob/user) - if(stat || user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !iscarbon(target)) - return - close_machine(target) - -/obj/machinery/sleeper/blob_act() - if(prob(75)) - for(var/atom/movable/A in src) - A.loc = loc - A.blob_act() - qdel(src) - -/obj/machinery/sleeper/attack_animal(mob/living/simple_animal/M)//Stop putting hostile mobs in things guise - if(M.environment_smash) - M.do_attack_animation(src) - visible_message("[M.name] smashes [src] apart!") - qdel(src) - return - -/obj/machinery/sleeper/attackby(obj/item/I, mob/user, params) - if(!state_open && !occupant) - if(default_deconstruction_screwdriver(user, "sleeper-o", "sleeper", I)) - return - - if(default_change_direction_wrench(user, I)) - return - - if(exchange_parts(user, I)) - return - - if(default_pry_open(I)) - return - - default_deconstruction_crowbar(I) - -/obj/machinery/sleeper/emp_act(severity) - if(stat & (BROKEN|NOPOWER)) - ..(severity) - return - if(occupant) - go_out() - ..(severity) - -/obj/machinery/sleeper/proc/go_out() - if(!occupant) - return - for(var/atom/movable/O in src) - O.loc = loc - occupant.reset_perspective(null) - occupant = null - icon_state = "sleeper-open" - -/obj/machinery/sleeper/container_resist() - open_machine() - -/obj/machinery/sleeper/relaymove(mob/user) - ..() - open_machine() - -/obj/machinery/sleeper/attack_hand(mob/user) - if(..()) - return - - sleeperUI(user) - -/obj/machinery/sleeper/proc/sleeperUI(mob/user) - var/dat - dat += "

Injector

" - if(occupant) - dat += "Inject Epinephrine" - else - dat += "Inject Epinephrine" - if(occupant && occupant.health > min_health) - for(var/re in injection_chems) - var/datum/reagent/C = chemical_reagents_list[re] - if(C) - dat += "
Inject [C.name]" - else - for(var/re in injection_chems) - var/datum/reagent/C = chemical_reagents_list[re] - if(C) - dat += "
Inject [C.name]" - - dat += "

Sleeper Status

" - dat += "Scan" - dat += "Close" : "open=1'>Open"]" - dat += "
" - if(!occupant) - dat += "Sleeper Unoccupied" - else - dat += "[occupant.name] => " - switch(occupant.stat) //obvious, see what their status is - if(0) - dat += "Conscious" - if(1) - dat += "Unconscious" - else - dat += "DEAD" - dat += "
" - dat += "
Health:
[occupant.stat > 1 ? "" : "[occupant.health]%"]
" - dat += "
\> Brute Damage:
[occupant.getBruteLoss()]%
" - dat += "
\> Resp. Damage:
[occupant.getOxyLoss()]%
" - dat += "
\> Toxin Content:
[occupant.getToxLoss()]%
" - dat += "
\> Burn Severity:
[occupant.getFireLoss()]%

" - - dat += "
Paralysis Summary:
[round(occupant.paralysis)]% [occupant.paralysis ? "([round(occupant.paralysis / 4)] seconds left)" : ""]

" - if(occupant.getCloneLoss()) - dat += "
Subject appears to have cellular damage.

" - if(occupant.getBrainLoss()) - dat += "
Significant brain damage detected.

" - if(occupant.reagents.reagent_list.len) - for(var/datum/reagent/R in occupant.reagents.reagent_list) - dat += "
[R.name]:
[round(R.volume, 0.1)] units

" - dat += "
" - - var/datum/browser/popup = new(user, "sleeper", "Sleeper Console", 520, 540) //Set up the popup browser window - popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) - popup.set_content(dat) - popup.open() - -/obj/machinery/sleeper/Topic(href, href_list) - if(..() || usr == occupant) - return - usr.set_machine(src) - if(href_list["refresh"]) - updateUsrDialog() - return - if(href_list["open"]) - open_machine() - return - if(href_list["close"]) - close_machine() - return - if(occupant && occupant.stat != DEAD) - if(href_list["inject"] == "epinephrine" || occupant.health > min_health) - inject_chem(usr, href_list["inject"]) - else - usr << "ERROR: Subject is not in stable condition for auto-injection." - else - usr << "ERROR: Subject cannot metabolise chemicals." - updateUsrDialog() - add_fingerprint(usr) - -/obj/machinery/sleeper/attack_ai(mob/user) - return attack_hand(user) - -/obj/machinery/sleeper/attack_paw(mob/user) - return attack_hand(user) - -/obj/machinery/sleeper/open_machine() - if(!state_open && !panel_open) - ..() - -/obj/machinery/sleeper/close_machine(mob/target) - if(state_open && !panel_open) - ..(target) - -/obj/machinery/sleeper/proc/inject_chem(mob/user, chem) - if(!is_operational()) - return - if(occupant && occupant.reagents) - if(chem in injection_chems + "epinephrine") - if(occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency) - occupant.reagents.add_reagent(chem, 10) - var/units = round(occupant.reagents.get_reagent_amount(chem)) - user << "Occupant now has [units] unit\s of [chemical_reagents_list[chem]] in their bloodstream." +/obj/machinery/sleeper/Destroy() + var/turf/T = loc + T.contents += contents + return ..() /obj/machinery/sleeper/update_icon() if(state_open) icon_state = "sleeper-open" else icon_state = "sleeper" + +/obj/machinery/sleeper/container_resist() + visible_message("[occupant] emerges from [src]!", + "You climb out of [src]!") + open_machine() + +/obj/machinery/sleeper/relaymove(mob/user) + container_resist() + +/obj/machinery/sleeper/open_machine() + if(!state_open && !panel_open) + ..() + +/obj/machinery/sleeper/close_machine(mob/user) + if((isnull(user) || istype(user)) && state_open && !panel_open) + ..(user) + +/obj/machinery/sleeper/attack_animal(mob/living/simple_animal/M) + if(M.environment_smash) + M.do_attack_animation(src) + visible_message("[M.name] smashes [src] apart!") + qdel(src) + +/obj/machinery/sleeper/emp_act(severity) + if(is_operational() && occupant) + open_machine() + ..(severity) + +/obj/machinery/sleeper/blob_act() + if(prob(75)) + var/turf/T = get_turf(src) + for(var/atom/movable/A in src) + A.forceMove(T) + A.blob_act() + qdel(src) + +/obj/machinery/sleeper/MouseDrop_T(mob/target, mob/user) + if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target)) + return + close_machine(target) + +/obj/machinery/sleeper/attackby(obj/item/I, mob/user, params) + if(!state_open && !occupant) + if(default_deconstruction_screwdriver(user, "sleeper-o", "sleeper", I)) + return + if(default_change_direction_wrench(user, I)) + return + if(exchange_parts(user, I)) + return + if(default_pry_open(I)) + return + if(default_deconstruction_crowbar(I)) + return +/obj/machinery/sleeper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + 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, "sleeper", name, 375, 550, master_ui, state) + ui.open() + +/obj/machinery/sleeper/ui_data() + var/list/data = list() + data["occupied"] = occupant ? 1 : 0 + data["open"] = state_open + + data["chems"] = list() + for(var/chem in available_chems) + var/datum/reagent/R = chemical_reagents_list[chem] + data["chems"] += list(list("name" = R.name, "id" = R.id, "allowed" = chem_allowed(chem))) + + data["occupant"] = list() + if(occupant) + data["occupant"]["name"] = occupant.name + data["occupant"]["stat"] = occupant.stat + data["occupant"]["health"] = occupant.health + data["occupant"]["maxHealth"] = occupant.maxHealth + data["occupant"]["minHealth"] = config.health_threshold_dead + data["occupant"]["bruteLoss"] = occupant.getBruteLoss() + data["occupant"]["oxyLoss"] = occupant.getOxyLoss() + data["occupant"]["toxLoss"] = occupant.getToxLoss() + data["occupant"]["fireLoss"] = occupant.getFireLoss() + data["occupant"]["cloneLoss"] = occupant.getCloneLoss() + data["occupant"]["brainLoss"] = occupant.getBrainLoss() + data["occupant"]["reagents"] = list() + if(occupant.reagents.reagent_list.len) + for(var/datum/reagent/R in occupant.reagents.reagent_list) + data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume)) + return data + +/obj/machinery/sleeper/ui_act(action, params) + if(..()) + return + switch(action) + if("door") + if(state_open) + close_machine() + else + open_machine() + . = TRUE + if("inject") + var/chem = params["chem"] + if(!is_operational() || !occupant) + return + if(occupant.health < min_health && chem != "epinephrine") + return + if(inject_chem(chem)) + . = TRUE + +/obj/machinery/sleeper/proc/inject_chem(chem) + if((chem in available_chems) && chem_allowed(chem)) + occupant.reagents.add_reagent(chem, 10) + return TRUE + +/obj/machinery/sleeper/proc/chem_allowed(chem) + if(!occupant) + return + var/amount = occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency + var/health = occupant.health > min_health || chem == "epinephrine" + return amount && health \ No newline at end of file diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index f43488a5103..970c174a025 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -78,7 +78,7 @@ usr << "No input found, please hang up and try your call again!" return - var/list/tempnetwork = text2list(input, ",") + var/list/tempnetwork = splittext(input, ",") if(tempnetwork.len < 1) usr << "No network found, please hang up and try your call again!" return diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 0ef98a5d268..e6f306e03c8 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -25,7 +25,7 @@ ui = new(user, src, ui_key, "atmos_alert", name, 350, 300, master_ui, state) ui.open() -/obj/machinery/computer/atmos_alert/get_ui_data(mob/user) +/obj/machinery/computer/atmos_alert/ui_data(mob/user) var/list/data = list() data["priority"] = list() diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 8d570478a6a..32e3ae5c38e 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -102,7 +102,7 @@ ui = new(user, src, ui_key, "atmos_control", name, 400, 925, master_ui, state) ui.open() -/obj/machinery/computer/atmos_control/get_ui_data(mob/user) +/obj/machinery/computer/atmos_control/ui_data(mob/user) var/data = list() data["sensors"] = list() @@ -157,10 +157,10 @@ var/datum/radio_frequency/freq = SSradio.return_frequency(1441) var/list/devices = freq.devices["_default"] for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in devices) - var/list/text = text2list(U.id_tag, "_") + var/list/text = splittext(U.id_tag, "_") IO |= text[1] for(var/obj/machinery/atmospherics/components/unary/outlet_injector/U in devices) - var/list/text = text2list(U.id, "_") + var/list/text = splittext(U.id, "_") IO |= text[1] if(!IO.len) user << "No machinery detected." @@ -171,7 +171,7 @@ name = "[uppertext(S)] Supply Control" var/list/new_devices = freq.devices["4"] for(var/obj/machinery/air_sensor/U in new_devices) - var/list/text = text2list(U.id_tag, "_") + var/list/text = splittext(U.id_tag, "_") if(text[1] == S) sensors = list("[S]_sensor" = "Tank") break @@ -188,7 +188,7 @@ ui = new(user, src, ui_key, "atmos_control", name, 500, 305, master_ui, state) ui.open() -/obj/machinery/computer/atmos_control/tank/get_ui_data(mob/user) +/obj/machinery/computer/atmos_control/tank/ui_data(mob/user) var/list/data = ..() data["tank"] = TRUE data["inputting"] = input_info ? input_info["power"] : FALSE diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index f020df370b0..815efb44d6b 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -167,14 +167,14 @@ name = "circuit board (Mech Bay Power Control Console)" build_path = /obj/machinery/computer/mech_bay_power_console origin_tech = "programming=2;powerstorage=3" -/obj/item/weapon/circuitboard/ordercomp - name = "circuit board (Supply Ordering Console)" - build_path = /obj/machinery/computer/ordercomp -/obj/item/weapon/circuitboard/supplycomp - name = "circuit board (Supply shuttle console)" - build_path = /obj/machinery/computer/supplycomp +/obj/item/weapon/circuitboard/cargo + name = "circuit board (Supply Console)" + build_path = /obj/machinery/computer/cargo origin_tech = "programming=3" - var/contraband_enabled = 0 + var/contraband = 0 +/obj/item/weapon/circuitboard/cargo/request + name = "circuit board (Supply Request Console)" + build_path = /obj/machinery/computer/cargo/request /obj/item/weapon/circuitboard/operating name = "circuit board (Operating Computer)" build_path = /obj/machinery/computer/operating @@ -221,9 +221,6 @@ name = "circuit board (AI Integrity Restorer)" build_path = /obj/machinery/computer/aifixer origin_tech = "programming=3;biotech=2" -/obj/item/weapon/circuitboard/area_atmos - name = "circuit board (Area Air Control)" - build_path = /obj/machinery/computer/area_atmos /*/obj/item/weapon/circuitboard/prison_shuttle name = "circuit board (Prison Shuttle)" build_path = /obj/machinery/computer/prison_shuttle*/ @@ -244,27 +241,10 @@ target_dept = dept_list.Find(choice) return -/obj/item/weapon/circuitboard/supplycomp/attackby(obj/item/I, mob/user, params) +/obj/item/weapon/circuitboard/cargo/attackby(obj/item/I, mob/user, params) if(istype(I,/obj/item/device/multitool)) - var/catastasis = src.contraband_enabled - var/opposite_catastasis - if(catastasis) - opposite_catastasis = "STANDARD" - catastasis = "BROAD" - else - opposite_catastasis = "BROAD" - catastasis = "STANDARD" - - switch( alert("Current receiver spectrum is set to: [catastasis]","Multitool-Circuitboard interface","Switch to [opposite_catastasis]","Cancel") ) - //switch( alert("Current receiver spectrum is set to: " {(src.contraband_enabled) ? ("BROAD") : ("STANDARD")} , "Multitool-Circuitboard interface" , "Switch to " {(src.contraband_enabled) ? ("STANDARD") : ("BROAD")}, "Cancel") ) - if("Switch to STANDARD","Switch to BROAD") - src.contraband_enabled = !src.contraband_enabled - - if("Cancel") - return - else - user << "DERP! BUG! Report this (And what you were doing to cause it) to Agouri" - return + contraband = !contraband + user << "Receiver spectrum set to [contraband ? "Broad" : "Standard"]." /obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I, mob/user, params) if(istype(I,/obj/item/weapon/screwdriver)) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index eb0ada26249..c67b1b2f56b 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -7,7 +7,7 @@ use_power = 1 idle_power_usage = 300 active_power_usage = 300 - var/obj/item/weapon/circuitboard/circuit = null //if circuit==null, computer can't disassembly + var/obj/item/weapon/circuitboard/circuit = null // if circuit==null, computer can't disassembly var/processing = 0 var/brightness_on = 2 var/icon_keyboard = "generic_key" diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm deleted file mode 100644 index 40b8ebfa2a8..00000000000 --- a/code/game/machinery/computer/power.dm +++ /dev/null @@ -1,113 +0,0 @@ -// the power monitoring computer -// for the moment, just report the status of all APCs in the same powernet -/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 = 80 - circuit = /obj/item/weapon/circuitboard/powermonitor - var/datum/powernet/powernet = null - -//fix for issue 521, by QualityVan. -//someone should really look into why circuits have a powernet var, it's several kinds of retarded. -/obj/machinery/computer/monitor/New() - ..() - var/obj/structure/cable/attached = null - var/turf/T = loc - if(isturf(T)) - attached = locate() in T - if(attached) - powernet = attached.get_powernet() - -/obj/machinery/computer/monitor/process() //oh shit, somehow we didnt end up with a powernet... lets look for one. - if(!powernet) - var/obj/structure/cable/attached = null - var/turf/T = loc - if(isturf(T)) - attached = locate() in T - if(attached) - powernet = attached.get_powernet() - return - -/obj/machinery/computer/monitor/attack_hand(mob/user) - if(..()) - return - interact(user) - -/obj/machinery/computer/monitor/interact(mob/user) - if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) ) - if (!(istype(user, /mob/living/silicon) || IsAdminGhost(user))) - user.unset_machine() - user << browse(null, "window=powcomp") - return - - - user.set_machine(src) - var/t = "" - - t += "Refresh Close

" - - if(!powernet) - t += "No connection." - else - - var/list/L = list() - for(var/obj/machinery/power/terminal/term in powernet.nodes) - if(istype(term.master, /obj/machinery/power/apc)) - var/obj/machinery/power/apc/A = term.master - L += A - - t += "
Total power: [powernet.avail] W
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 += "
" - - //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
":null] diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index a1ce789e73a..60b088ebc97 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -35,11 +35,9 @@ /obj/item/mecha_parts/mecha_equipment/wormhole_generator/action(atom/target) - if(!action_checks(target) || src.loc.z == ZLEVEL_CENTCOM) return - var/list/theareas = list() - for(var/area/AR in ultra_range(100, chassis, 1)) - if(AR in theareas) continue - theareas += AR + if(!action_checks(target) || src.loc.z == ZLEVEL_CENTCOM) + return + var/list/theareas = get_areas_in_range(100, chassis) if(!theareas.len) return var/area/thearea = pick(theareas) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index a1ff2d38896..6b123816b10 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -254,19 +254,17 @@ //processing internal damage, temperature, air regulation, alert updates, lights power use. /obj/mecha/process() - var/internal_temp_regulation = 1 if(internal_damage) - if(internal_damage & MECHA_INT_FIRE) if(!(internal_damage & MECHA_INT_TEMP_CONTROL) && prob(5)) clearInternalDamage(MECHA_INT_FIRE) if(internal_tank) - if(internal_tank.return_pressure() > internal_tank.maximum_pressure && !(internal_damage & MECHA_INT_TANK_BREACH)) - setInternalDamage(MECHA_INT_TANK_BREACH) var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - if(int_tank_air && int_tank_air.return_volume()>0) //heat the air_contents + if(int_tank_air.return_pressure() > internal_tank.maximum_pressure && !(internal_damage & MECHA_INT_TANK_BREACH)) + setInternalDamage(MECHA_INT_TANK_BREACH) + if(int_tank_air && int_tank_air.return_volume() > 0) //heat the air_contents int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15)) if(cabin_air && cabin_air.return_volume()>0) cabin_air.temperature = min(6000+T0C, cabin_air.return_temperature()+rand(10,15)) @@ -558,7 +556,6 @@ - /////////////////////////////////// //////// Internal damage //////// /////////////////////////////////// diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 70492716193..73fabdec133 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -71,8 +71,9 @@ /obj/mecha/proc/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) . = {"[report_internal_damage()] [integrity<30?"DAMAGE LEVEL CRITICAL
":null] diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index b582c9b95cd..29cf1ed7fea 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -13,6 +13,8 @@ var/obj/item/device/assembly/signaler/anomaly/aSignal = null /obj/effect/anomaly/New() + ..() + poi_list |= src SetLuminosity(initial(luminosity)) aSignal = new(src) aSignal.code = rand(1,100) @@ -21,6 +23,9 @@ if(IsMultiple(aSignal.frequency, 2))//signaller frequencies are always uneven! aSignal.frequency++ +/obj/effect/anomaly/Destroy() + poi_list.Remove(src) + return ..() /obj/effect/anomaly/proc/anomalyEffect() if(prob(movechance)) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 5655ebdc754..e229630bb5c 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -347,12 +347,12 @@ Code: menu += "No connection
" else var/list/L = list() - for(var/obj/machinery/power/terminal/term in powmonitor.powernet.nodes) + for(var/obj/machinery/power/terminal/term in powmonitor.attached.powernet.nodes) if(istype(term.master, /obj/machinery/power/apc)) var/obj/machinery/power/apc/A = term.master L += A - menu += "
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 = {" - - - - - -

Area Air Control

- [status]
- Scan - "} - for(var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber in connectedscrubbers) - dat += {" - - - - "} - - dat += {" -
[scrubber.name]Turn On Turn Off

- [zone] - - "} - user << browse("[dat]", "window=miningshuttle;size=400x400") - status = "" - -/obj/machinery/computer/area_atmos/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - src.add_fingerprint(usr) - - - if(href_list["scan"]) - scanscrubbers() - else if(href_list["toggle"]) - var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber = locate(href_list["scrub"]) - - if(!validscrubber(scrubber)) - spawn(20) - status = "ERROR: Couldn't connect to scrubber! (timeout)" - connectedscrubbers -= scrubber - src.updateUsrDialog() - return - - scrubber.on = text2num(href_list["toggle"]) - scrubber.update_icon() - -/obj/machinery/computer/area_atmos/proc/validscrubber( obj/machinery/portable_atmospherics/scrubber/huge/scrubber ) - if(!isobj(scrubber) || get_dist(scrubber.loc, src.loc) > src.range || scrubber.loc.z != src.loc.z) - return 0 - - return 1 - -/obj/machinery/computer/area_atmos/proc/scanscrubbers() - connectedscrubbers = new() - - var/found = 0 - for(var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber in ultra_range(range, src.loc)) - if(istype(scrubber)) - found = 1 - connectedscrubbers += scrubber - - if(!found) - status = "ERROR: No scrubber found!" - - src.updateUsrDialog() - - -/obj/machinery/computer/area_atmos/area - zone = "This computer is working in a wired network limited to this area." - - validscrubber( obj/machinery/portable_atmospherics/scrubber/huge/scrubber ) - if(!isobj(scrubber)) - return 0 - - /* - wow this is stupid, someone help me - */ - var/turf/T_src = get_turf(src) - if(!T_src.loc) return 0 - var/area/A_src = T_src.loc - if (A_src.master) - A_src = A_src.master - - var/turf/T_scrub = get_turf(scrubber) - if(!T_scrub.loc) return 0 - var/area/A_scrub = T_scrub.loc - if (A_scrub.master) - A_scrub = A_scrub.master - - if(A_scrub != A_src) - return 0 - - return 1 - -/obj/machinery/computer/area_atmos/area/scanscrubbers() - connectedscrubbers = new() - - var/found = 0 - - var/turf/T = get_turf(src) - if(!T.loc) return - var/area/A = T.loc - if (A.master) - A = A.master - for(var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber in machines ) - var/turf/T2 = get_turf(scrubber) - if(T2 && T2.loc) - var/area/A2 = T2.loc - if(istype(A2) && A2.master && A2.master == A ) - connectedscrubbers += scrubber - found = 1 - - - if(!found) - status = "ERROR: No scrubber found!" - - src.updateUsrDialog() \ No newline at end of file diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 16c1e7f8468..5bef5a4ffd7 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -1,25 +1,27 @@ -#define CAN_MAX_RELEASE_PRESSURE (ONE_ATMOSPHERE*10) -#define CAN_MIN_RELEASE_PRESSURE (ONE_ATMOSPHERE/10) +#define CAN_MAX_RELEASE_PRESSURE (ONE_ATMOSPHERE * 10) +#define CAN_MIN_RELEASE_PRESSURE (ONE_ATMOSPHERE / 10) #define CAN_DEFAULT_RELEASE_PRESSURE (ONE_ATMOSPHERE) /obj/machinery/portable_atmospherics/canister name = "canister" desc = "A canister for the storage of gas." - icon = 'icons/obj/atmos.dmi' icon_state = "yellow" density = 1 - var/health = 100 - var/valve_open = 0 - var/release_pressure = ONE_ATMOSPHERE - var/canister_color = "yellow" - var/filled = 0.5 - pressure_resistance = 7*ONE_ATMOSPHERE - var/temperature_resistance = 1000 + T0C - volume = 1000 - use_power = 0 + + var/valve_open = FALSE + var/obj/machinery/atmospherics/components/binary/pump/pump var/release_log = "" - var/update_flag = 0 + + volume = 1000 + var/filled = 0.5 var/gas_type = "" + var/release_pressure = ONE_ATMOSPHERE + + var/health = 100 + pressure_resistance = 7 * ONE_ATMOSPHERE + var/temperature_resistance = 1000 + T0C + + var/update = 0 var/static/list/label2types = list( "n2" = /obj/machinery/portable_atmospherics/canister/nitrogen, "o2" = /obj/machinery/portable_atmospherics/canister/oxygen, @@ -34,25 +36,21 @@ name = "n2 canister" desc = "Nitrogen gas. Reportedly useful for something." icon_state = "red" - canister_color = "red" gas_type = "n2" /obj/machinery/portable_atmospherics/canister/oxygen name = "o2 canister" desc = "Oxygen. Necessary for human life." icon_state = "blue" - canister_color = "blue" gas_type = "o2" /obj/machinery/portable_atmospherics/canister/carbon_dioxide name = "co2 canister" desc = "Carbon dioxide. What the fuck is carbon dioxide?" icon_state = "black" - canister_color = "black" gas_type = "co2" /obj/machinery/portable_atmospherics/canister/toxins name = "plasma canister" desc = "Plasma gas. The reason YOU are here. Highly toxic." icon_state = "orange" - canister_color = "orange" gas_type = "plasma" /obj/machinery/portable_atmospherics/canister/agent_b name = "agent b canister" @@ -62,75 +60,87 @@ name = "n2o canister" desc = "Nitrous oxide gas. Known to cause drowsiness." icon_state = "redws" - canister_color = "redws" gas_type = "n2o" /obj/machinery/portable_atmospherics/canister/air name = "air canister" desc = "Pre-mixed air." icon_state = "grey" - canister_color = "grey" -/obj/machinery/portable_atmospherics/canister/proc/check_change() - var/old_flag = update_flag - update_flag = 0 - if(holding) - update_flag |= 1 - if(connected_port) - update_flag |= 2 +/obj/machinery/portable_atmospherics/canister/New(loc) + ..() + create_gas() + pump = new(src, FALSE) + pump.on = TRUE + pump.stat = 0 + pump.build_network() + update_icon() - var/tank_pressure = air_contents.return_pressure() - if(tank_pressure < 10) - update_flag |= 4 - else if(tank_pressure < ONE_ATMOSPHERE) - update_flag |= 8 - else if(tank_pressure < 15*ONE_ATMOSPHERE) - update_flag |= 16 - else - update_flag |= 32 +/obj/machinery/portable_atmospherics/canister/Destroy() + qdel(pump) + pump = null + return ..() - if(update_flag == old_flag) - return 1 - else - return 0 +/obj/machinery/portable_atmospherics/canister/proc/create_gas() + if(gas_type) + air_contents.assert_gas(gas_type) + air_contents.gases[gas_type][MOLES] = (maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) +/obj/machinery/portable_atmospherics/canister/air/create_gas() + air_contents.assert_gases("o2","n2") + air_contents.gases["o2"][MOLES] = (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) + air_contents.gases["n2"][MOLES] = (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) + +#define HOLDING 1 +#define CONNECTED 2 +#define EMPTY 4 +#define LOW 8 +#define FULL 16 +#define DANGER 32 /obj/machinery/portable_atmospherics/canister/update_icon() -/* -update_flag -1 = holding -2 = connected_port -4 = tank_pressure < 10 -8 = tank_pressure < ONE_ATMOS -16 = tank_pressure < 15*ONE_ATMOS -32 = tank_pressure go boom. -*/ - - if (destroyed) - overlays = 0 - icon_state = text("[]-1", canister_color) + if(destroyed) + overlays.Cut() + icon_state = "[initial(icon_state)]-1" return - if(icon_state != "[canister_color]") - icon_state = "[canister_color]" + var/last_update = update + update = 0 - if(check_change()) //Returns 1 if no change needed to icons. + if(holding) + update |= HOLDING + if(connected_port) + update |= CONNECTED + var/pressure = air_contents.return_pressure() + if(pressure < 10) + update |= EMPTY + else if(pressure < ONE_ATMOSPHERE) + update |= LOW + else if(pressure < 15 * ONE_ATMOSPHERE) + update |= FULL + else + update |= DANGER + + if(update == last_update) return - src.overlays = 0 - - if(update_flag & 1) + overlays.Cut() + if(update & HOLDING) overlays += "can-open" - if(update_flag & 2) + if(update & CONNECTED) overlays += "can-connector" - if(update_flag & 4) + if(update & EMPTY) overlays += "can-o0" - if(update_flag & 8) + else if(update & LOW) overlays += "can-o1" - else if(update_flag & 16) + else if(update & FULL) overlays += "can-o2" - else if(update_flag & 32) + else if(update & DANGER) overlays += "can-o3" - return - +#undef HOLDING +#undef CONNECTED +#undef EMPTY +#undef LOW +#undef FULL +#undef DANGER /obj/machinery/portable_atmospherics/canister/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > temperature_resistance) @@ -139,86 +149,47 @@ update_flag /obj/machinery/portable_atmospherics/canister/proc/healthcheck() if(destroyed) - return 1 + return - if (src.health <= 10) - var/atom/location = src.loc - location.assume_air(air_contents) + if(health <= 10) + var/turf/T = get_turf(src) + T.assume_air(air_contents) air_update_turf() - src.destroyed = 1 + destroyed = TRUE + density = 0 playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) - src.density = 0 update_icon() - investigate_log("was destroyed by heat/gunfire.", "atmos") + investigate_log("was destroyed.", "atmos") - if (src.holding) - src.holding.loc = src.loc - src.holding = null - - return 1 - else - return 1 + if(holding) + holding.loc = T + holding = null /obj/machinery/portable_atmospherics/canister/process_atmos() - if (destroyed) + if(destroyed) return PROCESS_KILL + if(!valve_open) + return - ..() + var/turf/T = get_turf(src) + pump.AIR1 = air_contents + pump.AIR2 = holding ? holding.air_contents : T.return_air() + pump.target_pressure = release_pressure - if(valve_open) - var/datum/gas_mixture/environment - if(holding) - environment = holding.air_contents - else - environment = loc.return_air() - - var/env_pressure = environment.return_pressure() - var/pressure_delta = min(release_pressure - env_pressure, (air_contents.return_pressure() - env_pressure)/2) - //Can not have a pressure delta that would cause environment pressure > tank pressure - - var/transfer_moles = 0 - if((air_contents.temperature > 0) && (pressure_delta > 0)) - transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION) - - //Actually transfer the gas - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - if(holding) - environment.merge(removed) - else - loc.assume_air(removed) - air_update_turf() - update_icon() - -/obj/machinery/portable_atmospherics/canister/process() - src.updateDialog() - return ..() - -/obj/machinery/portable_atmospherics/canister/return_air() - return air_contents - -/obj/machinery/portable_atmospherics/canister/proc/return_temperature() - var/datum/gas_mixture/GM = src.return_air() - if(GM && GM.volume>0) - return GM.temperature - return 0 - -/obj/machinery/portable_atmospherics/canister/proc/return_pressure() - var/datum/gas_mixture/GM = src.return_air() - if(GM && GM.volume>0) - return GM.return_pressure() - return 0 + pump.process_atmos() // Pump gas. + if(!holding) + air_update_turf() // Update the environment if needed. + update_icon() /obj/machinery/portable_atmospherics/canister/blob_act() - src.health -= 200 + health = 0 healthcheck() - return -/obj/machinery/portable_atmospherics/canister/bullet_act(obj/item/projectile/Proj) - if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - if(Proj.damage) - src.health -= round(Proj.damage / 2) +/obj/machinery/portable_atmospherics/canister/bullet_act(obj/item/projectile/P) + if((P.damage_type == BRUTE || P.damage_type == BURN)) + if(P.damage) + health -= round(P.damage / 2) healthcheck() ..() @@ -227,55 +198,37 @@ update_flag if(1) if(destroyed || prob(30)) qdel(src) + return else - src.health = 0 - healthcheck() - return + health = 0 if(2) if(destroyed) qdel(src) + return else - src.health -= rand(40, 100) - healthcheck() - return + health -= rand(40, 100) if(3) - src.health -= rand(15,40) - healthcheck() - return - return + health -= rand(15, 40) + healthcheck() /obj/machinery/portable_atmospherics/canister/attackby(obj/item/weapon/W, mob/user, params) if(!istype(W, /obj/item/weapon/wrench) && !istype(W, /obj/item/weapon/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda)) - investigate_log("was smacked with \a [W] by [key_name(user)]", "atmos") + investigate_log("was smacked with \a [W] by [key_name(user)].", "atmos") health -= W.force add_fingerprint(user) healthcheck() - - if(istype(user, /mob/living/silicon/robot) && istype(W, /obj/item/weapon/tank/jetpack)) - var/datum/gas_mixture/thejetpack = W:air_contents - var/env_pressure = thejetpack.return_pressure() - var/pressure_delta = min(10*ONE_ATMOSPHERE - env_pressure, (air_contents.return_pressure() - env_pressure)/2) - //Can not have a pressure delta that would cause environment pressure > tank pressure - var/transfer_moles = 0 - if((air_contents.temperature > 0) && (pressure_delta > 0)) - transfer_moles = pressure_delta*thejetpack.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)//Actually transfer the gas - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - thejetpack.merge(removed) - user << "You pulse-pressurize your jetpack from the tank." - return - - ..() + else + ..() /obj/machinery/portable_atmospherics/canister/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) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "canister", name, 415, 405, master_ui, state) + ui = new(user, src, ui_key, "canister", name, 420, 405, master_ui, state) ui.open() -/obj/machinery/portable_atmospherics/canister/get_ui_data() +/obj/machinery/portable_atmospherics/canister/ui_data() var/data = list() - data["name"] = name data["portConnected"] = connected_port ? 1 : 0 data["tankPressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) data["releasePressure"] = round(release_pressure ? release_pressure : 0) @@ -302,7 +255,6 @@ update_flag if(newtype) var/obj/machinery/portable_atmospherics/canister/replacement = new newtype(loc) replacement.air_contents.copy_from(air_contents) - replacement.update_icon() replacement.interact(usr) qdel(src) if("pressure") @@ -325,7 +277,7 @@ update_flag . = TRUE if(.) release_pressure = Clamp(round(pressure), CAN_MIN_RELEASE_PRESSURE, CAN_MAX_RELEASE_PRESSURE) - investigate_log("was set to [release_pressure] kPa by [key_name(usr)]", "atmos") + investigate_log("was set to [release_pressure] kPa by [key_name(usr)].", "atmos") if("valve") var/logmsg valve_open = !valve_open @@ -346,25 +298,7 @@ update_flag if(holding) if(valve_open) investigate_log("[key_name(usr)] removed the [holding], leaving the valve open and transfering into the air
", "atmos") - holding.loc = loc + holding.loc = get_turf(src) holding = null . = TRUE update_icon() - -/obj/machinery/portable_atmospherics/canister/New(loc) - ..() - - create_gas() - update_icon() - return 1 - -/obj/machinery/portable_atmospherics/canister/proc/create_gas() - if(gas_type) - air_contents.assert_gas(gas_type) - air_contents.gases[gas_type][MOLES] = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature) - -/obj/machinery/portable_atmospherics/canister/air/create_gas() - air_contents.assert_gases("o2","n2") - // PV = nRT - air_contents.gases["o2"][MOLES] = (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) - air_contents.gases["n2"][MOLES] = (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index fe5877a467b..56d3c867675 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -1,16 +1,16 @@ /obj/machinery/portable_atmospherics - name = "atmoalter" + name = "portable_atmospherics" + icon = 'icons/obj/atmos.dmi' use_power = 0 - var/datum/gas_mixture/air_contents = new + var/datum/gas_mixture/air_contents = new var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port var/obj/item/weapon/tank/holding var/volume = 0 var/destroyed = 0 - var/maximum_pressure = 90*ONE_ATMOSPHERE - var/lastupdate = 0 + var/maximum_pressure = 90 * ONE_ATMOSPHERE /obj/machinery/portable_atmospherics/New() ..() @@ -20,20 +20,19 @@ return 1 /obj/machinery/portable_atmospherics/process_atmos() - if(!connected_port) //only react when pipe_network will not it do it for you - //Allow for reactions + if(!connected_port) // Pipe network handles reactions if connected. air_contents.react() else update_icon() -/obj/machinery/portable_atmospherics/process() - return + /obj/machinery/portable_atmospherics/Destroy() qdel(air_contents) + air_contents = null SSair.atmos_machinery -= src return ..() -/obj/machinery/portable_atmospherics/update_icon() - return null +/obj/machinery/portable_atmospherics/return_air() + return air_contents /obj/machinery/portable_atmospherics/proc/connect(obj/machinery/atmospherics/components/unary/portables_connector/new_port) //Make sure not already connected to something else @@ -65,19 +64,14 @@ return air_contents /obj/machinery/portable_atmospherics/attackby(obj/item/weapon/W, mob/user, params) - if ((istype(W, /obj/item/weapon/tank) && !( src.destroyed ))) - if (src.holding) - return - if(!user.drop_item()) - return - + if((istype(W, /obj/item/weapon/tank) && !destroyed)) var/obj/item/weapon/tank/T = W + if(holding || !user.drop_item()) + return T.loc = src - src.holding = T + holding = T update_icon() - return - - else if (istype(W, /obj/item/weapon/wrench)) + else if(istype(W, /obj/item/weapon/wrench)) if(connected_port) disconnect() playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) @@ -89,24 +83,19 @@ return else var/obj/machinery/atmospherics/components/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/components/unary/portables_connector) in loc - if(possible_port) - if(connect(possible_port)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user.visible_message( \ - "[user] connects [src].", \ - "You fasten [src] to the port.", \ - "You hear a ratchet.") - update_icon() - return - else - user << "[name] failed to connect to the port." - return - else + if(!possible_port) user << "Nothing happens." return - - else if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) + if(!connect(possible_port)) + user << "[name] failed to connect to the port." + return + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user.visible_message( \ + "[user] connects [src].", \ + "You fasten [src] to the port.", \ + "You hear a ratchet.") + update_icon() + else if((istype(W, /obj/item/device/analyzer)) && Adjacent(user)) atmosanalyzer_scan(air_contents, user) - else ..() \ No newline at end of file diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 3602982dbca..2c9d8b93510 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -1,157 +1,139 @@ +#define PUMP_OUT "out" +#define PUMP_IN "in" +#define PUMP_MAX_PRESSURE (ONE_ATMOSPHERE * 10) +#define PUMP_MIN_PRESSURE (ONE_ATMOSPHERE / 10) +#define PUMP_DEFAULT_PRESSURE (ONE_ATMOSPHERE) + /obj/machinery/portable_atmospherics/pump name = "portable air pump" - - icon = 'icons/obj/atmos.dmi' icon_state = "psiphon:0" density = 1 - var/on = 0 - var/direction_out = 0 //0 = siphoning, 1 = releasing - var/target_pressure = 100 + var/on = FALSE + var/direction = PUMP_OUT + var/obj/machinery/atmospherics/components/binary/pump/pump volume = 1000 +/obj/machinery/portable_atmospherics/pump/New() + ..() + pump = new(src, FALSE) + pump.on = TRUE + pump.stat = 0 + pump.build_network() + +/obj/machinery/portable_atmospherics/pump/Destroy() + var/turf/T = get_turf(src) + T.assume_air(air_contents) + air_update_turf() + qdel(pump) + pump = null + return ..() + /obj/machinery/portable_atmospherics/pump/update_icon() - src.overlays = 0 - - if(on) - icon_state = "psiphon:1" - else - icon_state = "psiphon:0" + icon_state = "psiphon:[on]" + overlays.Cut() if(holding) overlays += "siphon-open" - if(connected_port) overlays += "siphon-connector" - return - -/obj/machinery/portable_atmospherics/pump/emp_act(severity) - if(stat & (BROKEN|NOPOWER)) - ..(severity) - return - - if(prob(50/severity)) - on = !on - - if(prob(100/severity)) - direction_out = !direction_out - - target_pressure = rand(0,1300) - update_icon() - - ..(severity) - /obj/machinery/portable_atmospherics/pump/process_atmos() ..() - if(on) - var/datum/gas_mixture/environment - if(holding) - environment = holding.air_contents - else - environment = loc.return_air() - if(direction_out) - var/pressure_delta = target_pressure - environment.return_pressure() - //Can not have a pressure delta that would cause environment pressure > tank pressure + if(!on) + return - var/transfer_moles = 0 - if(air_contents.temperature > 0) - transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION) + var/turf/T = get_turf(src) + if(direction == PUMP_OUT) // Hook up the internal pump. + pump.AIR1 = holding ? holding.air_contents : air_contents + pump.AIR2 = holding ? air_contents : T.return_air() + else + pump.AIR1 = holding ? air_contents : T.return_air() + pump.AIR2 = holding ? holding.air_contents : air_contents - //Actually transfer the gas - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) + pump.process_atmos() // Pump gas. + if(!holding) + air_update_turf() // Update the environment if needed. - if(holding) - environment.merge(removed) - else - loc.assume_air(removed) - air_update_turf() - else - var/pressure_delta = target_pressure - air_contents.return_pressure() - //Can not have a pressure delta that would cause environment pressure > tank pressure - - var/transfer_moles = 0 - if(environment.temperature > 0) - transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) - - //Actually transfer the gas - var/datum/gas_mixture/removed - if(holding) - removed = environment.remove(transfer_moles) - else - removed = loc.remove_air(transfer_moles) - air_update_turf() - - air_contents.merge(removed) - //src.update_icon() -/obj/machinery/portable_atmospherics/pump/process() +/obj/machinery/portable_atmospherics/pump/emp_act(severity) + if(is_operational()) + if(prob(50 / severity)) + on = !on + if(prob(100 / severity)) + direction = PUMP_OUT + pump.target_pressure = rand(0, 100 * ONE_ATMOSPHERE) + update_icon() ..() - src.updateDialog() - return -/obj/machinery/portable_atmospherics/pump/return_air() - return air_contents -/obj/machinery/portable_atmospherics/pump/attack_ai(mob/user) - return src.attack_hand(user) +/obj/machinery/portable_atmospherics/pump/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) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "portable_pump", name, 420, 415, master_ui, state) + ui.open() -/obj/machinery/portable_atmospherics/pump/attack_paw(mob/user) - return src.attack_hand(user) - -/obj/machinery/portable_atmospherics/pump/attack_hand(mob/user) - - user.set_machine(src) - var/holding_text +/obj/machinery/portable_atmospherics/pump/ui_data() + var/data = list() + data["on"] = on + data["direction"] = direction + data["connected"] = connected_port ? 1 : 0 + data["pressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) + data["target_pressure"] = round(pump.target_pressure ? pump.target_pressure : 0) + data["default_pressure"] = round(PUMP_DEFAULT_PRESSURE) + data["min_pressure"] = round(PUMP_MIN_PRESSURE) + data["max_pressure"] = round(PUMP_MAX_PRESSURE) if(holding) - holding_text = {"
Tank Pressure: [holding.air_contents.return_pressure()] KPa
-Remove Tank
-"} - var/output_text = {"[name]
-Pressure: [air_contents.return_pressure()] KPa
-Port Status: [(connected_port)?("Connected"):("Disconnected")] -[holding_text] -
-Power Switch: [on?("On"):("Off")]
-Pump Direction: [direction_out?("Out"):("In")]
-Target Pressure: - - - - [target_pressure] + + + +
-
-Close
-"} + data["holding"] = list() + data["holding"]["name"] = holding.name + data["holding"]["pressure"] = round(holding.air_contents.return_pressure()) + return data - user << browse(output_text, "window=pump;size=600x300") - onclose(user, "pump") - - return - -/obj/machinery/portable_atmospherics/pump/Topic(href, href_list) - ..() - if (usr.stat || usr.restrained()) +/obj/machinery/portable_atmospherics/pump/ui_act(action, params) + if(..()) return - - if (((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) - usr.set_machine(src) - - if(href_list["power"]) + switch(action) + if("power") on = !on - - if(href_list["direction"]) - direction_out = !direction_out - - if (href_list["remove_tank"]) + if(on && !holding) + var/plasma = air_contents.gases["plasma"] + var/n2o = air_contents.gases["n2o"] + if(n2o || plasma) + message_admins("[key_name_admin(usr)] (?) (FLW) turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""]! (JMP)") + log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [x], [y], [z]") + . = TRUE + if("direction") + if(direction == PUMP_OUT) + direction = PUMP_IN + else + direction = PUMP_OUT + . = TRUE + if("pressure") + var/pressure = params["pressure"] + if(pressure == "reset") + pressure = PUMP_DEFAULT_PRESSURE + . = TRUE + else if(pressure == "min") + pressure = PUMP_MIN_PRESSURE + . = TRUE + else if(pressure == "max") + pressure = PUMP_MAX_PRESSURE + . = TRUE + else if(pressure == "input") + pressure = input("New release pressure ([PUMP_MIN_PRESSURE]-[PUMP_MAX_PRESSURE] kPa):", name, pump.target_pressure) as num|null + if(!isnull(pressure) && !..()) + . = TRUE + else if(text2num(pressure) != null) + pressure = text2num(pressure) + . = TRUE + if(.) + pump.target_pressure = Clamp(round(pressure), PUMP_MIN_PRESSURE, PUMP_MAX_PRESSURE) + investigate_log("was set to [pump.target_pressure] kPa by [key_name(usr)].", "atmos") + if("eject") if(holding) - holding.loc = loc + holding.loc = get_turf(src) holding = null - - if (href_list["pressure_adj"]) - var/diff = text2num(href_list["pressure_adj"]) - target_pressure = min(10*ONE_ATMOSPHERE, max(0, target_pressure+diff)) - - src.updateUsrDialog() - src.add_fingerprint(usr) - update_icon() - else - usr << browse(null, "window=pump") - return - return \ No newline at end of file + . = TRUE + update_icon() \ No newline at end of file diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index d69288b5d95..9a0bcdde173 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -1,214 +1,134 @@ /obj/machinery/portable_atmospherics/scrubber name = "portable air scrubber" - - icon = 'icons/obj/atmos.dmi' icon_state = "pscrubber:0" density = 1 - var/on = 0 - var/volume_rate = 800 - var/widenet = 0 //is this scrubber acting on the 3x3 area around it. + var/on = FALSE + var/volume_rate = 1000 + volume = 1000 - volume = 750 - - var/list/gases_to_scrub = list("plasma", "co2", "agent_b", "n2o") //datum var so we can VV it and maybe even change it in the future - - - -/obj/machinery/portable_atmospherics/scrubber/emp_act(severity) - if(stat & (BROKEN|NOPOWER)) - ..(severity) - return - - if(prob(50/severity)) - on = !on - update_icon() - - ..(severity) + var/list/scrubbing = list("plasma", "co2", "n2o", "agent_b") +/obj/machinery/portable_atmospherics/scrubber/Destroy() + var/turf/T = get_turf(src) + T.assume_air(air_contents) + air_update_turf() + return ..() /obj/machinery/portable_atmospherics/scrubber/update_icon() - src.overlays = 0 - - if(on) - icon_state = "pscrubber:1" - else - icon_state = "pscrubber:0" + icon_state = "pscrubber:[on]" + overlays.Cut() if(holding) overlays += "scrubber-open" - if(connected_port) overlays += "scrubber-connector" - return - /obj/machinery/portable_atmospherics/scrubber/process_atmos() - ..() - if(!on) return - scrub(loc) - if (widenet) - var/turf/T = loc - if (istype(T)) - for (var/turf/simulated/tile in T.GetAtmosAdjacentTurfs(alldir=1)) - scrub(tile) - -/obj/machinery/portable_atmospherics/scrubber/proc/scrub(var/turf/simulated/tile) - var/datum/gas_mixture/environment if(holding) - environment = holding.air_contents + scrub(holding.air_contents) else - environment = tile.return_air() - var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles() + var/turf/T = get_turf(src) + scrub(T.return_air()) - //Take a gas sample - var/datum/gas_mixture/removed - if(holding) - removed = environment.remove(transfer_moles) - else - removed = tile.remove_air(transfer_moles) +/obj/machinery/portable_atmospherics/scrubber/proc/scrub(var/datum/gas_mixture/mixture) + var/transfer_moles = min(1, volume_rate / mixture.volume) * mixture.total_moles() - //Filter it - if (removed) - var/datum/gas_mixture/filtered_out = new - var/list/filtered_gases = filtered_out.gases - var/list/removed_gases = removed.gases - - for(var/id in removed_gases & gases_to_scrub) - filtered_out.assert_gas(id) - filtered_gases[id][MOLES] = removed_gases[id][MOLES] - removed_gases[id][MOLES] = 0 - - filtered_out.temperature = removed.temperature - removed.garbage_collect() - - //Remix the resulting gases - air_contents.merge(filtered_out) - - if(holding) - environment.merge(removed) - else - tile.assume_air(removed) - tile.air_update_turf() - -/obj/machinery/portable_atmospherics/scrubber/process() - ..() - src.updateDialog() - return - -/obj/machinery/portable_atmospherics/scrubber/return_air() - return air_contents - -/obj/machinery/portable_atmospherics/scrubber/attack_ai(mob/user) - return src.attack_hand(user) - -/obj/machinery/portable_atmospherics/scrubber/attack_paw(mob/user) - return src.attack_hand(user) - -/obj/machinery/portable_atmospherics/scrubber/attack_hand(mob/user) - - user.set_machine(src) - var/holding_text - - if(holding) - holding_text = {"
Tank Pressure: [holding.air_contents.return_pressure()] KPa
-Remove Tank
-"} - var/output_text = {"[name]
-Pressure: [air_contents.return_pressure()] KPa
-Port Status: [(connected_port)?("Connected"):("Disconnected")] -[holding_text] -
-Power Switch: [on?("On"):("Off")]
-Power regulator: - - - - [volume_rate] + + + +
- -
-Close
-"} - - user << browse(output_text, "window=scrubber;size=600x300") - onclose(user, "scrubber") - return - -/obj/machinery/portable_atmospherics/scrubber/Topic(href, href_list) - ..() - if (usr.stat || usr.restrained()) + var/datum/gas_mixture/filtering = mixture.remove(transfer_moles) // Remove part of the mixture to filter. + var/datum/gas_mixture/filtered = new + if(!filtering) return - if (((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) - usr.set_machine(src) + filtered.temperature = filtering.temperature + for(var/gas in filtering.gases & scrubbing) + filtered.assert_gas(gas) + filtered.gases[gas][MOLES] = filtering.gases[gas][MOLES] // Shuffle the "bad" gasses to the filtered mixture. + filtering.gases[gas][MOLES] = 0 + filtering.garbage_collect() // Now that the gasses are set to 0, clean up the mixture. - if(href_list["power"]) + air_contents.merge(filtered) // Store filtered out gasses. + mixture.merge(filtering) // Returned the cleaned gas. + if(!holding) + air_update_turf() + +/obj/machinery/portable_atmospherics/scrubber/emp_act(severity) + if(is_operational()) + if(prob(50 / severity)) on = !on - - if (href_list["remove_tank"]) - if(holding) - holding.loc = loc - holding = null - - if (href_list["volume_adj"]) - var/diff = text2num(href_list["volume_adj"]) - volume_rate = min(10*ONE_ATMOSPHERE, max(0, volume_rate+diff)) - - src.updateUsrDialog() - src.add_fingerprint(usr) update_icon() - else - usr << browse(null, "window=scrubber") + ..() + +/obj/machinery/portable_atmospherics/scrubber/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) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "portable_scrubber", name, 420, 335, master_ui, state) + ui.open() + +/obj/machinery/portable_atmospherics/scrubber/ui_data() + var/data = list() + data["on"] = on + data["connected"] = connected_port ? 1 : 0 + data["pressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) + + if(holding) + data["holding"] = list() + data["holding"]["name"] = holding.name + data["holding"]["pressure"] = round(holding.air_contents.return_pressure()) + return data + +/obj/machinery/portable_atmospherics/scrubber/ui_act(action, params) + if(..()) return - return - - + switch(action) + if("power") + on = !on + . = TRUE + if("eject") + if(holding) + holding.loc = get_turf(src) + holding = null + . = TRUE + update_icon() /obj/machinery/portable_atmospherics/scrubber/huge name = "huge air scrubber" icon_state = "scrubber:0" - anchored = 1 + anchored = TRUE + active_power_usage = 500 + idle_power_usage = 10 + + volume_rate = 1500 volume = 50000 - widenet = 1 - var/static/gid = 1 - var/id = 0 - var/stationary = 0 + var/movable = FALSE -/obj/machinery/portable_atmospherics/scrubber/huge/New() - ..() - id = gid - gid++ - - name = "[name] (ID [id])" - -/obj/machinery/portable_atmospherics/scrubber/huge/attack_hand(var/mob/user as mob) - usr << "You can't directly interact with this machine! Use the area atmos computer." +/obj/machinery/portable_atmospherics/scrubber/huge/movable + movable = TRUE /obj/machinery/portable_atmospherics/scrubber/huge/update_icon() - src.overlays = 0 + icon_state = "scrubber:[on]" - if(on) - icon_state = "scrubber:1" - else - icon_state = "scrubber:0" +/obj/machinery/portable_atmospherics/scrubber/huge/process_atmos() + if((!anchored && !movable) || !is_operational()) + on = FALSE + update_icon() + use_power = 1 + on + if(!on) + return + + ..() + if(!holding) + var/turf/T = get_turf(src) + for(var/turf/simulated/AT in T.GetAtmosAdjacentTurfs(alldir = TRUE)) + scrub(AT.return_air()) /obj/machinery/portable_atmospherics/scrubber/huge/attackby(obj/item/weapon/W, mob/user) - if(istype(W, /obj/item/weapon/wrench)) - if(stationary) - user << "The bolts are too tight for you to unscrew!" - return - if(on) - user << "Turn it off first!" - return - - anchored = !anchored - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "You [anchored ? "wrench" : "unwrench"] \the [src]." - - else if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) - atmosanalyzer_scan(air_contents, user) - - -/obj/machinery/portable_atmospherics/scrubber/huge/stationary - name = "stationary air scrubber" - stationary = 0 + if(default_unfasten_wrench(user, W)) + if(!movable) + on = FALSE + else + ..() diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm index a33123bbd7a..f6a29a2f3ac 100644 --- a/code/modules/awaymissions/maploader/reader.dm +++ b/code/modules/awaymissions/maploader/reader.dm @@ -151,7 +151,7 @@ var/global/dmm_suite/preloader/_preloader = null var/variables_start = findtext(full_def,"{") if(variables_start)//if there's any variable full_def = copytext(full_def,variables_start+1,length(full_def))//removing the last '}' - fields = text2list(full_def,";") + fields = readlist(full_def, ";") //then fill the members_attributes list with the corresponding variables members_attributes.len++ @@ -258,7 +258,7 @@ var/global/dmm_suite/preloader/_preloader = null //build a list from variables in text form (e.g {var1="derp"; var2; var3=7} => list(var1="derp", var2, var3=7)) //return the filled list -/dmm_suite/proc/text2list(text as text,delimiter=",") +/dmm_suite/proc/readlist(text as text, delimiter=",") var/list/to_return = list() @@ -292,7 +292,7 @@ var/global/dmm_suite/preloader/_preloader = null //Check for list else if(copytext(trim_right,1,5) == "list") - trim_right = text2list(copytext(trim_right,6,length(trim_right))) + trim_right = readlist(copytext(trim_right,6,length(trim_right))) //Check for file else if(copytext(trim_right,1,2) == "'") diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm new file mode 100644 index 00000000000..65bc46f890e --- /dev/null +++ b/code/modules/cargo/console.dm @@ -0,0 +1,181 @@ +/obj/machinery/computer/cargo + name = "supply console" + desc = "Used to order supplies, approve requests, and control the shuttle." + icon_screen = "supply" + circuit = /obj/item/weapon/circuitboard/cargo + var/requestonly = FALSE + var/contraband = FALSE + +/obj/machinery/computer/cargo/request + name = "supply request console" + desc = "Used to request supplies from cargo." + icon_screen = "request" + circuit = /obj/item/weapon/circuitboard/cargo/request + requestonly = TRUE + +/obj/machinery/computer/cargo/New() + ..() + var/obj/item/weapon/circuitboard/cargo/board = circuit + contraband = board.contraband + +/obj/machinery/computer/cargo/emag_act(mob/user) + if(!emagged) + user << "Special supplies unlocked." + emagged = TRUE + +/obj/machinery/computer/cargo/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, "cargo", name, 1000, 800, master_ui, state) + ui.open() + +/obj/machinery/computer/cargo/ui_data() + var/list/data = list() + data["requestonly"] = requestonly + data["location"] = SSshuttle.supply.getStatusText() + data["points"] = SSshuttle.points + data["away"] = SSshuttle.supply.getDockedId() == "supply_away" + data["docked"] = SSshuttle.supply.mode == SHUTTLE_IDLE + data["loan"] = !!SSshuttle.shuttle_loan + data["loan_dispatched"] = SSshuttle.shuttle_loan && SSshuttle.shuttle_loan.dispatched + data["message"] = SSshuttle.centcom_message || "Remember to stamp and send back the supply manifests." + + var/list/supplies = list() + supplies.len = all_supply_groups.len + for(var/group in all_supply_groups) + supplies[group] = list( + "name" = get_supply_group_name(group), + "packs" = list() + ) + for(var/pack in SSshuttle.supply_packs) + var/datum/supply_packs/P = SSshuttle.supply_packs[pack] + if((P.hidden && !emagged) || (P.contraband && !contraband)) + continue + supplies[P.group]["packs"] += list(list( + "name" = P.name, + "cost" = P.cost, + "id" = pack + )) + data["supplies"] = supplies + + data["cart"] = list() + for(var/datum/supply_order/SO in SSshuttle.shoppinglist) + data["cart"] += list(list( + "object" = SO.object.name, + "cost" = SO.object.cost, + "id" = SO.ordernum + )) + + data["requests"] = list() + for(var/datum/supply_order/SO in SSshuttle.requestlist) + data["requests"] += list(list( + "object" = SO.object.name, + "cost" = SO.object.cost, + "orderedby" = SO.orderedby, + "comment" = SO.comment, + "id" = SO.ordernum + )) + + return data + +/obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui) + if(..()) + return + if(action != "add" && requestonly) + return + switch(action) + if("send") + if(SSshuttle.supply.canMove()) + say("For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.") + return + if(SSshuttle.supply.getDockedId() == "supply_home") + SSshuttle.moveShuttle("supply", "supply_away", TRUE) + say("The supply shuttle has departed.") + investigate_log("[key_name(usr)] has sent the supply shuttle away. Points: [SSshuttle.points]. Contents: [SSshuttle.sold_atoms].", "cargo") + else + investigate_log("[key_name(usr)] has called the supply shuttle. Points: [SSshuttle.points].", "cargo") // TODO: more robust logging here + say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.") + SSshuttle.moveShuttle("supply", "supply_home", TRUE) + . = TRUE + if("loan") + if(!SSshuttle.shuttle_loan) + return + else if(SSshuttle.supply.mode == SHUTTLE_IDLE) + SSshuttle.shuttle_loan.loan_shuttle() + say("The supply shuttle has been loaned to Centcom.") + . = TRUE + if("add") + var/id = params["id"] + if(!SSshuttle.supply_packs[id]) + return + + var/name = "*None Provided*" + var/rank = "*None Provided*" + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + name = H.get_authentification_name() + rank = H.get_assignment() + else if(issilicon(usr)) + name = usr.real_name + rank = "Silicon" + + var/reason = "" + if(requestonly) + reason = input("Reason:", name, "") as text|null + if(isnull(reason) || ..()) + return + + var/turf/T = get_turf(src) + var/datum/supply_order/SO = SSshuttle.generateSupplyOrder(id, name, rank, reason) + SO.generateRequisition(T) + if(requestonly) + SSshuttle.requestlist += SO + else + SSshuttle.shoppinglist += SO + . = TRUE + if("remove") + var/id = text2num(params["id"]) + for(var/datum/supply_order/SO in SSshuttle.shoppinglist) + if(SO.ordernum == id) + SSshuttle.shoppinglist -= SO + . = TRUE + break + if("clear") + SSshuttle.shoppinglist.Cut() + . = TRUE + if("approve") + var/id = text2num(params["id"]) + for(var/datum/supply_order/SO in SSshuttle.requestlist) + if(SO.ordernum == id) + SSshuttle.requestlist -= SO + SSshuttle.shoppinglist += SO + . = TRUE + break + if("deny") + var/id = text2num(params["id"]) + for(var/datum/supply_order/SO in SSshuttle.requestlist) + if(SO.ordernum == id) + SSshuttle.requestlist -= SO + . = TRUE + break + if("denyall") + SSshuttle.requestlist.Cut() + . = TRUE + if(.) + post_signal("supply") + +/obj/machinery/computer/cargo/proc/post_signal(command) + + var/datum/radio_frequency/frequency = SSradio.return_frequency(1435) + + if(!frequency) + return + + var/datum/signal/status_signal = new + status_signal.source = src + status_signal.transmission_method = 1 + status_signal.data["command"] = command + + frequency.post_signal(src, status_signal) + diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm new file mode 100644 index 00000000000..3dff08e2173 --- /dev/null +++ b/code/modules/cargo/order.dm @@ -0,0 +1,121 @@ + +/datum/supply_order + var/ordernum + var/datum/supply_packs/object = null + var/orderedby = null + var/orderedbyRank + var/comment = null + +/datum/supply_order/proc/generateRequisition(atom/_loc) + if(!object) + return + + var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(_loc) + reqform.name = "requisition form - [object.name]" + reqform.info += "

[station_name] Supply Requisition Form


" + reqform.info += "INDEX: #[ordernum]
" + reqform.info += "REQUESTED BY: [orderedby]
" + reqform.info += "RANK: [orderedbyRank]
" + reqform.info += "REASON: [comment]
" + reqform.info += "SUPPLY CRATE TYPE: [object.name]
" + reqform.info += "ACCESS RESTRICTION: [get_access_desc(object.access)]
" + reqform.info += "CONTENTS:
" + reqform.info += object.manifest + reqform.info += "
" + reqform.info += "STAMP BELOW TO APPROVE THIS REQUISITION:
" + + reqform.update_icon() //Fix for appearing blank when printed. + + return reqform + +/datum/supply_order/proc/createObject(atom/_loc, errors=0) + if(!object) + return + + //create the crate + var/atom/Crate = new object.containertype(_loc) + Crate.name = "[object.containername] [comment ? "([comment])":"" ]" + if(object.access) + Crate:req_access = list(text2num(object.access)) + + //create the manifest slip + var/obj/item/weapon/paper/manifest/slip = new /obj/item/weapon/paper/manifest() + slip.erroneous = errors + slip.points = object.cost + slip.ordernumber = ordernum + + var/stationName = (errors & MANIFEST_ERROR_NAME) ? new_station_name() : station_name() + var/packagesAmt = SSshuttle.shoppinglist.len + ((errors & MANIFEST_ERROR_COUNT) ? rand(1,2) : 0) + + slip.info = "

[command_name()] Shipping Manifest



" + slip.info +="Order #[ordernum]
" + slip.info +="Destination: [stationName]
" + slip.info +="[packagesAmt] PACKAGES IN THIS SHIPMENT
" + slip.info +="CONTENTS:
    " + + //we now create the actual contents + var/list/contains + if(istype(object, /datum/supply_packs/misc/randomised)) + var/datum/supply_packs/misc/randomised/SO = object + contains = list() + if(object.contains.len) + for(var/j=1, j<=SO.num_contained, j++) + contains += pick(object.contains) + else + contains = object.contains + + for(var/typepath in contains) + if(!typepath) + continue + var/atom/A = new typepath(Crate) + if(object.amount && A.vars.Find("amount") && A:amount) + A:amount = object.amount + slip.info += "
  • [A.name]
  • " //add the item to the manifest (even if it was misplaced) + + if(istype(Crate, /obj/structure/closet/critter)) // critter crates do not actually spawn mobs yet and have no contains var, but the manifest still needs to list them + var/obj/structure/closet/critter/CritCrate = Crate + if(CritCrate.content_mob) + var/mob/crittername = CritCrate.content_mob + slip.info += "
  • [initial(crittername.name)]
  • " + + if((errors & MANIFEST_ERROR_ITEM)) + //secure and large crates cannot lose items + if(findtext("[object.containertype]", "/secure/") || findtext("[object.containertype]","/largecrate/")) + errors &= ~MANIFEST_ERROR_ITEM + else + var/lostAmt = max(round(Crate.contents.len/10), 1) + //lose some of the items + while(--lostAmt >= 0) + qdel(pick(Crate.contents)) + + //manifest finalisation + slip.info += "

" + slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
" // And now this is actually meaningful. + slip.loc = Crate + if(istype(Crate, /obj/structure/closet/crate)) + var/obj/structure/closet/crate/CR = Crate + CR.manifest = slip + CR.update_icon() + if(istype(Crate, /obj/structure/largecrate)) + var/obj/structure/largecrate/LC = Crate + LC.manifest = slip + LC.update_icon() + + return Crate + +/datum/subsystem/shuttle/proc/generateSupplyOrder(packId, _orderedby, _orderedbyRank, _comment) + if(!packId) + return + var/datum/supply_packs/P = supply_packs[packId] + if(!P) + return + + var/datum/supply_order/O = new() + O.ordernum = ordernum++ + O.object = P + O.orderedby = _orderedby + O.orderedbyRank = _orderedbyRank + O.comment = _comment + + return O + diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 4018207c10b..452e6077172 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -201,12 +201,12 @@ var/next_external_rsc = 0 else winset(src, "infowindow.changelog", "font-style=bold") - if (ckey in clientmessages) - for (var/message in clientmessages[ckey]) + if(ckey in clientmessages) + for(var/message in clientmessages[ckey]) src << message clientmessages.Remove(ckey) - if (config && config.autoconvert_notes) + if(config && config.autoconvert_notes) convert_notes_sql(ckey) if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them. diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 8c5bc9d7683..debbc249b61 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -27,6 +27,7 @@ var/list/preferences_datums = list() var/UI_style = "Midnight" + var/hotkeys = FALSE var/tgui_fancy = TRUE var/tgui_lock = TRUE var/toggles = TOGGLES_DEFAULT @@ -328,6 +329,7 @@ var/list/preferences_datums = list() dat += "
" 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 = "
Scanner Report


" - 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("
[dat]
") + popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + +/obj/machinery/computer/shuttle/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + src.add_fingerprint(usr) + if(!allowed(usr)) + usr << "Access denied." + return + + if(href_list["move"]) + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + if(M.launch_status == ENDGAME_LAUNCHED) + usr << "You've already escaped. Never going back to that place again!" + return + if(no_destination_swap) + if(M.mode != SHUTTLE_IDLE) + usr << "Shuttle already in transit." + return + switch(SSshuttle.moveShuttle(shuttleId, href_list["move"], 1)) + if(0) + usr << "Shuttle received message and will be sent shortly." + if(1) + usr << "Invalid shuttle requested." + else + usr << "Unable to comply." + +/obj/machinery/computer/shuttle/emag_act(mob/user) + if(!emagged) + src.req_access = list() + emagged = 1 + user << "You fried the consoles ID checking system." + diff --git a/code/game/machinery/computer/shuttle.dm b/code/modules/shuttle/emergency.dm similarity index 72% rename from code/game/machinery/computer/shuttle.dm rename to code/modules/shuttle/emergency.dm index 10c1af8d7a6..f3da90aae59 100644 --- a/code/game/machinery/computer/shuttle.dm +++ b/code/modules/shuttle/emergency.dm @@ -73,44 +73,4 @@ log_game("[key_name(user)] has emagged the emergency shuttle in ([x],[y],[z]) [time] seconds before launch.") minor_announce("The emergency shuttle will launch in 10 seconds", "SYSTEM ERROR:",null,1) SSshuttle.emergency.setTimer(100) - emagged = 1 - -/obj/machinery/computer/supplycomp - name = "supply shuttle console" - desc = "Used to order supplies." - icon_screen = "supply" - req_access = list(access_cargo) - circuit = /obj/item/weapon/circuitboard/supplycomp - verb_say = "flashes" - verb_ask = "flashes" - verb_exclaim = "flashes" - var/temp = null - var/reqtime = 0 //Cooldown for requisitions - Quarxink - var/hacked = 0 - var/can_order_contraband = 0 - var/last_viewed_group = "categories" - -/obj/machinery/computer/supplycomp/New() - ..() - - var/obj/item/weapon/circuitboard/supplycomp/board = circuit - can_order_contraband = board.contraband_enabled - -/obj/machinery/computer/ordercomp - name = "supply ordering console" - desc = "Used to order supplies from cargo staff." - icon_screen = "request" - circuit = /obj/item/weapon/circuitboard/ordercomp - verb_say = "flashes" - verb_ask = "flashes" - verb_exclaim = "flashes" - var/temp = null - var/reqtime = 0 //Cooldown for requisitions - Quarxink - var/last_viewed_group = "categories" - -/obj/machinery/computer/shuttle/white_ship - name = "White Ship Console" - desc = "Used to control the White Ship." - circuit = /obj/item/weapon/circuitboard/white_ship - shuttleId = "whiteship" - possible_destinations = "whiteship_away;whiteship_home;whiteship_z4" + emagged = 1 \ No newline at end of file diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm new file mode 100644 index 00000000000..0921e074f06 --- /dev/null +++ b/code/modules/shuttle/ferry.dm @@ -0,0 +1,24 @@ +/obj/machinery/computer/shuttle/ferry + name = "transport ferry console" + circuit = /obj/item/weapon/circuitboard/ferry + shuttleId = "ferry" + possible_destinations = "ferry_home;ferry_away" + + +/obj/machinery/computer/shuttle/ferry/request + name = "ferry console" + circuit = /obj/item/weapon/circuitboard/ferry/request + var/cooldown //prevents spamming admins + possible_destinations = "ferry_home" + admin_controlled = 1 + +/obj/machinery/computer/shuttle/ferry/request/Topic(href, href_list) + ..() + if(href_list["request"]) + if(cooldown) + return + cooldown = 1 + usr << "Your request has been recieved by Centcom." + admins << "FERRY: [key_name_admin(usr)] (?) (FLW) (Move Ferry) is requesting to move the transport ferry to Centcom." + spawn(600) //One minute cooldown + cooldown = 0 \ No newline at end of file diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index c7925e422f3..13b3d500a17 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -294,8 +294,6 @@ pixel_x = oldPY pixel_y = (oldPX*(-1)) - - //this is the main proc. It instantly moves our mobile port to stationary port S1 //it handles all the generic behaviour, such as sanity checks, closing doors on the shuttle, stunning mobs, etc /obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/S1) @@ -330,8 +328,6 @@ rotation += (rotation % 90) //diagonal rotations not allowed, round up rotation = SimplifyDegrees(rotation) - - //remove area surrounding docking port if(areaInstance.contents.len) var/area/A0 = locate("[area_type]") @@ -363,7 +359,7 @@ for(var/atom/movable/AM in T0) AM.onShuttleMove(T1, rotation) - if (rotation) + if(rotation) T1.shuttleRotate(rotation) //lighting stuff @@ -529,112 +525,7 @@ dst = previous else dst = destination - . += " towards [dst ? dst.name : "unknown location"] ([timeLeft(600)]mins)" - -/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("
[dat]
") - popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - -/obj/machinery/computer/shuttle/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - src.add_fingerprint(usr) - if(!allowed(usr)) - usr << "Access denied." - return - - if(href_list["move"]) - var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) - if(M.launch_status == ENDGAME_LAUNCHED) - usr << "You've already escaped. Never going back to that place again!" - return - if(no_destination_swap) - if(M.mode != SHUTTLE_IDLE) - usr << "Shuttle already in transit." - return - switch(SSshuttle.moveShuttle(shuttleId, href_list["move"], 1)) - if(0) - usr << "Shuttle received message and will be sent shortly." - if(1) - usr << "Invalid shuttle requested." - else - usr << "Unable to comply." - -/obj/machinery/computer/shuttle/emag_act(mob/user) - if(!emagged) - src.req_access = list() - emagged = 1 - user << "You fried the consoles ID checking system." - -/obj/machinery/computer/shuttle/ferry - name = "transport ferry console" - circuit = /obj/item/weapon/circuitboard/ferry - shuttleId = "ferry" - possible_destinations = "ferry_home;ferry_away" - - -/obj/machinery/computer/shuttle/ferry/request - name = "ferry console" - circuit = /obj/item/weapon/circuitboard/ferry/request - var/cooldown //prevents spamming admins - possible_destinations = "ferry_home" - admin_controlled = 1 - -/obj/machinery/computer/shuttle/ferry/request/Topic(href, href_list) - ..() - if(href_list["request"]) - if(cooldown) - return - cooldown = 1 - usr << "Your request has been recieved by Centcom." - admins << "FERRY: [key_name_admin(usr)] (?) (FLW) (Move Ferry) is requesting to move the transport ferry to Centcom." - spawn(600) //One minute cooldown - cooldown = 0 - - + . += " towards [dst ? dst.name : "unknown location"] ([timeLeft(600)] minutes)" #undef DOCKING_PORT_HIGHLIGHT diff --git a/code/game/machinery/computer/syndicate_shuttle.dm b/code/modules/shuttle/syndicate.dm similarity index 95% rename from code/game/machinery/computer/syndicate_shuttle.dm rename to code/modules/shuttle/syndicate.dm index ff61abf9798..b79c1b175fa 100644 --- a/code/game/machinery/computer/syndicate_shuttle.dm +++ b/code/modules/shuttle/syndicate.dm @@ -1,41 +1,40 @@ -#define SYNDICATE_CHALLENGE_TIMER 12000 //20 minutes - -/obj/machinery/computer/shuttle/syndicate - name = "syndicate shuttle terminal" - icon_screen = "syndishuttle" - icon_keyboard = "syndie_key" - req_access = list(access_syndicate) - shuttleId = "syndicate" - possible_destinations = "syndicate_away;syndicate_z5;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s" - var/challenge = FALSE - -/obj/machinery/computer/shuttle/syndicate/recall - name = "syndicate shuttle recall terminal" - possible_destinations = "syndicate_away" - - -/obj/machinery/computer/shuttle/syndicate/Topic(href, href_list) - if(href_list["move"]) - if(challenge && world.time < SYNDICATE_CHALLENGE_TIMER) - usr << "You've issued a combat challenge to the station! You've got to give them at least [round(((SYNDICATE_CHALLENGE_TIMER - world.time) / 10) / 60)] more minutes to allow them to prepare." - return 0 - ..() - -/obj/machinery/computer/shuttle/syndicate/drop_pod - name = "syndicate assault pod control" - icon = 'icons/obj/terminals.dmi' - icon_state = "dorm_available" - req_access = list(access_syndicate) - shuttleId = "steel_rain" - possible_destinations = null - -/obj/machinery/computer/shuttle/syndicate/drop_pod/Topic(href, href_list) - if(href_list["move"]) - if(z != ZLEVEL_CENTCOM) - usr << "Pods are one way!" - return 0 - ..() - - - +#define SYNDICATE_CHALLENGE_TIMER 12000 //20 minutes + +/obj/machinery/computer/shuttle/syndicate + name = "syndicate shuttle terminal" + icon_screen = "syndishuttle" + icon_keyboard = "syndie_key" + req_access = list(access_syndicate) + shuttleId = "syndicate" + possible_destinations = "syndicate_away;syndicate_z5;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s" + var/challenge = FALSE + +/obj/machinery/computer/shuttle/syndicate/recall + name = "syndicate shuttle recall terminal" + possible_destinations = "syndicate_away" + + +/obj/machinery/computer/shuttle/syndicate/Topic(href, href_list) + if(href_list["move"]) + if(challenge && world.time < SYNDICATE_CHALLENGE_TIMER) + usr << "You've issued a combat challenge to the station! You've got to give them at least [round(((SYNDICATE_CHALLENGE_TIMER - world.time) / 10) / 60)] more minutes to allow them to prepare." + return 0 + ..() + +/obj/machinery/computer/shuttle/syndicate/drop_pod + name = "syndicate assault pod control" + icon = 'icons/obj/terminals.dmi' + icon_state = "dorm_available" + req_access = list(access_syndicate) + shuttleId = "steel_rain" + possible_destinations = null + +/obj/machinery/computer/shuttle/syndicate/drop_pod/Topic(href, href_list) + if(href_list["move"]) + if(z != ZLEVEL_CENTCOM) + usr << "Pods are one way!" + return 0 + ..() + + #undef SYNDICATE_CHALLENGE_TIMER \ No newline at end of file diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm new file mode 100644 index 00000000000..2d0ed77ad06 --- /dev/null +++ b/code/modules/shuttle/white_ship.dm @@ -0,0 +1,6 @@ +/obj/machinery/computer/shuttle/white_ship + name = "White Ship Console" + desc = "Used to control the White Ship." + circuit = /obj/item/weapon/circuitboard/white_ship + shuttleId = "whiteship" + possible_destinations = "whiteship_away;whiteship_home;whiteship_z4" \ No newline at end of file diff --git a/code/modules/spells/spell_types/barnyard.dm b/code/modules/spells/spell_types/barnyard.dm index 61238a7623a..e11115c64d3 100644 --- a/code/modules/spells/spell_types/barnyard.dm +++ b/code/modules/spells/spell_types/barnyard.dm @@ -47,4 +47,4 @@ target.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1) playsound(get_turf(target), mSounds[randM], 50, 1) - flick("e_flash", target.flash) + target.flash_eyes() diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index 217128df817..d3d5c1a7037 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -30,7 +30,7 @@ * * return list Data to be sent to the UI. **/ -/datum/proc/get_ui_data(mob/user) +/datum/proc/ui_data(mob/user) return list() // Not implemented. @@ -60,6 +60,13 @@ /datum/proc/ui_host() return src // Default src. + /** + * global + * + * Used to track the current screen. + **/ +/datum/var/ui_screen = "home" + /** * global * diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index 4b5aa73d61d..6244f000bcf 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -39,7 +39,6 @@ /datum/ui_state/proc/can_use_topic(src_object, mob/user) return UI_CLOSE // Don't allow interaction by default. - /** * public * @@ -48,22 +47,21 @@ * return UI_state The state of the UI. **/ /mob/proc/shared_ui_interaction(src_object) - if(!client || stat) // Close UIs if mindless or dead/unconcious. + if(!client) // Close UIs if mindless. return UI_CLOSE - // Update UIs if incapicitated but concious. - else if(incapacitated() || lying) + else if(stat) // Disable UIs if unconcious. + return UI_DISABLED + else if(incapacitated() || lying) // Update UIs if incapicitated but concious. return UI_UPDATE return UI_INTERACTIVE /mob/living/silicon/ai/shared_ui_interaction(src_object) - if(lacks_power()) // Close UIs if the AI is unpowered. - return UI_CLOSE + if(lacks_power()) // Disable UIs if the AI is unpowered. + return UI_DISABLED return ..() /mob/living/silicon/robot/shared_ui_interaction(src_object) - if(cell.charge <= 0) // Close UIs if the Borg is unpowered. - return UI_CLOSE - if(lockcharge) // Disable UIs if the Borg is locked. + if(cell.charge <= 0 || lockcharge) // Disable UIs if the Borg is unpowered or locked. return UI_DISABLED return ..() @@ -92,7 +90,7 @@ * return UI_state The state of the UI. **/ /mob/living/proc/shared_living_ui_distance(atom/movable/src_object) - if(!(src_object in view(4, src))) // If the object is out of view, close it. + if(!(src_object in view(src))) // If the object is obscured, close it. return UI_CLOSE var/dist = get_dist(src_object, src) diff --git a/code/modules/tgui/states/default.dm b/code/modules/tgui/states/default.dm index 56ec71b7cc8..74f2ad63c2f 100644 --- a/code/modules/tgui/states/default.dm +++ b/code/modules/tgui/states/default.dm @@ -33,7 +33,7 @@ return // Robots can interact with anything they can see. - if(get_dist(src, src_object) <= src.client.view) + if(get_dist(src, src_object) <= client.view) return UI_INTERACTIVE return UI_DISABLED // Otherwise they can keep the UI open. @@ -43,7 +43,7 @@ return // The AI can interact with anything it can see nearby, or with cameras. - if((get_dist(src, src_object) <= src.client.view) || cameranet.checkTurfVis(get_turf_pixel(src_object))) + if((get_dist(src, src_object) <= client.view) || cameranet.checkTurfVis(get_turf_pixel(src_object))) return UI_INTERACTIVE return UI_CLOSE diff --git a/code/modules/tgui/states/zlevel.dm b/code/modules/tgui/states/zlevel.dm index 1871980a82a..a7842383a69 100644 --- a/code/modules/tgui/states/zlevel.dm +++ b/code/modules/tgui/states/zlevel.dm @@ -9,6 +9,6 @@ /datum/ui_state/z_state/can_use_topic(src_object, mob/user) var/turf/turf_obj = get_turf(src_object) var/turf/turf_usr = get_turf(user) - if(!turf_obj || !turf_usr || !(turf_obj.z == turf_usr.z)) - return UI_CLOSE - return UI_INTERACTIVE + if(turf_obj && turf_usr && turf_obj.z == turf_usr.z) + return UI_INTERACTIVE + return UI_CLOSE diff --git a/code/modules/tgui/subsystem.dm b/code/modules/tgui/subsystem.dm index ffa7082bcf7..81c67c67d1c 100644 --- a/code/modules/tgui/subsystem.dm +++ b/code/modules/tgui/subsystem.dm @@ -22,7 +22,7 @@ ui = get_open_ui(user, src_object, ui_key) if(!isnull(ui)) - var/data = src_object.get_ui_data(user) // Get data from the src_object. + var/data = src_object.ui_data(user) // Get data from the src_object. if(!force_open) // UI is already open; update it. ui.push_data(data) else // Re-open it anyways. diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index 79e6aa15ea0..43b625a4152 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -31,7 +31,7 @@ var/list/initial_data // The data (and datastructure) used to initialize the UI. var/status = UI_INTERACTIVE // The status/visibility of the UI. var/datum/ui_state/state = null // Topic state used to determine status/interactability. - var/datum/tgui/master_ui // The parent UI. + var/datum/tgui/master_ui // The parent UI. var/list/datum/tgui/children = list() // Children of this UI. /** @@ -80,16 +80,15 @@ * Open this UI (and initialize it with data). **/ /datum/tgui/proc/open() - set waitfor = 0 // Don't wait on sleep()s. if(!user.client) return // Bail if there is no client. update_status(push = 0) // Update the window status. - if(status == UI_CLOSE) + if(status < UI_UPDATE) return // Bail if we're not supposed to open. if(!initial_data) - set_initial_data(src_object.get_ui_data(user)) // Get the UI data. + set_initial_data(src_object.ui_data(user)) // Get the UI data. var/window_size = "" if(width && height) // If we have a width and height, use them. @@ -129,6 +128,7 @@ children.Cut() state = null master_ui = null + qdel(src) /** * public @@ -212,6 +212,7 @@ var/list/config_data = list( "title" = title, "status" = status, + "screen" = src_object.ui_screen, "style" = style, "interface" = interface, "fancy" = user.client.prefs.tgui_fancy, @@ -245,10 +246,10 @@ json_data["data"] = data // Generate the JSON. - var/json = JSON.stringify(json_data) + var/json = json_encode(json_data) // Strip #255/improper. - json = regex_replaceall(json, "\improper", "") - json = regex_replaceall(json, "\proper", "") + json = replacetext(json, "\proper", "") + json = replacetext(json, "\improper", "") return json /** @@ -265,26 +266,24 @@ var/action = href_list["action"] var/params = href_list; params -= "action" - // Handle any special actions. switch(action) if("tgui:initialize") user << output(url_encode(get_json(initial_data)), "[window_id].browser:initialize") initialized = TRUE - return + if("tgui:view") + if(params["screen"]) + src_object.ui_screen = params["screen"] + SStgui.update_uis(src_object) if("tgui:link") user << link(params["url"]) - return if("tgui:fancy") user.client.prefs.tgui_fancy = TRUE - return if("tgui:nofrills") user.client.prefs.tgui_fancy = FALSE - return - - update_status(push = 0) // Update the window state. - var/update = src_object.ui_act(action, params, src, state) // Call ui_act() on the src_object. - if(src_object && update) - SStgui.update_uis(src_object) // If we have a src_object and its ui_act() told us to update. + else + update_status(push = 0) // Update the window state. + if(src_object.ui_act(action, params, src, state)) // Call ui_act() on the src_object. + SStgui.update_uis(src_object) // Update if the object requested it. /** * private diff --git a/code/modules/uplink/uplink.dm b/code/modules/uplink/uplink.dm index 5c75482566d..20156b750b4 100644 --- a/code/modules/uplink/uplink.dm +++ b/code/modules/uplink/uplink.dm @@ -40,13 +40,13 @@ var/global/list/uplinks = list() ui.set_style("syndicate") ui.open() -/obj/item/device/uplink/get_ui_data(mob/user) +/obj/item/device/uplink/ui_data(mob/user) var/list/data = list() data["telecrystals"] = telecrystals data["lockable"] = lockable var/list/uplink_items = get_uplink_items(gamemode) - data["buyable"] = list() + data["categories"] = list() for(var/category in uplink_items) var/list/cat = list( "name" = category, @@ -56,11 +56,10 @@ var/global/list/uplinks = list() var/datum/uplink_item/I = uplink_items[category][item] cat["items"] += list(list( "name" = I.name, - "category" = I.category, "cost" = I.cost, "desc" = I.desc, )) - data["buyable"] += list(cat) + data["categories"] += list(cat) return data /obj/item/device/uplink/ui_act(action, params) @@ -69,16 +68,20 @@ var/global/list/uplinks = list() switch(action) if("buy") - var/list/uplink_items = get_uplink_items(gamemode) - var/category = params["category"] var/item = params["item"] - var/datum/uplink_item/I = uplink_items[category][item] - if(I) + + var/list/uplink_items = get_uplink_items(gamemode) + var/list/buyable_items = list() + for(var/category in uplink_items) + buyable_items += uplink_items[category] + + if(item in buyable_items) + var/datum/uplink_item/I = buyable_items[item] I.buy(usr, src) + . = TRUE if("lock") active = FALSE SStgui.close_uis(src) - return 1 /obj/item/device/uplink/ui_host() @@ -97,6 +100,7 @@ var/global/list/uplinks = list() user << "[I] refunded." qdel(I) return + ..() // A collection of pre-set uplinks, for admin spawns. /obj/item/device/radio/uplink/New() diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index df9b9e43fbf..f5684100f48 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -190,9 +190,9 @@ var/list/uplink_items = list() // Global list so we only initialize this once. /datum/uplink_item/dangerous/machinegun name = "L6 Squad Automatic Weapon" desc = "A fully-loaded Aussec Armoury belt-fed machine gun. \ - This deadly weapon has a massive 50-round magazine of devastating 7.62x51mm ammunition." + This deadly weapon has a massive 50-round magazine of devastating 5.56x45mm ammunition." item = /obj/item/weapon/gun/projectile/automatic/l6_saw - cost = 23 + cost = 18 surplus = 0 include_modes = list(/datum/game_mode/nuclear) @@ -394,14 +394,14 @@ var/list/uplink_items = list() // Global list so we only initialize this once. name = "12g Slug Drum" desc = "An additional 8-round slug magazine for use with the Bulldog shotgun. \ Now 8 times less likely to shoot your pals." + cost = 3 item = /obj/item/ammo_box/magazine/m12g -/datum/uplink_item/ammo/shotgun/slug - name = "12 Stun Slug Drum" +/datum/uplink_item/ammo/shotgun/stun + name = "12g Stun Slug Drum" desc = "An alternative 8-round stun slug magazine for use with the Bulldog shotgun. \ Saying that they're completely non-lethal would be lying." item = /obj/item/ammo_box/magazine/m12g/stun - cost = 3 include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/shotgun/dragon @@ -411,6 +411,13 @@ var/list/uplink_items = list() // Global list so we only initialize this once. item = /obj/item/ammo_box/magazine/m12g/dragon include_modes = list(/datum/game_mode/nuclear) +/datum/uplink_item/ammo/shotgun/breach + name = "12g Breaching Shells" + desc = "An economic variant of the CMC meteorshot slugs, not as effective for knocking \ + down targets, but still great for blasting airlocks off their frames." + item = /obj/item/ammo_box/magazine/m12g/breach + include_modes = list(/datum/game_mode/nuclear) + /datum/uplink_item/ammo/shotgun/bag name = "12g Ammo Duffelbag" desc = "A duffelbag filled with enough 12g ammo to supply an entire team, at a discounted price." @@ -454,34 +461,34 @@ var/list/uplink_items = list() // Global list so we only initialize this once. include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/machinegun/basic - name = "7.62x51mm Box Magazine" - desc = "A 50-round magazine of 7.62x51mm ammunition for use with the L6 SAW. \ + name = "5.56x45mm Box Magazine" + desc = "A 50-round magazine of 5.56x45mm ammunition for use with the L6 SAW. \ By the time you need to use this, you'll already be on a pile of corpses." - item = /obj/item/ammo_box/magazine/m762 + item = /obj/item/ammo_box/magazine/mm556x45 /datum/uplink_item/ammo/machinegun/bleeding - name = "7.62x51mm (Bleeding) Box Magazine" - desc = "A 50-round magazine of 7.62x51mm ammunition for use in the L6 SAW; equipped with special properties \ + name = "5.56x45mm (Bleeding) Box Magazine" + desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \ to induce internal bleeding on targets." - item = /obj/item/ammo_box/magazine/m762/bleeding + item = /obj/item/ammo_box/magazine/mm556x45/bleeding /datum/uplink_item/ammo/machinegun/hollow - name = "7.62x51mm (Hollow-Point) Box Magazine" - desc = "A 50-round magazine of 7.62x51mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \ + name = "5.56x45mm (Hollow-Point) Box Magazine" + desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \ with the unarmored masses of crew." - item = /obj/item/ammo_box/magazine/m762/hollow + item = /obj/item/ammo_box/magazine/mm556x45/hollow /datum/uplink_item/ammo/machinegun/ap - name = "7.62x51mm (Armor Penetrating) Box Magazine" - desc = "A 50-round magazine of 7.62x51mm ammunition for use in the L6 SAW; equipped with special properties \ + name = "5.56x45mm (Armor Penetrating) Box Magazine" + desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \ to puncture even the most durable armor." - item = /obj/item/ammo_box/magazine/m762/ap + item = /obj/item/ammo_box/magazine/mm556x45/ap /datum/uplink_item/ammo/machinegun/incen - name = "7.62x51mm (Incendiary) Box Magazine" - desc = "A 50-round magazine of 7.62x51mm ammunition for use in the L6 SAW; tipped with a special flammable \ + name = "5.56x45mm (Incendiary) Box Magazine" + desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; tipped with a special flammable \ mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn." - item = /obj/item/ammo_box/magazine/m762/incen + item = /obj/item/ammo_box/magazine/mm556x45/incen /datum/uplink_item/ammo/sniper cost = 4 diff --git a/code/world.dm b/code/world.dm index 31e3056e829..0fccf138ac0 100644 --- a/code/world.dm +++ b/code/world.dm @@ -251,7 +251,7 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG features += "hosted by [config.hostedby]" if (features) - s += ": [list2text(features, ", ")]" + s += ": [jointext(features, ", ")]" /* does this help? I do not know */ if (src.status != s) diff --git a/config/awaymissionconfig.txt b/config/awaymissionconfig.txt index 986900d5c1d..da5d85dc11a 100644 --- a/config/awaymissionconfig.txt +++ b/config/awaymissionconfig.txt @@ -1,9 +1,9 @@ #List the potential random Z-levels here. #Maps must be the full path to them -#Maps should be 255x255 or smaller and be bounded. Falling off the edge of the map will result in undefined behavior. +#Maps should be 255x255 or smaller and be bounded. Falling off the edge of the map will result in undefined behavior. #SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START -#!!IMPORTANT NOTES FOR HOSTING AWAY MISSIONS!!: +#!!IMPORTANT NOTES FOR HOSTING AWAY MISSIONS!!: #Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once. #DO tick the associated code file for the away mission you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors! diff --git a/config/config.txt b/config/config.txt index 6335574a29e..c7ad64e5a6e 100644 --- a/config/config.txt +++ b/config/config.txt @@ -26,7 +26,7 @@ BAN_LEGACY_SYSTEM ## log OOC channel LOG_OOC -## log client Say +## log client Say LOG_SAY ## log admin actions @@ -146,7 +146,7 @@ GUEST_BAN ##Remove the # mark infront of this to forbid admins from possessing the singularity. #FORBID_SINGULO_POSSESSION -## Remove the # to show a popup 'reply to' window to every non-admin that recieves an adminPM. +## Remove the # to show a popup 'reply to' window to every non-admin that recieves an adminPM. ## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off) #POPUP_ADMIN_PM @@ -190,7 +190,7 @@ EXTREME_POPCAP_MESSAGE The server is currently serving a high number of users, f ## Notify admins when a new player connects for the first x days a player's been around. (0 for first connection only, -1 for never) ## Requres database -NOTIFY_NEW_PLAYER_AGE 0 +NOTIFY_NEW_PLAYER_AGE 0 ## Notify the irc channel when a new player makes their first connection ## Requres database @@ -206,26 +206,26 @@ NOTIFY_NEW_PLAYER_AGE 0 ## Uncomment to have the game log runtimes to the log folder. (Note: this disables normal output in dd/ds, so it should be left off for testing. #LOG_RUNTIMES -##Comment this out if you've used the mass conversion sql proc for notes or want to stop converting notes +## Comment this out if you've used the mass conversion sql proc for notes or want to stop converting notes AUTOCONVERT_NOTES -##Comment this out to stop admin messages sent anytime an admin disconnects from a round in play, you can edit the messages in admin.dm +## Comment this out to stop admin messages sent anytime an admin disconnects from a round in play, you can edit the messages in admin.dm ANNOUNCE_ADMIN_LOGOUT -##Uncomment to have an admin message sent anytime an admin connects to a round in play, you can edit the messages in admin.dm +## Uncomment to have an admin message sent anytime an admin connects to a round in play, you can edit the messages in admin.dm #ANNOUNCE_ADMIN_LOGIN -##Map rotation -##This feature requires you are running a Windows OS (or can other wise run .bat files) and that you are using the tgstation-server toolset in tools/ -##You should edit maps.txt to match your configuration when you enable this. +## Map rotation +## This feature requires you are running a Windows OS (or can other wise run .bat files) and that you are using the tgstation-server toolset in tools/ +## You should edit maps.txt to match your configuration when you enable this. #MAPROTATION -##Map rotate chance delta -##This is the chance of map rotation factored to the round length. -##A value of 1 would mean the map rotation chance is the round length in minutes (hour long round == 60% rotation chance) -##A value of 0.5 would mean the map rotation chance is half of the round length in minutes (hour long round == 30% rotation chance) +## Map rotate chance delta +## This is the chance of map rotation factored to the round length. +## A value of 1 would mean the map rotation chance is the round length in minutes (hour long round == 60% rotation chance) +## A value of 0.5 would mean the map rotation chance is half of the round length in minutes (hour long round == 30% rotation chance) #MAPROTATIONCHANCEDELTA 0.75 -##AUTOADMIN -##Uncomment to automatically give that admin rank to all players -#AUTOADMIN Game Admin \ No newline at end of file +## AUTOADMIN +## Uncomment to automatically give that admin rank to all players +#AUTOADMIN Game Admin diff --git a/html/changelog.html b/html/changelog.html index 5a9be922b2f..c7d4e78570a 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,69 @@ -->
+

06 February 2016

+

LordPidey updated:

+
    +
  • Added suicide command for pipe valves. It's quite messy.
  • +
+

Lzimann updated:

+
    +
  • Combat Mechas now have a increased chance of destroying a wall with punches (40% for walls and 20% for reinforced walls)!
  • +
  • Combat mechas can now destroy tables and racks with a punch!
  • +
+

neersighted updated:

+
    +
  • The Syndicate has stolen the latest tgui improvements from Nanotrasen! All uplinks now feature filtering/search.
  • +
  • Nanotrasen is proud to announce its next generation sleepers, featuring tgui!
  • +
  • Portable atmospheric components have been overhauled to use the latest interface technology.
  • +
  • The Area Atmosphere Computer has been removed.
  • +
  • Huge scrubbers now require power.
  • +
  • Borg jetpacks are now refilled from a recharger and not a canister.
  • +
  • Power monitors now have a state of the art graph. Hopefully they're actually useful to someone.
  • +
  • Cargo consoles have been redesigned and now feature search and a shopping cart!
  • +
+ +

05 February 2016

+

Joan updated:

+
    +
  • Blob expansion is faster near the expanding blob, but slower further away from it.
  • +
  • Blob spores produce a slightly larger smoke cloud when dying. Sporing Pods spores and blob zombies produce the current small cloud.
  • +
  • Blobbernauts can no longer pull anything at all.
  • +
  • Blobbernauts health reduced to 200, but blobbernauts now take half brute damage.
  • +
  • Blobbernauts now take massive damage from fire.
  • +
  • Blobbernauts do approximately 3 more damage when attacking.
  • +
  • Replicating Foam will expand more actively when damaged.
  • +
  • Adds Electromagnetic Web, which is light blue, does burn damage and EMPs targets, and causes a small EMP when dying.
  • +
  • Electromagnetic Web takes more damage; a normal blob that hasn't been near a node or the core for 6~ seconds can be oneshotted by a laser.
  • +
  • Anomalies, such as pyroclastic and vortex anomalies, now appear at the bottom of the ghost orbit and observe menus.
  • +
+

Kor updated:

+
    +
  • Nuke ops can purchase sentience potions for 4tc
  • +
+

MMMiracles updated:

+
    +
  • Bulldog now starts with stun-slugs instead of its usual 60-brute slugs. Slugs now cost 3 TC instead of 2.
  • +
  • Most SAW ammo has been slightly buffed in damage so maybe it'll be worth buying now along with a slight cost decrease for the gun itself.
  • +
  • Incen shells for the shotgun now apply extra firestacks on hit so it actually sets people on fire instead of turning them into a light show.
  • +
  • Incen rounds for the SAW now leave a fire trail similar to the bulldog's dragonsbreath round.
  • +
  • Nuke Ops now have the ability to purchase breaching shells, a weaker variant of the meteorslugs that can still push back people/airlocks/mechs/corgis.
  • +
  • SAW should now use its in-hand sprites for an open-closed magazine
  • +
+

PKPenguin321 updated:

+
    +
  • You can now sharpen carrots into shivs by using a knife or hatchet on them.
  • +
+

bgobandit updated:

+
    +
  • Seven new emoji have been added to hasten the death of the English language.
  • +
+

octareenroon91 updated:

+
    +
  • Player-controlled medibots can examine a patient to know what chems are in the patient's body.
  • +
  • autolathes have been showing extra copies of the hacked designs, but no more.
  • +
+

01 February 2016

Erwgd updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index f9b3c0a4966..5f6816a3461 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -3370,3 +3370,66 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: On Valentine's Day, all spacemen will receive candy hearts and valentines for their special someones! Label valentines with a pen. - rscadd: Note that today is not Valentine's Day. +2016-02-05: + Joan: + - experiment: Blob expansion is faster near the expanding blob, but slower further + away from it. + - tweak: Blob spores produce a slightly larger smoke cloud when dying. Sporing Pods + spores and blob zombies produce the current small cloud. + - rscdel: Blobbernauts can no longer pull anything at all. + - tweak: Blobbernauts health reduced to 200, but blobbernauts now take half brute + damage. + - tweak: Blobbernauts now take massive damage from fire. + - tweak: Blobbernauts do approximately 3 more damage when attacking. + - wip: Replicating Foam will expand more actively when damaged. + - rscadd: Adds Electromagnetic Web, which is light blue, does burn damage and EMPs + targets, and causes a small EMP when dying. + - rscadd: Electromagnetic Web takes more damage; a normal blob that hasn't been + near a node or the core for 6~ seconds can be oneshotted by a laser. + - rscadd: Anomalies, such as pyroclastic and vortex anomalies, now appear at the + bottom of the ghost orbit and observe menus. + Kor: + - rscadd: Nuke ops can purchase sentience potions for 4tc + MMMiracles: + - tweak: Bulldog now starts with stun-slugs instead of its usual 60-brute slugs. + Slugs now cost 3 TC instead of 2. + - tweak: Most SAW ammo has been slightly buffed in damage so maybe it'll be worth + buying now along with a slight cost decrease for the gun itself. + - tweak: Incen shells for the shotgun now apply extra firestacks on hit so it actually + sets people on fire instead of turning them into a light show. + - tweak: Incen rounds for the SAW now leave a fire trail similar to the bulldog's + dragonsbreath round. + - rscadd: Nuke Ops now have the ability to purchase breaching shells, a weaker variant + of the meteorslugs that can still push back people/airlocks/mechs/corgis. + - bugfix: SAW should now use its in-hand sprites for an open-closed magazine + PKPenguin321: + - rscadd: You can now sharpen carrots into shivs by using a knife or hatchet on + them. + bgobandit: + - rscadd: Seven new emoji have been added to hasten the death of the English language. + octareenroon91: + - rscadd: Player-controlled medibots can examine a patient to know what chems are + in the patient's body. + - bugfix: autolathes have been showing extra copies of the hacked designs, but no + more. +2016-02-06: + LordPidey: + - rscadd: Added suicide command for pipe valves. It's quite messy. + Lzimann: + - tweak: Combat Mechas now have a increased chance of destroying a wall with punches + (40% for walls and 20% for reinforced walls)! + - rscadd: Combat mechas can now destroy tables and racks with a punch! + neersighted: + - rscadd: The Syndicate has stolen the latest tgui improvements from Nanotrasen! + All uplinks now feature filtering/search. + - rscadd: Nanotrasen is proud to announce its next generation sleepers, featuring + tgui! + - rscadd: Portable atmospheric components have been overhauled to use the latest + interface technology. + - rscdel: The Area Atmosphere Computer has been removed. + - rscadd: Huge scrubbers now require power. + - rscdel: Borg jetpacks are now refilled from a recharger and not a canister. + - rscadd: Power monitors now have a state of the art graph. Hopefully they're actually + useful to someone. + - rscadd: Cargo consoles have been redesigned and now feature search and a shopping + cart! diff --git a/html/changelogs/AutoChangeLog-pr-15068.yml b/html/changelogs/AutoChangeLog-pr-15068.yml deleted file mode 100644 index 12518617908..00000000000 --- a/html/changelogs/AutoChangeLog-pr-15068.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: PKPenguin321 -delete-after: True -changes: - - rscadd: "You can now sharpen carrots into shivs by using a knife or hatchet on them." diff --git a/html/changelogs/AutoChangeLog-pr-15110.yml b/html/changelogs/AutoChangeLog-pr-15110.yml deleted file mode 100644 index 5bc8d8d60c2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-15110.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Kor -delete-after: True -changes: - - rscadd: "Nuke ops can purchase sentience potions for 4tc" diff --git a/html/changelogs/AutoChangeLog-pr-15132.yml b/html/changelogs/AutoChangeLog-pr-15132.yml deleted file mode 100644 index bd085db28d8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-15132.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: octareenroon91 -delete-after: True -changes: - - rscadd: "Player-controlled medibots can examine a patient to know what chems are in the patient's body." diff --git a/html/changelogs/AutoChangeLog-pr-15139.yml b/html/changelogs/AutoChangeLog-pr-15139.yml deleted file mode 100644 index 01d07a3a7f2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-15139.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: bgobandit -delete-after: True -changes: - - rscadd: "Seven new emoji have been added to hasten the death of the English language." diff --git a/html/changelogs/AutoChangeLog-pr-15143.yml b/html/changelogs/AutoChangeLog-pr-15143.yml deleted file mode 100644 index 398a0807ffb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-15143.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: octareenroon91 -delete-after: True -changes: - - bugfix: "autolathes have been showing extra copies of the hacked designs, but no more." diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi index ad118904ec2..2104cc58324 100644 Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi index bb23cabef96..42ae6559cfe 100644 Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ diff --git a/icons/mob/screen_full.dmi b/icons/mob/screen_full.dmi index f5bd46f3622..e84b0546950 100644 Binary files a/icons/mob/screen_full.dmi and b/icons/mob/screen_full.dmi differ diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 12772089da7..3ac8e26637c 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index b3b91d6236e..3a57dbbcfd3 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index 703d22a67db..ac30f9e3b33 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 45e6893bb27..e95a33eea6d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -46,6 +46,7 @@ #include "code\__DEFINES\tablecrafting.dm" #include "code\__DEFINES\tgui.dm" #include "code\__DEFINES\wires.dm" +#include "code\__HELPERS\510.dm" #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" #include "code\__HELPERS\cmp.dm" @@ -65,7 +66,6 @@ #include "code\__HELPERS\time.dm" #include "code\__HELPERS\type2type.dm" #include "code\__HELPERS\unsorted.dm" -#include "code\__HELPERS\bygex\bygex.dm" #include "code\__HELPERS\sorts\__main.dm" #include "code\__HELPERS\sorts\InsertSort.dm" #include "code\__HELPERS\sorts\MergeSort.dm" @@ -83,6 +83,7 @@ #include "code\_globalvars\lists\mobs.dm" #include "code\_globalvars\lists\names.dm" #include "code\_globalvars\lists\objects.dm" +#include "code\_onclick\_defines.dm" #include "code\_onclick\adjacent.dm" #include "code\_onclick\ai.dm" #include "code\_onclick\click.dm" @@ -102,6 +103,7 @@ #include "code\_onclick\hud\alien_larva.dm" #include "code\_onclick\hud\blob_overmind.dm" #include "code\_onclick\hud\drones.dm" +#include "code\_onclick\hud\fullscreen.dm" #include "code\_onclick\hud\ghost.dm" #include "code\_onclick\hud\guardian.dm" #include "code\_onclick\hud\hud.dm" @@ -147,7 +149,6 @@ #include "code\datums\browser.dm" #include "code\datums\datacore.dm" #include "code\datums\datumvars.dm" -#include "code\datums\debug.dm" #include "code\datums\hud.dm" #include "code\datums\martial.dm" #include "code\datums\material_container.dm" @@ -419,13 +420,10 @@ #include "code\game\machinery\computer\message.dm" #include "code\game\machinery\computer\Operating.dm" #include "code\game\machinery\computer\pod.dm" -#include "code\game\machinery\computer\power.dm" #include "code\game\machinery\computer\prisoner.dm" #include "code\game\machinery\computer\robot.dm" #include "code\game\machinery\computer\security.dm" -#include "code\game\machinery\computer\shuttle.dm" #include "code\game\machinery\computer\station_alert.dm" -#include "code\game\machinery\computer\syndicate_shuttle.dm" #include "code\game\machinery\computer\telecrystalconsoles.dm" #include "code\game\machinery\doors\airlock.dm" #include "code\game\machinery\doors\airlock_electronics.dm" @@ -861,7 +859,6 @@ #include "code\modules\atmospherics\machinery\components\unary_devices\unary_devices.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\vent_pump.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm" -#include "code\modules\atmospherics\machinery\other\area_atmos_computer.dm" #include "code\modules\atmospherics\machinery\other\meter.dm" #include "code\modules\atmospherics\machinery\other\zvent.dm" #include "code\modules\atmospherics\machinery\pipes\manifold.dm" @@ -897,6 +894,8 @@ #include "code\modules\awaymissions\mission_code\spacebattle.dm" #include "code\modules\awaymissions\mission_code\stationCollision.dm" #include "code\modules\awaymissions\mission_code\wildwest.dm" +#include "code\modules\cargo\console.dm" +#include "code\modules\cargo\order.dm" #include "code\modules\client\asset_cache.dm" #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" @@ -1099,7 +1098,6 @@ #include "code\modules\jobs\job_types\science.dm" #include "code\modules\jobs\job_types\security.dm" #include "code\modules\jobs\job_types\silicon.dm" -#include "code\modules\json\json.dm" #include "code\modules\library\lib_items.dm" #include "code\modules\library\lib_machines.dm" #include "code\modules\library\lib_readme.dm" @@ -1386,6 +1384,7 @@ #include "code\modules\power\generator.dm" #include "code\modules\power\gravitygenerator.dm" #include "code\modules\power\lighting.dm" +#include "code\modules\power\monitor.dm" #include "code\modules\power\port_gen.dm" #include "code\modules\power\power.dm" #include "code\modules\power\powernet.dm" @@ -1536,7 +1535,12 @@ #include "code\modules\ruins\ruin_areas.dm" #include "code\modules\security levels\keycard authentication.dm" #include "code\modules\security levels\security levels.dm" +#include "code\modules\shuttle\computer.dm" +#include "code\modules\shuttle\emergency.dm" +#include "code\modules\shuttle\ferry.dm" #include "code\modules\shuttle\shuttle.dm" +#include "code\modules\shuttle\syndicate.dm" +#include "code\modules\shuttle\white_ship.dm" #include "code\modules\space transition\space_transition.dm" #include "code\modules\spells\spell.dm" #include "code\modules\spells\spell_types\area_teleport.dm" diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index 7bd360536f8..98b1eb69346 100644 --- a/tgui/assets/tgui.css +++ b/tgui/assets/tgui.css @@ -1 +1 @@ -body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}.normal{color:#40628a}.good{color:#537d29}.average{color:#be6209}.bad{color:#b00e0e}.highlight{color:#8ba5c4}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}main{display:block;margin-top:32px;padding:2px 6px 0}hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .bar .barText,body.nanotrasen span.button,body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}.bold{font-weight:700}.italic{font-style:italic}[unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[data-tooltip]{position:relative}[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}[data-tooltip].tooltip-bottom:after,[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}[data-tooltip].tooltip-bottom:after{top:100%;left:50%}[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}[data-tooltip].tooltip-left:hover:after,[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}[data-tooltip].tooltip-right:after{top:50%;left:100%}[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen{background:url("data:image/svg+xml;base64,PCEtLSBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgYSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlQWxpa2UgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gLS0+DQo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+DQo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MjUgMjAwIiBvcGFjaXR5PSIuMzMiPg0KICA8cGF0aCBkPSJtIDE3OC4wMDM5OSwwLjAzODY5IC03MS4yMDM5MywwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzNCw2LjAyNTU1IGwgMCwxODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzQsNi4wMjU1NCBsIDUzLjEwNzIsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNSwtNi4wMjU1NCBsIDAsLTEwMS41NDQwMTggNzIuMjE2MjgsMTA0LjY5OTM5OCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNS43NjAxNSwyLjg3MDE2IGwgNzMuNTU0ODcsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNSwtNi4wMjU1NCBsIDAsLTE4Ny44NzE0NyBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzUsLTYuMDI1NTUgbCAtNTQuNzE2NDQsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzMsNi4wMjU1NSBsIDAsMTAyLjYxOTM1IEwgMTgzLjc2NDEzLDIuOTA4ODYgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC01Ljc2MDE0LC0yLjg3MDE3IHoiIC8+DQogIDxwYXRoIGQ9Ik0gNC44NDQ2MzMzLDIyLjEwODc1IEEgMTMuNDEyMDM5LDEyLjUwMTg0MiAwIDAgMSAxMy40Nzc1ODgsMC4wMzkyNCBsIDY2LjExODMxNSwwIGEgNS4zNjQ4MTU4LDUuMDAwNzM3IDAgMCAxIDUuMzY0ODIzLDUuMDAwNzMgbCAwLDc5Ljg3OTMxIHoiIC8+DQogIDxwYXRoIGQ9Im0gNDIwLjE1NTM1LDE3Ny44OTExOSBhIDEzLjQxMjAzOCwxMi41MDE4NDIgMCAwIDEgLTguNjMyOTUsMjIuMDY5NTEgbCAtNjYuMTE4MzIsMCBhIDUuMzY0ODE1Miw1LjAwMDczNyAwIDAgMSAtNS4zNjQ4MiwtNS4wMDA3NCBsIDAsLTc5Ljg3OTMxIHoiIC8+DQo8L3N2Zz4NCg==") no-repeat fixed center/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen .wf-inactive .statusicon:after{content:"O"}body.nanotrasen .wf-inactive .minimize:after{content:"-"}body.nanotrasen .wf-inactive .close:after{content:"X"}body.syndicate{background:url("data:image/svg+xml;base64,PCEtLSBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgYSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlQWxpa2UgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gLS0+DQo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+DQo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCAyMDAgMjg5Ljc0MiIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSA5My41Mzc2NzcsMCBjIC0xOC4xMTMxMjUsMCAtMzQuMjIwMTMzLDMuMTExNjQgLTQ4LjMyMzQ4NCw5LjMzNDM3IC0xMy45NjUwOTIsNi4yMjE2NyAtMjQuNjEyNDQyLDE1LjA3MTE0IC0zMS45NDA2NTEsMjYuNTQ3MSAtNy4xODk5Mzk4LDExLjMzNzg5IC0xMC4zMDEyMjY2LDI0Ljc0OTExIC0xMC4zMDEyMjY2LDQwLjIzNDc4IDAsMTAuNjQ2NjIgMi43MjUwMDI2LDIwLjQ2NDY1IDguMTc1MTExNiwyOS40NTI1OCA1LjYxNTI3Nyw4Ljk4Njg2IDE0LjAzODI3NywxNy4zNTIwNCAyNS4yNjg4MjEsMjUuMDk0MzYgMTEuMjMwNTQ0LDcuNjA1MzEgMjYuNTA3NDIxLDE1LjQxODM1IDQ1LjgzMDUxNCwyMy40Mzc4MiAxOS45ODM3NDgsOC4yOTU1NyAzNC44NDg4NDgsMTUuNTU0NzEgNDQuNTkyOTk4LDIxLjc3NjM4IDkuNzQ0MTQsNi4yMjI3MyAxNi43NjE3LDEyLjg1ODUgMjEuMDU1NzIsMTkuOTA5NTEgNC4yOTQwNCw3LjA1MjA4IDYuNDQxOTMsMTUuNzY0MDggNi40NDE5MywyNi4xMzQ1OSAwLDE2LjE3NzAyIC01LjIwMTk2LDI4LjQ4MjIyIC0xNS42MDY3MywzNi45MTY4MiAtMTAuMjM5Niw4LjQzNDcgLTI1LjAyMjAzLDEyLjY1MjMgLTQ0LjM0NTE2OSwxMi42NTIzIC0xNC4wMzgxNzEsMCAtMjUuNTE1MjQ3LC0xLjY1OTQgLTM0LjQzMzYxOCwtNC45Nzc3IC04LjkxODM3LC0zLjQ1NjYgLTE2LjE4NTU3MiwtOC43MTEzIC0yMS44MDA4MzksLTE1Ljc2MzMgLTUuNjE1Mjc3LC03LjA1MjEgLTEwLjA3NDc5NSwtMTYuNjYwODggLTEzLjM3Nzg5OSwtMjguODI4MTIgbCAtMjQuNzczMTYyNjI5Mzk0NSwwIDAsNTYuODI2MzIgQyAzMy44NTY3NjksMjg2LjA3NjAxIDYzLjc0OTA0LDI4OS43NDIwMSA4OS42NzgzODMsMjg5Ljc0MjAxIGMgMTYuMDIwMDI3LDAgMzAuNzE5Nzg3LC0xLjM4MjcgNDQuMDk3MzM3LC00LjE0NzkgMTMuNTQyNzIsLTIuOTA0MyAyNS4xMDQxLC03LjQ2NzYgMzQuNjgzMDksLTEzLjY4OTMgOS43NDQxMywtNi4zNTk3IDE3LjM0MDQyLC0xNC41MTk1IDIyLjc5MDUyLC0yNC40NzQ4IDUuNDUwMSwtMTAuMDkzMzIgOC4xNzUxMSwtMjIuMzk5NTkgOC4xNzUxMSwtMzYuOTE2ODIgMCwtMTIuOTk3NjQgLTMuMzAyMSwtMjQuMzM1MzkgLTkuOTA4MjksLTM0LjAxNDYgLTYuNDQxMDUsLTkuODE3MjUgLTE1LjUyNTQ1LC0xOC41MjcwNyAtMjcuMjUxNDYsLTI2LjEzMTMzIC0xMS41NjA4NSwtNy42MDQyNyAtMjcuOTEwODMsLTE1LjgzMTQyIC00OS4wNTA2NiwtMjQuNjgwMjIgLTE3LjUwNjQ0LC03LjE5MDEyIC0zMC43MTk2NjgsLTEzLjY4OTQ4IC0zOS42MzgwMzgsLTE5LjQ5NzAxIC04LjkxODM3MSwtNS44MDc1MiAtMTguNjA3NDc0LC0xMi40MzQwOSAtMjQuMDk2NTI0LC0xOC44NzQxNyAtNS40MjYwNDMsLTYuMzY2MTYgLTkuNjU4ODI2LC0xNS4wNzAwMyAtOS42NTg4MjYsLTI0Ljg4NzI5IDAsLTkuMjY0MDEgMi4wNzU0MTQsLTE3LjIxMzQ1IDYuMjIzNDU0LC0yMy44NTAzMyAxMS4wOTgyOTgsLTE0LjM5NzQ4IDQxLjI4NjYzOCwtMS43OTUwNyA0NS4wNzU2MDksMjQuMzQ3NjIgNC44MzkzOTIsNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NzI5IDEyLjAyOTUxNSwyOC40MTU2IGwgMjAuNTMyMzQsMCAwLC01NS45OTk2NyBjIC00LjQ3ODI1LC01LjkyNDQ4IC05Ljk1NDg4LC0xMC42MzIyMiAtMTUuOTA4MzcsLTE0LjM3NDExIDEuNjQwNTUsMC40NzkwNSAzLjE5MDM5LDEuMDIzNzYgNC42Mzg2NSwxLjY0MDI0IDYuNDk4NjEsMi42MjYwNyAxMi4xNjc5Myw3LjMyNzQ3IDE3LjAwNzMsMTQuMTAzNDUgNC44MzkzOSw2Ljc3NDkxIDguODQ5MzUsMTYuMjQ1NjcgMTIuMDI5NTIsMjguNDEzOTcgMCwwIDguNDgxMjgsLTAuMTI4OTQgOC40ODk3OCwtMC4wMDIgMC40MTc3Niw2LjQxNDk0IC0xLjc1MzM5LDkuNDUyODYgLTQuMTIzNDIsMTIuNTYxMDQgLTIuNDE3NCwzLjE2OTc4IC01LjE0NDg2LDYuNzg5NzMgLTQuMDAyNzgsMTMuMDAyOSAxLjUwNzg2LDguMjAzMTggMTAuMTgzNTQsMTAuNTk2NDIgMTQuNjIxOTQsOS4zMTE1NCAtMy4zMTg0MiwtMC40OTkxMSAtNS4zMTg1NSwtMS43NDk0OCAtNS4zMTg1NSwtMS43NDk0OCAwLDAgMS44NzY0NiwwLjk5ODY4IDUuNjUxMTcsLTEuMzU5ODEgLTMuMjc2OTUsMC45NTU3MSAtMTAuNzA1MjksLTAuNzk3MzggLTExLjgwMTI1LC02Ljc2MzEzIC0wLjk1NzUyLC01LjIwODYxIDAuOTQ2NTQsLTcuMjk1MTQgMy40MDExMywtMTAuNTE0ODIgMi40NTQ2MiwtMy4yMTk2OCA1LjI4NDI2LC02Ljk1ODMxIDQuNjg0MywtMTQuNDg4MjQgbCAwLjAwMywwLjAwMiA4LjkyNjc2LDAgMCwtNTUuOTk5NjcgYyAtMTUuMDcxMjUsLTMuODcxNjggLTI3LjY1MzE0LC02LjM2MDQyIC0zNy43NDY3MSwtNy40NjU4NiAtOS45NTUzMSwtMS4xMDc1NSAtMjAuMTg4MjMsLTEuNjU5ODEgLTMwLjY5NjYxMywtMS42NTk4MSB6IG0gNzAuMzIxNjAzLDE3LjMwODkzIDAuMjM4MDUsNDAuMzA0OSBjIDEuMzE4MDgsMS4yMjY2NiAyLjQzOTY1LDIuMjc4MTUgMy4zNDA4MSwzLjEwNjAyIDQuODM5MzksNi43NzQ5MSA4Ljg0OTM0LDE2LjI0NTY2IDEyLjAyOTUxLDI4LjQxMzk3IGwgMjAuNTMyMzQsMCAwLC01NS45OTk2NyBjIC02LjY3NzMxLC00LjU5MzgxIC0xOS44MzY0MywtMTAuNDczMDkgLTM2LjE0MDcxLC0xNS44MjUyMiB6IG0gLTI4LjEyMDQ5LDUuNjA1NTEgOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzNywtNi40NjY5NyAtMTMuODQ2NzgsLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNSwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAxNS4yMjE5NSwyNC4wMDg0OCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4LC02LjQ2Njk3IC0xMy44NDY3OSwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NzA0LDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiBtIC05OS4xMTM4NCwyLjIwNzY0IDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzgyLC02LjQ2Njk3IC0xMy44NDY3ODIsLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTU0MiwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHoiIC8+DQo8L3N2Zz4NCg==") no-repeat fixed center/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate .wf-inactive .statusicon:after{content:"O"}body.syndicate .wf-inactive .minimize:after{content:"-"}body.syndicate .wf-inactive .close:after{content:"X"} \ No newline at end of file +body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}.wf-inactive .titlebar .minimize:after{content:"-"}.wf-inactive .titlebar .close:after{content:"X"}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MjUgMjAwIiBvcGFjaXR5PSIuMzMiPgogIDxwYXRoIGQ9Im0gMTc4LjAwMzk5LDAuMDM4NjkgLTcxLjIwMzkzLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM0LDYuMDI1NTUgbCAwLDE4Ny44NzE0NyBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNCw2LjAyNTU0IGwgNTMuMTA3MiwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTAxLjU0NDAxOCA3Mi4yMTYyOCwxMDQuNjk5Mzk4IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA1Ljc2MDE1LDIuODcwMTYgbCA3My41NTQ4NywwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzNSwtNi4wMjU1NSBsIC01NC43MTY0NCwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzMyw2LjAyNTU1IGwgMCwxMDIuNjE5MzUgTCAxODMuNzY0MTMsMi45MDg4NiBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTUuNzYwMTQsLTIuODcwMTcgeiIgLz4KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPgogIDxwYXRoIGQ9Im0gNDIwLjE1NTM1LDE3Ny44OTExOSBhIDEzLjQxMjAzOCwxMi41MDE4NDIgMCAwIDEgLTguNjMyOTUsMjIuMDY5NTEgbCAtNjYuMTE4MzIsMCBhIDUuMzY0ODE1Miw1LjAwMDczNyAwIDAgMSAtNS4zNjQ4MiwtNS4wMDA3NCBsIDAsLTc5Ljg3OTMxIHoiIC8+Cjwvc3ZnPgo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4KPCEtLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIC0tPgo=") no-repeat fixed center/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCAyMDAgMjg5Ljc0MiIgb3BhY2l0eT0iLjMzIj4KICA8cGF0aCBkPSJtIDkzLjUzNzY3NywwIGMgLTE4LjExMzEyNSwwIC0zNC4yMjAxMzMsMy4xMTE2NCAtNDguMzIzNDg0LDkuMzM0MzcgLTEzLjk2NTA5Miw2LjIyMTY3IC0yNC42MTI0NDIsMTUuMDcxMTQgLTMxLjk0MDY1MSwyNi41NDcxIC03LjE4OTkzOTgsMTEuMzM3ODkgLTEwLjMwMTIyNjYsMjQuNzQ5MTEgLTEwLjMwMTIyNjYsNDAuMjM0NzggMCwxMC42NDY2MiAyLjcyNTAwMjYsMjAuNDY0NjUgOC4xNzUxMTE2LDI5LjQ1MjU4IDUuNjE1Mjc3LDguOTg2ODYgMTQuMDM4Mjc3LDE3LjM1MjA0IDI1LjI2ODgyMSwyNS4wOTQzNiAxMS4yMzA1NDQsNy42MDUzMSAyNi41MDc0MjEsMTUuNDE4MzUgNDUuODMwNTE0LDIzLjQzNzgyIDE5Ljk4Mzc0OCw4LjI5NTU3IDM0Ljg0ODg0OCwxNS41NTQ3MSA0NC41OTI5OTgsMjEuNzc2MzggOS43NDQxNCw2LjIyMjczIDE2Ljc2MTcsMTIuODU4NSAyMS4wNTU3MiwxOS45MDk1MSA0LjI5NDA0LDcuMDUyMDggNi40NDE5MywxNS43NjQwOCA2LjQ0MTkzLDI2LjEzNDU5IDAsMTYuMTc3MDIgLTUuMjAxOTYsMjguNDgyMjIgLTE1LjYwNjczLDM2LjkxNjgyIC0xMC4yMzk2LDguNDM0NyAtMjUuMDIyMDMsMTIuNjUyMyAtNDQuMzQ1MTY5LDEyLjY1MjMgLTE0LjAzODE3MSwwIC0yNS41MTUyNDcsLTEuNjU5NCAtMzQuNDMzNjE4LC00Ljk3NzcgLTguOTE4MzcsLTMuNDU2NiAtMTYuMTg1NTcyLC04LjcxMTMgLTIxLjgwMDgzOSwtMTUuNzYzMyAtNS42MTUyNzcsLTcuMDUyMSAtMTAuMDc0Nzk1LC0xNi42NjA4OCAtMTMuMzc3ODk5LC0yOC44MjgxMiBsIC0yNC43NzMxNjI2MjkzOTQ1LDAgMCw1Ni44MjYzMiBDIDMzLjg1Njc2OSwyODYuMDc2MDEgNjMuNzQ5MDQsMjg5Ljc0MjAxIDg5LjY3ODM4MywyODkuNzQyMDEgYyAxNi4wMjAwMjcsMCAzMC43MTk3ODcsLTEuMzgyNyA0NC4wOTczMzcsLTQuMTQ3OSAxMy41NDI3MiwtMi45MDQzIDI1LjEwNDEsLTcuNDY3NiAzNC42ODMwOSwtMTMuNjg5MyA5Ljc0NDEzLC02LjM1OTcgMTcuMzQwNDIsLTE0LjUxOTUgMjIuNzkwNTIsLTI0LjQ3NDggNS40NTAxLC0xMC4wOTMzMiA4LjE3NTExLC0yMi4zOTk1OSA4LjE3NTExLC0zNi45MTY4MiAwLC0xMi45OTc2NCAtMy4zMDIxLC0yNC4zMzUzOSAtOS45MDgyOSwtMzQuMDE0NiAtNi40NDEwNSwtOS44MTcyNSAtMTUuNTI1NDUsLTE4LjUyNzA3IC0yNy4yNTE0NiwtMjYuMTMxMzMgLTExLjU2MDg1LC03LjYwNDI3IC0yNy45MTA4MywtMTUuODMxNDIgLTQ5LjA1MDY2LC0yNC42ODAyMiAtMTcuNTA2NDQsLTcuMTkwMTIgLTMwLjcxOTY2OCwtMTMuNjg5NDggLTM5LjYzODAzOCwtMTkuNDk3MDEgLTguOTE4MzcxLC01LjgwNzUyIC0xOC42MDc0NzQsLTEyLjQzNDA5IC0yNC4wOTY1MjQsLTE4Ljg3NDE3IC01LjQyNjA0MywtNi4zNjYxNiAtOS42NTg4MjYsLTE1LjA3MDAzIC05LjY1ODgyNiwtMjQuODg3MjkgMCwtOS4yNjQwMSAyLjA3NTQxNCwtMTcuMjEzNDUgNi4yMjM0NTQsLTIzLjg1MDMzIDExLjA5ODI5OCwtMTQuMzk3NDggNDEuMjg2NjM4LC0xLjc5NTA3IDQ1LjA3NTYwOSwyNC4zNDc2MiA0LjgzOTM5Miw2Ljc3NDkxIDguODQ5MzUsMTYuMjQ3MjkgMTIuMDI5NTE1LDI4LjQxNTYgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTQuNDc4MjUsLTUuOTI0NDggLTkuOTU0ODgsLTEwLjYzMjIyIC0xNS45MDgzNywtMTQuMzc0MTEgMS42NDA1NSwwLjQ3OTA1IDMuMTkwMzksMS4wMjM3NiA0LjYzODY1LDEuNjQwMjQgNi40OTg2MSwyLjYyNjA3IDEyLjE2NzkzLDcuMzI3NDcgMTcuMDA3MywxNC4xMDM0NSA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNSwxNi4yNDU2NyAxMi4wMjk1MiwyOC40MTM5NyAwLDAgOC40ODEyOCwtMC4xMjg5NCA4LjQ4OTc4LC0wLjAwMiAwLjQxNzc2LDYuNDE0OTQgLTEuNzUzMzksOS40NTI4NiAtNC4xMjM0MiwxMi41NjEwNCAtMi40MTc0LDMuMTY5NzggLTUuMTQ0ODYsNi43ODk3MyAtNC4wMDI3OCwxMy4wMDI5IDEuNTA3ODYsOC4yMDMxOCAxMC4xODM1NCwxMC41OTY0MiAxNC42MjE5NCw5LjMxMTU0IC0zLjMxODQyLC0wLjQ5OTExIC01LjMxODU1LC0xLjc0OTQ4IC01LjMxODU1LC0xLjc0OTQ4IDAsMCAxLjg3NjQ2LDAuOTk4NjggNS42NTExNywtMS4zNTk4MSAtMy4yNzY5NSwwLjk1NTcxIC0xMC43MDUyOSwtMC43OTczOCAtMTEuODAxMjUsLTYuNzYzMTMgLTAuOTU3NTIsLTUuMjA4NjEgMC45NDY1NCwtNy4yOTUxNCAzLjQwMTEzLC0xMC41MTQ4MiAyLjQ1NDYyLC0zLjIxOTY4IDUuMjg0MjYsLTYuOTU4MzEgNC42ODQzLC0xNC40ODgyNCBsIDAuMDAzLDAuMDAyIDguOTI2NzYsMCAwLC01NS45OTk2NyBjIC0xNS4wNzEyNSwtMy44NzE2OCAtMjcuNjUzMTQsLTYuMzYwNDIgLTM3Ljc0NjcxLC03LjQ2NTg2IC05Ljk1NTMxLC0xLjEwNzU1IC0yMC4xODgyMywtMS42NTk4MSAtMzAuNjk2NjEzLC0xLjY1OTgxIHogbSA3MC4zMjE2MDMsMTcuMzA4OTMgMC4yMzgwNSw0MC4zMDQ5IGMgMS4zMTgwOCwxLjIyNjY2IDIuNDM5NjUsMi4yNzgxNSAzLjM0MDgxLDMuMTA2MDIgNC44MzkzOSw2Ljc3NDkxIDguODQ5MzQsMTYuMjQ1NjYgMTIuMDI5NTEsMjguNDEzOTcgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTYuNjc3MzEsLTQuNTkzODEgLTE5LjgzNjQzLC0xMC40NzMwOSAtMzYuMTQwNzEsLTE1LjgyNTIyIHogbSAtMjguMTIwNDksNS42MDU1MSA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM3LC02LjQ2Njk3IC0xMy44NDY3OCwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NzA1LDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiBtIDE1LjIyMTk1LDI0LjAwODQ4IDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzgsLTYuNDY2OTcgLTEzLjg0Njc5LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDQsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gLTk5LjExMzg0LDIuMjA3NjQgOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzODIsLTYuNDY2OTcgLTEzLjg0Njc4MiwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NTQyLDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiIgLz4KPC9zdmc+CjwhLS0gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIC0tPgo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+Cg==") no-repeat fixed center/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px} \ No newline at end of file diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index bf079024e7e..381c2f719da 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,11 +1,12 @@ -require=function t(e,n,r){function i(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(a)return a(o,!0);var c=Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[o]={exports:{}};e[o][0].call(l.exports,function(t){var n=e[o][1][t];return i(n?n:t)},l,l.exports,t,e,n,r)}return n[o].exports}for(var a="function"==typeof require&&require,o=0;o=0;--r){var i=this.tryEntries[r],a=i.completion;if("root"===i.tryLoc)return e("end");if(i.tryLoc<=this.prev){var o=y.call(i,"catchLoc"),s=y.call(i,"finallyLoc");if(o&&s){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&y.call(r,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),h(n),O}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;h(n)}return i}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},O}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(193),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{193:193}],3:[function(t,e,n){e.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},{}],4:[function(t,e,n){var r=t(84)("unscopables"),i=Array.prototype;void 0==i[r]&&t(32)(i,r,{}),e.exports=function(t){i[r][t]=!0}},{32:32,84:84}],5:[function(t,e,n){var r=t(39);e.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},{39:39}],6:[function(t,e,n){"use strict";var r=t(81),i=t(77),a=t(80);e.exports=[].copyWithin||function(t,e){var n=r(this),o=a(n.length),s=i(t,o),u=i(e,o),c=arguments,l=c.length>2?c[2]:void 0,p=Math.min((void 0===l?o:i(l,o))-u,o-s),f=1;for(s>u&&u+p>s&&(f=-1,u+=p-1,s+=p-1);p-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{77:77,80:80,81:81}],7:[function(t,e,n){"use strict";var r=t(81),i=t(77),a=t(80);e.exports=[].fill||function(t){for(var e=r(this),n=a(e.length),o=arguments,s=o.length,u=i(s>1?o[1]:void 0,n),c=s>2?o[2]:void 0,l=void 0===c?n:i(c,n);l>u;)e[u++]=t;return e}},{77:77,80:80,81:81}],8:[function(t,e,n){var r=t(79),i=t(80),a=t(77);e.exports=function(t){return function(e,n,o){var s,u=r(e),c=i(u.length),l=a(o,c);if(t&&n!=n){for(;c>l;)if(s=u[l++],s!=s)return!0}else for(;c>l;l++)if((t||l in u)&&u[l]===n)return t||l;return!t&&-1}}},{77:77,79:79,80:80}],9:[function(t,e,n){var r=t(18),i=t(35),a=t(81),o=t(80),s=t(10);e.exports=function(t){var e=1==t,n=2==t,u=3==t,c=4==t,l=6==t,p=5==t||l;return function(f,h,d){for(var m,v,g=a(f),y=i(g),b=r(h,d,3),w=o(y.length),x=0,_=e?s(f,w):n?s(f,0):void 0;w>x;x++)if((p||x in y)&&(m=y[x],v=b(m,x,g),t))if(e)_[x]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return x;case 2:_.push(m)}else if(c)return!1;return l?-1:u||c?c:_}}},{10:10,18:18,35:35,80:80,81:81}],10:[function(t,e,n){var r=t(39),i=t(37),a=t(84)("species");e.exports=function(t,e){var n;return i(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!i(n.prototype)||(n=void 0),r(n)&&(n=n[a],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{37:37,39:39,84:84}],11:[function(t,e,n){var r=t(12),i=t(84)("toStringTag"),a="Arguments"==r(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[i])?n:a?r(e):"Object"==(o=r(e))&&"function"==typeof e.callee?"Arguments":o}},{12:12,84:84}],12:[function(t,e,n){var r={}.toString;e.exports=function(t){return r.call(t).slice(8,-1)}},{}],13:[function(t,e,n){"use strict";var r=t(47),i=t(32),a=t(61),o=t(18),s=t(70),u=t(19),c=t(28),l=t(43),p=t(45),f=t(83)("id"),h=t(31),d=t(39),m=t(66),v=t(20),g=Object.isExtensible||d,y=v?"_s":"size",b=0,w=function(t,e){if(!d(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!h(t,f)){if(!g(t))return"F";if(!e)return"E";i(t,f,++b)}return"O"+t[f]},x=function(t,e){var n,r=w(e);if("F"!==r)return t._i[r];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,i){var l=t(function(t,a){s(t,l,e),t._i=r.create(null),t._f=void 0,t._l=void 0,t[y]=0,void 0!=a&&c(a,n,t[i],t)});return a(l.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[y]=0},"delete":function(t){var e=this,n=x(e,t);if(n){var r=n.n,i=n.p;delete e._i[n.i],n.r=!0,i&&(i.n=r),r&&(r.p=i),e._f==n&&(e._f=r),e._l==n&&(e._l=i),e[y]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!x(this,t)}}),v&&r.setDesc(l.prototype,"size",{get:function(){return u(this[y])}}),l},def:function(t,e,n){var r,i,a=x(t,e);return a?a.v=n:(t._l=a={i:i=w(e,!0),k:e,v:n,p:r=t._l,n:void 0,r:!1},t._f||(t._f=a),r&&(r.n=a),t[y]++,"F"!==i&&(t._i[i]=a)),t},getEntry:x,setStrong:function(t,e,n){l(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?p(0,n.k):"values"==e?p(0,n.v):p(0,[n.k,n.v]):(t._t=void 0,p(1))},n?"entries":"values",!n,!0),m(e)}}},{18:18,19:19,20:20,28:28,31:31,32:32,39:39,43:43,45:45,47:47,61:61,66:66,70:70,83:83}],14:[function(t,e,n){var r=t(28),i=t(11);e.exports=function(t){return function(){if(i(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return r(this,!1,e.push,e),e}}},{11:11,28:28}],15:[function(t,e,n){"use strict";var r=t(32),i=t(61),a=t(5),o=t(39),s=t(70),u=t(28),c=t(9),l=t(31),p=t(83)("weak"),f=Object.isExtensible||o,h=c(5),d=c(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},y=function(t,e){return h(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=y(this,t);return e?e[1]:void 0},has:function(t){return!!y(this,t)},set:function(t,e){var n=y(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=d(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,r){var a=t(function(t,i){s(t,a,e),t._i=m++,t._l=void 0,void 0!=i&&u(i,n,t[r],t)});return i(a.prototype,{"delete":function(t){return o(t)?f(t)?l(t,p)&&l(t[p],this._i)&&delete t[p][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?l(t,p)&&l(t[p],this._i):v(this).has(t):!1}}),a},def:function(t,e,n){return f(a(e))?(l(e,p)||r(e,p,{}),e[p][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:p}},{28:28,31:31,32:32,39:39,5:5,61:61,70:70,83:83,9:9}],16:[function(t,e,n){"use strict";var r=t(30),i=t(23),a=t(62),o=t(61),s=t(28),u=t(70),c=t(39),l=t(25),p=t(44),f=t(67);e.exports=function(t,e,n,h,d,m){var v=r[t],g=v,y=d?"set":"add",b=g&&g.prototype,w={},x=function(t){var e=b[t];a(b,t,"delete"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!c(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||b.forEach&&!l(function(){(new g).entries().next()}))){var _,k=new g,E=k[y](m?{}:-0,1)!=k,S=l(function(){k.has(1)}),O=p(function(t){new g(t)});O||(g=e(function(e,n){u(e,g,t);var r=new v;return void 0!=n&&s(n,d,r[y],r),r}),g.prototype=b,b.constructor=g),m||k.forEach(function(t,e){_=1/e===-(1/0)}),(S||_)&&(x("delete"),x("has"),d&&x("get")),(_||E)&&x(y),m&&b.clear&&delete b.clear}else g=h.getConstructor(e,t,d,y),o(g.prototype,n);return f(g,t),w[t]=g,i(i.G+i.W+i.F*(g!=v),w),m||h.setStrong(g,t,d),g}},{23:23,25:25,28:28,30:30,39:39,44:44,61:61,62:62,67:67,70:70}],17:[function(t,e,n){var r=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=r)},{}],18:[function(t,e,n){var r=t(3);e.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},{3:3}],19:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],20:[function(t,e,n){e.exports=!t(25)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{25:25}],21:[function(t,e,n){var r=t(39),i=t(30).document,a=r(i)&&r(i.createElement);e.exports=function(t){return a?i.createElement(t):{}}},{30:30,39:39}],22:[function(t,e,n){var r=t(47);e.exports=function(t){var e=r.getKeys(t),n=r.getSymbols;if(n)for(var i,a=n(t),o=r.isEnum,s=0;a.length>s;)o.call(t,i=a[s++])&&e.push(i);return e}},{47:47}],23:[function(t,e,n){var r=t(30),i=t(17),a=t(32),o=t(62),s=t(18),u="prototype",c=function(t,e,n){var l,p,f,h,d=t&c.F,m=t&c.G,v=t&c.S,g=t&c.P,y=t&c.B,b=m?r:v?r[e]||(r[e]={}):(r[e]||{})[u],w=m?i:i[e]||(i[e]={}),x=w[u]||(w[u]={});m&&(n=e);for(l in n)p=!d&&b&&l in b,f=(p?b:n)[l],h=y&&p?s(f,r):g&&"function"==typeof f?s(Function.call,f):f,b&&!p&&o(b,l,f),w[l]!=f&&a(w,l,h),g&&x[l]!=f&&(x[l]=f)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,e.exports=c},{17:17,18:18,30:30,32:32,62:62}],24:[function(t,e,n){var r=t(84)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(i){}}return!0}},{84:84}],25:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],26:[function(t,e,n){"use strict";var r=t(32),i=t(62),a=t(25),o=t(19),s=t(84);e.exports=function(t,e,n){var u=s(t),c=""[t];a(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(i(String.prototype,t,n(o,u,c)),r(RegExp.prototype,u,2==e?function(t,e){return c.call(t,this,e)}:function(t){return c.call(t,this)}))}},{19:19,25:25,32:32,62:62,84:84}],27:[function(t,e,n){"use strict";var r=t(5);e.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{5:5}],28:[function(t,e,n){var r=t(18),i=t(41),a=t(36),o=t(5),s=t(80),u=t(85);e.exports=function(t,e,n,c){var l,p,f,h=u(t),d=r(n,c,e?2:1),m=0;if("function"!=typeof h)throw TypeError(t+" is not iterable!");if(a(h))for(l=s(t.length);l>m;m++)e?d(o(p=t[m])[0],p[1]):d(t[m]);else for(f=h.call(t);!(p=f.next()).done;)i(f,d,p.value,e)}},{18:18,36:36,41:41,5:5,80:80,85:85}],29:[function(t,e,n){var r=t(79),i=t(47).getNames,a={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return i(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==a.call(t)?s(t):i(r(t))}},{47:47,79:79}],30:[function(t,e,n){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],31:[function(t,e,n){var r={}.hasOwnProperty;e.exports=function(t,e){return r.call(t,e)}},{}],32:[function(t,e,n){var r=t(47),i=t(60);e.exports=t(20)?function(t,e,n){return r.setDesc(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},{20:20,47:47,60:60}],33:[function(t,e,n){e.exports=t(30).document&&document.documentElement},{30:30}],34:[function(t,e,n){e.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],35:[function(t,e,n){var r=t(12);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},{12:12}],36:[function(t,e,n){var r=t(46),i=t(84)("iterator"),a=Array.prototype;e.exports=function(t){return void 0!==t&&(r.Array===t||a[i]===t)}},{46:46,84:84}],37:[function(t,e,n){var r=t(12);e.exports=Array.isArray||function(t){return"Array"==r(t)}},{12:12}],38:[function(t,e,n){var r=t(39),i=Math.floor;e.exports=function(t){return!r(t)&&isFinite(t)&&i(t)===t}},{39:39}],39:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],40:[function(t,e,n){var r=t(39),i=t(12),a=t(84)("match");e.exports=function(t){var e;return r(t)&&(void 0!==(e=t[a])?!!e:"RegExp"==i(t))}},{12:12,39:39,84:84}],41:[function(t,e,n){var r=t(5);e.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(a){var o=t["return"];throw void 0!==o&&r(o.call(t)),a}}},{5:5}],42:[function(t,e,n){"use strict";var r=t(47),i=t(60),a=t(67),o={};t(32)(o,t(84)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=r.create(o,{next:i(1,n)}),a(t,e+" Iterator")}},{32:32,47:47,60:60,67:67,84:84}],43:[function(t,e,n){"use strict";var r=t(49),i=t(23),a=t(62),o=t(32),s=t(31),u=t(46),c=t(42),l=t(67),p=t(47).getProto,f=t(84)("iterator"),h=!([].keys&&"next"in[].keys()),d="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,y,b,w,x){c(n,e,y);var _,k,E=function(t){if(!h&&t in P)return P[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},S=e+" Iterator",O=b==v,A=!1,P=t.prototype,C=P[f]||P[d]||b&&P[b],j=C||E(b);if(C){var T=p(j.call(new t));l(T,S,!0),!r&&s(P,d)&&o(T,f,g),O&&C.name!==v&&(A=!0,j=function(){return C.call(this)})}if(r&&!x||!h&&!A&&P[f]||o(P,f,j),u[e]=j,u[S]=g,b)if(_={values:O?j:E(v),keys:w?j:E(m),entries:O?E("entries"):j},x)for(k in _)k in P||a(P,k,_[k]);else i(i.P+i.F*(h||A),e,_);return _}},{23:23,31:31,32:32,42:42,46:46,47:47,49:49,62:62,67:67,84:84}],44:[function(t,e,n){var r=t(84)("iterator"),i=!1;try{var a=[7][r]();a["return"]=function(){i=!0},Array.from(a,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var a=[7],o=a[r]();o.next=function(){n=!0},a[r]=function(){return o},t(a)}catch(s){}return n}},{84:84}],45:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],46:[function(t,e,n){e.exports={}},{}],47:[function(t,e,n){var r=Object;e.exports={create:r.create,getProto:r.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:r.getOwnPropertyDescriptor,setDesc:r.defineProperty,setDescs:r.defineProperties,getKeys:r.keys,getNames:r.getOwnPropertyNames,getSymbols:r.getOwnPropertySymbols,each:[].forEach}},{}],48:[function(t,e,n){var r=t(47),i=t(79);e.exports=function(t,e){for(var n,a=i(t),o=r.getKeys(a),s=o.length,u=0;s>u;)if(a[n=o[u++]]===e)return n}},{47:47,79:79}],49:[function(t,e,n){e.exports=!1},{}],50:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],51:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],52:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],53:[function(t,e,n){var r,i,a,o=t(30),s=t(76).set,u=o.MutationObserver||o.WebKitMutationObserver,c=o.process,l=o.Promise,p="process"==t(12)(c),f=function(){var t,e,n;for(p&&(t=c.domain)&&(c.domain=null,t.exit());r;)e=r.domain,n=r.fn,e&&e.enter(),n(),e&&e.exit(),r=r.next;i=void 0,t&&t.enter()};if(p)a=function(){c.nextTick(f)};else if(u){var h=1,d=document.createTextNode("");new u(f).observe(d,{characterData:!0}),a=function(){d.data=h=-h}}else a=l&&l.resolve?function(){l.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:p&&c.domain};i&&(i.next=e),r||(r=e,a()),i=e}},{12:12,30:30,76:76}],54:[function(t,e,n){var r=t(47),i=t(81),a=t(35);e.exports=t(25)(function(){var t=Object.assign,e={},n={},r=Symbol(),i="abcdefghijklmnopqrst";return e[r]=7,i.split("").forEach(function(t){n[t]=t}),7!=t({},e)[r]||Object.keys(t({},n)).join("")!=i})?function(t,e){for(var n=i(t),o=arguments,s=o.length,u=1,c=r.getKeys,l=r.getSymbols,p=r.isEnum;s>u;)for(var f,h=a(o[u++]),d=l?c(h).concat(l(h)):c(h),m=d.length,v=0;m>v;)p.call(h,f=d[v++])&&(n[f]=h[f]);return n}:Object.assign},{25:25,35:35,47:47,81:81}],55:[function(t,e,n){var r=t(23),i=t(17),a=t(25);e.exports=function(t,e){var n=(i.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*a(function(){n(1)}),"Object",o)}},{17:17,23:23,25:25}],56:[function(t,e,n){var r=t(47),i=t(79),a=r.isEnum;e.exports=function(t){return function(e){for(var n,o=i(e),s=r.getKeys(o),u=s.length,c=0,l=[];u>c;)a.call(o,n=s[c++])&&l.push(t?[n,o[n]]:o[n]);return l}}},{47:47,79:79}],57:[function(t,e,n){var r=t(47),i=t(5),a=t(30).Reflect;e.exports=a&&a.ownKeys||function(t){var e=r.getNames(i(t)),n=r.getSymbols;return n?e.concat(n(t)):e}},{30:30,47:47,5:5}],58:[function(t,e,n){"use strict";var r=t(59),i=t(34),a=t(3);e.exports=function(){for(var t=a(this),e=arguments.length,n=Array(e),o=0,s=r._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var r,a=this,o=arguments,c=o.length,l=0,p=0;if(!u&&!c)return i(t,n,a);if(r=n.slice(),u)for(;e>l;l++)r[l]===s&&(r[l]=o[p++]);for(;c>p;)r.push(o[p++]);return i(t,r,a)}}},{3:3,34:34,59:59}],59:[function(t,e,n){e.exports=t(30)},{30:30}],60:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],61:[function(t,e,n){var r=t(62);e.exports=function(t,e){for(var n in e)r(t,n,e[n]);return t}},{62:62}],62:[function(t,e,n){var r=t(30),i=t(32),a=t(83)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(17).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(a)||i(n,a,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||i(n,"name",e)),t===r?t[e]=n:(o||delete t[e],i(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[a]||s.call(this)})},{17:17,30:30,32:32,83:83}],63:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],64:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],65:[function(t,e,n){var r=t(47).getDesc,i=t(39),a=t(5),o=function(t,e){if(a(t),!i(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,i){try{i=t(18)(Function.call,r(Object.prototype,"__proto__").set,2),i(e,[]),n=!(e instanceof Array)}catch(a){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:i(t,e),t}}({},!1):void 0),check:o}},{18:18,39:39,47:47,5:5}],66:[function(t,e,n){"use strict";var r=t(30),i=t(47),a=t(20),o=t(84)("species");e.exports=function(t){var e=r[t];a&&e&&!e[o]&&i.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{20:20,30:30,47:47,84:84}],67:[function(t,e,n){var r=t(47).setDesc,i=t(31),a=t(84)("toStringTag");e.exports=function(t,e,n){t&&!i(t=n?t:t.prototype,a)&&r(t,a,{configurable:!0,value:e})}},{31:31,47:47,84:84}],68:[function(t,e,n){var r=t(30),i="__core-js_shared__",a=r[i]||(r[i]={});e.exports=function(t){return a[t]||(a[t]={})}},{30:30}],69:[function(t,e,n){var r=t(5),i=t(3),a=t(84)("species");e.exports=function(t,e){var n,o=r(t).constructor;return void 0===o||void 0==(n=r(o)[a])?e:i(n)}},{3:3,5:5,84:84}],70:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],71:[function(t,e,n){var r=t(78),i=t(19);e.exports=function(t){return function(e,n){var a,o,s=i(e)+"",u=r(n),c=s.length;return 0>u||u>=c?t?"":void 0:(a=s.charCodeAt(u),55296>a||a>56319||u+1===c||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):a:t?s.slice(u,u+2):(a-55296<<10)+(o-56320)+65536)}}},{19:19,78:78}],72:[function(t,e,n){var r=t(40),i=t(19);e.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return i(t)+""}},{19:19,40:40}],73:[function(t,e,n){var r=t(80),i=t(74),a=t(19);e.exports=function(t,e,n,o){var s=a(t)+"",u=s.length,c=void 0===n?" ":n+"",l=r(e);if(u>=l)return s;""==c&&(c=" ");var p=l-u,f=i.call(c,Math.ceil(p/c.length));return f.length>p&&(f=f.slice(0,p)),o?f+s:s+f}},{19:19,74:74,80:80}],74:[function(t,e,n){"use strict";var r=t(78),i=t(19);e.exports=function(t){var e=i(this)+"",n="",a=r(t);if(0>a||a==1/0)throw RangeError("Count can't be negative");for(;a>0;(a>>>=1)&&(e+=e))1&a&&(n+=e);return n}},{19:19,78:78}],75:[function(t,e,n){var r=t(23),i=t(19),a=t(25),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",c=RegExp("^"+s+s+"*"),l=RegExp(s+s+"*$"),p=function(t,e){var n={};n[t]=e(f),r(r.P+r.F*a(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=p.trim=function(t,e){return t=i(t)+"",1&e&&(t=t.replace(c,"")),2&e&&(t=t.replace(l,"")),t};e.exports=p},{19:19,23:23,25:25}],76:[function(t,e,n){var r,i,a,o=t(18),s=t(34),u=t(33),c=t(21),l=t(30),p=l.process,f=l.setImmediate,h=l.clearImmediate,d=l.MessageChannel,m=0,v={},g="onreadystatechange",y=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},b=function(t){y.call(t.data)};f&&h||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},r(m),m},h=function(t){delete v[t]},"process"==t(12)(p)?r=function(t){p.nextTick(o(y,t,1))}:d?(i=new d,a=i.port2,i.port1.onmessage=b,r=o(a.postMessage,a,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(t){l.postMessage(t+"","*")},l.addEventListener("message",b,!1)):r=g in c("script")?function(t){u.appendChild(c("script"))[g]=function(){u.removeChild(this),y.call(t)}}:function(t){setTimeout(o(y,t,1),0)}),e.exports={set:f,clear:h}},{12:12,18:18,21:21,30:30,33:33,34:34}],77:[function(t,e,n){var r=t(78),i=Math.max,a=Math.min;e.exports=function(t,e){return t=r(t),0>t?i(t+e,0):a(t,e)}},{78:78}],78:[function(t,e,n){var r=Math.ceil,i=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?i:r)(t)}},{}],79:[function(t,e,n){var r=t(35),i=t(19);e.exports=function(t){return r(i(t))}},{19:19,35:35}],80:[function(t,e,n){var r=t(78),i=Math.min;e.exports=function(t){return t>0?i(r(t),9007199254740991):0}},{78:78}],81:[function(t,e,n){var r=t(19);e.exports=function(t){return Object(r(t))}},{19:19}],82:[function(t,e,n){var r=t(39);e.exports=function(t,e){if(!r(t))return t;var n,i;if(e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!r(i=n.call(t)))return i;if(!e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},{39:39}],83:[function(t,e,n){var r=0,i=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+i).toString(36))}},{}],84:[function(t,e,n){var r=t(68)("wks"),i=t(83),a=t(30).Symbol;e.exports=function(t){return r[t]||(r[t]=a&&a[t]||(a||i)("Symbol."+t))}},{30:30,68:68,83:83}],85:[function(t,e,n){var r=t(11),i=t(84)("iterator"),a=t(46);e.exports=t(17).getIteratorMethod=function(t){return void 0!=t?t[i]||t["@@iterator"]||a[r(t)]:void 0}},{11:11,17:17,46:46,84:84}],86:[function(t,e,n){"use strict";var r,i=t(47),a=t(23),o=t(20),s=t(60),u=t(33),c=t(21),l=t(31),p=t(12),f=t(34),h=t(25),d=t(5),m=t(3),v=t(39),g=t(81),y=t(79),b=t(78),w=t(77),x=t(80),_=t(35),k=t(83)("__proto__"),E=t(9),S=t(8)(!1),O=Object.prototype,A=Array.prototype,P=A.slice,C=A.join,j=i.setDesc,T=i.getDesc,M=i.setDescs,F={};o||(r=!h(function(){return 7!=j(c("div"),"a",{get:function(){return 7}}).a}),i.setDesc=function(t,e,n){if(r)try{return j(t,e,n)}catch(i){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(d(t)[e]=n.value),t},i.getDesc=function(t,e){if(r)try{return T(t,e)}catch(n){}return l(t,e)?s(!O.propertyIsEnumerable.call(t,e),t[e]):void 0},i.setDescs=M=function(t,e){d(t);for(var n,r=i.getKeys(e),a=r.length,o=0;a>o;)i.setDesc(t,n=r[o++],e[n]);return t}),a(a.S+a.F*!o,"Object",{getOwnPropertyDescriptor:i.getDesc,defineProperty:i.setDesc,defineProperties:M});var N="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),L=N.concat("length","prototype"),R=N.length,I=function(){var t,e=c("iframe"),n=R,r=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(" + + + diff --git a/tgui/src/components/input.styl b/tgui/src/components/input.styl new file mode 100644 index 00000000000..40765a4e579 --- /dev/null +++ b/tgui/src/components/input.styl @@ -0,0 +1,16 @@ +input + display: inline-block + vertical-align: middle + height: 20px + line-height: @height - 3px + padding: 0 5px + white-space: nowrap + + color: input-color-text + background-color: input-color-background + border: 1px solid input-color-border + + &::placeholder + color: input-color-placeholder + &::-ms-clear + display: none diff --git a/tgui/src/components/linegraph.ract b/tgui/src/components/linegraph.ract new file mode 100644 index 00000000000..515d7ef2d08 --- /dev/null +++ b/tgui/src/components/linegraph.ract @@ -0,0 +1,88 @@ + + + + + {{#graph({data: points, xaccessor: xaccessor, yaccessor: yaccessor, width: width, height: height})}} + {{#each xaxis}} + + {{#if @index % 2 == 0}} + {{(size - .) * xfactor}} {{xunit}} + {{/if}} + {{/each}} + {{#each yaxis}} + + {{. * yfactor}} {{yunit}} + {{/each}} + {{#each curves:curve}} + + {{/each}} + {{#each curves:curve}} + + {{/each}} + {{#each curves:curve}} + {{#each line.path.points():count}} + + {{/each}} + {{/each}} + {{#each curves:curve}} + {{#each line.path.points():count}} + {{#if selected == count }} + + {{item[count].y * yfactor}} {{yunit}} @ {{(size - item[count].x) * xfactor}} {{xunit}} + + {{/if}} + {{/each}} + {{/each}} + {{#each curves:curve}} + + + {{legend[curve]}} + + {{/each}} + {{/graph}} + + diff --git a/tgui/src/components/linegraph.styl b/tgui/src/components/linegraph.styl new file mode 100644 index 00000000000..b7eca3c79af --- /dev/null +++ b/tgui/src/components/linegraph.styl @@ -0,0 +1,2 @@ +svg.linegraph + overflow: hidden diff --git a/tgui/src/components/titlebar.styl b/tgui/src/components/titlebar.styl index 25435355a3e..d4661fd8913 100644 --- a/tgui/src/components/titlebar.styl +++ b/tgui/src/components/titlebar.styl @@ -48,11 +48,3 @@ header.titlebar position: absolute top: 4px right: 12px - -.wf-inactive - .statusicon::after - content: "O" - .minimize::after - content: "-" - .close::after - content: "X" diff --git a/tgui/src/images/nanotrasen.svg b/tgui/src/images/nanotrasen.svg index 748c31171b0..d21b9f0a2a0 100644 --- a/tgui/src/images/nanotrasen.svg +++ b/tgui/src/images/nanotrasen.svg @@ -1,8 +1,8 @@ - - + + diff --git a/tgui/src/images/syndicate.svg b/tgui/src/images/syndicate.svg index 7a23a25b695..c2863b790df 100644 --- a/tgui/src/images/syndicate.svg +++ b/tgui/src/images/syndicate.svg @@ -1,6 +1,6 @@ - - + + diff --git a/tgui/src/interfaces/airalarm.ract b/tgui/src/interfaces/airalarm.ract index b32c0101997..f1f5002c7c0 100644 --- a/tgui/src/interfaces/airalarm.ract +++ b/tgui/src/interfaces/airalarm.ract @@ -1,4 +1,3 @@ - @@ -16,15 +15,37 @@ {{#if !data.locked || data.siliconUser}} - {{#if data.screen == 1}} - - {{elseif data.screen == 2}} + {{#if config.screen == "home"}} + + + Area Atmosphere Alarm + + + Panic Siphon + +
    + + Vent Controls + + + Scrubber Controls + + + Operating Mode + + + Alarm Thresholds + +
    + {{elseif config.screen == "vents"}} - {{elseif data.screen == 3}} + {{elseif config.screen == "scrubbers"}} - {{elseif data.screen == 4}} + {{elseif config.screen == "modes"}} - {{elseif data.screen == 5}} + {{elseif config.screen == "thresholds"}} - {{/if}} + {{/if}} {{/if}} diff --git a/tgui/src/interfaces/airalarm/back.ract b/tgui/src/interfaces/airalarm/back.ract index a76d2a47527..b280ebe3291 100644 --- a/tgui/src/interfaces/airalarm/back.ract +++ b/tgui/src/interfaces/airalarm/back.ract @@ -1 +1 @@ -Back +Back diff --git a/tgui/src/interfaces/airalarm/controls.ract b/tgui/src/interfaces/airalarm/controls.ract deleted file mode 100644 index ec2541e4f1d..00000000000 --- a/tgui/src/interfaces/airalarm/controls.ract +++ /dev/null @@ -1,23 +0,0 @@ - - - Area Atmosphere Alarm - - - Panic Siphon - -
    - - Vent Controls - - - Scrubber Controls - - - Operating Mode - - - Alarm Thresholds - -
    diff --git a/tgui/src/interfaces/cargo.ract b/tgui/src/interfaces/cargo.ract new file mode 100644 index 00000000000..1db3bbddef0 --- /dev/null +++ b/tgui/src/interfaces/cargo.ract @@ -0,0 +1,96 @@ + + + + {{#partial button}} + {{#if config.fancy}} + + {{/if}} + {{/partial}} + + {{#if data.docked && !data.requestonly}} + {{data.location}} + {{else}} + {{data.location}} + {{/if}} + + + {{Math.floor(adata.points)}} + + + {{data.message}} + + {{#if data.loan && !data.requestonly}} + + {{#if !data.loan_dispatched}} + Loan Shuttle + {{else}} + Loaned to Centcom + {{/if}} + + {{/if}} + +{{#if !data.requestonly}} + + {{#partial button}} + Clear + {{/partial}} + {{#each data.cart}} + +
    #{{id}}
    +
    {{object}}
    +
    {{cost}} Points
    +
    + +
    +
    + {{else}} + Nothing in Cart + {{/each}} +
    +{{/if}} + + {{#partial button}} + {{#if !data.requestonly}} + Clear + {{/if}} + {{/partial}} + {{#each data.requests}} + +
    #{{id}}
    +
    {{object}}
    +
    {{cost}} Points
    +
    By {{orderedby}}
    +
    Comment: {{comment}}
    + {{#if !data.requestonly}} +
    + + +
    + {{/if}} +
    + {{else}} + No Requests + {{/each}} +
    +{{#each data.supplies}} + + {{#each packs}} + + {{cost}} Points + + {{/each}} + +{{/each}} diff --git a/tgui/src/interfaces/firealarm.ract b/tgui/src/interfaces/firealarm.ract index 9377f19aca9..bfc268e8ef9 100644 --- a/tgui/src/interfaces/firealarm.ract +++ b/tgui/src/interfaces/firealarm.ract @@ -1,8 +1,5 @@ + + + {{#if config.fancy}} + + {{else}} + + {{data.supply}} W + + + {{data.demand}} W + + {{/if}} + + + +
    Area
    +
    Charge
    +
    Load
    +
    Status
    +
    Equipment
    +
    Lighting
    +
    Environment
    +
    + {{#each data.areas}} + +
    {{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)}}]
    +
    + {{/each}} +
    diff --git a/tgui/src/interfaces/sleeper.ract b/tgui/src/interfaces/sleeper.ract new file mode 100644 index 00000000000..20c9b487f81 --- /dev/null +++ b/tgui/src/interfaces/sleeper.ract @@ -0,0 +1,56 @@ + + + + + {{data.occupant.name ? data.occupant.name : "No Occupant"}} + + {{#if data.occupied}} + + {{data.occupant.stat == 0 ? "Conscious" : data.occupant.stat == 1 ? "Unconcious" : "Dead"}} + + + {{Math.round(adata.occupant.health)}} + + {{#each [{label: "Brute", type: "bruteLoss"}, {label: "Respiratory", type: "oxyLoss"}, {label: "Toxin", type: "toxLoss"}, {label: "Burn", type: "fireLoss"}]}} + + {{Math.round(adata.occupant[type])}} + + {{/each}} + + {{data.occupant.cloneLoss ? "Damaged" : "Healthy"}} + + + {{data.occupant.brainLoss ? "Abnormal" : "Healthy"}} + + + {{#each adata.occupant.reagents}} + {{Math.fixed(volume, 1)}} units of {{name}}
    + {{else}} + Pure + {{/each}} +
    + {{/if}} +
    + + + {{data.open ? "Open" : "Closed"}} + + + {{#each data.chems}} + {{name}}
    + {{/each}} +
    +
    diff --git a/tgui/src/interfaces/space_heater.ract b/tgui/src/interfaces/space_heater.ract index c419e27c0f1..9f143d9562d 100644 --- a/tgui/src/interfaces/space_heater.ract +++ b/tgui/src/interfaces/space_heater.ract @@ -1,11 +1,3 @@ - - {{#partial button}} {{#if data.open}} @@ -33,7 +25,7 @@ {{Math.round(adata.targetTemp)}}°C {{#if data.open}} - + Set diff --git a/tgui/src/interfaces/uplink.ract b/tgui/src/interfaces/uplink.ract index 6b68e2a3976..8c2e08008b1 100644 --- a/tgui/src/interfaces/uplink.ract +++ b/tgui/src/interfaces/uplink.ract @@ -1,5 +1,9 @@ {{#partial button}} + {{#if config.fancy}} + + {{/if}} {{#if data.lockable}} Lock {{/if}} @@ -25,7 +36,7 @@ {{data.telecrystals}} TC -{{#each data.buyable}} +{{#each data.categories}} {{#each items}} diff --git a/tgui/src/styles/nanotrasen.styl b/tgui/src/styles/nanotrasen.styl index d9fb1860034..14f6c7d5746 100644 --- a/tgui/src/styles/nanotrasen.styl +++ b/tgui/src/styles/nanotrasen.styl @@ -3,4 +3,5 @@ body.nanotrasen linear-gradient(to bottom, background-color-start 0%, background-color-end 100%) + @import "util/*" @import "components/*" diff --git a/tgui/src/styles/syndicate.styl b/tgui/src/styles/syndicate.styl index bab31f6030b..e9d11c2e8aa 100644 --- a/tgui/src/styles/syndicate.styl +++ b/tgui/src/styles/syndicate.styl @@ -1,4 +1,5 @@ body.syndicate + color-good = pale-green color-highlight = black background-color-start = #750000 background-color-end = #340404 @@ -18,9 +19,12 @@ body.syndicate button-color-selected = dark-red button-color-caution = yellow-orange button-color-danger = yellow + input-color-text = white + input-color-background = dark-red background: data-url('images/syndicate.svg') no-repeat fixed center/70% 70%, linear-gradient(to bottom, background-color-start 0%, background-color-end 100%) + @import "util/*" @import "components/*" diff --git a/tgui/src/tgui.js b/tgui/src/tgui.js index 0ec03953692..9b4123cbc5b 100644 --- a/tgui/src/tgui.js +++ b/tgui/src/tgui.js @@ -9,15 +9,6 @@ import 'html5shiv' Object.assign(Math, require('util/math')) -import WebFont from 'webfontloader' -WebFont.load({ - custom: { - families: [ 'FontAwesome' ], - urls: [ 'https://netdna.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css' ], - testStrings: { FontAwesome: '\uf240' } - } -}) - import TGUI from 'tgui.ract' window.initialize = (dataString) => { if (window.tgui) return @@ -27,6 +18,7 @@ window.initialize = (dataString) => { const initial = JSON.parse(dataString) return { constants: require('util/constants'), + text: require('util/text'), config: initial.config, data: initial.data, adata: initial.data @@ -46,3 +38,12 @@ if (data !== '{}') { // If the JSON was inlined, load it. import { act } from 'util/byond' act(ref, 'tgui:initialize') + +import WebFont from 'webfontloader' +WebFont.load({ + custom: { + families: [ 'FontAwesome' ], + urls: [ 'https://netdna.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css' ], + testStrings: { FontAwesome: '\uf240' } + } +}) diff --git a/tgui/src/tgui.ract b/tgui/src/tgui.ract index 5160fccad81..8d277168e28 100644 --- a/tgui/src/tgui.ract +++ b/tgui/src/tgui.ract @@ -11,6 +11,8 @@ component.exports = { 'ui-bar': require('components/bar'), 'ui-button': require('components/button'), 'ui-display': require('components/display'), + 'ui-input': require('components/input'), + 'ui-linegraph': require('components/linegraph'), 'ui-notice': require('components/notice'), 'ui-section': require('components/section'), 'ui-subdisplay': require('components/subdisplay'), diff --git a/tgui/src/tgui.styl b/tgui/src/tgui.styl index 2f43a8e03a3..822d4d21c18 100644 --- a/tgui/src/tgui.styl +++ b/tgui/src/tgui.styl @@ -80,6 +80,12 @@ button-color-border = dark-gray button-lighten-hover = 15% button-alpha-disabled = .75 +// Input +input-color-text = black +input-color-placeholder = light-gray +input-color-border = dark-gray +input-color-background = white + // Tooltips tooltip-color-border = dark-gray tooltip-color-background = gray @@ -108,5 +114,28 @@ body *, *:before, *:after box-sizing: inherit -@require "util/*" +$h + display: inline-block + margin: 0 + padding: 6px 0 +h1 + @extend $h + font-size: 18px +h2 + @extend $h + font-size: 16px +h3 + @extend $h + font-size: 14px +h4 + @extend $h + font-size: 12px + +.wf-inactive + .titlebar + .minimize::after + content: "-" + .close::after + content: "X" + @require "styles/*" diff --git a/tgui/src/util/filter.js b/tgui/src/util/filter.js new file mode 100644 index 00000000000..28d14f09f9b --- /dev/null +++ b/tgui/src/util/filter.js @@ -0,0 +1,22 @@ +export function filterMulti (displays, string) { + for (let display of displays) { // First check if the display includes the search term in the first place. + if (display.textContent.toLowerCase().includes(string)) { + display.style.display = '' + filter(display, string) + } else { + display.style.display = 'none' + } + } +} + +export function filter (display, string) { + const items = display.queryAll('section') + const titleMatch = display.query('header').textContent.toLowerCase().includes(string) + for (let item of items) { // Check if the item or its displays title contains the search term. + if (titleMatch || item.textContent.toLowerCase().includes(string)) { + item.style.display = '' + } else { + item.style.display = 'none' + } + } +} diff --git a/tgui/src/util/header.styl b/tgui/src/util/header.styl deleted file mode 100644 index b7a98456197..00000000000 --- a/tgui/src/util/header.styl +++ /dev/null @@ -1,16 +0,0 @@ -$h - display: inline-block - margin: 0 - padding: 6px 0 -h1 - @extend $h - font-size: 18px -h2 - @extend $h - font-size: 16px -h3 - @extend $h - font-size: 14px -h4 - @extend $h - font-size: 12px diff --git a/tgui/src/util/misc.styl b/tgui/src/util/misc.styl index bcee9c3cc24..3d40538fcd4 100644 --- a/tgui/src/util/misc.styl +++ b/tgui/src/util/misc.styl @@ -7,3 +7,6 @@ hr height: rule-size background-color: rule-color-normal border: none + +.hidden + display: none diff --git a/tgui/src/util/tooltip.styl b/tgui/src/util/tooltip.styl index a88cf0f65c2..d1500a73a39 100644 --- a/tgui/src/util/tooltip.styl +++ b/tgui/src/util/tooltip.styl @@ -1,4 +1,4 @@ -[data-tooltip] +div[data-tooltip], span[data-tooltip] position: relative &::after