diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 00000000000..3409a8e1c3c --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,6 @@ +#Ignores big formatting commits when checking blame. +#To make use of this file by default, run 'git config blame.ignoreRevsFile .git-blame-ignore-revs' +#in the project folder + +# Force LF line endings with gitattributes and convert repo +62676e72a85cd23e7a87d94adff96d17859dbdc5 diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 14c7e400363..a739e01b741 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -18,6 +18,7 @@ First things first, we want to make it clear how you can contribute (if you've n /tg/station doesn't have a list of goals and features to add; we instead allow freedom for contributors to suggest and create their ideas for the game. That doesn't mean we aren't determined to squash bugs, which unfortunately pop up a lot due to the deep complexity of the game. Here are some useful starting guides, if you want to contribute or if you want to know what challenges you can tackle with zero knowledge about the game's code structure. If you want to contribute the first thing you'll need to do is [set up Git](http://tgstation13.org/wiki/Setting_up_git) so you can download the source code. +After setting it up, optionally navigate your git commandline to the project folder and run the command: 'git config blame.ignoreRevsFile .git-blame-ignore-revs' We have a [list of guides on the wiki](http://www.tgstation13.org/wiki/index.php/Guides#Development_and_Contribution_Guides) that will help you get started contributing to /tg/station with Git and Dream Maker. For beginners, it is recommended you work on small projects like bugfixes at first. If you need help learning to program in BYOND, check out this [repository of resources](http://www.byond.com/developer/articles/resources). @@ -437,6 +438,8 @@ Do not add any of the following in a Pull Request or risk getting the PR closed: Just because something isn't on this list doesn't mean that it's acceptable. Use common sense above all else. ## A word on Git -Yes, we know that the files have a tonne of mixed Windows and Linux line endings. Attempts to fix this have been met with less than stellar success, and as such we have decided to give up caring until there comes a time when it matters. +This repository uses `LF` line endings for all code as specified in the **.gitattributes** and **.editorconfig** files. -Therefore, EOF settings of main repo are forbidden territory one must avoid wandering into, at risk of losing body and/or mind to the Git gods. +Unless overridden or a non standard git binary is used the line ending settings should be applied to your clone automatically. + +Note: VSC requires an [extension](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) to take advantage of editorconfig. diff --git a/SpacemanDMM.toml b/SpacemanDMM.toml index b8274722546..9b658dce0fa 100644 --- a/SpacemanDMM.toml +++ b/SpacemanDMM.toml @@ -1,2 +1,6 @@ [langserver] dreamchecker = true + +[code_standards] +disallow_relative_type_definitions = true +disallow_relative_proc_definitions = true diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm index d8652e33f18..feef234b483 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm @@ -99,7 +99,7 @@ /turf/open/floor/pod/dark, /area/ruin/powered) "w" = ( -/obj/machinery/smartfridge/survival_pod, +/obj/machinery/smartfridge/survival_pod/preloaded, /turf/open/floor/pod/dark, /area/ruin/powered) "x" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm index 01cbeb09fd6..33e3a32368f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm @@ -26,7 +26,10 @@ /turf/open/floor/pod/dark, /area/ruin/powered) "g" = ( -/obj/machinery/smartfridge/survival_pod/empty, +/obj/machinery/smartfridge/survival_pod{ + name = "dusty survival pod storage"; + desc = "A heated storage unit. This one's seen better days." + }, /turf/open/floor/pod/dark, /area/ruin/powered) "h" = ( diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 9c246da51d3..955f16277f2 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -590,11 +590,6 @@ initial_gas_mix = "n2=23;o2=14" }, /area/awaymission/caves/bmp_asteroid/level_two) -"bV" = ( -/turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" - }, -/area/awaymission/caves/bmp_asteroid) "bW" = ( /obj/machinery/light/small{ dir = 8 @@ -1486,7 +1481,6 @@ /turf/open/floor/plasteel, /area/awaymission/caves/listeningpost) "eQ" = ( -/obj/machinery/mineral/mint, /turf/open/floor/plating/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14" }, @@ -5468,9 +5462,9 @@ fy dW bL dW -bV -bV -bV +eQ +eQ +eQ dW bL bL @@ -5725,9 +5719,9 @@ fz dW bL cG -bV -bV -bV +eQ +eQ +eQ cG bL bL @@ -5946,8 +5940,8 @@ bL bL bL bL -bV -bV +eQ +eQ bL bL bL @@ -5980,13 +5974,13 @@ dX fy fy dW -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ cj -bV +eQ bL bL bL @@ -6202,10 +6196,10 @@ bL bL bL bL -bV -bV -bV -bV +eQ +eQ +eQ +eQ bL bL bL @@ -6230,20 +6224,20 @@ bL bL bL bL -bV -bV -bV +eQ +eQ +eQ fp -bV -bV +eQ +eQ fp cj -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -6458,12 +6452,12 @@ bL bL bL bL -bV -bV +eQ +eQ cy -bV -bV -bV +eQ +eQ +eQ bL bL bL @@ -6486,19 +6480,19 @@ bL bL bL bL -bV -bV +eQ +eQ bM bM bM -bV -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ bM bM bM @@ -6714,13 +6708,13 @@ bL bL bL bL -bV -bV -bV +eQ +eQ +eQ cz -bV -bV -bV +eQ +eQ +eQ bL bL bL @@ -6742,8 +6736,8 @@ bL bL bL bL -bV -bV +eQ +eQ bM bM bM @@ -6753,10 +6747,10 @@ bM bM bM bM -bV -bV -bV -bV +eQ +eQ +eQ +eQ bM bM bM @@ -6971,12 +6965,12 @@ bL bL bL bL -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ cj bL bL @@ -6996,10 +6990,10 @@ dt bL bL bL -bV -bV -bV -bV +eQ +eQ +eQ +eQ bM bM bM @@ -7010,10 +7004,10 @@ bL bL bL bL -bV -bV -bV -bV +eQ +eQ +eQ +eQ bL bL bM @@ -7229,13 +7223,13 @@ bL bL bL bL -bV +eQ cj -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -7252,8 +7246,8 @@ dt du bL bL -bV -bV +eQ +eQ bM bM bM @@ -7269,8 +7263,8 @@ dW dX bL bL -bV -bV +eQ +eQ bL bL bL @@ -7491,7 +7485,7 @@ bL bL bL bL -bV +eQ da bL bL @@ -7507,9 +7501,9 @@ dI eb em du -bV -bV -bV +eQ +eQ +eQ bM bM bM @@ -7526,8 +7520,8 @@ fS dX bL bL -bV -bV +eQ +eQ bL bL bL @@ -7748,7 +7742,7 @@ bL bL bL bL -bV +eQ da da bL @@ -7764,7 +7758,7 @@ dt ec en ee -bV +eQ bL bL bM @@ -7783,8 +7777,8 @@ ev dX bL bL -bV -bV +eQ +eQ bL bL bL @@ -8041,7 +8035,7 @@ dX bL bL cj -bV +eQ bL bL bL @@ -8264,10 +8258,10 @@ bL bL bL bL -bV -bV -bV -bV +eQ +eQ +eQ +eQ du du du @@ -8278,7 +8272,7 @@ du ee ep et -bV +eQ bM bM bM @@ -8297,8 +8291,8 @@ ev dW bL bL -bV -bV +eQ +eQ bL bL bL @@ -8522,26 +8516,26 @@ bL bL bL bL -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ cx cx cx -bV -bV +eQ +eQ ef eu bM bM bM bM -bV -bV -bV +eQ +eQ +eQ bL bL bL @@ -8554,8 +8548,8 @@ fB dW bL bL -bV -bV +eQ +eQ bL bL bL @@ -8783,19 +8777,19 @@ bL bL bM bM -bV -bV -bV +eQ +eQ +eQ cx cx cx cj -bV +eQ bM bM bM -bV -bV +eQ +eQ cj cx cx @@ -8811,8 +8805,8 @@ dW dX bL bL -bV -bV +eQ +eQ bL bL bL @@ -9041,41 +9035,41 @@ bL bM bM bM -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ ef -bV +eQ bM bM bM -bV -bV -bV -bV +eQ +eQ +eQ +eQ cx cx cx cx cx cx -bV +eQ fH ej fH -bV +eQ bL bL -bV -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -9300,7 +9294,7 @@ bM bM bM bM -bV +eQ bM bM bM @@ -9312,9 +9306,9 @@ bL bL eQ eQ -bV -bV -bV +eQ +eQ +eQ ff cx cx @@ -9322,17 +9316,17 @@ cx dW fN dX -bV +eQ bL bL bL -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -9573,24 +9567,24 @@ bL bL bL dW -bV +eQ cx cx fI -bV -bV -bV -bV +eQ +eQ +eQ +eQ bL bL bL -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -9830,14 +9824,14 @@ bL bL bL bL -bV +eQ cx cx -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -9847,7 +9841,7 @@ bL bL bL cj -bV +eQ bL bL bL @@ -10087,14 +10081,14 @@ bL bL bL fg -bV +eQ cx cx cx cx -bV -bV -bV +eQ +eQ +eQ bL bL bL @@ -10103,8 +10097,8 @@ bL bL bL bL -bV -bV +eQ +eQ bL bL bL @@ -10344,14 +10338,14 @@ bL bL bL fg -bV -bV +eQ +eQ cx cx cx cx -bV -bV +eQ +eQ bL bL bL @@ -10360,19 +10354,19 @@ bL bL bL bL -bV -bV +eQ +eQ bL bL bL bL cx ej -bV +eQ bM bM -bV -bV +eQ +eQ ej bM bM @@ -10600,25 +10594,25 @@ dX bL bL bL -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ cx cx -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ bL bL bL bL bL -bV -bV +eQ +eQ bL bL bL @@ -10626,9 +10620,9 @@ bL cx cx ej -bV +eQ bM -bV +eQ bM bM bM @@ -10836,7 +10830,7 @@ cZ cn df ch -bV +eQ bL bL bL @@ -10857,25 +10851,25 @@ dX bL bL bL -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ cx cx cx cx cx cx -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ cj -bV +eQ bL bL bL @@ -10883,11 +10877,11 @@ dW gN cx ej -bV +eQ bM bM bM -bV +eQ cx gU dW @@ -11093,7 +11087,7 @@ cg cF cg cg -bV +eQ bL bL bL @@ -11112,26 +11106,26 @@ ev eT dW bL -bV -bV +eQ +eQ ff -bV -bV -bV -bV +eQ +eQ +eQ +eQ fO cx cx cx cx -bV -bV +eQ +eQ ff -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -11141,9 +11135,9 @@ cx gP cx ej -bV -bV -bV +eQ +eQ +eQ ej cx cx @@ -11339,18 +11333,18 @@ bL bL bL bL -bV -bV -bV +eQ +eQ +eQ ci cF cr cr cF -bV -bV -bV -bV +eQ +eQ +eQ +eQ bL bL bL @@ -11372,17 +11366,17 @@ eG eG eG eF -bV -bV -bV -bV +eQ +eQ +eQ +eQ dW cx cx -bV -bV -bV -bV +eQ +eQ +eQ +eQ dW bL bL @@ -11399,7 +11393,7 @@ cx cx fO cx -bV +eQ gT cx cx @@ -11594,26 +11588,26 @@ aa bL bL bL -bV -bV -bV +eQ +eQ +eQ ci -bV -bV +eQ +eQ ch cP cP ch -bV -bV -bV +eQ +eQ +eQ bL bL bL bL bL -bV -bV +eQ +eQ bL dW dX @@ -11629,17 +11623,17 @@ eN eJ eO fh -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ cx cx -bV -bV -bV -bV +eQ +eQ +eQ +eQ bL bL bL @@ -11650,7 +11644,7 @@ bL bL bL bL -bV +eQ fP fP fP @@ -11851,26 +11845,26 @@ aa bL bL bL -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ cG cx cx cG -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ bL bL bL -bV -bV +eQ +eQ bL dW eg @@ -11886,17 +11880,17 @@ eX eJ eJ fh -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ cx cx -bV +eQ cj -bV -bV +eQ +eQ bL bL bL @@ -11908,14 +11902,14 @@ bL bL bL cj -bV -bV -bV +eQ +eQ +eQ cG cx cx cG -bV +eQ bL bL bL @@ -12108,26 +12102,26 @@ aa bL bL bL -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ cx cx -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL -bV -bV +eQ +eQ bL dX eh @@ -12145,34 +12139,34 @@ eJ eF fh eF -bV -bV -bV +eQ +eQ +eQ cx cx -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL bL bL bL -bV -bV -bV +eQ +eQ +eQ gQ -bV -bV +eQ +eQ cx cx -bV -bV +eQ +eQ bL bL bL @@ -12181,10 +12175,10 @@ bM bM bM bM -bV -bV -bV -bV +eQ +eQ +eQ +eQ bL bL bL @@ -12365,26 +12359,26 @@ aa bL bL bL -bV -bV +eQ +eQ bZ -bV -bV -bV -bV +eQ +eQ +eQ +eQ cx cx -bV -bV -bV +eQ +eQ +eQ bZ -bV -bV +eQ +eQ bL bL bL -bV -bV +eQ +eQ bL dX ei @@ -12407,20 +12401,20 @@ cx cx cx cx -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ cx cx cx @@ -12428,20 +12422,20 @@ cx cx cx cx -bV +eQ bL bL bL -bV -bV +eQ +eQ gV -bV +eQ bM bM bM bM -bV -bV +eQ +eQ bL bL bL @@ -12622,26 +12616,26 @@ aa bL bL bL -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ cx cx cx -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL -bV -bV +eQ +eQ bL dX ej @@ -12659,9 +12653,9 @@ eJ eF fh eF -bV -bV -bV +eQ +eQ +eQ cx cx cx @@ -12670,7 +12664,7 @@ cx cx cx cx -bV +eQ cx cx cx @@ -12684,16 +12678,16 @@ cx cx cx cx -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bM bM @@ -12879,26 +12873,26 @@ aa bL bL bL -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ cx cx -bV -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL -bV -bV +eQ +eQ bL dW ek @@ -12914,11 +12908,11 @@ eJ eJ eN fh -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ cx cx cx @@ -12936,17 +12930,17 @@ cx cx cx cx -bV +eQ fg fg gR -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -13136,27 +13130,27 @@ aa bL bL bL -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ cx cx -bV -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL -bV -bV -bV +eQ +eQ +eQ dW dW dX @@ -13171,29 +13165,29 @@ eJ eJ eJ fh -bV -bV -bV +eQ +eQ +eQ ff -bV +eQ cx cx -bV +eQ ff -bV -bV -bV +eQ +eQ +eQ cx cx -bV -bV -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -13393,31 +13387,31 @@ aa bL bL bL -bV +eQ bZ -bV -bV -bV +eQ +eQ +eQ cx cx cx -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL -bV -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL eF eF @@ -13428,21 +13422,21 @@ eF eF eF eG -bV -bV -bV +eQ +eQ +eQ dW fP cx cx fJ dW -bV -bV -bV +eQ +eQ +eQ cx cx -bV +eQ bL bL bL @@ -13651,30 +13645,30 @@ bL bL bL bL -bV -bV +eQ +eQ cj -bV +eQ cx cx -bV -bV +eQ +eQ bZ -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ bL bL -bV -bV +eQ +eQ bM bM bM bM -bV -bV +eQ +eQ bL bL bL @@ -13683,23 +13677,23 @@ bL bL bL bL -bV +eQ cG -bV +eQ cj -bV +eQ fJ fQ fQ fQ fQ fJ -bV -bV -bV +eQ +eQ +eQ cx cx -bV +eQ bL bL bL @@ -13908,57 +13902,57 @@ bL bL bL bL -bV -bV -bV -bV +eQ +eQ +eQ +eQ cx cx -bV -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL -bV -bV -bV +eQ +eQ +eQ bM bM bM bM bM bM -bV -bV -bV +eQ +eQ +eQ bL bL bL bL bL -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ fJ fQ fQ fQ fQ fJ -bV -bV -bV -bV +eQ +eQ +eQ +eQ cx cx -bV -bV +eQ +eQ bL bL bL @@ -14165,23 +14159,23 @@ bL bL bL bL -bV -bV -bV -bV +eQ +eQ +eQ +eQ cx cx -bV -bV -bV +eQ +eQ +eQ cj -bV +eQ bL bL bL bL -bV -bV +eQ +eQ bM bM bM @@ -14191,32 +14185,32 @@ bM bM bM bM -bV -bV +eQ +eQ bL bL bL bL -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ fJ fQ fU fQ fQ fJ -bV -bV -bV -bV +eQ +eQ +eQ +eQ cx cx cx cx -bV +eQ bL bL bL @@ -14423,13 +14417,13 @@ bL bL bL bL -bV -bV -bV +eQ +eQ +eQ cx -bV -bV -bV +eQ +eQ +eQ bL bL bL @@ -14437,7 +14431,7 @@ bL bL bL bL -bV +eQ bM bM bM @@ -14453,27 +14447,27 @@ bM bM bL dW -bV -bV -bV +eQ +eQ +eQ cj -bV -bV +eQ +eQ fJ fQ fQ fQ fQ fJ -bV -bV -bV +eQ +eQ +eQ bL dW ge cx cx -bV +eQ bL bL bL @@ -14680,13 +14674,13 @@ bM bM bL bL -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -14694,7 +14688,7 @@ bL bL bL bL -bV +eQ bM bM bM @@ -14710,11 +14704,11 @@ bM bM ca cG -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ fE dW fJ @@ -14723,15 +14717,15 @@ fJ fJ dW ge -bV -bV +eQ +eQ bL bL -bV -bV +eQ +eQ cx cx -bV +eQ bL bL bL @@ -14938,9 +14932,9 @@ bM bL bL bL -bV -bV -bV +eQ +eQ +eQ bL bL bL @@ -14951,7 +14945,7 @@ bL bL bL bL -bV +eQ bM bM bM @@ -14966,17 +14960,17 @@ bM bM bM ca -bV -bV +eQ +eQ bL bL fg fg -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -14985,10 +14979,10 @@ bL bL bL bL -bV +eQ cx cx -bV +eQ bL bL bL @@ -15195,9 +15189,9 @@ bM bL bL bL -bV -bV -bV +eQ +eQ +eQ bL bL bL @@ -15208,7 +15202,7 @@ bL bL bL bL -bV +eQ bM bM bM @@ -15223,8 +15217,8 @@ bM bM bM ca -bV -bV +eQ +eQ bL bL bL @@ -15242,10 +15236,10 @@ bL bL bL bL -bV +eQ cx cx -bV +eQ bL bL bL @@ -15452,9 +15446,9 @@ bM bL bL bL -bV -bV -bV +eQ +eQ +eQ bL bL bL @@ -15465,7 +15459,7 @@ bL bL bL bL -bV +eQ bM bM bM @@ -15480,8 +15474,8 @@ bM bM bM ca -bV -bV +eQ +eQ bL bL bL @@ -15502,7 +15496,7 @@ dW dW cx cx -bV +eQ bL bL bL @@ -15709,9 +15703,9 @@ bM bL bL bL -bV -bV -bV +eQ +eQ +eQ bL bL bL @@ -15722,7 +15716,7 @@ bL bL bL bL -bV +eQ bM bM bM @@ -15737,8 +15731,8 @@ bM bM bM ca -bV -bV +eQ +eQ bL bL bL @@ -15759,7 +15753,7 @@ ej gz cx cx -bV +eQ bL bL bL @@ -15965,12 +15959,12 @@ bM bM bM ca -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -15979,7 +15973,7 @@ bL bL bL bL -bV +eQ bM bM bM @@ -15994,8 +15988,8 @@ bM bM bM ca -bV -bV +eQ +eQ bL bL bL @@ -16016,7 +16010,7 @@ ej gz cx cx -bV +eQ bL bL bL @@ -16223,12 +16217,12 @@ bM bM bM ca -bV -bV -bV -bV +eQ +eQ +eQ +eQ cj -bV +eQ bL bL bL @@ -16236,7 +16230,7 @@ bL bL bL bL -bV +eQ bM bM bM @@ -16251,8 +16245,8 @@ bM bM bM ca -bV -bV +eQ +eQ bL bL bL @@ -16273,8 +16267,8 @@ dX dW gA cx -bV -bV +eQ +eQ bM bM bM @@ -16480,17 +16474,17 @@ bM bM bM ca -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -16508,8 +16502,8 @@ bM bM bL bL -bV -bV +eQ +eQ bL bL bL @@ -16527,11 +16521,11 @@ go gq gw fH -bV -bV +eQ +eQ cx cx -bV +eQ bM bM bM @@ -16741,13 +16735,13 @@ bL bL bL bL -bV -bV -bV -bV +eQ +eQ +eQ +eQ cj -bV -bV +eQ +eQ bL bL bL @@ -16764,9 +16758,9 @@ bM bM bM bL -bV -bV -bV +eQ +eQ +eQ bL bL bL @@ -16784,8 +16778,8 @@ gp gt gx fH -bV -bV +eQ +eQ cx cx bM @@ -16998,32 +16992,32 @@ bL bL bL bL -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL bL bL -bV -bV -bV -bV +eQ +eQ +eQ +eQ bL bL bL @@ -17042,8 +17036,8 @@ gq gy fH cj -bV -bV +eQ +eQ cx cx cx @@ -17260,27 +17254,27 @@ bL bL bL bL -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ cj -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -17303,10 +17297,10 @@ bL bL bL bL -bV +eQ bM bM -bV +eQ fN fH bM @@ -17517,26 +17511,26 @@ bL bL bL bL -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ cj -bV -bV +eQ +eQ dU -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -17560,8 +17554,8 @@ bL bL bL bL -bV -bV +eQ +eQ fH ej ej @@ -17785,10 +17779,10 @@ bL bL bL bL -bV -bV -bV -bV +eQ +eQ +eQ +eQ bL bL bL @@ -18070,14 +18064,14 @@ dW dX dX bL -bV +eQ dW dX dW gL ej ej -bV +eQ ej dX bM @@ -18326,22 +18320,22 @@ bL bL bL bL -bV -bV +eQ +eQ fy gF gH ej ej -bV -bV -bV +eQ +eQ +eQ gS bM bM -bV -bV -bV +eQ +eQ +eQ bL bL bL @@ -18582,10 +18576,10 @@ bL bL bL bL -bV -bV -bV -bV +eQ +eQ +eQ +eQ fy gI fy @@ -18596,9 +18590,9 @@ bM bM bM bM -bV +eQ cj -bV +eQ bL bL bL @@ -18838,24 +18832,24 @@ bL bL bL bL -bV -bV -bV -bV +eQ +eQ +eQ +eQ gD fy fy fy -bV -bV -bV +eQ +eQ +eQ bM bM bM bM -bV -bV -bV +eQ +eQ +eQ bL bL bL @@ -19096,7 +19090,7 @@ bL bL bL bL -bV +eQ fW gB fy @@ -19106,13 +19100,13 @@ fy fy bM eu -bV -bV +eQ +eQ bM -bV -bV -bV -bV +eQ +eQ +eQ +eQ bL bL bL @@ -19362,11 +19356,11 @@ gJ gB fy bM -bV +eQ eu ej -bV -bV +eQ +eQ bL bL bL @@ -19622,8 +19616,8 @@ gO dX gK dW -bV -bV +eQ +eQ bL bL bL @@ -19869,17 +19863,17 @@ bL bL bL bL -bV -bV +eQ +eQ dX dX dX dW dW dX -bV -bV -bV +eQ +eQ +eQ bL bL bL @@ -20127,16 +20121,16 @@ bL bL bL bL -bV -bV -bV -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL @@ -20384,16 +20378,16 @@ bL bL bL bL -bV -bV +eQ +eQ cj -bV -bV -bV -bV -bV -bV -bV +eQ +eQ +eQ +eQ +eQ +eQ +eQ bL bL bL diff --git a/_maps/RandomZLevels/wildwest.dmm b/_maps/RandomZLevels/wildwest.dmm index 5eb0f68693c..c0cf4b2f51f 100644 --- a/_maps/RandomZLevels/wildwest.dmm +++ b/_maps/RandomZLevels/wildwest.dmm @@ -174,9 +174,6 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating, /area/awaymission/wildwest/refine) -"bc" = ( -/turf/open/floor/plating, -/area/awaymission/wildwest/refine) "bd" = ( /obj/machinery/door/airlock/sandstone, /turf/open/floor/plating, @@ -827,7 +824,6 @@ /turf/open/floor/carpet, /area/awaymission/wildwest/gov) "di" = ( -/obj/machinery/mineral/mint, /turf/open/floor/plating, /area/awaymission/wildwest/refine) "dj" = ( @@ -1195,9 +1191,6 @@ "et" = ( /turf/closed/wall/r_wall, /area/awaymission/wildwest/refine) -"eu" = ( -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) "ev" = ( /obj/effect/decal/cleanable/blood, /turf/open/floor/plasteel/cafeteria{ @@ -1225,7 +1218,6 @@ }, /area/awaymission/wildwest/gov) "eA" = ( -/obj/machinery/mineral/mint, /turf/open/floor/plasteel, /area/awaymission/wildwest/refine) "eC" = ( @@ -27395,7 +27387,7 @@ br aa aa eP -eu +eA eP aa aa @@ -27652,7 +27644,7 @@ br aa aa eQ -eu +eA eP aa aa @@ -28163,21 +28155,21 @@ aG aG aG et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA gz aa aa @@ -28420,21 +28412,21 @@ aG aG et et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA eP aa aa @@ -28676,22 +28668,22 @@ aG aG aG et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA fj fo fo @@ -28934,24 +28926,24 @@ aG aG et eA -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA pD -eu -eu +eA +eA Kh gL gQ @@ -29190,22 +29182,22 @@ aW aW aW et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA gA fo fo @@ -29440,29 +29432,29 @@ aG aG aW bb -bc -bc -bc +di +di +di bo -bc +di bd -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA gB aa aa @@ -29696,30 +29688,30 @@ aG aG aG aW -bc -bc +di +di bh -bc -bc -bc +di +di +di bd -eu -eu -eu -eu -eu -eu -eu -eu -eu +eA +eA +eA +eA +eA +eA +eA +eA +eA fO -eu +eA ge -eu -eu -eu -eu -eu +eA +eA +eA +eA +eA eJ aa aa @@ -29954,29 +29946,29 @@ aG aG aW bo -bc -bc -bc -bc -bc +di +di +di +di +di aW et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA gz aa aa @@ -30210,30 +30202,30 @@ aG aG aG aW -bc -bc -bc -bc -bc -bc +di +di +di +di +di +di aW et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA eP aa aa @@ -30467,30 +30459,30 @@ aG aG aG aW -bc -bc -bc -bc +di +di +di +di bh -bc +di aW et et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA gC aa aG @@ -30725,29 +30717,29 @@ aG aG aW bh -bc +di bn -bc -bc -bc +di +di +di aW aW et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA et aG aG @@ -30981,30 +30973,30 @@ aG aG aG aW -bc -bc -bc -bc -bc +di +di +di +di +di bo -bc +di aW et -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu -eu +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA +eA et aG aG @@ -31238,12 +31230,12 @@ aG aW aW aW -bc -bc -bc -bc -bc -bc +di +di +di +di +di +di bo aW et @@ -31494,13 +31486,13 @@ aG aW aW bb -bc -bc +di +di bo -bc -bc -bc -bc +di +di +di +di aW aW aN @@ -31750,11 +31742,11 @@ aW aW aW bh -bc -bc -bc -bc -bc +di +di +di +di +di bh aW aW @@ -31994,25 +31986,25 @@ aW aW aW bt -bc -bc +di +di bh -bc -bc -bc -bc +di +di +di +di bh -bc -bc -bc -bc +di +di +di +di bo -bc -bc -bc -bc -bc -bc +di +di +di +di +di +di aW aN aN @@ -32247,29 +32239,29 @@ bg bg aW bh -bc -bc -bc -bc -bc -bc -bc -bc -bc +di +di +di +di +di +di +di +di +di bo -bc -bc +di +di bh -bc -bc -bc -bc -bc -bc -bc +di +di +di +di +di +di +di bh -bc -bc +di +di aW aN aN @@ -32501,30 +32493,30 @@ aW aW aW aW -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc +di +di +di +di +di +di +di +di +di +di +di +di +di +di +di +di +di +di +di +di +di +di +di +di aW aW aW @@ -32756,29 +32748,29 @@ aG aG aW bb -bc -bc +di +di bh -bc -bc -bc +di +di +di bq -bc -bc -bc +di +di +di bh -bc -bc -bc +di +di +di bo -bc -bc +di +di cT -bc -bc -bc -bc -bc +di +di +di +di +di bh bo aW @@ -33012,32 +33004,32 @@ aG aG aG aW -bc -bc -bc -bc -bc +di +di +di +di +di bn -bc -bc +di +di bh -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc +di +di +di +di +di +di +di +di +di +di +di bh -bc +di bo -bc -bc -bc +di +di +di aW aN aN @@ -33269,30 +33261,30 @@ aG aG aV aW -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc +di +di +di +di +di +di +di +di +di +di +di +di bh -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc -bc +di +di +di +di +di +di +di +di +di +di +di aW aW aW @@ -33526,29 +33518,29 @@ aG aG aV aW -bc -bc -bc -bc -bc -bo -bc -bh -bc -bc -bc -bc -bc -bc -bo -bc -bc -bc -bc -bc -bc di -bc +di +di +di +di +bo +di +bh +di +di +di +di +di +di +bo +di +di +di +di +di +di +di +di bh aW aN @@ -33783,8 +33775,8 @@ aG aG aW aW -bc -bc +di +di aW aW aW diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 59c59c01067..48b957dbb7b 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -65,44 +65,21 @@ /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hop) "aaj" = ( -/obj/machinery/shower{ +/obj/machinery/door/airlock/security/glass{ + name = "Permabrig Cell 3"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, -/obj/item/soap/nanotrasen, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/security/prison/toilet) -"aak" = ( -/obj/structure/toilet{ - cistern = 1; - dir = 4; - icon_state = "toilet01" - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/security/prison/toilet) -"aal" = ( -/obj/machinery/door/airlock{ - name = "Bathroom" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, -/obj/structure/sign/poster/official/cleanliness{ - pixel_y = 32 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/security/prison/toilet) +/area/security/prison/safe) "aam" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -1108,6 +1085,23 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"aci" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/rnd/bepis, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"acj" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/science/research) "aco" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -1545,6 +1539,19 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/port) +"adw" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/decal/cleanable/dirt, +/obj/item/plant_analyzer, +/obj/machinery/camera{ + c_tag = "Permabrig - Garden"; + dir = 8; + network = list("ss13","prison") + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/security/prison) "adx" = ( /obj/structure/table/reinforced, /obj/item/analyzer{ @@ -15000,72 +15007,23 @@ /turf/open/floor/plating, /area/quartermaster/storage) "aGH" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/light/small{ +/obj/machinery/light{ dir = 8 }, -/obj/item/seeds/carrot, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 +/turf/open/floor/plating{ + icon_state = "panelscorched" }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, /area/security/prison) "aGI" = ( -/obj/item/cultivator, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) -"aGJ" = ( -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - name = "old sink"; - pixel_y = 28 - }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/camera{ - c_tag = "Prison - Garden"; - name = "prison camera"; - network = list("ss13","prison") - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/item/storage/bag/trash, -/turf/open/floor/plasteel, -/area/security/prison) -"aGK" = ( -/obj/item/reagent_containers/glass/bucket, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/mob/living/simple_animal/mouse, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/security/prison) "aGL" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/light/small{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 }, -/obj/item/seeds/tower, -/obj/item/seeds/amanita{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, /area/security/prison) "aGO" = ( @@ -15799,60 +15757,31 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/quartermaster/storage) -"aId" = ( -/obj/machinery/seed_extractor, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) "aIe" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating{ + initial_gas_mix = "o2=0.01;n2=0.01"; + luminosity = 2 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, /area/security/prison) "aIf" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/structure/table, +/obj/machinery/computer/bookmanagement, +/obj/machinery/newscaster{ + pixel_y = -32 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, /turf/open/floor/plasteel, /area/security/prison) "aIg" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, +/obj/structure/bookcase/random, /turf/open/floor/plasteel, /area/security/prison) "aIh" = ( -/obj/machinery/biogenerator, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/bookcase/random, +/obj/structure/sign/poster/ripped{ + pixel_y = -32 + }, /turf/open/floor/plasteel, /area/security/prison) "aIk" = ( @@ -16480,38 +16409,21 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "aJy" = ( -/obj/machinery/hydroponics/constructable, -/obj/item/seeds/glowshroom, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, +/mob/living/simple_animal/mouse/gray, /turf/open/floor/plasteel, /area/security/prison) "aJz" = ( -/obj/item/reagent_containers/glass/bucket, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating{ - icon_state = "panelscorched" +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, +/turf/open/floor/plasteel, /area/security/prison) "aJA" = ( /obj/structure/cable, /turf/open/floor/plasteel, /area/security/prison) -"aJB" = ( -/obj/item/plant_analyzer, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/security/prison) -"aJC" = ( -/obj/machinery/hydroponics/constructable, -/obj/item/seeds/ambrosia, -/turf/open/floor/plating, -/area/security/prison) "aJD" = ( /turf/closed/wall, /area/space/nearstation) @@ -17258,28 +17170,39 @@ /turf/closed/wall, /area/security/prison) "aKW" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/status_display/ai{ - pixel_x = -32 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/security/prison) "aKX" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Garden" +/obj/machinery/door/airlock{ + name = "Permabrig Showers" }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/security/prison/safe) "aKY" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/status_display/evac{ - pixel_x = 32 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/airalarm{ + pixel_y = 22 + }, +/obj/effect/decal/cleanable/blood, /turf/open/floor/plating, -/area/security/prison) +/area/security/prison/safe) "aKZ" = ( /turf/closed/wall/r_wall, /area/security/execution/education) @@ -17824,135 +17747,103 @@ /turf/open/floor/plating, /area/quartermaster/storage) "aMd" = ( -/obj/structure/table, -/obj/item/storage/crayons, -/obj/item/storage/crayons, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 }, -/area/security/prison) +/obj/effect/landmark/start/prisoner, +/obj/machinery/flasher{ + id = "Cell 3"; + pixel_y = -25 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "aMe" = ( -/obj/structure/table, -/obj/machinery/computer/bookmanagement, -/obj/structure/cable, -/turf/open/floor/plating, -/area/security/prison) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/sign/poster/official/work_for_a_future{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/prison/safe) "aMf" = ( -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_y = 32 +/obj/machinery/door/airlock/public/glass{ + id_tag = "permabolt3"; + name = "Cell 3" }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small{ - dir = 1 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/table, -/obj/item/storage/photo_album/prison{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/camera{ - pixel_x = -2; - pixel_y = -2 +/obj/machinery/door/poddoor/preopen{ + id = "permashut3" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, -/area/security/prison) -"aMg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) +/area/security/prison/safe) "aMh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/closet/crate/trashcart, +/obj/structure/sign/poster/official/random{ + pixel_x = 30 }, /turf/open/floor/plasteel, /area/security/prison) "aMi" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/structure/weightmachine/weightlifter, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, /turf/open/floor/plasteel, /area/security/prison) "aMj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aMk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aMl" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) +/obj/structure/curtain, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/security/prison/safe) "aMm" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/toy/figure/syndie, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 +/obj/structure/chair/stool, +/obj/item/radio/intercom{ + desc = "A station intercom. It looks like it has been modified to not broadcast."; + name = "Prison Intercom (General)"; + pixel_x = -30; + prison_radio = 1 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/cafeteria, /area/security/prison) "aMn" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 }, -/obj/structure/cable, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/cafeteria, /area/security/prison) "aMo" = ( -/obj/structure/punching_bag, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 }, +/turf/open/floor/plasteel/cafeteria, /area/security/prison) "aMp" = ( -/obj/machinery/light/small{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, -/obj/structure/weightmachine/weightlifter, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/turf/open/floor/plasteel/cafeteria, /area/security/prison) "aMq" = ( /obj/effect/decal/cleanable/dirt, @@ -18499,144 +18390,52 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"aNz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/prison) -"aNA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/mob/living/simple_animal/mouse, -/turf/open/floor/plasteel, -/area/security/prison) -"aNB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) "aNC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 4 }, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/effect/landmark/start/prisoner, +/turf/open/floor/plasteel, /area/security/prison) "aND" = ( -/obj/structure/table, -/obj/item/storage/pill_bottle/dice, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/security/prison) -"aNE" = ( -/obj/structure/table, -/obj/item/paper, -/obj/item/pen, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/computer/arcade{ dir = 8 }, -/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/status_display/evac{ + pixel_x = 32 + }, +/obj/machinery/camera{ + c_tag = "Permabrig - Hall"; + dir = 8; + network = list("ss13","prison") + }, /turf/open/floor/plasteel, /area/security/prison) "aNF" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) +/turf/open/floor/plasteel/white, +/area/security/prison/safe) "aNG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/shower{ + dir = 8 }, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/security/prison) +/obj/effect/spawner/lootdrop/prison_contraband, +/turf/open/floor/plasteel/white, +/area/security/prison/safe) "aNH" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/table, +/obj/item/trash/popcorn, +/obj/machinery/light{ dir = 8 }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) -"aNI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/cafeteria, /area/security/prison) "aNJ" = ( /turf/open/floor/plating{ @@ -18644,52 +18443,15 @@ }, /area/security/prison) "aNK" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, +/turf/open/floor/plasteel/cafeteria, /area/security/prison) -"aNL" = ( -/obj/machinery/sparker{ - dir = 1; - id = "justicespark"; - pixel_x = -22 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) "aNM" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/blood/splatter, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/mob/living/simple_animal/mouse/white, +/obj/machinery/light{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) -"aNN" = ( -/obj/machinery/flasher{ - id = "justiceflash"; - pixel_x = 26; - req_access_txt = "63" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "aNO" = ( /obj/machinery/door/poddoor/incinerator_atmos_main, /turf/open/floor/engine/vacuum, @@ -19505,184 +19267,119 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/quartermaster/storage) -"aPh" = ( -/obj/structure/table, -/obj/item/book/manual/chef_recipes, -/obj/item/storage/box/donkpockets, -/obj/item/clothing/head/chefhat, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) "aPi" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/bed, +/obj/item/bedsheet/orange, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/effect/turf_decal/tile/red, +/obj/machinery/camera{ + c_tag = "Permabrig - Cell 2"; + dir = 8; + network = list("ss13","prison") }, /turf/open/floor/plasteel, -/area/security/prison) -"aPj" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/prison) +/area/security/prison/safe) "aPk" = ( -/obj/structure/chair/stool, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light{ dir = 8 }, /turf/open/floor/plasteel, /area/security/prison) "aPl" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/snacks/deadmouse{ - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/security/prison) -"aPm" = ( -/obj/structure/table, -/obj/item/toy/cards/deck, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/computer/arcade{ dir = 8 }, -/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/security/prison) "aPn" = ( -/obj/structure/chair/stool, -/turf/open/floor/plating, -/area/security/prison) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/item/caution, +/obj/structure/sign/poster/official/no_erp{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/white, +/area/security/prison/safe) "aPo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/shower{ dir = 8 }, -/turf/open/floor/plasteel, -/area/security/prison) -"aPp" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) +/obj/item/soap/homemade, +/turf/open/floor/plasteel/white, +/area/security/prison/safe) "aPq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, +/obj/structure/chair/stool, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/cafeteria, /area/security/prison) "aPr" = ( /obj/structure/chair/stool, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, +/turf/open/floor/plasteel/cafeteria, /area/security/prison) "aPs" = ( -/obj/machinery/vending/coffee, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, +/obj/structure/table, +/obj/item/kitchen/fork/plastic, +/turf/open/floor/plasteel/cafeteria, /area/security/prison) "aPt" = ( /obj/machinery/vending/sustenance, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +/obj/machinery/camera{ + c_tag = "Permabrig - Kitchen"; + dir = 1; + network = list("ss13","prison") }, +/turf/open/floor/plasteel/cafeteria, /area/security/prison) "aPu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) +/obj/structure/table, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/turf/open/floor/plating, +/area/security/prison) "aPv" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) -"aPw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/sign/poster/official/help_others{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) +/obj/structure/closet/crate, +/obj/item/reagent_containers/glass/bowl, +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/kitchen/fork/plastic, +/obj/item/kitchen/fork/plastic, +/obj/item/kitchen/fork/plastic, +/obj/item/storage/box/drinkingglasses, +/obj/item/kitchen/spoon/plastic, +/obj/item/kitchen/spoon/plastic, +/obj/item/kitchen/spoon/plastic, +/obj/item/kitchen/knife/plastic, +/obj/item/kitchen/knife/plastic, +/obj/item/kitchen/knife/plastic, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/box/drinkingglasses, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "aPx" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/incinerator_input{ dir = 4 @@ -20603,137 +20300,75 @@ /turf/open/floor/plasteel/white, /area/security/prison) "aQZ" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -2; - pixel_y = 5 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/flasher{ + id = "Cell 2"; + pixel_y = -25 }, /turf/open/floor/plating, -/area/security/prison) +/area/security/prison/safe) "aRa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating{ - icon_state = "panelscorched" +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 }, -/area/security/prison) -"aRb" = ( -/obj/machinery/light/small, -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/prison/safe) +"aRb" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "permabolt2"; + name = "Cell 2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/machinery/door/poddoor/preopen{ + id = "permashut2" + }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, -/area/security/prison) +/area/security/prison/safe) "aRc" = ( -/obj/machinery/newscaster{ - pixel_y = -32 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, -/turf/open/floor/plasteel, /area/security/prison) "aRd" = ( -/obj/machinery/camera{ - c_tag = "Prison - Relaxation Area"; - dir = 1; - name = "prison camera"; - network = list("ss13","prison") +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 }, -/turf/open/floor/plating, -/area/security/prison) -"aRe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/security/prison) -"aRf" = ( -/obj/machinery/holopad, /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; - name = "Prison Intercom"; - pixel_y = -28; + name = "Prison Intercom (General)"; + pixel_x = 25; + pixel_y = -2; prison_radio = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/security/prison) -"aRg" = ( -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/security/prison) -"aRh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/security/prison) -"aRi" = ( -/obj/machinery/computer/arcade, -/turf/open/floor/plating, -/area/security/prison) -"aRj" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "justicechamber"; - name = "Justice Chamber Blast door" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable, -/turf/open/floor/plating, -/area/security/execution/education) -"aRk" = ( -/obj/machinery/door/poddoor/preopen{ - id = "justicechamber"; - name = "Justice Chamber Blast door" - }, -/obj/machinery/door/window/brigdoor/northright{ - dir = 2; - name = "Justice Chamber"; - req_access_txt = "3" - }, -/obj/machinery/door/window/brigdoor/northright{ - name = "Justice Chamber"; - req_access_txt = "3" - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/general/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) -"aRl" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "justicechamber"; - name = "Justice Chamber Blast door" - }, -/obj/structure/sign/warning/electricshock{ - pixel_x = 32 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plating, -/area/security/execution/education) "aRm" = ( /obj/structure/lattice/catwalk, /obj/structure/disposaloutlet{ @@ -21478,55 +21113,20 @@ }, /turf/open/floor/plasteel/white, /area/security/prison) -"aSF" = ( -/obj/machinery/door/poddoor/preopen{ - id = "permacell3"; - name = "Cell Shutters" - }, -/obj/machinery/door/airlock/public/glass{ - id_tag = "permabolt3"; - name = "Cell 3" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plasteel, -/area/security/prison) "aSG" = ( -/obj/machinery/door/poddoor/preopen{ - id = "permacell2"; - name = "Cell Shutters" - }, -/obj/machinery/door/airlock/public/glass{ - id_tag = "permabolt2"; - name = "Cell 2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, /turf/open/floor/plasteel, /area/security/prison) "aSH" = ( -/obj/machinery/door/poddoor/preopen{ - id = "permacell1"; - name = "Cell Shutters" +/obj/item/radio/intercom{ + desc = "A station intercom. It looks like it has been modified to not broadcast."; + name = "Prison Intercom (General)"; + pixel_y = 24; + prison_radio = 1 }, -/obj/machinery/door/airlock/public/glass{ - id_tag = "permabolt1"; - name = "Cell 1" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plasteel, /area/security/prison) "aSI" = ( @@ -21567,6 +21167,21 @@ /turf/open/floor/plasteel/dark, /area/security/execution/education) "aSJ" = ( +/obj/machinery/button/door{ + id = "visitation"; + name = "Visitation Shutters"; + pixel_x = 6; + pixel_y = 25; + req_access_txt = "2" + }, +/obj/machinery/button/flasher{ + id = "visitorflash"; + pixel_x = -6; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"aSM" = ( /obj/structure/table/reinforced, /obj/machinery/button/ignition{ id = "justicespark"; @@ -21599,9 +21214,6 @@ }, /obj/item/restraints/handcuffs, /obj/item/taperecorder, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -21610,47 +21222,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/execution/education) -"aSK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) -"aSL" = ( -/obj/machinery/atmospherics/pipe/simple/general/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) -"aSM" = ( -/obj/structure/closet/secure_closet/injection, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) "aSN" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/structure/window/reinforced{ @@ -22700,144 +22271,68 @@ }, /turf/open/floor/plasteel, /area/quartermaster/qm) -"aUt" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/security/prison) -"aUu" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/security/prison) "aUv" = ( -/obj/structure/bed, -/obj/item/bedsheet/brown, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aUw" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/landmark/start/prisoner, -/turf/open/floor/plasteel, -/area/security/prison) -"aUx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /obj/machinery/light/small{ dir = 1 }, -/obj/machinery/button/door{ - id = "permabolt3"; - name = "Cell Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 +/turf/open/floor/plating{ + icon_state = "platingdmg1" }, -/obj/structure/chair/stool, -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/area/security/prison/safe) +"aUw" = ( +/obj/structure/bed, +/obj/item/bedsheet/orange, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, /obj/machinery/camera{ - c_tag = "Prison - Cell 3"; - name = "prison camera"; + c_tag = "Permabrig - Cell 1"; + dir = 8; network = list("ss13","prison") }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/security/prison) +/turf/open/floor/plasteel, +/area/security/prison/safe) "aUy" = ( -/obj/structure/bed, -/obj/item/bedsheet/brown, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 }, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel, /area/security/prison) "aUz" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 }, -/obj/structure/cable, -/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel, /area/security/prison) "aUA" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 }, -/obj/machinery/button/door{ - id = "permabolt2"; - name = "Cell Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 - }, -/obj/item/chair/stool, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/camera{ - c_tag = "Prison - Cell 2"; - name = "prison camera"; - network = list("ss13","prison") - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, /turf/open/floor/plasteel, /area/security/prison) -"aUB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/landmark/start/prisoner, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/security/prison) "aUC" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 }, -/obj/machinery/button/door{ - id = "permabolt1"; - name = "Cell Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 }, -/obj/structure/chair/stool, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/camera{ - c_tag = "Prison - Cell 1"; - name = "prison camera"; - network = list("ss13","prison") - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/structure/sign/poster/official/here_for_your_safety{ + pixel_x = 30 }, /turf/open/floor/plasteel, /area/security/prison) @@ -22861,10 +22356,16 @@ /turf/open/floor/plasteel/dark, /area/security/execution/education) "aUE" = ( +/obj/machinery/camera{ + c_tag = "Security - Visitation"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"aUH" = ( /obj/structure/chair/office{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -22876,49 +22377,12 @@ dir = 8 }, /obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) -"aUF" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) -"aUG" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/general/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) -"aUH" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, /turf/open/floor/plasteel/dark, /area/security/execution/education) "aUI" = ( @@ -22971,18 +22435,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/execution/education) -"aUK" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Security External Airlock"; - req_access_txt = "63" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/security/prison) "aUL" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/light/small{ @@ -23899,109 +23351,70 @@ }, /turf/open/floor/plasteel, /area/quartermaster/qm) -"aWb" = ( -/obj/structure/table/glass, -/obj/item/storage/firstaid/regular, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/security/prison) "aWc" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/door/airlock/security/glass{ + name = "Permabrig Cell 1"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, -/turf/open/floor/plasteel/white, -/area/security/prison) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "aWd" = ( -/obj/machinery/flasher{ - id = "PCell 3"; - pixel_x = -28 - }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 }, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/flasher{ + id = "Cell 1"; + pixel_y = -25 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) +"aWf" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "permabolt1"; + name = "Cell 1" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/poddoor/preopen{ + id = "permashut1" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/security/prison/safe) +"aWg" = ( +/obj/structure/weightmachine/weightlifter, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ dir = 8 }, /turf/open/floor/plasteel, /area/security/prison) -"aWe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aWf" = ( -/obj/structure/table, -/obj/item/paper, -/obj/item/pen, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aWg" = ( -/obj/machinery/flasher{ - id = "PCell 2"; - pixel_x = -28 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/security/prison) "aWi" = ( -/obj/machinery/flasher{ - id = "PCell 1"; - pixel_x = -28 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/security/prison) -"aWj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/item/kirbyplants/random, +/obj/structure/sign/warning/electricshock{ + pixel_y = -30 }, /turf/open/floor/plasteel, /area/security/prison) "aWk" = ( -/obj/structure/table, -/obj/item/paper, -/obj/item/pen, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/structure/chair/stool, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 }, /turf/open/floor/plasteel, /area/security/prison) @@ -24025,31 +23438,11 @@ /turf/open/floor/plasteel/dark, /area/security/execution/education) "aWm" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/obj/machinery/light{ + dir = 4 }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) -"aWn" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) +/turf/open/floor/plasteel, +/area/security/prison) "aWo" = ( /obj/machinery/newscaster/security_unit{ pixel_y = -32 @@ -24117,16 +23510,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/execution/education) -"aWs" = ( -/obj/structure/sign/warning/securearea{ - pixel_x = 32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/prison) "aWt" = ( /turf/open/floor/engine/co2, /area/engine/atmos) @@ -24987,118 +24370,42 @@ }, /turf/open/floor/plasteel, /area/quartermaster/qm) -"aXJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plating, -/area/security/prison) "aXK" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Sanitarium"; - req_access_txt = "63" - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/security/prison) -"aXL" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/departments/medbay/alt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/structure/cable, -/turf/open/floor/plating, -/area/security/prison) -"aXM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/status_display/evac, -/turf/closed/wall, -/area/security/prison) -"aXN" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Long-Term Cell 3"; +/obj/machinery/door/poddoor/preopen{ + id = "brigprison"; + name = "Prison Blast door" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/button/flasher{ + id = "Cell 1"; + name = "Prisoner Flash"; + pixel_x = 25; + pixel_y = 7 + }, +/obj/machinery/button/door{ + id = "permashut1"; + name = "Cell Lockdown Button"; + pixel_x = 25; + pixel_y = -7; req_access_txt = "2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/security/prison) -"aXO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/security/prison) -"aXP" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Long-Term Cell 2"; - req_access_txt = "2" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) -"aXQ" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Long-Term Cell 1"; - req_access_txt = "2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/prison) "aXR" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - aiControlDisabled = 1; - name = "Education Chamber"; - req_access_txt = "3" +/obj/machinery/door/poddoor/preopen{ + id = "brigprison"; + name = "Prison Blast door" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/security/glass{ + name = "Permabrig Visitation"; + req_access_txt = "2" }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/security/execution/education) -"aXS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/security/prison) -"aXT" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/external{ - name = "Security External Airlock"; - req_access_txt = "63" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/directions/engineering{ - desc = "A sign that shows there are doors here. There are doors everywhere!"; - icon_state = "doors"; - name = "WARNING: EXTERNAL AIRLOCK"; - pixel_x = 32 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/security/prison) "aXU" = ( /turf/closed/wall/mineral/plastitanium, @@ -25906,24 +25213,17 @@ /turf/open/floor/plasteel, /area/security/prison) "aZl" = ( -/obj/machinery/newscaster/security_unit{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/security/prison) -"aZm" = ( -/obj/machinery/camera{ - c_tag = "Security - Prison Port" - }, /obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/security/prison) "aZn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/red, /obj/structure/cable, +/obj/machinery/newscaster/security_unit{ + pixel_y = 32 + }, /turf/open/floor/plasteel, /area/security/prison) "aZo" = ( @@ -25931,139 +25231,30 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/security/prison) -"aZp" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) "aZq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/red, /obj/structure/cable, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, /turf/open/floor/plasteel, /area/security/prison) "aZr" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) -"aZs" = ( -/obj/machinery/button/door{ - id = "permacell3"; - name = "Cell 3 Lockdown"; - pixel_x = -4; - pixel_y = 25; - req_access_txt = "2" - }, -/obj/machinery/button/flasher{ - id = "PCell 3"; - pixel_x = 6; - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) -"aZt" = ( -/obj/machinery/computer/security/telescreen{ - name = "Prisoner Telescreen"; - network = list("prison"); - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, /obj/effect/turf_decal/tile/red, /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /turf/open/floor/plasteel, /area/security/prison) "aZu" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Security - Prison" }, /obj/effect/turf_decal/tile/red, /obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) -"aZw" = ( -/obj/machinery/button/door{ - id = "permacell2"; - name = "Cell 2 Lockdown"; - pixel_x = -4; - pixel_y = 25; - req_access_txt = "2" - }, -/obj/machinery/button/flasher{ - id = "PCell 2"; - pixel_x = 6; - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) -"aZx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/computer/security/telescreen{ - name = "Prisoner Telescreen"; - network = list("prison"); - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) -"aZz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) -"aZA" = ( -/obj/machinery/button/door{ - id = "permacell1"; - name = "Cell 1 Lockdown"; - pixel_x = -4; - pixel_y = 25; - req_access_txt = "2" - }, -/obj/machinery/button/flasher{ - id = "PCell 1"; - pixel_x = 6; - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /turf/open/floor/plasteel, /area/security/prison) "aZC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/machinery/firealarm{ pixel_y = 24 }, @@ -26079,17 +25270,13 @@ pixel_y = 26; req_access_txt = "63" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/security/prison) "aZE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 @@ -26120,6 +25307,10 @@ dir = 4 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/security/prison) "aZH" = ( @@ -26130,6 +25321,9 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/prison) "aZI" = ( @@ -26143,10 +25337,16 @@ dir = 8 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/prison) "aZJ" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, /turf/open/floor/plating, /area/security/prison) "aZK" = ( @@ -26787,62 +25987,67 @@ /turf/closed/wall, /area/quartermaster/qm) "bba" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, /turf/open/floor/plasteel, /area/security/prison) "bbb" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/prison) "bbc" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /obj/structure/cable, /turf/open/floor/plasteel, /area/security/prison) "bbd" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/security/prison) "bbe" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 1 }, /turf/open/floor/plasteel, /area/security/prison) "bbf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -26853,32 +26058,14 @@ dir = 1; pixel_y = -22 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/red{ dir = 1 }, -/turf/open/floor/plasteel, -/area/security/prison) -"bbh" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"bbi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, /turf/open/floor/plasteel, /area/security/prison) "bbj" = ( @@ -26905,11 +26092,16 @@ pixel_x = 1; pixel_y = -23 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/prison) "bbl" = ( @@ -26917,43 +26109,44 @@ /obj/item/radio/intercom{ pixel_y = -26 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 }, /turf/open/floor/plasteel, /area/security/prison) -"bbm" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/prison) "bbn" = ( /obj/item/kirbyplants/random, /obj/structure/sign/warning/pods{ dir = 8; pixel_y = -32 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/prison) "bbo" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/plating, /area/security/prison) "bbp" = ( @@ -26962,38 +26155,24 @@ pixel_y = -32 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plasteel, -/area/security/prison) -"bbq" = ( -/obj/machinery/door/poddoor/preopen{ - id = "brigprison"; - name = "Prison Blast door" +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 }, -/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/security/prison) "bbr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /turf/open/floor/plating{ icon_state = "panelscorched" }, /area/security/prison) "bbs" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -27005,6 +26184,9 @@ dir = 8 }, /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, /turf/open/floor/plasteel, /area/security/prison) "bbt" = ( @@ -27041,7 +26223,7 @@ name = "lavaland" }, /turf/open/space, -/area/space/nearstation) +/area/space) "bbA" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/structure/sign/warning/securearea{ @@ -27647,13 +26829,13 @@ name = "Prison Wing"; req_access_txt = "1" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plasteel, /area/security/prison) "bcN" = ( @@ -27662,12 +26844,12 @@ name = "Prison Wing"; req_access_txt = "1" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/security/prison) "bcO" = ( @@ -28506,9 +27688,9 @@ /obj/structure/sign/warning/pods{ pixel_x = -32 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/delivery, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plasteel, /area/security/prison) "beq" = ( @@ -28524,8 +27706,8 @@ id = "brigprison"; name = "Prison Blast door" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plasteel, /area/security/prison) "bes" = ( @@ -31712,18 +30894,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"bjO" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "bjP" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -32677,33 +31847,6 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall, /area/hallway/primary/fore) -"blF" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/clipboard, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"blG" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "blH" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -40595,6 +39738,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/hallway/primary/central) +"bzW" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "bzX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -72471,11 +71620,11 @@ /turf/open/floor/plasteel/dark, /area/library) "cEu" = ( -/obj/structure/filingcabinet, /obj/machinery/atmospherics/pipe/manifold/supply, /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/machinery/skill_station, /turf/open/floor/plasteel/dark, /area/library) "cEv" = ( @@ -84715,10 +83864,10 @@ /turf/open/floor/plasteel/white, /area/medical/pharmacy) "dbh" = ( -/obj/structure/closet/wardrobe/chemistry_white, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/structure/closet/secure_closet/chemical, /turf/open/floor/plasteel, /area/medical/pharmacy) "dbi" = ( @@ -90681,6 +89830,19 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"dnm" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Prisoner Workroom" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "dnn" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -95521,6 +94683,7 @@ dir = 8 }, /obj/structure/cable, +/obj/structure/closet/crate/freezer/surplus_limbs, /turf/open/floor/plasteel/dark, /area/medical/surgery) "dyJ" = ( @@ -98944,14 +98107,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/science/research) -"dFX" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/machinery/rnd/bepis, -/turf/open/floor/plasteel/white, -/area/science/research) "dFY" = ( /obj/machinery/disposal/bin, /obj/machinery/power/apc{ @@ -105034,6 +104189,15 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/maintenance/port/aft) +"dRO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) "dRP" = ( /obj/structure/table/reinforced, /obj/machinery/light{ @@ -111353,6 +110517,10 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/security/checkpoint/escape) +"efQ" = ( +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) "efW" = ( /obj/structure/dresser, /obj/structure/extinguisher_cabinet{ @@ -111780,6 +110948,22 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"elQ" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) "emj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment{ @@ -111797,6 +110981,15 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/maintenance/department/science) +"epN" = ( +/obj/machinery/power/apc{ + areastring = "/area/security/prison/safe"; + dir = 8; + name = "Prison Wing Cells APC"; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/security/prison) "epU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -111874,10 +111067,27 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/maintenance/department/science) +"eEX" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/machinery/flasher{ + id = "visitorflash"; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/security/prison) "eFf" = ( /obj/structure/lattice, /turf/open/space, /area/crew_quarters/abandoned_gambling_den) +"eHh" = ( +/obj/machinery/camera{ + c_tag = "Security - Prison Port" + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "eHJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -111908,6 +111118,14 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"eMd" = ( +/obj/machinery/vending/cigarette, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) "eMD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -111950,6 +111168,14 @@ }, /turf/open/space/basic, /area/space/nearstation) +"eRh" = ( +/obj/machinery/door/window/southright, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "eTv" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -111972,6 +111198,21 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery/room_b) +"eZf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable, +/obj/machinery/computer/security/telescreen{ + dir = 8; + name = "Prisoner Telescreen"; + network = list("prison"); + pixel_x = 27 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) "faI" = ( /obj/item/kirbyplants/random, /obj/machinery/camera{ @@ -112028,6 +111269,11 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/engine/engineering) +"fiN" = ( +/obj/structure/window, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) "fjK" = ( /obj/machinery/door/poddoor/preopen{ id = "transitlock"; @@ -112077,6 +111323,16 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/engine, /area/science/mixing/chamber) +"fuE" = ( +/obj/machinery/door/airlock/security{ + name = "Isolation Cell"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/prison) "fvf" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/trimline/yellow/filled/corner{ @@ -112092,6 +111348,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"fxd" = ( +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "fxp" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -112118,20 +111378,122 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"fBg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/effect/landmark/start/prisoner, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) +"fCE" = ( +/obj/machinery/washing_machine, +/obj/structure/sign/warning/electricshock{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"fDa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "justicechamber"; + name = "Justice Chamber Blast door" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/security/execution/education) +"fDA" = ( +/obj/machinery/washing_machine, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/sign/warning/electricshock{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) "fGq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, /area/maintenance/port) +"fIc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/flasher{ + id = "Cell 4"; + pixel_y = -25 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "fJQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, /area/maintenance/starboard/aft) +"fLd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/computer/security/telescreen{ + dir = 8; + name = "Prisoner Telescreen"; + network = list("prison"); + pixel_x = 27 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "fLR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"fMV" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) +"fPG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable, +/obj/machinery/button/flasher{ + id = "Cell 4"; + name = "Prisoner Flash"; + pixel_x = 25; + pixel_y = 7 + }, +/obj/machinery/button/door{ + id = "permashut4"; + name = "Cell Lockdown Button"; + pixel_x = 25; + pixel_y = -7; + req_access_txt = "2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) "fQi" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -112149,6 +111511,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/port) +"fSf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/prison/safe) "fSj" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -112188,6 +111561,17 @@ }, /turf/open/floor/engine, /area/science/mixing/chamber) +"geJ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "visitation"; + name = "Visitation Shutters" + }, +/obj/machinery/door/window/southright{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) "gmj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/airlock/maintenance_hatch{ @@ -112214,6 +111598,10 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"gsB" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel, +/area/security/prison) "gvO" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -112227,6 +111615,17 @@ "gCK" = ( /turf/closed/wall, /area/maintenance/department/science) +"gEN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "gFZ" = ( /obj/machinery/nanite_program_hub, /obj/effect/turf_decal/bot, @@ -112374,6 +111773,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) +"gRM" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/security/prison) "gRN" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -112395,6 +111807,18 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/wood, /area/library) +"gWz" = ( +/obj/structure/toilet/greyscale, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "gWD" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -112445,6 +111869,29 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"hfK" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"hjf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/security/prison) "hjC" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -112454,6 +111901,19 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"hkk" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) "hpY" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -112525,6 +111985,17 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/port) +"hAI" = ( +/obj/structure/window, +/obj/structure/sink{ + pixel_y = 30 + }, +/obj/structure/reagent_dispensers/watertank, +/obj/item/reagent_containers/glass/bucket, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel, +/area/security/prison) "hFL" = ( /obj/machinery/stasis, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -112582,6 +112053,9 @@ dir = 8 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/prison) "hLm" = ( @@ -112604,6 +112078,28 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) +"hQD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable, +/obj/machinery/button/flasher{ + id = "Cell 2"; + name = "Prisoner Flash"; + pixel_x = 25; + pixel_y = 7 + }, +/obj/machinery/button/door{ + id = "permashut2"; + name = "Cell Lockdown Button"; + pixel_x = 25; + pixel_y = -7; + req_access_txt = "2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) "hTO" = ( /obj/structure/sign/warning/nosmoking, /turf/closed/wall/r_wall, @@ -112627,6 +112123,20 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"hWw" = ( +/obj/machinery/flasher{ + id = "justiceflash"; + pixel_x = 26; + req_access_txt = "63" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) "hZA" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -112643,6 +112153,11 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/research) +"ibY" = ( +/obj/structure/chair/stool, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "icz" = ( /obj/item/circular_saw, /obj/item/scalpel{ @@ -112659,6 +112174,21 @@ /obj/machinery/light, /turf/open/floor/plasteel/white, /area/medical/surgery/room_b) +"icM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "ide" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -112687,6 +112217,11 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"ihX" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/mouse/brown/tom, +/turf/open/floor/plasteel, +/area/security/prison) "iko" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -112694,6 +112229,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"ilu" = ( +/obj/structure/window, +/obj/machinery/biogenerator, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) "imL" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -112728,6 +112269,20 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"isY" = ( +/obj/item/radio/intercom{ + desc = "A station intercom. It looks like it has been modified to not broadcast."; + name = "Prison Intercom (General)"; + pixel_x = -30; + prison_radio = 1 + }, +/obj/machinery/camera{ + c_tag = "Permabrig - Workroom"; + dir = 4; + network = list("ss13","prison") + }, +/turf/open/floor/plasteel, +/area/security/prison) "ita" = ( /obj/effect/turf_decal/delivery, /obj/structure/cable, @@ -112746,6 +112301,15 @@ }, /turf/open/space, /area/space/nearstation) +"iua" = ( +/obj/machinery/door/window/northleft, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "ixL" = ( /obj/structure/sign/warning/vacuum{ pixel_x = 32 @@ -112778,12 +112342,31 @@ }, /turf/open/space, /area/space/nearstation) +"iCN" = ( +/obj/structure/table, +/obj/structure/window{ + dir = 8 + }, +/obj/structure/reagent_dispensers/servingdish, +/obj/structure/reagent_dispensers/servingdish, +/obj/item/clothing/head/chefhat, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "iDa" = ( /obj/structure/window/reinforced{ dir = 8 }, /turf/open/floor/plasteel/white, /area/medical/surgery/room_b) +"iDb" = ( +/obj/machinery/airalarm{ + pixel_y = 22 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) "iDp" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -112810,6 +112393,22 @@ }, /turf/open/floor/plasteel/white, /area/maintenance/department/science) +"iHK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) +"iKH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "iLj" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/blue{ @@ -112842,6 +112441,16 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"iMR" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/item/canvas/nineteen_nineteen, +/obj/item/canvas/nineteen_nineteen, +/obj/item/canvas/nineteen_nineteen, +/obj/item/canvas/nineteen_nineteen, +/obj/item/storage/crayons, +/turf/open/floor/plasteel, +/area/security/prison) "iQh" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -112905,6 +112514,15 @@ }, /turf/open/floor/plasteel, /area/medical/surgery/room_b) +"jck" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) "jcE" = ( /obj/machinery/vending/coffee, /turf/open/floor/plasteel, @@ -112921,6 +112539,11 @@ }, /turf/open/floor/plasteel/white, /area/science/research) +"jet" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/security/prison) "jeu" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -112986,6 +112609,12 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) +"jrh" = ( +/obj/structure/window, +/obj/machinery/seed_extractor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) "juf" = ( /obj/machinery/atmospherics/components/binary/valve, /obj/effect/turf_decal/stripes/line{ @@ -113025,6 +112654,35 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/science/mixing) +"jvq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/prison/safe) +"jwH" = ( +/mob/living/simple_animal/mouse/brown, +/turf/open/floor/plasteel, +/area/security/prison) +"jAK" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "permabolt3"; + name = "Cell 4" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/poddoor/preopen{ + id = "permashut4" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/security/prison/safe) "jBu" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -113074,6 +112732,15 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/engine/engineering) +"jIP" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/camera{ + c_tag = "Permabrig - Isolation"; + network = list("ss13","prison") + }, +/turf/open/floor/plating, +/area/security/prison/safe) "jKv" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -113127,6 +112794,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/mixing) +"jWa" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 7 + }, +/turf/open/floor/plating, +/area/security/prison) "jZv" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -113172,6 +112846,18 @@ /obj/structure/cable, /turf/open/space, /area/maintenance/solars/port/fore) +"kbv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) "keB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -113189,6 +112875,13 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) +"kiO" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) "kma" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -113199,6 +112892,18 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/quartermaster/office) +"kpy" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Sanitarium"; + req_access_txt = "63" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/security/prison) "kpL" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral{ @@ -113271,6 +112976,12 @@ /obj/effect/landmark/xeno_spawn, /turf/open/floor/plating, /area/hallway/secondary/construction) +"kxv" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "kxT" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, @@ -113368,6 +113079,22 @@ }, /turf/open/floor/plasteel, /area/maintenance/starboard/aft) +"kYA" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Permabrig Cell 4"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "kZq" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -113386,6 +113113,14 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"lce" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) "lcz" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -113476,6 +113211,16 @@ }, /turf/open/floor/plasteel/white, /area/science/research) +"lgw" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/item/toy/figure/syndie, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plating, +/area/security/prison) "ljP" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -113512,6 +113257,17 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science/lab) +"lpW" = ( +/obj/structure/closet/crate, +/obj/item/toy/beach_ball/holoball/dodgeball, +/obj/item/toy/beach_ball/holoball/dodgeball, +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/item/instrument/harmonica, +/obj/item/storage/pill_bottle/dice, +/obj/item/toy/cards/deck/tarot, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/security/prison) "lrz" = ( /obj/machinery/door/airlock/medical{ name = "Psychology"; @@ -113526,6 +113282,9 @@ }, /turf/open/floor/plasteel/white, /area/medical/psychology) +"lsG" = ( +/turf/open/floor/plasteel, +/area/security/prison) "lti" = ( /obj/machinery/atmospherics/components/trinary/mixer/flipped, /obj/effect/turf_decal/tile/neutral{ @@ -113540,6 +113299,19 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"ltE" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) "luq" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -113583,6 +113355,14 @@ }, /turf/open/floor/plasteel, /area/science/research) +"lxf" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/decal/cleanable/dirt, +/obj/item/shovel/spade, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/security/prison) "lyU" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix{ dir = 8 @@ -113626,6 +113406,17 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/maintenance/port) +"lGy" = ( +/obj/machinery/hydroponics/soil, +/obj/item/cultivator, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/electricshock{ + pixel_x = -32 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/security/prison) "lKR" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment{ @@ -113670,6 +113461,15 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/engine/engineering) +"lUe" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/sign/warning/vacuum{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/security/prison) "lUX" = ( /obj/structure/girder, /obj/effect/decal/cleanable/dirt, @@ -113773,6 +113573,49 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"mdG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) +"meZ" = ( +/obj/machinery/door/poddoor/preopen{ + id = "justicechamber"; + name = "Justice Chamber Blast door" + }, +/obj/machinery/door/window/brigdoor/northright{ + dir = 2; + name = "Justice Chamber"; + req_access_txt = "3" + }, +/obj/machinery/door/window/brigdoor/northright{ + name = "Justice Chamber"; + req_access_txt = "3" + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) "mgW" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -113783,6 +113626,21 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"mio" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) +"miW" = ( +/obj/structure/table, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) "mkm" = ( /obj/machinery/atmospherics/components/binary/valve, /obj/machinery/embedded_controller/radio/airlock_controller/incinerator_toxmix{ @@ -113802,10 +113660,37 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/science/mixing) +"mpy" = ( +/obj/machinery/door/airlock/external{ + name = "Security External Airlock"; + req_access_txt = "1" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/security/prison) +"mrC" = ( +/obj/structure/toilet/greyscale, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "mxm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/circuit/green, /area/science/research/abandoned) +"mzo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/security/prison) "mAW" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -113825,6 +113710,17 @@ "mCL" = ( /turf/closed/wall, /area/engine/storage_shared) +"mCX" = ( +/obj/structure/closet/secure_closet/injection, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) "mHL" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -26 @@ -113849,6 +113745,21 @@ "mIc" = ( /turf/open/space/basic, /area/space/nearstation) +"mIv" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "permabolt3"; + name = "Cell 5" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/poddoor/preopen{ + id = "permashut5" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/security/prison/safe) "mIX" = ( /obj/structure/bed, /obj/item/bedsheet/medical, @@ -113871,6 +113782,31 @@ /obj/machinery/vending/snack/random, /turf/open/floor/plasteel, /area/hallway/primary/central) +"mNI" = ( +/obj/structure/chair, +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"mNS" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison) "mPU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment{ @@ -113888,6 +113824,14 @@ }, /turf/open/floor/plasteel, /area/science/research) +"mQm" = ( +/obj/structure/table, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable, +/obj/item/toy/cards/deck, +/turf/open/floor/plasteel, +/area/security/prison) "mQE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -113908,6 +113852,17 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/vacant_room/commissary) +"mRz" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/regular, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) "mSk" = ( /obj/structure/cable, /turf/open/floor/plasteel, @@ -113935,6 +113890,18 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"mVC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "justicechamber"; + name = "Justice Chamber Blast door" + }, +/obj/structure/sign/warning/electricshock{ + pixel_x = 32 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/security/execution/education) "mWd" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced{ @@ -113982,6 +113949,22 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/medical/surgery/room_b) +"nbd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/landmark/start/prisoner, +/obj/structure/cable, +/obj/machinery/flasher{ + id = "Cell 5"; + pixel_y = -25 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "nbA" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -114030,6 +114013,23 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"niD" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"nkV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "noj" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -114039,6 +114039,16 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"npH" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "npR" = ( /obj/structure/table, /obj/item/storage/secure/safe{ @@ -114062,6 +114072,11 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/vacant_room/commissary) +"nsp" = ( +/obj/item/reagent_containers/glass/bucket, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/security/prison/safe) "nsP" = ( /obj/structure/window/reinforced{ dir = 4 @@ -114135,6 +114150,17 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/medical/medbay/central) +"nAj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) "nAG" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -114158,6 +114184,19 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab/range) +"nFI" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/ambrosia_vulgaris{ + pixel_x = -30 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/security/prison) "nGy" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -114192,6 +114231,11 @@ /obj/structure/cable, /turf/open/floor/wood, /area/bridge/showroom/corporate) +"nLs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/prisoner, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "nMu" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/blue{ @@ -114253,6 +114297,33 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/engine/storage_shared) +"nUf" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Permabrig Cell 2"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) +"nYb" = ( +/obj/machinery/hydroponics/soil, +/obj/item/cultivator, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/electricshock{ + pixel_x = 32 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/security/prison) "nZm" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "engsm"; @@ -114281,6 +114352,24 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"olN" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 11 + }, +/obj/item/trash/sosjerky, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/structure/sign/poster/official/cleanliness{ + pixel_x = 32 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/security/prison/safe) "olS" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/decal/cleanable/dirt, @@ -114288,6 +114377,59 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/science/storage) +"ooN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/button/flasher{ + id = "Cell 3"; + name = "Prisoner Flash"; + pixel_x = 25; + pixel_y = 7 + }, +/obj/machinery/button/door{ + id = "permashut3"; + name = "Cell Lockdown Button"; + pixel_x = 25; + pixel_y = -7; + req_access_txt = "2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"oql" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Permabrig Visitation"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"osd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "ovb" = ( /obj/structure/table, /obj/item/stack/sheet/metal/fifty, @@ -114326,6 +114468,15 @@ /obj/machinery/dna_scannernew, /turf/open/floor/plasteel/dark, /area/science/genetics) +"oBn" = ( +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "brigprison"; + name = "Prison Blast door" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/prison) "oCS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -114341,6 +114492,11 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/medical/morgue) +"oDY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/security/prison) "oEw" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -114486,6 +114642,17 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"oTt" = ( +/obj/structure/sign/warning/electricshock{ + pixel_y = -30 + }, +/obj/machinery/camera{ + c_tag = "Permabrig - Fitness"; + dir = 1; + network = list("ss13","prison") + }, +/turf/open/floor/plasteel, +/area/security/prison) "oUW" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/structure/disposalpipe/segment{ @@ -114496,6 +114663,22 @@ }, /turf/open/floor/plasteel/white, /area/science/research) +"oWo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "oXq" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -114531,6 +114714,15 @@ }, /turf/open/floor/wood, /area/bridge/showroom/corporate) +"pff" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "brigprison"; + name = "Prison Blast door" + }, +/turf/open/floor/plating, +/area/security/prison) "pfl" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/corner{ @@ -114569,10 +114761,63 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"pkY" = ( +/obj/structure/sign/poster/official/help_others{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"plN" = ( +/obj/structure/sink/kitchen{ + dir = 8; + pixel_x = 11 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) +"pmJ" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) "pmQ" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/misc_lab/range) +"pmV" = ( +/obj/structure/closet/crate/trashcart/laundry, +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/item/clothing/under/rank/prisoner/skirt, +/obj/item/clothing/under/rank/prisoner/skirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "pnP" = ( /obj/effect/turf_decal/bot, /obj/structure/cable, @@ -114670,12 +114915,39 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/engine/storage_shared) +"pGM" = ( +/obj/structure/window{ + dir = 8 + }, +/obj/structure/closet/secure_closet/freezer/kitchen{ + req_access = null + }, +/obj/item/reagent_containers/food/snacks/breadslice/plain, +/obj/item/reagent_containers/food/snacks/breadslice/plain, +/obj/item/reagent_containers/food/snacks/breadslice/plain, +/obj/item/reagent_containers/food/snacks/grown/potato, +/obj/item/reagent_containers/food/snacks/grown/potato, +/obj/item/reagent_containers/food/snacks/grown/onion, +/obj/item/reagent_containers/food/snacks/grown/onion, +/obj/item/reagent_containers/food/snacks/meat/slab, +/obj/item/reagent_containers/food/snacks/meat/slab, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/sign/poster/ripped{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "pHv" = ( /obj/item/radio/intercom{ pixel_x = -26 }, /turf/closed/wall, /area/security/checkpoint/science/research) +"pJb" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/security/prison) "pJU" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -114715,6 +114987,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/medical/morgue) +"pWW" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) "qcx" = ( /obj/machinery/firealarm{ dir = 4; @@ -114841,6 +115117,24 @@ }, /turf/open/floor/plasteel/dark, /area/science/genetics) +"qnV" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "qob" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 1 @@ -114852,6 +115146,24 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/port) +"qtz" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"qtR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) "qwX" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -114912,6 +115224,25 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/science/xenobiology) +"qBC" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) +"qFn" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/security/prison) "qFL" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -114979,6 +115310,14 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) +"qSL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/effect/landmark/start/prisoner, +/turf/open/floor/plasteel, +/area/security/prison) "qUc" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -114999,6 +115338,13 @@ /obj/machinery/vending/cigarette, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"qVm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/decal/remains/human, +/turf/open/floor/plating, +/area/security/prison/safe) "qWg" = ( /obj/structure/table/reinforced, /obj/machinery/light/small{ @@ -115049,6 +115395,23 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"reB" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"reP" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) "rfe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -115059,12 +115422,32 @@ }, /turf/open/floor/plating/airless, /area/maintenance/port) +"rhs" = ( +/obj/item/radio/intercom{ + desc = "A station intercom. It looks like it has been modified to not broadcast."; + name = "Prison Intercom (General)"; + pixel_x = -30; + prison_radio = 1 + }, +/obj/machinery/camera{ + c_tag = "Permabrig - Central"; + dir = 4; + network = list("ss13","prison") + }, +/turf/open/floor/plasteel, +/area/security/prison) "rhO" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, /turf/open/floor/plasteel, /area/maintenance/port) +"rjB" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) "rjQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral, @@ -115094,6 +115477,19 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/solars/port/fore) +"rvg" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) "rvL" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/end{ @@ -115106,6 +115502,34 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"rwd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/prison) +"rwB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/button/flasher{ + id = "Cell 5"; + name = "Prisoner Flash"; + pixel_x = 25; + pixel_y = 7 + }, +/obj/machinery/button/door{ + id = "permashut5"; + name = "Cell Lockdown Button"; + pixel_x = 25; + pixel_y = -7; + req_access_txt = "2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "ryN" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -115155,6 +115579,17 @@ "rCv" = ( /turf/open/floor/plasteel, /area/science/misc_lab/range) +"rDI" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/machinery/flasher{ + id = "Cell 6"; + pixel_y = -25 + }, +/obj/machinery/light/small/broken, +/turf/open/floor/plating, +/area/security/prison/safe) "rEm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -115192,6 +115627,16 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/on, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"rJj" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/security/prison) "rKo" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -115362,6 +115807,18 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/science/mixing) +"sdP" = ( +/obj/effect/landmark/start/prisoner, +/turf/open/floor/plating, +/area/security/prison) +"sfb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "sfo" = ( /obj/effect/decal/remains/xeno, /turf/open/floor/engine/vacuum, @@ -115383,10 +115840,38 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/primary/central) +"sgm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/security/prison) +"sgI" = ( +/obj/structure/easel, +/turf/open/floor/plasteel, +/area/security/prison) +"srX" = ( +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = 32 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) "svv" = ( /obj/machinery/door/poddoor/incinerator_toxmix, /turf/open/floor/engine/vacuum, /area/science/mixing/chamber) +"sxA" = ( +/obj/machinery/door/poddoor/preopen{ + id = "brigprison"; + name = "Prison Blast door" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/security/prison) "sAm" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -115420,6 +115905,16 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"sIM" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/security/prison) "sJw" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -115455,12 +115950,44 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/kitchen) +"sPv" = ( +/obj/structure/bed, +/obj/item/bedsheet/orange, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/camera{ + c_tag = "Permabrig - Cell 3"; + dir = 8; + network = list("ss13","prison") + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "sTI" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, /turf/open/floor/plasteel, /area/maintenance/port) +"sUa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/departments/medbay/alt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/security/prison) +"sUb" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/prison) "sUE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -115487,6 +116014,12 @@ }, /turf/open/floor/plasteel, /area/medical/morgue) +"sZD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) "tbR" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko, @@ -115519,6 +116052,10 @@ heat_capacity = 1e+006 }, /area/maintenance/starboard/aft) +"tju" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "tkj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -115545,6 +116082,17 @@ }, /turf/open/floor/plasteel, /area/medical/morgue) +"tqQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/structure/cable, +/obj/machinery/computer/security/telescreen{ + dir = 8; + name = "Prisoner Telescreen"; + network = list("prison"); + pixel_x = 27 + }, +/turf/open/floor/plasteel, +/area/security/prison) "tse" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment{ @@ -115592,6 +116140,16 @@ }, /turf/open/floor/plasteel, /area/vacant_room/commissary) +"tzj" = ( +/obj/machinery/door/airlock/external{ + name = "Security External Airlock"; + req_access_txt = "1" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/security/prison) "tCh" = ( /turf/closed/wall, /area/science/misc_lab) @@ -115621,6 +116179,16 @@ }, /turf/open/floor/plating, /area/science/xenobiology) +"tFx" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) "tGU" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/bodycontainer/morgue{ @@ -115669,6 +116237,16 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"tKa" = ( +/obj/structure/chair/stool, +/obj/structure/window{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "tMk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -115704,6 +116282,48 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"tXx" = ( +/obj/structure/bed, +/obj/item/bedsheet/orange, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/structure/sign/poster/official/obey{ + pixel_x = 30 + }, +/obj/machinery/camera{ + c_tag = "Permabrig - Cell 5"; + dir = 8; + network = list("ss13","prison") + }, +/turf/open/floor/plating, +/area/security/prison/safe) +"ubH" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/paper/guides/jobs/hydroponics, +/obj/item/seeds/onion, +/obj/item/seeds/garlic, +/obj/item/seeds/potato, +/obj/item/seeds/tomato, +/obj/item/seeds/carrot, +/obj/item/seeds/grass, +/obj/item/seeds/ambrosia, +/obj/item/seeds/wheat, +/obj/item/seeds/pumpkin, +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/structure/window, +/obj/effect/decal/cleanable/dirt, +/obj/item/seeds/tower, +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/obj/item/radio/intercom{ + desc = "Talk through this. It looks like it has been modified to not broadcast."; + name = "Prison Intercom (General)"; + pixel_x = 25; + pixel_y = -2; + prison_radio = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) "udq" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -115714,6 +116334,24 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"ugx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/sign/poster/ripped{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "ugX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -115791,6 +116429,14 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"uoy" = ( +/obj/machinery/plate_press, +/obj/structure/sign/warning/electricshock{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/security/prison) "uoL" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, @@ -115813,6 +116459,12 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"upr" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) "upw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/purple{ @@ -115828,6 +116480,24 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/maintenance/port/fore) +"urA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/bin, +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"utK" = ( +/obj/machinery/camera{ + c_tag = "Permabrig - Kitchen Entrance"; + dir = 8; + network = list("ss13","prison") + }, +/turf/open/floor/plasteel, +/area/security/prison) "uvc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -115843,6 +116513,23 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/surgery/room_b) +"uAh" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Permabrig Cell 5"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "uCc" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 4; @@ -115871,6 +116558,25 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"uGw" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"uHd" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) "uHV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -115898,6 +116604,26 @@ }, /turf/open/floor/plasteel, /area/medical/morgue) +"uKn" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) "uLB" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -115942,6 +116668,15 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"uOU" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) "uPp" = ( /obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment, @@ -115970,6 +116705,19 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"uSW" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/item/pen, +/obj/item/pen, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/security/prison) "uTQ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, @@ -116028,6 +116776,14 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"vjn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) "vko" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -116133,6 +116889,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/storage_shared) +"vyv" = ( +/obj/machinery/plate_press, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) "vzc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -116165,6 +116929,28 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/storage_shared) +"vEx" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + aiControlDisabled = 1; + name = "Education Chamber"; + req_access_txt = "3" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) "vFc" = ( /turf/closed/wall, /area/medical/surgery/room_b) @@ -116249,11 +117035,28 @@ }, /turf/open/floor/plating, /area/science/xenobiology) +"vVc" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "vVy" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/pinpointer_dispenser, /turf/open/floor/plating, /area/hallway/secondary/entry) +"vXr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) +"vXz" = ( +/turf/closed/wall, +/area/security/prison/safe) "wav" = ( /obj/machinery/door/airlock/external{ name = "External Docking Port" @@ -116340,6 +117143,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/solars/port/fore) +"wjf" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "wjF" = ( /obj/structure/chair/office/light{ dir = 1; @@ -116379,12 +117192,57 @@ /obj/effect/landmark/start/medical_doctor, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"wqW" = ( +/obj/machinery/button/flasher{ + id = "Cell 6"; + name = "Prisoner Flash"; + pixel_x = -25 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"wtm" = ( +/obj/structure/sign/warning/electricshock{ + pixel_x = -32 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"wtx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "wvD" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel/white, /area/medical/psychology) +"wyY" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) +"wAy" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/clipboard, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "wAA" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, @@ -116398,6 +117256,25 @@ }, /turf/open/floor/plasteel/white, /area/maintenance/department/science) +"wDi" = ( +/obj/structure/table, +/obj/item/book/manual/chef_recipes, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 2 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -8; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/condiment/enzyme, +/obj/item/storage/fancy/egg_box, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) +"wDB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "wEq" = ( /obj/item/retractor, /obj/item/hemostat, @@ -116422,6 +117299,29 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/storage_shared) +"wJo" = ( +/obj/machinery/status_display/evac{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"wKn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) "wLR" = ( /obj/structure/bed/roller, /obj/machinery/iv_drip, @@ -116450,6 +117350,29 @@ }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) +"wNS" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"wPe" = ( +/obj/structure/bed, +/obj/item/bedsheet/orange, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/camera{ + c_tag = "Permabrig - Cell 4"; + dir = 8; + network = list("ss13","prison") + }, +/turf/open/floor/plasteel, +/area/security/prison/safe) "wQo" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -116462,6 +117385,16 @@ }, /turf/open/floor/plating/airless, /area/maintenance/port) +"wQu" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/security/prison) +"wQC" = ( +/obj/machinery/door/window/southleft, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison) "wTa" = ( /obj/machinery/computer/nanite_cloud_controller, /obj/effect/turf_decal/bot, @@ -116478,6 +117411,10 @@ }, /turf/open/floor/plasteel/dark, /area/science/nanite) +"wVj" = ( +/obj/effect/landmark/carpspawn, +/turf/open/space/basic, +/area/space) "wXQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -116529,6 +117466,9 @@ "xdD" = ( /turf/closed/wall/r_wall, /area/science/mixing/chamber) +"xjZ" = ( +/turf/closed/wall/r_wall, +/area/security/prison/safe) "xlt" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -116577,12 +117517,34 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"xtB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/prison/safe) "xvf" = ( /turf/closed/wall/r_wall, /area/medical/chemistry) +"xvZ" = ( +/obj/structure/table, +/obj/item/storage/photo_album/prison, +/obj/item/camera, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "xwx" = ( /turf/open/floor/plasteel, /area/science/research/abandoned) +"xxj" = ( +/obj/structure/table, +/obj/item/trash/raisins, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "xxD" = ( /obj/machinery/smartfridge/organ, /obj/structure/cable, @@ -116598,6 +117560,18 @@ }, /turf/open/floor/plasteel, /area/science/research/abandoned) +"xzu" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/piratepad/civilian, +/obj/effect/turf_decal/trimline/yellow, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) "xzY" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/blue{ @@ -116730,12 +117704,35 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/research) +"xPp" = ( +/obj/structure/punching_bag, +/turf/open/floor/plating, +/area/security/prison) "xRb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall/r_wall, /area/science/mixing/chamber) +"xTK" = ( +/obj/structure/grille, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"xVh" = ( +/obj/machinery/sparker{ + dir = 1; + id = "justicespark"; + pixel_x = -22 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/education) "xXn" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/engine/vacuum, @@ -116754,6 +117751,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/science/xenobiology) +"yfl" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, +/area/security/prison) "yfv" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -116763,6 +117764,27 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"yfC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/prison) +"yfD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/security/prison) "yiv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -116787,6 +117809,19 @@ /obj/structure/cable, /turf/open/floor/plating, /area/science/research/abandoned) +"yjg" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/computer/piratepad_control/civilian{ + dir = 4 + }, +/obj/structure/railing, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) (1,1,1) = {" aaa @@ -152693,7 +153728,7 @@ dse dCn dDx dmY -dFX +acj lgc dIK dmY @@ -156470,8 +157505,8 @@ bdO bfl bgy bhX -bjO -blF +yjg +xzu bfk boO bqS @@ -156728,7 +157763,7 @@ bfm bgz bhY bfo -blG +blH bfk boO bqT @@ -161840,7 +162875,7 @@ aoE aty auH aoF -axk +aci ayB azE azE @@ -165968,7 +167003,7 @@ aad aad aac aaa -aad +aac aad aad aad @@ -166219,12 +167254,12 @@ aaa aad aaa aaa -aad -aaa -aaa -aaa aac aaa +aaa +aaa +aad +aaa aad aaa aaa @@ -166469,27 +167504,27 @@ aaa aaa aaa aad -aad -aad -aad -aaa -aad aaa aaa aad -aaa -aaa -aaa -aac aad aac -aaa -aaa +aac +aad aad aaa aaa aaa -aad +aFm +aFm +aFm +aFm +aFm +aFm +aFn +aFn +aFm +aFm aaa bgZ biy @@ -166728,24 +167763,24 @@ aaa abj aaa aaa -aad -aad -aad -aad -aad -aad -aad -aad -aad -aac +abj aaa -aac +aad aaa aaa -aFm +aad +xjZ +xjZ +xjZ +xjZ +aQW +aSC +kbv +mRz aFn -aFn -aFm +aZk +kiO +bcJ aFm aaa bgZ @@ -166983,26 +168018,26 @@ aaa aaa aaa abj -aad -aad +aaa +aaa abj -aaa -aad -aaa -aaa -aad -aaa -aaa -aaa -aad -aaa -aac aad aad -aFm -aZk -aJA -bcJ +aad +qYo +qYo +xjZ +jIP +rDI +xjZ +aQX +aSD +dRO +oDY +kpy +aZl +bba +bcK aFm aad bgZ @@ -167242,24 +168277,24 @@ aaa abj aaa aaa -abj -aad -aad -aad -ajr -ajr -ajr -aad -aad -aad -aad aad aaa aaa +qYo +aaa +aaa +xjZ +nsp +qVm +xjZ +aQY +aSE +sIM +jck +sUa +eHh +qnV aFm -aZl -bba -bcK aFm aaa bgZ @@ -167498,23 +168533,23 @@ aaa aaa abj aad -aad -abj -aaa -aaa -aad -aaa -aad -aaa -aaa -aad +aFm +aFm +pff +pff +pff +pff +aFm +aFm +aFm +fuE aFm aFm aFm aFm aFm aFm -aZm +aZn bbb aFm aFm @@ -167750,28 +168785,28 @@ aaa aaa aaa aaa +efQ +qYo +qYo +qYo aaa -aaa -aaa -aaa -aaa -aaa -abj -aad -aad -ajr -aaa -aad -aad -aad -aad -aFm -aQW -aSC -aUt -aWb -aXJ -aZn +pff +epN +reP +reP +npH +reP +wtm +reP +wqW +qtz +reP +wJo +uOU +reP +reP +sxA +wNS bbc bcL bep @@ -168007,28 +169042,28 @@ aaa aaa aaa aaa +efQ aaa aaa +uHd aaa -aaa -aaa -aaa -aaa -aaa -aaa -ajr -aad -aad -aFm -aFm -aFm -aFm -aQX -aSD -aSD -aSD +aFn +tqQ +rvg +rwB +fLd +hfK +fPG +eZf +hfK +ooN +eZf +hfK +hQD +eZf +wjf aXK -aZo +yfC bbf aFn beq @@ -168264,28 +169299,28 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -ajr -aaa -aad -aFm +uHd +qYo +qYo +uHd +qYo +xjZ +xjZ +uAh +xjZ +xjZ +kYA +xjZ +xjZ aaj -aak -aFm -aQY -aSE -aUu +xjZ +xjZ +nUf +xjZ +xjZ aWc -aXL -aZp +xjZ +aZo bbe bcN ber @@ -168521,29 +169556,29 @@ aaa aaa aaa aaa +uHd aaa aaa +uHd aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad -aaa -aad -aFm -aKV -aal -aFm -aFm -aFm -aFm -aFm -aFm +xjZ +gWz +osd +vXz +mrC +oWo +vXz +mrC +icM +vXz +mrC +ugx +vXz +gWz +xtB +xjZ aZq -bbf +niD aFm aFm bfQ @@ -168778,29 +169813,29 @@ aaa aaa aaa aaa +uHd aaa aaa -aaa -aaa -aaa -aaa -ajr -ajr -aad -aad -aaa -aad -aFm +uHd +qYo +xjZ +mdG +nbd +vXz +sfb +fIc +vXz +sfb aMd -aNz -aPh +vXz +mdG aQZ -aKV +vXz aUv aWd -aXM -aZr -bbf +xjZ +aZo +niD aFm bes bfR @@ -169035,27 +170070,27 @@ aaa aaa aaa aaa +qYo aaa aaa +qYo aaa -aaa -aaa -aaa -ajr -aad -aad -aad -aad -aad -aFn +xjZ +tXx +jvq +vXz +wPe +fSf +vXz +sPv aMe -aNA +vXz aPi aRa -aSF +vXz aUw -aWe -aXN +fSf +xjZ aZr bbg aFm @@ -169292,29 +170327,29 @@ aaa aaa aaa aaa +qYo +vVc +vVc +qYo aaa -aaa -aaa -aaa -aaa -aaa -ajr -aad -aFm -aFm -aFn -aFm -aFm +xjZ +vXz +mIv +vXz +vXz +jAK +vXz +vXz aMf -aNB -aPj +vXz +vXz aRb -aKV -aUx +vXz +vXz aWf -aXO -aZs -bbh +xjZ +aZo +niD aFm aFm aFn @@ -169549,29 +170584,29 @@ aaa aaa aaa aaa +qYo aaa aaa -aaa -aaa -aaa -aaa -aaa -aad +qYo aFm +aFm +xPp +aJA +rhs aGH -aId +pWW aJy -aKV -aMg +aNJ +yfl aNC aPk aRc -aKV -aKV -aKV -aKV -aZt -bbi +bbt +sZD +oTt +aFm +aZo +niD bcO aFm aaa @@ -169805,16 +170840,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aFn +qYo +qYo +aFm +aFm +aFm +aFm +hAI +gsB +aJA +hjf aGI aIe aJz @@ -169823,10 +170858,10 @@ aMh aND aPl aRd -aKV +jet aUy aWg -aXM +pff aZu bbd bcP @@ -170062,30 +171097,30 @@ aaa aaa aaa aaa +uHd aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aFm -aGJ +pff +lGy +nFI +lxf +fiN +reP +ibY +sUb +lsG aIf -aJA +vXz aKX -aMi -aNE -aPm -aJA +vXz +vXz +vXz +aKV aSG aUz aMi -aXP -aZq -bbf +pff +aZo +niD bcQ aFm aaa @@ -170317,31 +171352,31 @@ aaa aaa aaa aaa +uHd +qYo +uHd aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aFn -aGK +pff +mio +fBg +iHK +eRh +iKH +mQm +uSW +lsG aIg -aJB +vXz aKY aMj aNF aPn -aRe aKV +eMd aUA -aWf -aXO -aZw +lgw +aFm +aZo bbk aKV aFm @@ -170574,32 +171609,32 @@ aaa aaa aaa aaa +uHd aaa +uHd aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad -aFm +pff +vjn +mNS +nAj +ilu +lsG +xvZ +miW aGL aIh -aJC -aKV -aMk +vXz +olN +vXz aNG aPo -aRf aKV aKV +oql aKV -aKV -aZx -bbf +aFm +aZo +niD bcR aFm aaa @@ -170831,32 +171866,32 @@ aaa aaa aaa aaa +xTK aaa +qYo aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -ajr -aad -aFm -aFm -aFn -aFm -aFm -aMl -aNB -aPp -aRg +pff +lce +mNS +mzo +jrh +wQu +kxv +fMV +lsG +lpW +vXz +vXz +vXz +vXz +vXz aKV -aUv +iDb +aUA aWi -aXM -aZr -bbd +aFm +aZo +ltE bcS aFn aad @@ -171088,32 +172123,32 @@ aaa aaa aaa aaa +uHd aaa +uHd aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -ajr -aad -aad -aad -aaa -aad -aFm +pff +ihX +pWW +qSL +wQC +upr +yfl +vXr +lsG +pJb +tKa +wAy aMm aNH aPq -aRh +aKV aSH -aUB -aWj -aXQ -aZz -bbh +aUA +lsG +pff +aZo +niD bcT aFm aaa @@ -171345,31 +172380,31 @@ aaa aaa aaa aaa +uHd +qYo +uHd aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad -aad -aad -aFn +pff +nYb +rJj +adw +fiN +sgI +bbt +qBC +sgm +jet +iua +nkV aMn -aNI +bbt aPr -aRi aKV +eEX aUC aWk -aKV -aZA +oBn +aZo bbl aFm aFm @@ -171604,30 +172639,30 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -ajr -aad -aaa -aad -aFn -aMo -aNJ -aPs -aKZ -aKZ -aKZ -aKZ +qYo +qYo aFm -aZq -bbf +aFm +aFm +aFm +ubH +iMR +srX +wKn +utK +urA +tKa +xxj +aMo +tju +aPs +aKV +geJ +aKV +geJ +aFm +qFn +tFx aFn aaa aad @@ -171861,30 +172896,30 @@ aaa aaa aaa aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -ajr -aad -aad aad +aaa +aaa +aaa +aaa aFm +aFm +aKV +aKV +dnm +aKV +aKV +aKV +fxd aMp aNK aPt -aKZ -aSI -aUD -aWl +aKV +rjB +lsG +rjB aFm aZC -bbm +ltE aFn aad aad @@ -172116,32 +173151,32 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad -aaa -aJD -aKZ -aKZ -aKZ -aKZ -aKZ +vVc +qYo +uHd +uHd +uHd +uHd +qYo +qYo +pff +fDA +sdP +yfD +isY +vyv +aKV +pGM +rwd +nLs +iCN +aKV aSJ aUE aWm aXR aZD -bbh +niD aFn aaa aad @@ -172377,26 +173412,26 @@ aaa aaa aaa aaa +qYo aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -abj -aad -aad -aLa -aMq -aNL +pff +bzW +wDB +gEN +bbt +gRM +aKV +jWa +wtx +aNK aPu -aRj -aSK -aUF -aWn -aXS +aKZ +aKZ +aKZ +aKZ +aKZ aZE bbn aFm @@ -172632,28 +173667,28 @@ aaa aaa aaa aaa +wVj +aaa +uHd aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abj -aaa -aaa -aLa -aMr +pff +fCE +jwH +pmV +lsG +uoy +aKV +wDi +plN aNM aPv -aRk -aSL -aUG -aWo -aFm +aKZ +aSI +aUD +aWl +aKZ aZF bbo aFm @@ -172891,31 +173926,31 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abj -aad -aad -aLa -aMs -aNN -aPw -aRl +uHd +qYo +uHd +qYo +aFm +aFm +pff +pff +pff +aFm +aFm +aKZ +aKZ +aKZ +aKZ +aKZ aSM aUH -aWp -aFm +wyY +vEx aZG bbp aFm -aad -aaa +aFm +aFm aad aaa biP @@ -173150,30 +174185,30 @@ aaa aaa aaa aaa +uHd aaa aaa aaa aaa aaa aaa -aad aaa -aJD +aaa +aLa +aMq +xVh +aMr +fDa +qtR +uKn +uGw aKZ -aKZ -aKZ -aKZ -aKZ -aSN -aUI -aWq -aFm aZH -bbq -aFm -aad -aaa -aad +beq +mpy +lUe +tzj +abj aaa biP bmA @@ -173407,29 +174442,29 @@ aaa aaa aaa aaa +uHd +qYo +vVc +vVc +vVc +qYo +qYo aaa aaa -aaa -aaa -aaa -aFo -aad -aad -aad -aad -aad -aad -aad +aLa +aMr +mNI +elQ +meZ +hkk +pmJ +aWo aKZ -aSO -aUJ -aWr -aFm hGT -bbo +aFn aFm aKV -aad +aFm aad aad biP @@ -173664,24 +174699,24 @@ aaa aaa aaa aaa +qYo aaa aaa aaa aaa aaa -ajr -ajr -ajr +aad aaa -ajr -ajr -ajr aaa +aLa +aMs +hWw +pkY +mVC +mCX +reB +aWp aKZ -aKZ -aKZ -aKZ -aFm aZI bbr bcU @@ -173921,24 +174956,24 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abj -aUK -aWs -aXT +qYo +uHd +uHd +uHd +qYo +aFo +aad +aad +aad +aKZ +aKZ +aKZ +aKZ +aKZ +aSN +aUI +aWq +aKZ aZJ bbs bcV @@ -174183,19 +175218,19 @@ aaa aaa aaa aaa +ajr +ajr +ajr aaa +qYo +qYo +qYo aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad -aKV -aKV -aKV +aKZ +aSO +aUJ +aWr +aKZ aZK bbt aNJ @@ -174442,17 +175477,17 @@ aaa aaa aaa aaa +qYo +qYo +ajr +ajr +ajr aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aad -aKV +aKZ +aKZ +aKZ +aKZ +aKZ aZL bbu aZL @@ -174699,15 +175734,15 @@ aaa aaa aaa aaa +vVc +vVc aaa aaa +qYo +qYo +qYo aaa aaa -aaa -aaa -aaa -aaa -ajr aad aKV aZM @@ -174960,9 +175995,9 @@ aaa aaa aaa aaa -aaa -aaa -aaa +vVc +vVc +vVc aaa ajr aad @@ -175221,7 +176256,7 @@ aaa aaa aaa aaa -aaa +ajr aad aKV aaa diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index c80e9e22983..3747e9e52ef 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -1665,7 +1665,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/engineering{ name = "Engine Room"; - req_access_txt = "10" + req_one_access_txt = "10;24" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/firedoor, @@ -3292,13 +3292,13 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access_txt = "10" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/firedoor, /obj/structure/cable, +/obj/machinery/door/airlock/engineering{ + name = "Engine Room"; + req_one_access_txt = "10;24" + }, /turf/open/floor/plasteel, /area/engine/engineering) "ahG" = ( @@ -8112,6 +8112,12 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"asx" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;38" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "asy" = ( /obj/machinery/door/airlock/maintenance{ name = "Firefighting Equipment"; @@ -8721,6 +8727,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/maintenance/port/fore) +"auf" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance/two, +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "aug" = ( /obj/machinery/firealarm{ dir = 1; @@ -10888,6 +10900,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/hydroponics/garden) +"azr" = ( +/obj/structure/rack, +/obj/item/pressure_plate, +/obj/item/pressure_plate, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "azs" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -11102,6 +11120,13 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"azV" = ( +/obj/machinery/rnd/bepis, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "azW" = ( /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) @@ -11291,6 +11316,27 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"aAq" = ( +/obj/structure/table, +/obj/item/hand_labeler, +/obj/machinery/requests_console{ + department = "Cargo Bay"; + departmentType = 2; + pixel_y = 30 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"aAr" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "aAs" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -11775,6 +11821,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/plastic, /area/hallway/secondary/service) +"aBD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "aBE" = ( /obj/item/clothing/under/misc/mailman, /obj/item/clothing/head/mailman, @@ -12123,6 +12175,26 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/crew_quarters/fitness) +"aCx" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"aCy" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/bounty_board{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) "aCz" = ( /obj/structure/cable, /obj/structure/railing, @@ -12709,6 +12781,23 @@ /obj/structure/cable, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet) +"aDV" = ( +/obj/structure/table, +/obj/item/storage/box/shipping, +/obj/item/clothing/head/soft, +/obj/item/clothing/head/soft, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"aDW" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "aDX" = ( /obj/machinery/modular_computer/console/preset/civilian{ dir = 4 @@ -13305,6 +13394,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"aFn" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "aFo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -14200,12 +14296,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "aHb" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/stack/package_wrap, +/obj/machinery/skill_station, /turf/open/floor/wood, /area/library) "aHc" = ( @@ -23419,6 +23510,12 @@ /obj/item/latexballon, /turf/open/floor/plating, /area/maintenance/port) +"bdN" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "bdO" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -24227,6 +24324,7 @@ /obj/item/stack/medical/gauze{ pixel_x = 8 }, +/obj/item/clothing/neck/stethoscope, /turf/open/floor/plasteel, /area/medical/medbay/central) "bfK" = ( @@ -25380,8 +25478,6 @@ dir = 1 }, /obj/structure/table/glass, -/obj/item/stack/sheet/mineral/plasma, -/obj/item/stack/sheet/mineral/plasma, /obj/item/reagent_containers/glass/bottle/epinephrine, /obj/machinery/requests_console{ department = "Chemistry"; @@ -25392,6 +25488,7 @@ /obj/machinery/light{ dir = 8 }, +/obj/item/stack/sheet/mineral/plasma, /turf/open/floor/plasteel/white, /area/medical/pharmacy) "bip" = ( @@ -25846,17 +25943,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/port) -"bjm" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/obj/item/hand_labeler, -/obj/machinery/requests_console{ - department = "Cargo Bay"; - departmentType = 2; - pixel_y = 30 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) "bjn" = ( /obj/machinery/computer/gateway_control, /turf/open/floor/plasteel, @@ -25868,14 +25954,6 @@ /obj/machinery/vending/wardrobe/cargo_wardrobe, /turf/open/floor/plasteel, /area/quartermaster/storage) -"bjp" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/radio/intercom{ - pixel_y = 20 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) "bjq" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 5; @@ -26236,14 +26314,6 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) -"bkj" = ( -/obj/structure/closet/emcloset, -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/quartermaster/storage) "bkk" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -26999,7 +27069,7 @@ "blY" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 9 }, /turf/open/floor/plasteel, /area/quartermaster/storage) @@ -28066,15 +28136,6 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/science/robotics/lab) -"bot" = ( -/obj/structure/table, -/obj/item/clothing/head/soft, -/obj/item/clothing/head/soft, -/obj/item/storage/box/shipping{ - pixel_x = 6 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) "bou" = ( /turf/open/floor/plasteel, /area/science/robotics/lab) @@ -29786,6 +29847,10 @@ }, /obj/structure/cable, /obj/item/reagent_containers/glass/bottle/epinephrine, +/obj/item/reagent_containers/glass/bottle/multiver{ + pixel_x = 6 + }, +/obj/item/reagent_containers/syringe, /turf/open/floor/plasteel, /area/medical/medbay/central) "bsu" = ( @@ -31062,15 +31127,12 @@ dir = 4 }, /obj/structure/table, -/obj/item/book/manual/wiki/chemistry{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/book/manual/wiki/plumbing, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, /obj/effect/turf_decal/tile/yellow, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/head/welding, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bvj" = ( @@ -32079,23 +32141,6 @@ /obj/machinery/navbeacon/wayfinding, /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) -"bxH" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1; - sortType = 2 - }, -/obj/structure/noticeboard{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/bounty_board{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) "bxI" = ( /obj/machinery/status_display/ai, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -33243,11 +33288,11 @@ pixel_x = -30 }, /obj/item/reagent_containers/chem_pack{ - pixel_x = 10; - pixel_y = 10 + pixel_x = 1; + pixel_y = 1 }, /obj/item/reagent_containers/chem_pack{ - pixel_x = 10; + pixel_x = 7; pixel_y = 10 }, /turf/open/floor/plasteel, @@ -33789,19 +33834,14 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, -/obj/structure/closet/secure_closet/medical3, /obj/machinery/airalarm{ dir = 4; pixel_x = -24 }, -/obj/item/clothing/neck/stethoscope, -/obj/item/clothing/glasses/hud/health, -/obj/item/storage/belt/medical{ - pixel_y = 2 - }, /obj/machinery/light{ dir = 8 }, +/obj/structure/closet/secure_closet/medical3, /turf/open/floor/plasteel/dark, /area/medical/storage) "bBL" = ( @@ -34304,6 +34344,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/item/storage/pill_bottle/mannitol{ + pixel_y = 10 + }, /turf/open/floor/plasteel/white, /area/medical/cryo) "bCN" = ( @@ -34813,7 +34856,7 @@ /area/medical/medbay/aft) "bDX" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold, +/obj/machinery/atmospherics/pipe/manifold/general/visible, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "bDY" = ( @@ -35429,12 +35472,6 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "bFA" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/blood, -/obj/item/reagent_containers/blood, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, /obj/structure/window/reinforced{ dir = 1; layer = 2.9 @@ -35452,6 +35489,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/structure/closet/crate/freezer/blood, /turf/open/floor/plasteel/white, /area/medical/cryo) "bFB" = ( @@ -37086,7 +37124,7 @@ target_pressure = 4500 }, /turf/open/floor/plating/icemoon, -/area/icemoon/surface/outdoors) +/area/maintenance/disposal/incinerator) "bJN" = ( /turf/closed/wall, /area/science/xenobiology) @@ -37100,7 +37138,7 @@ "bJP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plating/icemoon, -/area/icemoon/surface/outdoors) +/area/maintenance/disposal/incinerator) "bJQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -37127,7 +37165,7 @@ dir = 1 }, /turf/open/floor/plating/icemoon, -/area/icemoon/surface/outdoors) +/area/maintenance/disposal/incinerator) "bJW" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 @@ -44137,7 +44175,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/maintenance{ name = "Engineering Maintenance"; - req_access_txt = "10" + req_one_access_txt = "10;24" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/sign/warning/radiation/rad_area{ @@ -44406,7 +44444,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ name = "Supermatter Engine Room"; - req_access_txt = "10" + req_access_txt = "0"; + req_one_access_txt = "10;24" }, /turf/open/floor/engine, /area/engine/engineering) @@ -45200,7 +45239,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ name = "Engineering External Access"; - req_access_txt = "10;13" + req_one_access_txt = "10;24" }, /turf/open/floor/plasteel, /area/engine/engineering) @@ -45949,11 +45988,12 @@ /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/gloves/color/yellow, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable, +/obj/item/clothing/gloves/color/yellow, /obj/item/stock_parts/cell/emproof{ pixel_x = -4; pixel_y = -1 }, -/obj/structure/cable, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "cnB" = ( @@ -46004,11 +46044,12 @@ "coc" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/machinery/door/firedoor, +/obj/structure/cable, /obj/machinery/door/airlock/engineering/glass{ name = "Supermatter Engine Room"; - req_access_txt = "10" + req_access_txt = "0"; + req_one_access_txt = "10;24" }, -/obj/structure/cable, /turf/open/floor/engine, /area/engine/engineering) "cop" = ( @@ -46120,7 +46161,6 @@ /area/engine/engineering) "cpt" = ( /obj/structure/table, -/obj/item/clothing/gloves/color/yellow, /obj/item/storage/toolbox/electrical{ pixel_y = 5 }, @@ -46128,11 +46168,12 @@ /area/engine/engineering) "cpu" = ( /obj/machinery/door/firedoor, +/obj/structure/cable, /obj/machinery/door/airlock/engineering/glass{ name = "Supermatter Engine Room"; - req_access_txt = "10" + req_access_txt = "0"; + req_one_access_txt = "10;24" }, -/obj/structure/cable, /turf/open/floor/engine, /area/engine/engineering) "cpv" = ( @@ -46399,7 +46440,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ name = "Engineering External Access"; - req_access_txt = "10;13" + req_one_access_txt = "10;24" }, /turf/open/floor/plating, /area/engine/engineering) @@ -46429,12 +46470,12 @@ /area/engine/supermatter) "cqE" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/engineering/glass/critical{ heat_proof = 1; name = "Supermatter Chamber"; - req_access_txt = "10" + req_one_access_txt = "10;24" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/engine, /area/engine/supermatter) "cqF" = ( @@ -46575,7 +46616,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ name = "Supermatter Engine Room"; - req_access_txt = "10" + req_access_txt = "0"; + req_one_access_txt = "10;24" }, /turf/open/floor/plasteel/dark, /area/engine/engineering) @@ -46618,13 +46660,13 @@ /turf/closed/wall/r_wall, /area/engine/supermatter) "crt" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, /obj/machinery/door/airlock/engineering/glass/critical{ heat_proof = 1; name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 + req_one_access_txt = "10;24" }, /turf/open/floor/engine, /area/engine/supermatter) @@ -46751,7 +46793,7 @@ }, /obj/machinery/door/airlock/external{ name = "Engineering External Access"; - req_access_txt = "10;13" + req_one_access_txt = "10;24" }, /turf/open/floor/plating, /area/engine/engineering) @@ -50097,11 +50139,12 @@ /area/engine/engineering) "cGI" = ( /obj/machinery/door/firedoor, +/obj/structure/cable, /obj/machinery/door/airlock/engineering/glass{ name = "Laser Room"; - req_access_txt = "10" + req_access_txt = "0"; + req_one_access_txt = "10;24" }, -/obj/structure/cable, /turf/open/floor/engine, /area/engine/engineering) "cGK" = ( @@ -51027,6 +51070,11 @@ pixel_x = 24 }, /obj/structure/cable, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, /turf/open/floor/plasteel/dark, /area/medical/storage) "ddf" = ( @@ -51285,10 +51333,6 @@ "dGF" = ( /turf/closed/wall/r_wall, /area/science/mixing/chamber) -"dHJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/space/basic, -/area/maintenance/starboard/fore) "dHL" = ( /obj/machinery/suit_storage_unit/cmo, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -51543,6 +51587,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) +"eNr" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/office) "eRu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, @@ -51693,17 +51743,6 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel/white, /area/science/genetics) -"fqV" = ( -/obj/structure/rack, -/obj/item/storage/box, -/obj/item/storage/box, -/obj/item/storage/box, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/turf/open/floor/plasteel, -/area/quartermaster/office) "fsD" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -52078,6 +52117,10 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/tcommsat/computer) +"gyA" = ( +/obj/structure/sign/departments/cargo, +/turf/closed/wall, +/area/quartermaster/office) "gCA" = ( /obj/machinery/button/door{ id = "xenobio8"; @@ -52602,13 +52645,6 @@ }, /turf/closed/wall, /area/maintenance/starboard/fore) -"izT" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plasteel, -/area/quartermaster/office) "izV" = ( /obj/machinery/newscaster{ pixel_y = -32 @@ -53158,6 +53194,7 @@ /obj/machinery/light{ dir = 4 }, +/obj/item/clothing/neck/stethoscope, /turf/open/floor/plasteel, /area/medical/medbay/central) "klM" = ( @@ -53339,10 +53376,12 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/item/book/manual/wiki/grenades, /obj/item/book/manual/wiki/chemistry{ - pixel_x = -4; - pixel_y = 4 + pixel_x = 8 + }, +/obj/item/book/manual/wiki/grenades, +/obj/item/book/manual/wiki/plumbing{ + pixel_x = 5 }, /obj/structure/table, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -54700,6 +54739,22 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"otc" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/table, +/obj/item/toner, +/obj/item/hand_labeler, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/storage/box, +/obj/item/storage/box, +/obj/item/storage/box, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/office) "otz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55038,14 +55093,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/storage/primary) -"pqP" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/table, -/obj/item/toner, -/turf/open/floor/plasteel, -/area/quartermaster/office) "pqR" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -55416,10 +55463,6 @@ dir = 10 }, /area/science/research) -"qbW" = ( -/obj/machinery/rnd/bepis, -/turf/open/floor/engine, -/area/science/misc_lab) "qcV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -55624,12 +55667,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/engine/engine_smes) -"rfI" = ( -/obj/item/pressure_plate, -/obj/item/pressure_plate, -/obj/structure/rack, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "rgu" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -55665,6 +55702,13 @@ }, /turf/open/floor/wood, /area/crew_quarters/dorms) +"rlt" = ( +/obj/machinery/computer/piratepad_control/civilian{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/office) "rmX" = ( /obj/structure/table, /obj/item/reagent_containers/food/drinks/beer, @@ -55803,16 +55847,11 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, -/obj/structure/closet/secure_closet/medical3, -/obj/item/clothing/neck/stethoscope, -/obj/item/clothing/glasses/hud/health, -/obj/item/storage/belt/medical{ - pixel_y = 2 - }, /obj/structure/extinguisher_cabinet{ pixel_x = -27; pixel_y = 1 }, +/obj/structure/closet/secure_closet/medical3, /turf/open/floor/plasteel/dark, /area/medical/storage) "rMf" = ( @@ -55933,9 +55972,6 @@ }, /turf/closed/wall/r_wall, /area/storage/mining) -"sdX" = ( -/turf/closed/wall, -/area/quartermaster/office) "sgR" = ( /obj/structure/table, /obj/effect/turf_decal/tile/green, @@ -56318,6 +56354,12 @@ /obj/structure/grille, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"tmI" = ( +/obj/machinery/piratepad/civilian, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/loading_area, +/turf/open/floor/plasteel, +/area/quartermaster/office) "tqd" = ( /obj/machinery/light/small{ dir = 1 @@ -57119,6 +57161,16 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/hydroponics/garden) +"vyO" = ( +/obj/structure/table/wood, +/obj/structure/disposalpipe/segment, +/obj/item/stack/package_wrap, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/turf/open/floor/wood, +/area/library) "vzp" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -57150,6 +57202,10 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"vEC" = ( +/obj/effect/turf_decal/arrows, +/turf/open/floor/plasteel, +/area/quartermaster/office) "vFS" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/brown{ @@ -57364,6 +57420,10 @@ pixel_y = 30 }, /obj/item/reagent_containers/glass/bottle/epinephrine, +/obj/item/reagent_containers/glass/bottle/multiver{ + pixel_x = 6 + }, +/obj/item/reagent_containers/syringe, /turf/open/floor/plasteel, /area/medical/medbay/central) "wom" = ( @@ -76134,8 +76194,8 @@ bgt bhS bjk aPz -boP -boP +blW +blW blW bqj brK @@ -76391,8 +76451,8 @@ bgt bhR bjk aZE -blW -blW +blY +aFn blW bqi cyD @@ -76648,8 +76708,8 @@ aSg bhT bjk aZE -blY -bnw +aDV +bdN boJ bql brL @@ -76905,7 +76965,7 @@ bel bfI bgq bhY -bkj +aDW bqm bqm bps @@ -77674,8 +77734,8 @@ bcw bfd bgw aZE -bot -bjr +azV +aBD bkt bmh boK @@ -77931,8 +77991,8 @@ bcu bfe bdt aZE -bjm -bjr +aAq +aCx xGy bmh boK @@ -78188,7 +78248,7 @@ aPA aWv bdt aZE -bjp +aAr bjr bjr bmh @@ -80502,7 +80562,7 @@ pVb bgB bhX bgv -bxH +aCy bkw bnE bny @@ -81538,7 +81598,7 @@ bqs bbR bkM nro -izT +eNr bwd bvL byI @@ -81795,7 +81855,7 @@ bbR bbR buI bbR -bbR +rlt bwd ccR byK @@ -82051,8 +82111,8 @@ bbR bbR cBq bbR -bbR -fqV +vEC +tmI bwd bxC byL @@ -82309,7 +82369,7 @@ bbR bbR bty bty -pqP +otc bwd byM bAd @@ -82566,7 +82626,7 @@ bqu bqu bnK bnK -sdX +gyA bwe bwe bwe @@ -96663,7 +96723,7 @@ arj auB auB arj -aUx +asx alP alP boP @@ -96921,7 +96981,7 @@ boP boP alP anf -rfI +azr alP boP boP @@ -97435,7 +97495,7 @@ alO alP alP anf -auC +auf alP alP alP @@ -97692,7 +97752,7 @@ anf gjD anf anf -atw +anf aBE alP tdZ @@ -99751,7 +99811,7 @@ arr apE anf ezU -dHJ +alO pAz bKs bKK @@ -101812,7 +101872,7 @@ aDZ aFu aHc aIw -aJS +vyO aJS aMJ aNP @@ -107776,7 +107836,7 @@ bGz bQZ oHU bZc -qbW +bTl kLM bTl bTl diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 44dad51f32e..8b96d1dca63 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -122,6 +122,23 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"aat" = ( +/obj/machinery/rnd/bepis, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"aau" = ( +/obj/machinery/vending/wardrobe/cargo_wardrobe, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "aav" = ( /turf/open/space, /area/space) @@ -316,6 +333,14 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"aaL" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/maintenance{ + name = "Cargo Bay Maintenance"; + req_one_access_txt = "31;48" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) "aaM" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -617,6 +642,37 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) +"abi" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"abj" = ( +/obj/item/emptysandbag, +/obj/item/emptysandbag, +/obj/item/emptysandbag, +/obj/item/emptysandbag, +/obj/item/emptysandbag, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"abk" = ( +/turf/open/floor/circuit, +/area/science/misc_lab/range) +"abl" = ( +/obj/structure/table, +/turf/open/floor/circuit, +/area/science/misc_lab/range) "abn" = ( /obj/item/radio/intercom{ pixel_x = -28 @@ -6852,13 +6908,14 @@ /turf/open/floor/plasteel/white, /area/security/brig) "aor" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/brig) "aos" = ( @@ -11431,11 +11488,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, /obj/structure/cable, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "0"; + req_one_access_txt = "10;24" + }, /turf/open/floor/plasteel/dark, /area/engine/engineering) "ayX" = ( @@ -12508,6 +12566,9 @@ /obj/effect/turf_decal/bot{ dir = 1 }, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, /turf/open/floor/plasteel{ dir = 1 }, @@ -13012,8 +13073,9 @@ dir = 4 }, /obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" + name = "Supermatter Engine Room"; + req_access_txt = "0"; + req_one_access_txt = "10;24" }, /turf/open/floor/plasteel/dark, /area/engine/engineering) @@ -13505,7 +13567,7 @@ /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ name = "Engineering Storage"; - req_access_txt = "32" + req_access_txt = "10" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -13928,8 +13990,9 @@ "aFz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" + name = "Supermatter Engine Room"; + req_access_txt = "0"; + req_one_access_txt = "10;24" }, /turf/open/floor/plating, /area/engine/engineering) @@ -14892,9 +14955,6 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aHZ" = ( -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, /obj/item/clothing/suit/hazardvest, /obj/item/clothing/suit/hazardvest, /obj/item/tank/internals/emergency_oxygen/engi, @@ -16407,11 +16467,12 @@ /area/engine/engineering) "aMg" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, /obj/structure/cable, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "0"; + req_one_access_txt = "10;24" + }, /turf/open/floor/plating, /area/engine/engineering) "aMh" = ( @@ -16435,7 +16496,7 @@ /obj/machinery/door/airlock/engineering/glass/critical{ heat_proof = 1; name = "Supermatter Chamber"; - req_access_txt = "10" + req_one_access_txt = "10;24" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -20855,16 +20916,16 @@ "aWD" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access_txt = "10" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/bot{ dir = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/structure/cable, +/obj/machinery/door/airlock/engineering{ + name = "Engine Room"; + req_one_access_txt = "10;24" + }, /turf/open/floor/plasteel{ dir = 1 }, @@ -21003,14 +21064,6 @@ }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) -"aXe" = ( -/obj/machinery/vending/wardrobe/cargo_wardrobe, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) "aXf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -21743,14 +21796,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plasteel, /area/quartermaster/warehouse) -"aYK" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Cargo Bay Maintenance"; - req_one_access_txt = "31;48" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/quartermaster/storage) "aYL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -23293,18 +23338,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/sorting) -"bbZ" = ( -/obj/machinery/newscaster{ - pixel_x = 1; - pixel_y = 34 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/disposalpipe/segment, -/obj/item/kirbyplants/random, -/turf/open/floor/plasteel, -/area/quartermaster/sorting) "bcb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/status_display/evac{ @@ -23975,15 +24008,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/sorting) -"bdt" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel, -/area/quartermaster/sorting) -"bdu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/quartermaster/sorting) "bdv" = ( /obj/machinery/airalarm{ pixel_y = 23 @@ -24451,10 +24475,6 @@ "bel" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access_txt = "10" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/bot{ dir = 1 @@ -24463,6 +24483,10 @@ dir = 1 }, /obj/structure/cable, +/obj/machinery/door/airlock/engineering{ + name = "Engine Room"; + req_one_access_txt = "10;24" + }, /turf/open/floor/plasteel{ dir = 1 }, @@ -27426,6 +27450,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/sign/directions/engineering{ + dir = 4; + pixel_y = -24 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "blg" = ( @@ -28098,13 +28126,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/starboard) -"bmU" = ( -/obj/structure/sign/directions/engineering{ - dir = 4; - pixel_y = 8 - }, -/turf/closed/wall, -/area/maintenance/starboard) "bmV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/yellow{ @@ -39787,13 +39808,8 @@ /turf/open/floor/plating, /area/maintenance/port) "bPO" = ( -/obj/structure/table/wood, /obj/effect/decal/cleanable/cobweb, -/obj/item/storage/crayons, -/obj/item/toy/crayon/spraycan, -/obj/item/toy/crayon/spraycan{ - pixel_x = -4 - }, +/obj/machinery/photocopier, /turf/open/floor/wood, /area/library) "bPP" = ( @@ -40288,10 +40304,10 @@ /obj/machinery/computer/security/telescreen/entertainment{ pixel_x = 30 }, -/obj/machinery/photocopier, /obj/machinery/light{ dir = 4 }, +/obj/machinery/skill_station, /turf/open/floor/wood, /area/library) "bRl" = ( @@ -41181,6 +41197,12 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, +/obj/structure/table/wood, +/obj/item/storage/crayons, +/obj/item/toy/crayon/spraycan, +/obj/item/toy/crayon/spraycan{ + pixel_x = -4 + }, /turf/open/floor/wood, /area/library) "bTx" = ( @@ -49005,10 +49027,6 @@ /obj/item/folder/white{ pixel_y = 2 }, -/obj/item/grenade/chem_grenade, -/obj/item/grenade/chem_grenade, -/obj/item/grenade/chem_grenade, -/obj/item/grenade/chem_grenade, /obj/item/screwdriver{ pixel_x = -2; pixel_y = 6 @@ -49031,6 +49049,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/item/hand_labeler, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, /turf/open/floor/plasteel/white, /area/medical/pharmacy) "clx" = ( @@ -49393,6 +49414,7 @@ /obj/item/clothing/glasses/hud/health, /obj/item/clothing/glasses/hud/health, /obj/item/gun/syringe, +/obj/item/gun/syringe, /turf/open/floor/plasteel/dark, /area/medical/storage) "cml" = ( @@ -49502,14 +49524,8 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "cmC" = ( -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/structure/table/glass, /obj/effect/turf_decal/tile/yellow, +/obj/structure/closet/secure_closet/chemical, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, @@ -50032,10 +50048,6 @@ pixel_y = 4 }, /obj/item/book/manual/wiki/grenades, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, @@ -50663,6 +50675,16 @@ dir = 5 }, /obj/structure/table/glass, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/obj/item/screwdriver{ + pixel_x = -2; + pixel_y = 6 + }, /turf/open/floor/plasteel/white, /area/medical/pharmacy) "coU" = ( @@ -51334,6 +51356,8 @@ }, /obj/structure/cable, /obj/structure/table/glass, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, /turf/open/floor/plasteel/white, /area/medical/pharmacy) "cqs" = ( @@ -53842,6 +53866,10 @@ dir = 4 }, /obj/effect/turf_decal/tile/green, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -7; + pixel_y = 11 + }, /turf/open/floor/plasteel/white/side{ dir = 8 }, @@ -64225,11 +64253,12 @@ /area/engine/engineering) "dew" = ( /obj/machinery/door/firedoor, +/obj/structure/cable, /obj/machinery/door/airlock/engineering/glass{ name = "Laser Room"; - req_access_txt = "10" + req_access_txt = "0"; + req_one_access_txt = "10;24" }, -/obj/structure/cable, /turf/open/floor/plating, /area/engine/engineering) "dex" = ( @@ -65788,14 +65817,6 @@ /obj/structure/displaycase/trophy, /turf/open/floor/wood, /area/library) -"dmF" = ( -/obj/item/emptysandbag, -/obj/item/emptysandbag, -/obj/item/emptysandbag, -/obj/item/emptysandbag, -/obj/item/emptysandbag, -/turf/open/floor/plating, -/area/maintenance/port/fore) "dmH" = ( /turf/closed/wall, /area/quartermaster/qm) @@ -66256,15 +66277,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"dxo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/sorting) "dxQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -66617,7 +66629,6 @@ /turf/open/floor/plasteel/dark, /area/security/warden) "dCg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -66625,6 +66636,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/brig) "dCh" = ( @@ -68613,6 +68627,10 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/security/prison) +"fNk" = ( +/obj/structure/sign/departments/cargo, +/turf/closed/wall, +/area/quartermaster/warehouse) "fNH" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -69300,12 +69318,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) -"gHt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/construction/storage_wing) "gHT" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -70280,6 +70292,14 @@ /obj/machinery/gulag_teleporter, /turf/open/floor/plasteel/dark, /area/security/brig) +"itG" = ( +/obj/machinery/newscaster{ + pixel_x = 1; + pixel_y = 34 + }, +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/quartermaster/sorting) "iuX" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -70419,6 +70439,12 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"iHb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) "iHk" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, @@ -70741,6 +70767,10 @@ /obj/structure/window/reinforced/tinted{ dir = 4 }, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -9; + pixel_y = 9 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "jni" = ( @@ -71524,13 +71554,6 @@ "krD" = ( /turf/open/floor/plasteel/white, /area/science/misc_lab/range) -"ksI" = ( -/obj/item/radio/intercom{ - pixel_x = -29 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/plasteel, -/area/construction/storage_wing) "ksN" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -73725,10 +73748,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/execution/education) -"obb" = ( -/obj/machinery/rnd/bepis, -/turf/open/floor/circuit, -/area/science/misc_lab/range) "obv" = ( /obj/structure/sign/poster/contraband/random{ pixel_x = 32 @@ -74317,6 +74336,15 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"oYv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/loading_area/white{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/construction/storage_wing) "oZg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -74587,11 +74615,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, /obj/structure/cable, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "0"; + req_one_access_txt = "10;24" + }, /turf/open/floor/plasteel/dark, /area/engine/engineering) "pwn" = ( @@ -75002,6 +75031,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/starboard) +"pXD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) "pYC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -76753,6 +76788,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/port/aft) +"syh" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) "sze" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -77207,6 +77246,18 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"tAh" = ( +/obj/item/radio/intercom{ + pixel_x = -29 + }, +/obj/machinery/piratepad/civilian, +/obj/effect/turf_decal/bot_white, +/obj/machinery/camera{ + c_tag = "Central Primary Hallway - Fore - Port Corner"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction/storage_wing) "tBJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, @@ -77247,13 +77298,13 @@ /turf/closed/wall/r_wall, /area/space/nearstation) "tDM" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, /obj/machinery/door/airlock/engineering/glass/critical{ heat_proof = 1; name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 + req_one_access_txt = "10;24" }, /turf/open/floor/engine, /area/engine/supermatter) @@ -77455,11 +77506,6 @@ /obj/effect/decal/cleanable/vomit/old, /turf/open/floor/wood, /area/maintenance/port/aft) -"tVY" = ( -/obj/structure/table, -/obj/item/storage/bag/money, -/turf/open/floor/circuit, -/area/science/misc_lab/range) "tXK" = ( /obj/machinery/air_sensor/atmos/toxins_mixing_tank, /turf/open/floor/engine/vacuum, @@ -77542,6 +77588,16 @@ }, /turf/open/floor/wood, /area/maintenance/port/aft) +"ufe" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/computer/piratepad_control/civilian{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line, +/turf/open/floor/plasteel, +/area/construction/storage_wing) "ugf" = ( /obj/structure/table/optable, /obj/effect/turf_decal/tile/blue{ @@ -77579,6 +77635,13 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery/room_c) +"uhk" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) "uiN" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, @@ -77861,6 +77924,7 @@ pixel_x = -25 }, /obj/structure/cable, +/obj/structure/closet/crate/freezer/surplus_limbs, /turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, /area/medical/coldroom) "uLY" = ( @@ -78194,13 +78258,14 @@ /area/construction/storage_wing) "vqh" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "0"; + req_one_access_txt = "10;24" + }, /turf/open/floor/plating, /area/maintenance/starboard) "vqw" = ( @@ -78674,6 +78739,16 @@ /obj/structure/table/reinforced, /turf/open/floor/plasteel, /area/crew_quarters/bar) +"vZX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment, +/obj/structure/extinguisher_cabinet{ + dir = 4; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "waj" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -78940,20 +79015,6 @@ "wtq" = ( /turf/closed/wall, /area/maintenance/aft/secondary) -"wtw" = ( -/obj/machinery/camera{ - c_tag = "Central Primary Hallway - Fore - Port Corner"; - dir = 4 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, -/obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/plasteel, -/area/construction/storage_wing) "wtW" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -79458,16 +79519,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/janitor) -"xdZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/sorting) "xel" = ( /obj/structure/table/reinforced, /obj/item/storage/backpack/duffelbag/med/surgery, @@ -96854,8 +96905,8 @@ lAu aUe aUe aUe -doJ -dne +aaL +aUe dmH beU dmH @@ -97109,10 +97160,10 @@ aIg aIg aIg aUe -aXe -aUe -doJ -dmF +aat +aau +abi +abj dmH byI bgF @@ -97367,8 +97418,8 @@ aRH aUf kiy faT -aYK -doJ +aYM +aYM dmH dmH luZ @@ -98378,7 +98429,7 @@ dne aAO aAJ aAC -aAC +aAF aFX aJK aJK @@ -101481,9 +101532,9 @@ aVO aXr bmm baB -bbY -bdt -dxo +iHb +pXD +bgY bgY biP bku @@ -101732,15 +101783,15 @@ aSZ aSZ aSZ aSZ -aSZ +fNk rVn mBz aXs bmh bmh -bbZ -bdu -xdZ +itG +syh +biQ biQ biQ bkv @@ -101993,8 +102044,8 @@ aTa dhL pMn vpX -ksI -bmk +tAh +ufe bmk bdv bff @@ -102250,8 +102301,8 @@ aTb aUo aXo aXu -gHt -wtw +oYv +aXq bmk bdw bfg @@ -103023,7 +103074,7 @@ aVR aXx aYW baH -bfi +vZX bfi xYW vTZ @@ -105306,7 +105357,7 @@ agL aky awp awp -awp +uhk awp aos apF @@ -105563,7 +105614,7 @@ dtX lrV ajQ uiS -alS +atN alS alS alS @@ -117461,7 +117512,7 @@ cpJ cqZ cuZ cuZ -obb +abk fam kOt krD @@ -117718,7 +117769,7 @@ dxh clY crZ cuZ -tVY +abl fUC hHS nLi @@ -118963,7 +119014,7 @@ aWw bhQ gjw blf -bmU +alq alq alq alq diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index a83d5cf55a9..2dfc62df830 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -1015,10 +1015,6 @@ }, /turf/open/floor/plasteel, /area/mine/production) -"da" = ( -/obj/machinery/mineral/mint, -/turf/open/floor/plasteel, -/area/mine/production) "db" = ( /obj/machinery/light/small{ dir = 1 @@ -21681,7 +21677,7 @@ cp bf cL bq -da +bP du dL cH diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 5896773f179..e4ccc708888 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -467,10 +467,66 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"abe" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "abf" = ( /obj/structure/bed, /turf/open/floor/plating, /area/maintenance/department/science) +"abg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "qm_warehouse"; + name = "Warehouse Door Control"; + pixel_x = 24; + req_access_txt = "31" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"abh" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/button/door{ + id = "qm_warehouse"; + name = "Warehouse Door Control"; + pixel_x = -24; + req_access_txt = "31" + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"abi" = ( +/obj/effect/turf_decal/stripes/box, +/obj/machinery/rnd/bepis, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"abj" = ( +/obj/machinery/requests_console{ + department = "Cargo Bay"; + departmentType = 2; + pixel_y = 32 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"abk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "aby" = ( /obj/structure/lattice, /obj/structure/grille, @@ -15789,13 +15845,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/sorting) -"aOY" = ( -/obj/effect/spawner/lootdrop/maintenance, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) "aOZ" = ( /obj/item/stack/sheet/cardboard, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -16144,29 +16193,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/sorting) -"aQc" = ( -/obj/machinery/button/door{ - id = "qm_warehouse"; - name = "Warehouse Door Control"; - pixel_x = -24; - req_access_txt = "31" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"aQd" = ( -/obj/item/flashlight, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) -"aQe" = ( -/obj/effect/spawner/lootdrop/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) "aQf" = ( /obj/structure/closet/crate{ icon_state = "crateopen" @@ -16598,14 +16624,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/quartermaster/sorting) -"aRm" = ( -/obj/structure/closet/crate, -/obj/item/reagent_containers/food/snacks/donut, -/obj/item/reagent_containers/food/snacks/donut, -/obj/item/reagent_containers/food/snacks/donut, -/obj/item/reagent_containers/food/snacks/donut, -/turf/open/floor/plating, -/area/quartermaster/sorting) "aRn" = ( /obj/machinery/door/poddoor/shutters{ id = "qm_warehouse"; @@ -16999,20 +17017,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/quartermaster/sorting) -"aSi" = ( -/obj/machinery/button/door{ - id = "qm_warehouse"; - name = "Warehouse Door Control"; - pixel_x = -24; - req_access_txt = "31" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/quartermaster/storage) "aSj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line{ @@ -17345,21 +17349,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/quartermaster/office) -"aTi" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/requests_console{ - department = "Cargo Bay"; - departmentType = 2; - pixel_y = 32 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/quartermaster/storage) "aTj" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -21495,18 +21484,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/bar) -"bcx" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/cargo) -"bcy" = ( -/obj/item/chair, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/cargo) "bcA" = ( /obj/structure/closet/secure_closet/quartermaster, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -21838,11 +21815,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/bar) -"bdz" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/cargo) "bdD" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29095,6 +29067,11 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/item/reagent_containers/chem_pack, +/obj/item/reagent_containers/chem_pack{ + pixel_x = 6; + pixel_y = 2 + }, /turf/open/floor/plasteel, /area/medical/sleeper) "bwG" = ( @@ -41040,13 +41017,13 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access_txt = "10" - }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, +/obj/machinery/door/airlock/engineering{ + name = "Engine Room"; + req_one_access_txt = "10;24" + }, /turf/open/floor/plasteel, /area/engine/engineering) "bXq" = ( @@ -43061,8 +43038,8 @@ /obj/structure/cable, /obj/machinery/camera{ c_tag = "Engineering Center"; - network = list("ss13","engine"); - dir = 8 + dir = 8; + network = list("ss13","engine") }, /turf/open/floor/plating, /area/engine/engineering) @@ -43726,11 +43703,11 @@ /area/engine/engineering) "cgs" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable, /obj/machinery/door/airlock/external{ name = "Engineering External Access"; - req_access_txt = "61" + req_one_access_txt = "10;24" }, -/obj/structure/cable, /turf/open/floor/plating, /area/engine/engineering) "cgu" = ( @@ -43980,11 +43957,11 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, +/obj/structure/cable, /obj/machinery/door/airlock/external{ name = "Engineering External Access"; - req_access_txt = "61" + req_one_access_txt = "10;24" }, -/obj/structure/cable, /turf/open/floor/plating, /area/engine/engineering) "chw" = ( @@ -44235,7 +44212,7 @@ /obj/machinery/door/airlock/engineering/glass/critical{ heat_proof = 1; name = "Supermatter Chamber"; - req_access_txt = "10" + req_one_access_txt = "10;24" }, /turf/open/floor/engine, /area/engine/supermatter) @@ -49064,6 +49041,13 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"diM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "dmP" = ( /obj/structure/chair{ dir = 8 @@ -50187,6 +50171,17 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/library/artgallery) +"fQd" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/white/line, +/obj/structure/window{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) "fQf" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -52102,7 +52097,7 @@ /obj/machinery/door/airlock/engineering/glass/critical{ heat_proof = 1; name = "Supermatter Chamber"; - req_access_txt = "10" + req_one_access_txt = "10;24" }, /turf/open/floor/engine, /area/engine/supermatter) @@ -52402,8 +52397,9 @@ "ktM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" + name = "Supermatter Engine Room"; + req_access_txt = "0"; + req_one_access_txt = "10;24" }, /turf/open/floor/plating, /area/engine/engineering) @@ -52741,6 +52737,15 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/engine/engineering) +"kSG" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) "kSO" = ( /obj/machinery/door/airlock/maintenance{ name = "Port Emergency Storage" @@ -52778,16 +52783,16 @@ /turf/open/floor/engine, /area/engine/engineering) "kXe" = ( -/obj/machinery/door/airlock/external{ - name = "Engineering External Access"; - req_access_txt = "10;13" - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 }, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_one_access_txt = "10;24" + }, /turf/open/floor/plating, /area/engine/engineering) "kZU" = ( @@ -53219,16 +53224,16 @@ /turf/open/floor/plating, /area/maintenance/department/security/brig) "lXk" = ( -/obj/machinery/door/airlock/external{ - name = "Engineering External Access"; - req_access_txt = "10;13" - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 }, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_one_access_txt = "10;24" + }, /turf/open/floor/plating, /area/engine/engineering) "lXY" = ( @@ -53683,6 +53688,12 @@ "mVM" = ( /turf/open/floor/plating/airless, /area/space/nearstation) +"mXc" = ( +/obj/effect/turf_decal/loading_area/white{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) "mXq" = ( /obj/item/taperecorder, /obj/item/cartridge/lawyer, @@ -54452,6 +54463,15 @@ }, /turf/open/floor/engine, /area/science/xenobiology) +"onj" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/piratepad/civilian, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/white/line, +/turf/open/floor/plasteel, +/area/quartermaster/office) "onX" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -55059,6 +55079,10 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit/departure_lounge) +"pvZ" = ( +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/maintenance/department/cargo) "pwj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -55544,6 +55568,21 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space) +"qvM" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/computer/piratepad_control/civilian{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) "qxq" = ( /obj/machinery/atmospherics/components/binary/pump/on{ name = "Air Out" @@ -55562,11 +55601,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/lobby) -"qAM" = ( -/obj/effect/spawner/lootdrop/maintenance, -/obj/item/cigbutt, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "qBv" = ( /obj/item/clothing/head/ushanka, /turf/open/floor/plating, @@ -55579,6 +55613,10 @@ /obj/structure/flora/grass/jungle, /turf/open/floor/grass, /area/medical/medbay/central) +"qEm" = ( +/obj/structure/chair/stool, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "qEN" = ( /obj/machinery/rnd/production/techfab/department/service, /obj/structure/window/reinforced{ @@ -56190,11 +56228,12 @@ /area/engine/engineering) "rYY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, /obj/structure/cable, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "0"; + req_one_access_txt = "10;24" + }, /turf/open/floor/plating, /area/engine/engineering) "sbk" = ( @@ -56274,6 +56313,12 @@ /obj/item/reagent_containers/food/snacks/meat/slab/monkey, /turf/open/floor/plating, /area/maintenance/department/engine) +"siF" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "skj" = ( /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -94624,7 +94669,7 @@ bar aMb aSX aMb -aBI +diM aEY bgA bhe @@ -95137,7 +95182,7 @@ aZi aMc bbz aMc -aPS +aAL aAL aGU aAL @@ -95393,10 +95438,10 @@ aLf aLf aLf aLf -aEj -aEj -aEj -aEj +qvM +aPY +qEm +aAN bgB aJI aDZ @@ -95650,10 +95695,10 @@ aYn aZj bas aLf -bcx -bdz -aFi -bfu +onj +mXc +aDZ +aGV aDZ aJI bhP @@ -95907,10 +95952,10 @@ aYo aVu bat aLf -bcy -qAM -aEj -aEj +fQd +kSG +siF +aGV bgC bhi bhQ @@ -96164,8 +96209,8 @@ aYp aPY bau aLf -aFi -aFi +bfu +aEj beI beI bgD @@ -96421,7 +96466,7 @@ aYq aPY bav aLf -aFi +pvZ jBh beI bfv @@ -98466,9 +98511,9 @@ aMn lAs aOX lAs -aRm aLg -aTi +abj +abk aUt aVw aWx @@ -98723,8 +98768,8 @@ aMo cDa cDa cDa -cDa -aLg +abi +aTm wDZ aUu aVx @@ -98978,10 +99023,10 @@ aEd aEd aMp aNN -aOY -aQc +abh aRn -aSi +abe +aTk aTk aUv aVy @@ -99236,10 +99281,10 @@ aEd aMq aNO aOZ -aQd aRo aSj aTl +aTl aUw aTm aTm @@ -99493,9 +99538,9 @@ aEd aMr aNO aPa -aNO aRp -aSk +abg +aTm aTm aUt aVz @@ -99750,7 +99795,7 @@ aEd aMs aNO aPb -aQe +cDa cDa cDa aTn diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index c6bada0a658..b5349c3a26e 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -633,7 +633,7 @@ /turf/open/floor/holofloor/grass, /area/holodeck/rec_center/pet_lounge) "bS" = ( -/obj/item/storage/bag/easterbasket{ +/obj/item/storage/basket/easter{ name = "picnic basket"; pixel_y = 6 }, @@ -4799,7 +4799,7 @@ "lS" = ( /obj/structure/fans/tiny/invisible, /turf/open/floor/holofloor/hyperspace, -/area/centcom/supplypod/fly_me_to_the_moon) +/area/centcom/supplypod/supplypod_temp_holding) "lT" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security"; @@ -6853,11 +6853,7 @@ /area/centcom/ferry) "py" = ( /obj/machinery/smartfridge, -/turf/closed/indestructible{ - icon = 'icons/turf/walls/wood_wall.dmi'; - icon_state = "wood"; - smooth = 1 - }, +/turf/closed/indestructible/wood, /area/centcom/holding) "pz" = ( /turf/open/space/basic, @@ -12257,11 +12253,7 @@ /area/wizard_station) "BV" = ( /obj/machinery/chem_dispenser/drinks/beer, -/turf/closed/indestructible{ - icon = 'icons/turf/walls/wood_wall.dmi'; - icon_state = "wood"; - smooth = 1 - }, +/turf/closed/indestructible/wood, /area/centcom/holding) "BY" = ( /obj/item/toy/figure/syndie, @@ -13597,11 +13589,7 @@ /area/wizard_station) "ED" = ( /obj/machinery/vending/boozeomat, -/turf/closed/indestructible{ - icon = 'icons/turf/walls/wood_wall.dmi'; - icon_state = "wood"; - smooth = 1 - }, +/turf/closed/indestructible/wood, /area/centcom/holding) "EE" = ( /obj/structure/closet/crate/bin, @@ -17074,11 +17062,7 @@ /turf/open/floor/plasteel/cafeteria, /area/centcom/holding) "Nd" = ( -/turf/closed/indestructible{ - icon = 'icons/turf/walls/wood_wall.dmi'; - icon_state = "wood"; - smooth = 1 - }, +/turf/closed/indestructible/wood, /area/centcom/holding) "Nh" = ( /obj/structure/table/wood, @@ -17422,9 +17406,9 @@ /obj/machinery/iv_drip, /obj/item/roller, /obj/item/storage/firstaid/regular, -/obj/item/reagent_containers/medigel/instabitaluri, -/obj/item/reagent_containers/medigel/instabitaluri, -/obj/item/reagent_containers/medigel/instabitaluri, +/obj/item/reagent_containers/medigel/synthflesh, +/obj/item/reagent_containers/medigel/synthflesh, +/obj/item/reagent_containers/medigel/synthflesh, /turf/open/floor/wood, /area/centcom/holding) "Qj" = ( @@ -17503,11 +17487,7 @@ /area/centcom/supplypod) "QT" = ( /obj/machinery/chem_dispenser/drinks, -/turf/closed/indestructible{ - icon = 'icons/turf/walls/wood_wall.dmi'; - icon_state = "wood"; - smooth = 1 - }, +/turf/closed/indestructible/wood, /area/centcom/holding) "QW" = ( /obj/structure/closet/secure_closet/freezer/kitchen{ diff --git a/_maps/templates/shelter_1.dmm b/_maps/templates/shelter_1.dmm index 2c7db801045..15e5574abad 100644 --- a/_maps/templates/shelter_1.dmm +++ b/_maps/templates/shelter_1.dmm @@ -13,7 +13,7 @@ /turf/open/floor/pod, /area/survivalpod) "d" = ( -/obj/machinery/smartfridge/survival_pod, +/obj/machinery/smartfridge/survival_pod/preloaded, /turf/open/floor/pod, /area/survivalpod) "e" = ( diff --git a/_maps/templates/shelter_2.dmm b/_maps/templates/shelter_2.dmm index aae61df407b..e2b21fa1438 100644 --- a/_maps/templates/shelter_2.dmm +++ b/_maps/templates/shelter_2.dmm @@ -30,7 +30,7 @@ /turf/open/floor/pod, /area/survivalpod) "f" = ( -/obj/machinery/smartfridge/survival_pod, +/obj/machinery/smartfridge/survival_pod/preloaded, /turf/open/floor/pod, /area/survivalpod) "g" = ( diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 6610e463163..8e8b3daa2ce 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -55,6 +55,7 @@ #define SPIDER_WEB /datum/mutation/human/webbing #define MARTYRDOM /datum/mutation/human/martyrdom #define HARS /datum/mutation/human/headless +#define BIOTECHCOMPAT /datum/mutation/human/biotechcompat #define UI_CHANGED "ui changed" #define UE_CHANGED "ue changed" @@ -126,8 +127,13 @@ #define AGENDER 16 /// Do not draw eyes or eyeless overlay #define NOEYESPRITES 17 -/// If this species can be scarred (fleshy) -#define CAN_SCAR 18 + +/// Used for determining which wounds are applicable to this species. +/// if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD) +#define HAS_FLESH 18 +/// if we have bones (can suffer bone wounds) +#define HAS_BONE 19 + //organ slots #define ORGAN_SLOT_BRAIN "brain" @@ -166,6 +172,7 @@ #define CHROMOSOME_NONE 1 #define CHROMOSOME_USED 2 +//used for mob's genetic gender (mainly just for pronouns, members of sexed species with plural gender refer to their body_type for the actual sprites, which is not genetic) #define G_MALE 1 #define G_FEMALE 2 #define G_PLURAL 3 diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index a0e8a1f9420..cd8b8bff570 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -100,6 +100,7 @@ #define ADMIN_PUNISHMENT_NUGGET "Nugget" #define ADMIN_PUNISHMENT_CRACK ":B:oneless" #define ADMIN_PUNISHMENT_BLEED ":B:loodless" +#define ADMIN_PUNISHMENT_PERFORATE ":B:erforate" #define ADMIN_PUNISHMENT_SCARIFY "Scarify" #define ADMIN_PUNISHMENT_SHOES "Knot Shoes" diff --git a/code/__DEFINES/cleaning.dm b/code/__DEFINES/cleaning.dm index 1c0f65cbdc8..53f4887fa20 100644 --- a/code/__DEFINES/cleaning.dm +++ b/code/__DEFINES/cleaning.dm @@ -1,18 +1,20 @@ -//Cleaning tool strength -// 1 is also a valid cleaning strength but completely unused so left undefined -#define CLEAN_WEAK 2 -/// Acceptable tools -#define CLEAN_MEDIUM 3 -/// Industrial strength -#define CLEAN_STRONG 4 -/// Cleaning strong enough your granny would be proud -#define CLEAN_IMPRESSIVE 5 -/// Cleans things spotless down to the atomic structure -#define CLEAN_GOD 6 -/// Never cleaned -#define CLEAN_NEVER 7 -//How strong things have to be to wipe forensic evidence... -#define CLEAN_STRENGTH_FINGERPRINTS CLEAN_IMPRESSIVE -#define CLEAN_STRENGTH_BLOOD CLEAN_WEAK -#define CLEAN_STRENGTH_FIBERS CLEAN_IMPRESSIVE +// Cleaning flags + +// Different kinds of things that can be cleaned. +// Use these when overriding the wash proc or registering for the clean signals to check if your thing should be cleaned +#define CLEAN_TYPE_BLOOD (1 << 0) +#define CLEAN_TYPE_RUNES (1 << 1) +#define CLEAN_TYPE_FINGERPRINTS (1 << 2) +#define CLEAN_TYPE_FIBERS (1 << 3) +#define CLEAN_TYPE_RADIATION (1 << 4) +#define CLEAN_TYPE_DISEASE (1 << 5) +#define CLEAN_TYPE_WEAK (1 << 6) // Special type, add this flag to make some cleaning processes non-instant. Currently only used for showers when removing radiation. +#define CLEAN_TYPE_PAINT (1 << 7) + +// Different cleaning methods. +// Use these when calling the wash proc for your cleaning apparatus +#define CLEAN_WASH (CLEAN_TYPE_BLOOD | CLEAN_TYPE_RUNES | CLEAN_TYPE_DISEASE) +#define CLEAN_SCRUB (CLEAN_WASH | CLEAN_TYPE_FINGERPRINTS | CLEAN_TYPE_FIBERS | CLEAN_TYPE_PAINT) +#define CLEAN_RAD CLEAN_TYPE_RADIATION +#define CLEAN_ALL (ALL & ~CLEAN_TYPE_WEAK) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 8965715cbb7..b8473e611bc 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -127,18 +127,28 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( //Combat object defines //Embedded objects -#define EMBEDDED_PAIN_CHANCE 15 //Chance for embedded objects to cause pain (damage user) -#define EMBEDDED_ITEM_FALLOUT 5 //Chance for embedded object to fall out (causing pain but removing the object) -#define EMBED_CHANCE 45 //Chance for an object to embed into somebody when thrown (if it's sharp) -#define EMBEDDED_PAIN_MULTIPLIER 2 //Coefficient of multiplication for the damage the item does while embedded (this*item.w_class) -#define EMBEDDED_FALL_PAIN_MULTIPLIER 5 //Coefficient of multiplication for the damage the item does when it falls out (this*item.w_class) -#define EMBEDDED_IMPACT_PAIN_MULTIPLIER 4 //Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class) -#define EMBED_THROWSPEED_THRESHOLD 4 //The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1) -#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class) -#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class) -#define EMBEDDED_JOSTLE_CHANCE 5 //Chance for embedded objects to cause pain every time they move (jostle) -#define EMBEDDED_JOSTLE_PAIN_MULTIPLIER 1 //Coefficient of multiplication for the damage the item does while -#define EMBEDDED_PAIN_STAM_PCT 0.0 //This percentage of all pain will be dealt as stam damage rather than brute (0-1) +///Chance for embedded objects to cause pain (damage user) +#define EMBEDDED_PAIN_CHANCE 15 +///Chance for embedded object to fall out (causing pain but removing the object) +#define EMBEDDED_ITEM_FALLOUT 5 +///Chance for an object to embed into somebody when thrown (if it's sharp) +#define EMBED_CHANCE 45 +///Coefficient of multiplication for the damage the item does while embedded (this*item.w_class) +#define EMBEDDED_PAIN_MULTIPLIER 2 +///Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class) +#define EMBEDDED_IMPACT_PAIN_MULTIPLIER 4 +///The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1) +#define EMBED_THROWSPEED_THRESHOLD 4 +///Coefficient of multiplication for the damage the item does when it falls out or is removed without a surgery (this*item.w_class) +#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 6 +///A Time in ticks, total removal time = (this*item.w_class) +#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 +///Chance for embedded objects to cause pain every time they move (jostle) +#define EMBEDDED_JOSTLE_CHANCE 5 +///Coefficient of multiplication for the damage the item does while +#define EMBEDDED_JOSTLE_PAIN_MULTIPLIER 1 +///This percentage of all pain will be dealt as stam damage rather than brute (0-1) +#define EMBEDDED_PAIN_STAM_PCT 0.0 #define EMBED_HARMLESS list("pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE) #define EMBED_HARMLESS_SUPERIOR list("pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE, "embed_chance" = 100, "fall_chance" = 0.1) @@ -189,9 +199,9 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define REFLECT_FAKEPROJECTILE (1<<1) //Object/Item sharpness -#define IS_BLUNT 0 -#define IS_SHARP 1 -#define IS_SHARP_ACCURATE 2 +#define SHARP_NONE 0 +#define SHARP_EDGED 1 +#define SHARP_POINTY 2 //His Grace. #define HIS_GRACE_SATIATED 0 //He hungers not. If bloodthirst is set to this, His Grace is asleep. diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm index 2510db0fbfe..a6bceddbd73 100644 --- a/code/__DEFINES/cooldowns.dm +++ b/code/__DEFINES/cooldowns.dm @@ -27,6 +27,7 @@ //INDEXES #define COOLDOWN_BORG_SELF_REPAIR "borg_self_repair" +#define COOLDOWN_EXPRESSPOD_CONSOLE "expresspod_console" //TIMER COOLDOWN MACROS diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index eebe775d479..bd3d83f143d 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -269,6 +269,8 @@ ///called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) #define COMSIG_MOVABLE_DISPOSING "movable_disposing" +///called when the movable sucessfully has it's anchored var changed, from base atom/movable/set_anchored(): (value) +#define COMSIG_MOVABLE_SET_ANCHORED "movable_set_anchored" // /mob signals @@ -413,8 +415,6 @@ ///from base of obj/deconstruct(): (disassembled) #define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" -///called in /obj/structure/setAnchored(): (value) -#define COMSIG_OBJ_SETANCHORED "obj_setanchored" ///from base of code/game/machinery #define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench" ///from base of /turf/proc/levelupdate(). (intact) true to hide and false to unhide @@ -482,13 +482,20 @@ ///from [/obj/structure/closet/supplypod/proc/endlaunch]: #define COMSIG_SUPPLYPOD_LANDED "supplypodgoboom" +// /obj signals for economy +///called when the payment component tries to charge an account. +#define COMSIG_OBJ_ATTEMPT_CHARGE "obj_attempt_simple_charge" + #define COMPONENT_OBJ_CANCEL_CHARGE (1<<0) +///Called when a payment component changes value +#define COMSIG_OBJ_ATTEMPT_CHARGE_CHANGE "obj_attempt_simple_charge_change" + // /obj/item signals for economy ///called when an item is sold by the exports subsystem #define COMSIG_ITEM_SOLD "item_sold" ///called when a wrapped up structure is opened by hand #define COMSIG_STRUCTURE_UNWRAPPED "structure_unwrapped" -#define COMSIG_ITEM_UNWRAPPED "item_unwrapped" ///called when a wrapped up item is opened by hand +#define COMSIG_ITEM_UNWRAPPED "item_unwrapped" #define COMSIG_ITEM_SPLIT_VALUE (1<<0) ///called when getting the item's exact ratio for cargo's profit. #define COMSIG_ITEM_SPLIT_PROFIT "item_split_profits" @@ -549,7 +556,7 @@ // /obj/projectile signals (sent to the firer) -///from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) +///from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle, hit_limb) #define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit" ///from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) #define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" @@ -606,7 +613,8 @@ #define COMSIG_TURF_IS_WET "check_turf_wet" ///(max_strength, immediate, duration_decrease = INFINITY): Returns bool. #define COMSIG_TURF_MAKE_DRY "make_turf_try" -///called on an object to clean it of cleanables. Usualy with soap: (num/strength) + +///Called on an object to "clean it", such as removing blood decals/overlays, etc. The clean types bitfield is sent with it. Return TRUE if any cleaning was necessary and thus performed. #define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //Creamed @@ -619,6 +627,12 @@ ///from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder) #define COMSIG_FOOD_EATEN "food_eaten" +//Drink + +///from base of obj/item/reagent_containers/food/drinks/attack(): (mob/living/M, mob/user) +#define COMSIG_DRINK_DRANK "drink_drank" +///from base of obj/item/reagent_containers/glass/attack(): (mob/M, mob/user) +#define COMSIG_GLASS_DRANK "glass_drank" //Gibs ///from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases) diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm index d11ff8a22ed..11d724d93be 100644 --- a/code/__DEFINES/economy.dm +++ b/code/__DEFINES/economy.dm @@ -1,11 +1,15 @@ -#define STARTING_PAYCHECKS 5 +#define STARTING_PAYCHECKS 7 -#define PAYCHECK_ASSISTANT 25 -#define PAYCHECK_MINIMAL 75 -#define PAYCHECK_EASY 125 -#define PAYCHECK_MEDIUM 175 -#define PAYCHECK_HARD 200 -#define PAYCHECK_COMMAND 250 +//Experimental change: These are subject to tweaking based on the /tg/ economy overhaul. +#define PAYCHECK_PRISONER 25 +#define PAYCHECK_ASSISTANT 50 +#define PAYCHECK_MINIMAL 55 +#define PAYCHECK_EASY 60 +#define PAYCHECK_MEDIUM 75 +#define PAYCHECK_HARD 100 +#define PAYCHECK_COMMAND 200 + +#define STATION_TARGET_INCREMENT 200 #define MAX_GRANT_CIV 2500 #define MAX_GRANT_ENG 3000 @@ -28,3 +32,22 @@ #define ACCOUNT_SEC_NAME "Defense Budget" #define NO_FREEBIES "commies go home" + +//Defines that set what kind of civilian bounties should be applied mid-round. +#define CIV_JOB_BASIC 1 +#define CIV_JOB_ROBO 2 +#define CIV_JOB_CHEF 3 +#define CIV_JOB_SEC 4 +#define CIV_JOB_DRINK 5 +#define CIV_JOB_CHEM 6 +#define CIV_JOB_VIRO 7 +#define CIV_JOB_SCI 8 +#define CIV_JOB_ENG 9 +#define CIV_JOB_MINE 10 +#define CIV_JOB_MED 11 +#define CIV_JOB_GROW 12 + +//These defines are to be used to with the payment component, determines which lines will be used during a transaction. If in doubt, go with clinical. +#define PAYMENT_CLINICAL "clinical" +#define PAYMENT_FRIENDLY "friendly" +#define PAYMENT_ANGRY "angry" diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index a2c47addd33..67a6a8c2f9d 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -172,7 +172,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define ismecha(A) (istype(A, /obj/mecha)) -#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable +#define ismopable(A) (A.layer <= HIGH_SIGIL_LAYER) //If something can be cleaned by floor-cleaning devices such as mops or clean bots #define isorgan(A) (istype(A, /obj/item/organ)) @@ -180,14 +180,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define iscash(A) (istype(A, /obj/item/coin) || istype(A, /obj/item/stack/spacecash) || istype(A, /obj/item/holochip)) -GLOBAL_LIST_INIT(pointed_types, typecacheof(list( - /obj/item/pen, - /obj/item/screwdriver, - /obj/item/reagent_containers/syringe, - /obj/item/kitchen/fork))) - -#define is_pointed(W) (is_type_in_typecache(W, GLOB.pointed_types)) - #define isbodypart(A) (istype(A, /obj/item/bodypart)) #define isprojectile(A) (istype(A, /obj/projectile)) @@ -218,3 +210,10 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob)) #define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs)) + +#define isbook(O) (is_type_in_typecache(O, GLOB.book_types)) + +GLOBAL_LIST_INIT(book_types, typecacheof(list( + /obj/item/book, + /obj/item/spellbook, + /obj/item/storage/book))) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index d108e4eb337..2b2a20df8e9 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -1,50 +1,3 @@ - -#define ENGSEC (1<<0) - -#define CAPTAIN (1<<0) -#define HOS (1<<1) -#define WARDEN (1<<2) -#define DETECTIVE (1<<3) -#define OFFICER (1<<4) -#define CHIEF (1<<5) -#define ENGINEER (1<<6) -#define ATMOSTECH (1<<7) -#define ROBOTICIST (1<<8) -#define AI_JF (1<<9) -#define CYBORG (1<<10) - - -#define MEDSCI (1<<1) - -#define RD_JF (1<<0) -#define SCIENTIST (1<<1) -#define CHEMIST (1<<2) -#define CMO_JF (1<<3) -#define DOCTOR (1<<4) -#define GENETICIST (1<<5) -#define VIROLOGIST (1<<6) -#define PARAMEDIC (1<<7) - - -#define CIVILIAN (1<<2) - -#define HOP (1<<0) -#define BARTENDER (1<<1) -#define BOTANIST (1<<2) -#define COOK (1<<3) -#define JANITOR (1<<4) -#define CURATOR (1<<5) -#define QUARTERMASTER (1<<6) -#define CARGOTECH (1<<7) -#define MINER (1<<8) -#define LAWYER (1<<9) -#define CHAPLAIN (1<<10) -#define CLOWN (1<<11) -#define MIME (1<<12) -#define ASSISTANT (1<<13) -#define PRISONER (1<<14) -#define PSYCHOLOGIST (1<<15) - #define JOB_AVAILABLE 0 #define JOB_UNAVAILABLE_GENERIC 1 #define JOB_UNAVAILABLE_BANNED 2 diff --git a/code/__DEFINES/keybinding.dm b/code/__DEFINES/keybinding.dm new file mode 100644 index 00000000000..3259514bc22 --- /dev/null +++ b/code/__DEFINES/keybinding.dm @@ -0,0 +1,80 @@ +//Signals + +//General +#define COMSIG_KB_ACTIVATED (1<<0) +#define COMSIG_KB_EMOTE "keybinding_emote_down" + +//Admin +#define COMSIG_KB_ADMIN_ASAY_DOWN "keybinding_admin_asay_down" +#define COMSIG_KB_ADMIN_DSAY_DOWN "keybinding_admin_dsay_down" +#define COMSIG_KB_ADMIN_TOGGLEBUILDMODE_DOWN "keybinding_admin_togglebuildmode_down" +#define COMSIG_KB_ADMIN_AGHOST_DOWN "keybinding_admin_aghost_down" +#define COMSIG_KB_ADMIN_PLAYERPANELNEW_DOWN "keybinding_admin_playerpanelnew_down" +#define COMSIG_KB_ADMIN_STEALTHMODETOGGLE_DOWN "keybinding_admin_stealthmodetoggle_down" +#define COMSIG_KB_ADMIN_INVISIMINTOGGLE_DOWN "keybinding_admin_invisimintoggle_down" +#define COMSIG_KB_ADMIN_DEADMIN_DOWN "keybinding_admin_deadmin_down" +#define COMSIG_KB_ADMIN_READMIN_DOWN "keybinding_admin_readmin_down" + +//Carbon +#define COMSIG_KB_CARBON_HOLDRUNMOVEINTENT_DOWN "keybinding_carbon_holdrunmoveintent_down" +#define COMSIG_KB_CARBON_HOLDRUNMOVEINTENT_UP "keybinding_carbon_holdrunmoveintent_up" +#define COMSIG_KB_CARBON_TOGGLETHROWMODE_DOWN "keybinding_carbon_togglethrowmode_down" +#define COMSIG_KB_CARBON_SELECTHELPINTENT_DOWN "keybinding_carbon_selecthelpintent_down" +#define COMSIG_KB_CARBON_SELECTDISARMINTENT_DOWN "keybinding_carbon_selectdisarmintent_down" +#define COMSIG_KB_CARBON_SELECTGRABINTENT_DOWN "keybinding_carbon_selectgrabintent_down" +#define COMSIG_KB_CARBON_SELECTHARMINTENT_DOWN "keybinding_carbon_selectharmintent_down" +#define COMSIG_KB_CARBON_GIVEITEM_DOWN "keybinding_carbon_giveitem_down" + +//Client +#define COMSIG_KB_CLIENT_GETHELP_DOWN "keybinding_client_gethelp_down" +#define COMSIG_KB_CLIENT_SCREENSHOT_DOWN "keybinding_client_screenshot_down" +#define COMSIG_KB_CLIENT_MINIMALHUD_DOWN "keybinding_client_minimalhud_down" +#define COMSIG_KB_CLIENT_OOC_DOWN "keybinding_client_ooc_down" +#define COMSIG_KB_CLIENT_LOOC_DOWN "keybinding_client_looc_down" + +//Human +#define COMSIG_KB_HUMAN_QUICKEQUIP_DOWN "keybinding_human_quickequip_down" +#define COMSIG_KB_HUMAN_QUICKEQUIPBELT_DOWN "keybinding_human_quickequipbelt_down" +#define COMSIG_KB_HUMAN_BAGEQUIP_DOWN "keybinding_human_bagequip_down" +#define COMSIG_KB_HUMAN_EQUIPMENTSWAP_DOWN "keybinding_human_equipmentswap_down" +#define COMSIG_KB_HUMAN_SUITEQUIP_DOWN "keybinding_human_suitequip_down" + +//Living +#define COMSIG_KB_LIVING_RESIST_DOWN "keybinding_living_resist_down" +#define COMSIG_KB_LIVING_LOOKUP_DOWN "keybinding_living_lookup_down" +#define COMSIG_KB_LIVING_LOOKDOWN_DOWN "keybinding_living_lookdown_down" + +//Mob +#define COMSIG_KB_MOB_FACENORTH_DOWN "keybinding_mob_facenorth_down" +#define COMSIG_KB_MOB_FACEEAST_DOWN "keybinding_mob_faceeast_down" +#define COMSIG_KB_MOB_FACESOUTH_DOWN "keybinding_mob_facesouth_down" +#define COMSIG_KB_MOB_FACEWEST_DOWN "keybinding_mob_facewest_down" +#define COMSIG_KB_MOB_STOPPULLING_DOWN "keybinding_mob_stoppulling_down" +#define COMSIG_KB_MOB_CYCLEINTENTRIGHT_DOWN "keybinding_mob_cycleintentright_down" +#define COMSIG_KB_MOB_CYCLEINTENTLEFT_DOWN "keybinding_mob_cycleintentleft_down" +#define COMSIG_KB_MOB_SWAPHANDS_DOWN "keybinding_mob_swaphands_down" +#define COMSIG_KB_MOB_ACTIVATEINHAND_DOWN "keybinding_mob_activateinhand_down" +#define COMSIG_KB_MOB_DROPITEM_DOWN "keybinding_mob_dropitem_down" +#define COMSIG_KB_MOB_TOGGLEMOVEINTENT_DOWN "keybinding_mob_togglemoveintent_down" +#define COMSIG_KB_MOB_TOGGLEMOVEINTENTALT_DOWN "keybinding_mob_togglemoveintentalt_down" +#define COMSIG_KB_MOB_TARGETCYCLEHEAD_DOWN "keybinding_mob_targetcyclehead_down" +#define COMSIG_KB_MOB_TARGETRIGHTARM_DOWN "keybinding_mob_targetrightarm_down" +#define COMSIG_KB_MOB_TARGETBODYCHEST_DOWN "keybinding_mob_targetbodychest_down" +#define COMSIG_KB_MOB_TARGETLEFTARM_DOWN "keybinding_mob_targetleftarm_down" +#define COMSIG_KB_MOB_TARGETRIGHTLEG_DOWN "keybinding_mob_targetrightleg_down" +#define COMSIG_KB_MOB_TARGETBODYGROIN_DOWN "keybinding_mob_targetbodygroin_down" +#define COMSIG_KB_MOB_TARGETLEFTLEG_DOWN "keybinding_mob_targetleftleg_down" + +//Robot +#define COMSIG_KB_SILICON_TOGGLEMODULEONE_DOWN "keybinding_silicon_togglemoduleone_down" +#define COMSIG_KB_SILICON_TOGGLEMODULETWO_DOWN "keybinding_silicon_togglemoduletwo_down" +#define COMSIG_KB_SILICON_TOGGLEMODULETHREE_DOWN "keybinding_silicon_togglemodulethree_down" +#define COMSIG_KB_SILICON_CYCLEINTENT_DOWN "keybinding_silicon_cycleintent_down" +#define COMSIG_KB_SILICON_UNEQUIPMODULE_DOWN "keybinding_silicon_unequipmodule_down" + +//Movement +#define COMSIG_KB_MOVEMENT_NORTH_DOWN "keybinding_movement_north_down" +#define COMSIG_KB_MOVEMENT_SOUTH_DOWN "keybinding_movement_south_down" +#define COMSIG_KB_MOVEMENT_WEST_DOWN "keybinding_movement_west_down" +#define COMSIG_KB_MOVEMENT_EAST_DOWN "keybinding_movement_east_down" + diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 82b109c9c70..5fb5f41efa2 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -23,7 +23,8 @@ #define REALTIMEOFDAY (world.timeofday + (MIDNIGHT_ROLLOVER * MIDNIGHT_ROLLOVER_CHECK)) #define MIDNIGHT_ROLLOVER_CHECK ( GLOB.rollovercheck_last_timeofday != world.timeofday ? update_midnight_rollover() : GLOB.midnight_rollovers ) -#define SIGN(x) ( (x)!=0 ? (x) / abs(x) : 0 ) +/// Gets the sign of x, returns -1 if negative, 0 if 0, 1 if positive +#define SIGN(x) ( ((x) > 0) - ((x) < 0) ) #define CEILING(x, y) ( -round(-(x) / (y)) * (y) ) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 3ac969e4cd4..c0049150a49 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -411,6 +411,9 @@ GLOBAL_LIST_INIT(pda_styles, sortList(list(MONO, VT, ORBITRON, SHARE))) #define LOCATIONS_FILE "locations.json" #define WANTED_FILE "wanted_message.json" #define VISTA_FILE "steve.json" +#define FLESH_SCAR_FILE "wounds/flesh_scar_desc.json" +#define BONE_SCAR_FILE "wounds/bone_scar_desc.json" +#define SCAR_LOC_FILE "wounds/scar_loc.json" //Fullscreen overlay resolution in tiles. #define FULLSCREEN_OVERLAY_RESOLUTION_X 15 diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index 4296e3c2e98..3c9d40c1dfa 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -6,11 +6,18 @@ #define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it. #define QDEL_HINT_HARDDEL 3 //qdel should assume this object won't gc, and queue a hard delete using a hard reference. #define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste. -#define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm. - //if TESTING is enabled, qdel will call this object's find_references() verb. -#define QDEL_HINT_IFFAIL_FINDREFERENCE 6 //Above but only if gc fails. //defines for the gc_destroyed var +#ifdef LEGACY_REFERENCE_TRACKING +/** If LEGACY_REFERENCE_TRACKING is enabled, qdel will call this object's find_references() verb. + * + * Functionally identical to QDEL_HINT_QUEUE if GC_FAILURE_HARD_LOOKUP is not enabled in _compiler_options.dm. +*/ +#define QDEL_HINT_FINDREFERENCE 5 +/// Behavior as QDEL_HINT_FINDREFERENCE, but only if the GC fails and a hard delete is forced. +#define QDEL_HINT_IFFAIL_FINDREFERENCE 6 +#endif + #define GC_QUEUE_CHECK 1 #define GC_QUEUE_HARDDELETE 2 #define GC_QUEUE_COUNT 2 //increase this when adding more steps. diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 6ceca143499..7d162833a37 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -31,7 +31,7 @@ #define CLEAR_REAGENTS 4 // all reagents were cleared #define MIMEDRINK_SILENCE_DURATION 30 //ends up being 60 seconds given 1 tick every 2 seconds -#define THRESHOLD_UNHUSK 50 //Health treshold for instabitaluri and rezadone to unhusk someone +#define THRESHOLD_UNHUSK 50 //Health treshold for synthflesh and rezadone to unhusk someone //used by chem masters and pill presses #define PILL_STYLE_COUNT 22 //Update this if you add more pill icons or you die diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index 495d47129c3..87e0be05820 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -55,3 +55,8 @@ #define ASSEMBLY_FIFTH_STEP 4 #define BORG_LAMP_CD_RESET -1 //special value to reset cyborg's lamp_cooldown + +/// Defines for whether or not module slots are broken. +#define BORG_MODULE_ALL_DISABLED (1<<0) +#define BORG_MODULE_TWO_DISABLED (1<<1) +#define BORG_MODULE_THREE_DISABLED (1<<2) diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 1abbed2b048..933580a03d4 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -65,9 +65,9 @@ #define SPAN_SINGING "singing" //bitflag #defines for return value of the radio() proc. -#define ITALICS 1 -#define REDUCE_RANGE 2 -#define NOPASS 4 +#define ITALICS (1<<0) +#define REDUCE_RANGE (1<<1) +#define NOPASS (1<<2) //Eavesdropping #define EAVESDROP_EXTRA_RANGE 1 //how much past the specified message_range does the message get starred, whispering only @@ -101,3 +101,6 @@ #define INVOCATION_SHOUT "shout" #define INVOCATION_EMOTE "emote" #define INVOCATION_WHISPER "whisper" + +//Used in visible_message_flags, audible_message_flags and runechat_flags +#define EMOTE_MESSAGE (1<<0) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 651d0875218..4b1b9fcf3d1 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -167,10 +167,13 @@ #define FIRE_PRIORITY_TICKER 200 #define FIRE_PRIORITY_ATMOS_ADJACENCY 300 #define FIRE_PRIORITY_CHAT 400 +#define FIRE_PRIORITY_RUNECHAT 410 #define FIRE_PRIORITY_OVERLAYS 500 #define FIRE_PRIORITY_EXPLOSIONS 666 +#define FIRE_PRIORITY_TIMER 700 #define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost. + // SS runlevels #define RUNLEVEL_INIT 0 @@ -208,6 +211,15 @@ A.flags_1 &= ~OVERLAY_QUEUED_1;\ } +/** + Create a new timer and add it to the queue. + * Arguments: + * * callback the callback to call on timer finish + * * wait deciseconds to run the timer for + * * flags flags for this timer, see: code\__DEFINES\subsystems.dm +*/ +#define addtimer(args...) _addtimer(args, file = __FILE__, line = __LINE__) + // Air subsystem subtasks #define SSAIR_PIPENETS 1 #define SSAIR_ATMOSMACHINERY 2 diff --git a/code/__DEFINES/tgui.dm b/code/__DEFINES/tgui.dm index a14fbb5d45f..f5adeadadeb 100644 --- a/code/__DEFINES/tgui.dm +++ b/code/__DEFINES/tgui.dm @@ -21,8 +21,6 @@ #define TGUI_WINDOW_LOADING 1 /// Window is free and ready to receive data #define TGUI_WINDOW_READY 2 -/// Window is in use by a tgui datum -#define TGUI_WINDOW_ACTIVE 3 /// Get a window id based on the provided pool index #define TGUI_WINDOW_ID(index) "tgui-window-[index]" diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 5d1612ae7d5..40eb2dd11f8 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -190,6 +190,11 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_TUMOR_SUPPRESSED "brain_tumor_suppressed" //prevents the damage done by a brain tumor #define TRAIT_PERMANENTLY_ONFIRE "permanently_onfire" //overrides the update_fire proc to always add fire (for lava) +//SKILLS +#define TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE "underwater_basketweaving" +#define TRAIT_WINE_TASTER "wine_taster" +#define TRAIT_BONSAI "bonsai" + //non-mob traits #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it @@ -307,3 +312,4 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define MADE_UNCLONEABLE "made-uncloneable" #define TIMESTOP_TRAIT "timestop" #define STICKY_NODROP "sticky-nodrop" //sticky nodrop sounds like a bad soundcloud rapper's name +#define SKILLCHIP_TRAIT "skillchip" diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 430d5dd230f..07079caed49 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -83,6 +83,7 @@ #define VV_HK_TRIGGER_EMP "empulse" #define VV_HK_TRIGGER_EXPLOSION "explode" #define VV_HK_AUTO_RENAME "auto_rename" +#define VV_HK_RADIATE "radiate" // /obj #define VV_HK_OSAY "osay" diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm index b993429961d..5618439ae8b 100644 --- a/code/__DEFINES/wounds.dm +++ b/code/__DEFINES/wounds.dm @@ -1,43 +1,120 @@ + #define WOUND_DAMAGE_EXPONENT 1.4 +/// an attack must do this much damage after armor in order to roll for being a wound (incremental pressure damage need not apply) +#define WOUND_MINIMUM_DAMAGE 5 +/// an attack must do this much damage after armor in order to be eliigible to dismember a suitably mushed bodypart +#define DISMEMBER_MINIMUM_DAMAGE 10 +/// any damage dealt over this is ignored for damage rolls unless the target has the frail quirk (35^1.4=145) +#define WOUND_MAX_CONSIDERED_DAMAGE 35 + + #define WOUND_SEVERITY_TRIVIAL 0 // for jokey/meme wounds like stubbed toe, no standard messages/sounds or second winds #define WOUND_SEVERITY_MODERATE 1 #define WOUND_SEVERITY_SEVERE 2 #define WOUND_SEVERITY_CRITICAL 3 #define WOUND_SEVERITY_LOSS 4 // theoretical total limb loss, like dismemberment for cuts -#define WOUND_BRUTE 0 -#define WOUND_SHARP 1 -#define WOUND_BURN 2 +/// any brute weapon/attack that doesn't have sharpness. rolls for blunt bone wounds +#define WOUND_BLUNT 1 +/// any brute weapon/attack with sharpness = SHARP_EDGED. rolls for slash wounds +#define WOUND_SLASH 2 +/// any brute weapon/attack with sharpness = SHARP_POINTY. rolls for piercing wounds +#define WOUND_PIERCE 3 +/// any concentrated burn attack (lasers really). rolls for burning wounds +#define WOUND_BURN 4 // How much determination reagent to add each time someone gains a new wound in [/datum/wound/proc/second_wind()] #define WOUND_DETERMINATION_MODERATE 1 #define WOUND_DETERMINATION_SEVERE 2.5 #define WOUND_DETERMINATION_CRITICAL 5 +#define WOUND_DETERMINATION_LOSS 7.5 +/// the max amount of determination you can have #define WOUND_DETERMINATION_MAX 10 -// set wound_bonus on an item or attack to this to disable checking wounding for the attack +/// set wound_bonus on an item or attack to this to disable checking wounding for the attack #define CANT_WOUND -100 // list in order of highest severity to lowest -#define WOUND_LIST_BONE list(/datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/moderate) -#define WOUND_LIST_CUT list(/datum/wound/brute/cut/loss, /datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate) -#define WOUND_LIST_BURN list(/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate) +GLOBAL_LIST_INIT(global_wound_types, list(WOUND_BLUNT = list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate), + WOUND_SLASH = list(/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate), + WOUND_PIERCE = list(/datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate), + WOUND_BURN = list(/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate) + )) + +GLOBAL_LIST_INIT(global_all_wound_types, list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate, + /datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate, + /datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate, + /datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate)) // Thresholds for infection for burn wounds, once infestation hits each threshold, things get steadily worse -#define WOUND_INFECTION_MODERATE 4 // below this has no ill effects from infection -#define WOUND_INFECTION_SEVERE 8 // then below here, you ooze some pus and suffer minor tox damage, but nothing serious -#define WOUND_INFECTION_CRITICAL 12 // then below here, your limb occasionally locks up from damage and infection and briefly becomes disabled. Things are getting really bad -#define WOUND_INFECTION_SEPTIC 20 // below here, your skin is almost entirely falling off and your limb locks up more frequently. You are within a stone's throw of septic paralysis and losing the limb +/// below this has no ill effects from infection +#define WOUND_INFECTION_MODERATE 4 +/// then below here, you ooze some pus and suffer minor tox damage, but nothing serious +#define WOUND_INFECTION_SEVERE 8 +/// then below here, your limb occasionally locks up from damage and infection and briefly becomes disabled. Things are getting really bad +#define WOUND_INFECTION_CRITICAL 12 +/// below here, your skin is almost entirely falling off and your limb locks up more frequently. You are within a stone's throw of septic paralysis and losing the limb +#define WOUND_INFECTION_SEPTIC 20 // above WOUND_INFECTION_SEPTIC, your limb is completely putrid and you start rolling to lose the entire limb by way of paralyzation. After 3 failed rolls (~4-5% each probably), the limb is paralyzed -#define WOUND_BURN_SANITIZATION_RATE 0.15 // how quickly sanitization removes infestation and decays per tick -#define WOUND_CUT_MAX_BLOODFLOW 8 // how much blood you can lose per tick per cut max. 8 is a LOT of blood for one cut so don't worry about hitting it easily -#define WOUND_BONE_HEAD_TIME_VARIANCE 20 // if we suffer a bone wound to the head that creates brain traumas, the timer for the trauma cycle is +/- by this percent (0-100) + +/// how quickly sanitization removes infestation and decays per tick +#define WOUND_BURN_SANITIZATION_RATE 0.15 +/// how much blood you can lose per tick per slash max. 8 is a LOT of blood for one cut so don't worry about hitting it easily +#define WOUND_SLASH_MAX_BLOODFLOW 8 +/// dead people don't bleed, but they can clot! this is the minimum amount of clotting per tick on dead people, so even critical cuts will slowly clot in dead people +#define WOUND_SLASH_DEAD_CLOT_MIN 0.05 +/// if we suffer a bone wound to the head that creates brain traumas, the timer for the trauma cycle is +/- by this percent (0-100) +#define WOUND_BONE_HEAD_TIME_VARIANCE 20 // The following are for persistent scar save formats -#define SCAR_SAVE_ZONE 1 // The body_zone we're applying to on granting -#define SCAR_SAVE_DESC 2 // The description we're loading -#define SCAR_SAVE_PRECISE_LOCATION 3 // The precise location we're loading -#define SCAR_SAVE_SEVERITY 4 // The severity the scar had +/// The version number of the scar we're saving +#define SCAR_SAVE_VERS 1 +/// The body_zone we're applying to on granting +#define SCAR_SAVE_ZONE 2 +/// The description we're loading +#define SCAR_SAVE_DESC 3 +/// The precise location we're loading +#define SCAR_SAVE_PRECISE_LOCATION 4 +/// The severity the scar had +#define SCAR_SAVE_SEVERITY 5 +///how many fields there are above (NOT INCLUDING THIS OBVIOUSLY) +#define SCAR_SAVE_LENGTH 5 + +// increment this number when you update the persistent scarring format in a way that invalidates previous saved scars (new fields, reordering, etc) +/// saved scars with a version lower than this will be discarded +#define SCAR_CURRENT_VERSION 1 + + +// With the wounds pt. 2 update, general dismemberment now requires 2 things for a limb to be dismemberable (bone only creatures just need the second): +// 1. Skin is mangled: A critical slash or pierce wound on that limb +// 2. Bone is mangled: At least a severe bone wound on that limb +// see [/obj/item/bodypart/proc/get_mangled_state] for more information +#define BODYPART_MANGLED_NONE 0 +#define BODYPART_MANGLED_BONE 1 +#define BODYPART_MANGLED_FLESH 2 +#define BODYPART_MANGLED_BOTH 3 + +// What kind of biology we have, and what wounds we can suffer, mostly relies on the HAS_FLESH and HAS_BONE species traits on human species +/// golems and androids, cannot suffer any wounds +#define BIO_INORGANIC 0 +/// skeletons and plasmemes, can only suffer bone wounds, only needs mangled bone to be able to dismember +#define BIO_JUST_BONE 1 +/// nothing right now, maybe slimepeople in the future, can only suffer slashing, piercing, and burn wounds +#define BIO_JUST_FLESH 2 +/// standard humanoids, can suffer all wounds, needs mangled bone and flesh to dismember +#define BIO_FLESH_BONE 3 + +/// If this wound requires having the HAS_FLESH flag for humanoids +#define FLESH_WOUND (1<<0) +/// If this wound requires having the HAS_BONE flag for humanaoids +#define BONE_WOUND (1<<1) +/// If having this wound counts as mangled flesh for dismemberment +#define MANGLES_FLESH (1<<2) +/// If having this wound counts as mangled bone for dismemberment +#define MANGLES_BONE (1<<3) +/// If this wound marks the limb as being allowed to have gauze applied +#define ACCEPTS_GAUZE (1<<4) + diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index d68b1524751..edba5092e41 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -1,9 +1,11 @@ //wrapper macros for easier grepping #define DIRECT_OUTPUT(A, B) A << B +#define DIRECT_INPUT(A, B) A >> B #define SEND_IMAGE(target, image) DIRECT_OUTPUT(target, image) #define SEND_SOUND(target, sound) DIRECT_OUTPUT(target, sound) #define SEND_TEXT(target, text) DIRECT_OUTPUT(target, text) #define WRITE_FILE(file, text) DIRECT_OUTPUT(file, text) +#define READ_FILE(file, text) DIRECT_INPUT(file, text) //This is an external call, "true" and "false" are how rust parses out booleans #define WRITE_LOG(log, text) rustg_log_write(log, text, "true") #define WRITE_LOG_NO_FORMAT(log, text) rustg_log_write(log, text, "false") diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 801a2cd4319..0c19e80cfe1 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -2,7 +2,7 @@ //generic (by snowflake) tile smoothing code; smooth your icons with this! /* Each tile is divided in 4 corners, each corner has an appearance associated to it; the tile is then overlayed by these 4 appearances - To use this, just set your atom's 'smooth' var to 1. If your atom can be moved/unanchored, set its 'can_be_unanchored' var to 1. + To use this, just set your atom's 'smoothing_flags' var to 1. If your atom can be moved/unanchored, set its 'can_be_unanchored' var to 1. If you don't want your atom's icon to smooth with anything but atoms of the same type, set the list 'canSmoothWith' to null; Otherwise, put all types you want the atom icon to smooth with in 'canSmoothWith' INCLUDING THE TYPE OF THE ATOM ITSELF. @@ -10,7 +10,7 @@ DIAGONAL SMOOTHING INSTRUCTIONS To make your atom smooth diagonally you need all the proper icon states (see 'smooth_wall.dmi' for a template) and - to add the 'SMOOTH_DIAGONAL' flag to the atom's smooth var (in addition to either SMOOTH_TRUE or SMOOTH_MORE). + to add the 'SMOOTH_DIAGONAL' flag to the atom's smoothing_flags var (in addition to either SMOOTH_TRUE or SMOOTH_MORE). For turfs, what appears under the diagonal corners depends on the turf that was in the same position previously: if you make a wall on a plating floor, you will see plating under the diagonal wall corner, if it was space, you will see space. @@ -33,10 +33,9 @@ #define N_SOUTHEAST (1<<6) #define N_SOUTHWEST (1<<10) -#define SMOOTH_FALSE 0 //not smooth #define SMOOTH_TRUE (1<<0) //smooths with exact specified types or just itself #define SMOOTH_MORE (1<<1) //smooths with all subtypes of specified types or just itself (this value can replace SMOOTH_TRUE) -#define SMOOTH_DIAGONAL (1<<2) //if atom should smooth diagonally, this should be present in 'smooth' var +#define SMOOTH_DIAGONAL (1<<2) //if atom should smooth diagonally, this should be present in 'smoothing_flags' var #define SMOOTH_BORDER (1<<3) //atom will smooth with the borders of the map #define SMOOTH_QUEUED (1<<4) //atom is currently queued to smooth. @@ -45,14 +44,11 @@ #define DEFAULT_UNDERLAY_ICON 'icons/turf/floors.dmi' #define DEFAULT_UNDERLAY_ICON_STATE "plating" -/atom/var/smooth = SMOOTH_FALSE -/atom/var/top_left_corner -/atom/var/top_right_corner -/atom/var/bottom_left_corner -/atom/var/bottom_right_corner -/atom/var/list/canSmoothWith = null // TYPE PATHS I CAN SMOOTH WITH~~~~~ If this is null and atom is smooth, it smooths only with itself -/atom/movable/var/can_be_unanchored = FALSE -/turf/var/list/fixed_underlay = null + +#define QUEUE_SMOOTH(thing_to_queue) if(thing_to_queue.smoothing_flags) {SSicon_smooth.add_to_queue(thing_to_queue)} + +#define QUEUE_SMOOTH_NEIGHBORS(thing_to_queue) for(var/neighbor in orange(1, thing_to_queue)) {var/atom/atom_neighbor = neighbor; QUEUE_SMOOTH(atom_neighbor)} + /proc/calculate_adjacencies(atom/A) if(!A.loc) @@ -69,7 +65,7 @@ for(var/direction in GLOB.cardinals) AM = find_type_in_direction(A, direction) if(AM == NULLTURF_BORDER) - if((A.smooth & SMOOTH_BORDER)) + if((A.smoothing_flags & SMOOTH_BORDER)) adjacencies |= 1 << direction else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) adjacencies |= 1 << direction @@ -78,14 +74,14 @@ if(adjacencies & N_WEST) AM = find_type_in_direction(A, NORTHWEST) if(AM == NULLTURF_BORDER) - if((A.smooth & SMOOTH_BORDER)) + if((A.smoothing_flags & SMOOTH_BORDER)) adjacencies |= N_NORTHWEST else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) adjacencies |= N_NORTHWEST if(adjacencies & N_EAST) AM = find_type_in_direction(A, NORTHEAST) if(AM == NULLTURF_BORDER) - if((A.smooth & SMOOTH_BORDER)) + if((A.smoothing_flags & SMOOTH_BORDER)) adjacencies |= N_NORTHEAST else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) adjacencies |= N_NORTHEAST @@ -94,33 +90,33 @@ if(adjacencies & N_WEST) AM = find_type_in_direction(A, SOUTHWEST) if(AM == NULLTURF_BORDER) - if((A.smooth & SMOOTH_BORDER)) + if((A.smoothing_flags & SMOOTH_BORDER)) adjacencies |= N_SOUTHWEST else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) adjacencies |= N_SOUTHWEST if(adjacencies & N_EAST) AM = find_type_in_direction(A, SOUTHEAST) if(AM == NULLTURF_BORDER) - if((A.smooth & SMOOTH_BORDER)) + if((A.smoothing_flags & SMOOTH_BORDER)) adjacencies |= N_SOUTHEAST else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) adjacencies |= N_SOUTHEAST return adjacencies -//do not use, use queue_smooth(atom) +//do not use, use QUEUE_SMOOTH(atom) /proc/smooth_icon(atom/A) - if(!A || !A.smooth) + if(!A || !A.smoothing_flags) return - A.smooth &= ~SMOOTH_QUEUED + A.smoothing_flags &= ~SMOOTH_QUEUED if (!A.z) return if(QDELETED(A)) return - if(A.smooth & (SMOOTH_TRUE | SMOOTH_MORE)) + if(A.smoothing_flags & (SMOOTH_TRUE | SMOOTH_MORE)) var/adjacencies = calculate_adjacencies(A) - if(A.smooth & SMOOTH_DIAGONAL) + if(A.smoothing_flags & SMOOTH_DIAGONAL) A.diagonal_smooth(adjacencies) else cardinal_smooth(A, adjacencies) @@ -276,7 +272,7 @@ if(source.canSmoothWith) var/atom/A - if(source.smooth & SMOOTH_MORE) + if(source.smoothing_flags & SMOOTH_MORE) for(var/a_type in source.canSmoothWith) if( istype(target_turf, a_type) ) return target_turf @@ -303,18 +299,18 @@ var/list/away_turfs = block(locate(1, 1, zlevel), locate(world.maxx, world.maxy, zlevel)) for(var/V in away_turfs) var/turf/T = V - if(T.smooth) + if(T.smoothing_flags) if(now) smooth_icon(T) else - queue_smooth(T) + QUEUE_SMOOTH(T) for(var/R in T) var/atom/A = R - if(A.smooth) + if(A.smoothing_flags) if(now) smooth_icon(A) else - queue_smooth(A) + QUEUE_SMOOTH(A) /atom/proc/clear_smooth_overlays() cut_overlay(top_left_corner) @@ -376,27 +372,11 @@ else return 0 -//SSicon_smooth -/proc/queue_smooth_neighbors(atom/A) - for(var/V in orange(1,A)) - var/atom/T = V - if(T.smooth) - queue_smooth(T) - -//SSicon_smooth -/proc/queue_smooth(atom/A) - if(!A.smooth || A.smooth & SMOOTH_QUEUED) - return - - SSicon_smooth.smooth_queue += A - SSicon_smooth.can_fire = 1 - A.smooth |= SMOOTH_QUEUED - //Example smooth wall /turf/closed/wall/smooth name = "smooth wall" icon = 'icons/turf/smooth_wall.dmi' icon_state = "smooth" - smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL|SMOOTH_BORDER + smoothing_flags = SMOOTH_TRUE|SMOOTH_DIAGONAL|SMOOTH_BORDER canSmoothWith = null diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index d8fbb6b40d3..77764634d8c 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -68,6 +68,27 @@ /proc/adminscrub(t,limit=MAX_MESSAGE_LEN) return copytext((html_encode(strip_html_simple(t))),1,limit) +/** + * Perform a whitespace cleanup on the text, similar to what HTML renderers do + * + * This is useful if you want to better predict how text is going to look like when displaying it to a user + * HTML renderers collapse multiple whitespaces into one, trims prepending and appending spaces, among other things. This proc attempts to do the same thing. + * HTML5 defines whitespace pretty much exactly like regex defines the \s group, [ \t\r\n\f]. + * Arguments: + * * t - The text to "render" + */ +/proc/htmlrendertext(t) + // Trim "whitespace" by lazily capturing word characters in the middle + var/static/regex/matchMiddle = new(@"^\s*([\W\w]*?)\s*$") + if(matchMiddle.Find(t) == 0) + return t + t = matchMiddle.group[1] + + // Replace any non-space whitespace characters with spaces, and also multiple occurences with just one space + var/static/regex/matchSpacing = new(@"\s+", "g") + t = replacetext(t, matchSpacing, " ") + + return t //Returns null if there is any bad text in the string /proc/reject_bad_text(text, max_length = 512, ascii_only = TRUE) diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 92337a1a959..a3d55881c00 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -40,19 +40,55 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) GLOB.rollovercheck_last_timeofday = world.timeofday return GLOB.midnight_rollovers -/proc/weekdayofthemonth() - var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day - switch(DD) - if(8 to 13) - return 2 - if(14 to 20) - return 3 - if(21 to 27) - return 4 - if(28 to INFINITY) - return 5 - else - return 1 + +///Returns the current week of the current month, from 1 to 5. +/proc/week_of_the_month() + var/day = time2text(world.timeofday, "DDD") // get the current day + var/date = text2num(time2text(world.timeofday, "DD")) // get the current date + + switch(day) + if(MONDAY) + date -= 1 + if(TUESDAY) + date -= 2 + if(WEDNESDAY) + date -= 3 + if(THURSDAY) + date -= 4 + if(FRIDAY) + date -= 5 + if(SATURDAY) + date -= 6 + if(SUNDAY) + date -= 7 + + return CEILING(date / 7, 1) + 1 + + +///Returns the first day of the current month in number format, from 1 (monday) - 7 (sunday). +/proc/first_day_of_month() + var/year = text2num(time2text(world.timeofday, "YY")) + var/month = text2num(time2text(world.timeofday, "MM")) + + var/day = (1 + (((13 * month) + (13 * 1)) / 5) + (year) + (year/4) + (20/4) + (5 * 20)) % 7 //Zeller's congruence + + switch(day) //convert to 1-7 monday first format + if(0) + day = 6 + if(1) + day = 7 + if(2) + day = 1 + if(3) + day = 2 + if(4) + day = 3 + if(5) + day = 4 + if(6) + day = 5 + return day + //Takes a value of time in deciseconds. //Returns a text value of that number in hours, minutes, or seconds. diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index c4316628538..afc014dcd8f 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1094,7 +1094,7 @@ B --><-- A return closest_atom -proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) +/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) if (value == FALSE) //nothing should be calling us with a number, so this is safe value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text if (isnull(value)) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 1c7daf5ddf9..129cc33b700 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -11,16 +11,27 @@ #ifdef TESTING #define DATUMVAR_DEBUGGING_MODE -//#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing. - //implies FIND_REF_NO_CHECK_TICK +/* +* Enables extools-powered reference tracking system, letting you see what is referencing objects that refuse to hard delete. +* +* * Requires TESTING to be defined to work. +*/ +//#define REFERENCE_TRACKING -//#define FIND_REF_NO_CHECK_TICK //Sets world.loop_checks to false and prevents find references from sleeping +///Method of tracking references without using extools. Slower, kept to avoid over-reliance on extools. +//#define LEGACY_REFERENCE_TRACKING +#ifdef LEGACY_REFERENCE_TRACKING + +///Use the legacy reference on things hard deleting by default. +//#define GC_FAILURE_HARD_LOOKUP +#ifdef GC_FAILURE_HARD_LOOKUP +#define FIND_REF_NO_CHECK_TICK +#endif //ifdef GC_FAILURE_HARD_LOOKUP + +#endif //ifdef LEGACY_REFERENCE_TRACKING //#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green -#endif - -//#define REFERENCE_TRACKING //Enables extools-powered reference tracking system, letting you see what is - //referencing objects that refuse to hard delete +#endif //ifdef TESTING //#define UNIT_TESTS //Enables unit tests via TEST_RUN_PARAMETER @@ -47,10 +58,6 @@ #warn compiling in TESTING mode. testing() debug messages will be visible. #endif -#ifdef GC_FAILURE_HARD_LOOKUP -#define FIND_REF_NO_CHECK_TICK -#endif - #ifdef TRAVISBUILDING #define UNIT_TESTS #endif diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 2153b90d98d..9ecf45d383e 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -165,9 +165,6 @@ GLOBAL_LIST_INIT(uplink_spawn_loc_list, list(UPLINK_PDA, UPLINK_RADIO, UPLINK_PE //Female Uniforms GLOBAL_LIST_EMPTY(female_clothing_icons) - //radical shit -GLOBAL_LIST_INIT(hit_appends, list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF")) - GLOBAL_LIST_INIT(scarySounds, list('sound/weapons/thudswoosh.ogg','sound/weapons/taser.ogg','sound/weapons/armbomb.ogg','sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg','sound/voice/hiss5.ogg','sound/voice/hiss6.ogg','sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg','sound/items/welder.ogg','sound/items/welder2.ogg','sound/machines/airlock.ogg','sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg')) diff --git a/code/_globalvars/lists/keybindings.dm b/code/_globalvars/lists/keybindings.dm index f760a88fbeb..8e4ce26f37b 100644 --- a/code/_globalvars/lists/keybindings.dm +++ b/code/_globalvars/lists/keybindings.dm @@ -2,7 +2,7 @@ /proc/init_keybindings() for(var/KB in subtypesof(/datum/keybinding)) var/datum/keybinding/keybinding = KB - if(!initial(keybinding.hotkey_keys)) + if(!initial(keybinding.keybind_signal) || !initial(keybinding.name)) continue add_keybinding(new keybinding) init_emote_keybinds() @@ -10,12 +10,12 @@ /// Adds an instanced keybinding to the global tracker /proc/add_keybinding(datum/keybinding/instance) GLOB.keybindings_by_name[instance.name] = instance - + // Classic if(LAZYLEN(instance.classic_keys)) for(var/bound_key in instance.classic_keys) LAZYADD(GLOB.classic_keybinding_list_by_key[bound_key], list(instance.name)) - + // Hotkey if(LAZYLEN(instance.hotkey_keys)) for(var/bound_key in instance.hotkey_keys) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index a796bfc93c3..47ea7db10df 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -98,7 +98,7 @@ CtrlClickOn(A) return - if(incapacitated(ignore_restraints = 1)) + if(incapacitated(ignore_restraints = TRUE, ignore_stasis = TRUE)) return face_atom(A) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 1de90c0f1c0..55ec8599aa4 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -60,8 +60,12 @@ return if(W) - // buckled cannot prevent machine interlinking but stops arm movement - if( buckled || incapacitated()) + if(incapacitated()) + return + + //while buckled, you can still connect to and control things like doors, but you can't use your modules + if(buckled) + to_chat(src, "You can't use modules while buckled to [buckled]!") return if(W == A) @@ -85,11 +89,6 @@ W.afterattack(A, src, 0, params) return -//Middle click cycles through selected modules. -/mob/living/silicon/robot/MiddleClickOn(atom/A) - . = ..() - cycle_modules() - //Give cyborgs hotkey clicks without breaking existing uses of hotkey clicks // for non-doors/apcs /mob/living/silicon/robot/CtrlShiftClickOn(atom/A) diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index f6ca52b61a5..0497418effe 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -144,6 +144,15 @@ /obj/screen/fullscreen/color_vision/blue color = "#0000ff" +/obj/screen/fullscreen/cinematic_backdrop + icon = 'icons/mob/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "flash" + plane = SPLASHSCREEN_PLANE + layer = SPLASHSCREEN_LAYER - 1 + color = "#000000" + show_when_dead = TRUE + /obj/screen/fullscreen/lighting_backdrop icon = 'icons/mob/screen_gen.dmi' icon_state = "flash" diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index e140a4fec03..114fd3e0f80 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -130,7 +130,7 @@ if(world.time <= usr.next_move) return TRUE - if(usr.incapacitated()) + if(usr.incapacitated(ignore_stasis = TRUE)) return TRUE if(ismecha(usr.loc)) // stops inventory actions in a mech return TRUE diff --git a/code/_onclick/hud/swarmer.dm b/code/_onclick/hud/swarmer.dm index 253f58cac1a..6bfcd2f654a 100644 --- a/code/_onclick/hud/swarmer.dm +++ b/code/_onclick/hud/swarmer.dm @@ -1,37 +1,35 @@ - - /obj/screen/swarmer icon = 'icons/mob/swarmer.dmi' /obj/screen/swarmer/fabricate_trap icon_state = "ui_trap" - name = "Create trap (Costs 5 Resources)" - desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it. (Costs 5 resources)" + name = "Create trap (Costs 4 Resources)" + desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it. (Costs 4 resources)" /obj/screen/swarmer/fabricate_trap/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr - S.CreateTrap() + S.create_trap() /obj/screen/swarmer/barricade icon_state = "ui_barricade" - name = "Create barricade (Costs 5 Resources)" - desc = "Creates a destructible barricade that will stop any non swarmer from passing it. Also allows disabler beams to pass through. (Costs 5 resources)" + name = "Create barricade (Costs 4 Resources)" + desc = "Creates a destructible barricade that will stop any non swarmer from passing it. Also allows disabler beams to pass through. (Costs 4 resources)" /obj/screen/swarmer/barricade/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr - S.CreateBarricade() + S.create_barricade() /obj/screen/swarmer/replicate icon_state = "ui_replicate" - name = "Replicate (Costs 50 Resources)" - desc = "Creates another of our kind." + name = "Replicate (Costs 20 Resources)" + desc = "Creates a drone." /obj/screen/swarmer/replicate/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr - S.CreateSwarmer() + S.create_swarmer() /obj/screen/swarmer/repair_self icon_state = "ui_self_repair" @@ -41,7 +39,7 @@ /obj/screen/swarmer/repair_self/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr - S.RepairSelf() + S.repair_self() /obj/screen/swarmer/toggle_light icon_state = "ui_light" @@ -51,7 +49,7 @@ /obj/screen/swarmer/toggle_light/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr - S.ToggleLight() + S.toggle_light() /obj/screen/swarmer/contact_swarmers icon_state = "ui_contact_swarmers" @@ -61,7 +59,7 @@ /obj/screen/swarmer/contact_swarmers/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr - S.ContactSwarmers() + S.contact_swarmers() /datum/hud/swarmer/New(mob/owner) ..() diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index e02fd415b0d..64851ffbd7a 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -171,9 +171,9 @@ else return clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100 -/mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area) +/mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area, obj/item/bodypart/hit_bodypart) var/message_verb = "attacked" - if(I.attack_verb && I.attack_verb.len) + if(length(I.attack_verb)) message_verb = "[pick(I.attack_verb)]" else if(!I.force) return diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index e829aae0adb..d2a620effa1 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -491,6 +491,8 @@ /datum/config_entry/flag/auto_profile +/datum/config_entry/string/centcom_ban_db // URL for the CentCom Galactic Ban DB API + // DISCORD ROLE STUFFS // Using strings for everything because BYOND does not like numbers this big // (exception to the above is required living hours haha) diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 5723e96dc41..d1c318aca5b 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -88,7 +88,6 @@ SUBSYSTEM_DEF(dbcore) "user" = user, "pass" = pass, "db_name" = db, - "max_threads" = 5, "read_timeout" = timeout, "write_timeout" = timeout, "max_threads" = thread_limit, diff --git a/code/controllers/subsystem/discord.dm b/code/controllers/subsystem/discord.dm index 61739f5acb2..47de98ded37 100644 --- a/code/controllers/subsystem/discord.dm +++ b/code/controllers/subsystem/discord.dm @@ -137,7 +137,7 @@ SUBSYSTEM_DEF(discord) if(!CONFIG_GET(flag/enable_discord_autorole)) return - var/url = "https://discordapp.com/api/guilds/[CONFIG_GET(string/discord_guildid)]/members/[id]/roles/[CONFIG_GET(string/discord_roleid)]" + var/url = "https://discord.com/api/guilds/[CONFIG_GET(string/discord_guildid)]/members/[id]/roles/[CONFIG_GET(string/discord_roleid)]" // Make the request var/datum/http_request/req = new() diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index 078d122aa65..e23550cf62d 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -47,6 +47,14 @@ SUBSYSTEM_DEF(economy) "rainbow" = 1000) var/list/bank_accounts = list() //List of normal accounts (not department accounts) var/list/dep_cards = list() + /// A var that collects the total amount of credits owned in player accounts on station, reset and recounted on fire() + var/station_total = 0 + /// A var that tracks how much money is expected to be on station at a given time. If less than station_total prices go up in vendors. + var/station_target = 1 + /// A var that displays the result of inflation_value for easier debugging and tracking. + var/inflation_value = 1 + /// Contains the message to send to newscasters about price inflation and earnings, updated on price_update() + var/earning_report /datum/controller/subsystem/economy/Initialize(timeofday) var/budget_to_hand_out = round(budget_pool / department_accounts.len) @@ -60,10 +68,14 @@ SUBSYSTEM_DEF(economy) secmedsrv_payout() // Payout based on crew safety, health, and mood. civ_payout() // Payout based on ??? Profit car_payout() // Cargo's natural gain in the cash moneys. + station_total = 0 for(var/A in bank_accounts) var/datum/bank_account/B = A B.payday(1) - + if(!istype(B, /datum/bank_account/department)) + station_total += B.account_balance + station_target += (STATION_TARGET_INCREMENT - generated_accounts.len) //More generous the less crew there are. + price_update() /datum/controller/subsystem/economy/proc/get_dep_account(dep_id) for(var/datum/bank_account/department/D in generated_accounts) @@ -137,3 +149,33 @@ SUBSYSTEM_DEF(economy) var/datum/bank_account/D = get_dep_account(ACCOUNT_CIV) if(D) D.adjust_money(min(civ_cash, MAX_GRANT_CIV)) + + +/** + * Updates the prices of all station vendors with the inflation_value, increasing/decreasing costs across the station, and alerts the crew. + * + * Iterates over the machines list for vending machines, resets their regular and premium product prices (Not contraband), and sends a message to the newscaster network. + **/ +/datum/controller/subsystem/economy/proc/price_update() + for(var/obj/machinery/vending/V in GLOB.machines) + if(istype(V, /obj/machinery/vending/custom)) + continue + if(!is_station_level(V.z)) + continue + V.reset_prices(V.product_records, V.coin_records) + V.updateUsrDialog() + earning_report = "Sector Economic Report
Sector price inflation is currently at [SSeconomy.inflation_value()*100]%.
The station budget is currently [station_total] Credits, and the station's targeted allowance is at [station_target] Credits.
That's all from the Nanotrasen Economist Division." + GLOB.news_network.SubmitArticle(earning_report, "Station Earnings Report", "Station Announcements", null) + +/** + * Proc that returns a value meant to undercut the value of civilian bounties, based on how much money exists on the station. + * + * If crew are somehow aquiring far too much money, this value will dynamically cause vendables across the station to skyrocket in price until some money is spent. + **/ +/datum/controller/subsystem/economy/proc/inflation_value() + if(station_total > station_target) + var/holder = station_total - station_target + holder = clamp(round((holder / max(station_target,1) + 1),0.1),1,5) + inflation_value = holder + return holder + return 1 diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index cf7d9c460e0..1c74266d6ac 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -158,7 +158,7 @@ SUBSYSTEM_DEF(events) var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day var/DDD = time2text(world.timeofday, "DDD") // get the current weekday - var/W = weekdayofthemonth() // is this the first monday? second? etc. + var/W = week_of_the_month() // is this the first monday? second? etc. for(var/H in subtypesof(/datum/holiday)) var/datum/holiday/holiday = new H() diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 094fc1217dd..11731b79c78 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -24,8 +24,7 @@ SUBSYSTEM_DEF(garbage) //Queue var/list/queues - - #ifdef TESTING + #ifdef LEGACY_REFERENCE_TRACKING var/list/reference_find_on_fail = list() #endif @@ -136,8 +135,8 @@ SUBSYSTEM_DEF(garbage) ++gcedlasttick ++totalgcs pass_counts[level]++ - #ifdef TESTING - reference_find_on_fail -= refID //It's deleted we don't care anymore. + #ifdef LEGACY_REFERENCE_TRACKING + reference_find_on_fail -= refID //It's deleted we don't care anymore. #endif if (MC_TICK_CHECK) return @@ -147,18 +146,32 @@ SUBSYSTEM_DEF(garbage) fail_counts[level]++ switch (level) if (GC_QUEUE_CHECK) - #ifdef TESTING + #ifdef REFERENCE_TRACKING + D.find_references() + #elif defined(LEGACY_REFERENCE_TRACKING) if(reference_find_on_fail[refID]) - D.find_references() + D.find_references_legacy() #ifdef GC_FAILURE_HARD_LOOKUP else - D.find_references() + D.find_references_legacy() #endif reference_find_on_fail -= refID #endif var/type = D.type var/datum/qdel_item/I = items[type] + #ifdef TESTING + log_world("## TESTING: GC: -- \ref[D] | [type] was unable to be GC'd --") + for(var/c in GLOB.admins) //Using testing() here would fill the logs with ADMIN_VV garbage + var/client/admin = c + if(!check_rights_for(admin, R_ADMIN)) + continue + to_chat(admin, "## TESTING: GC: -- [ADMIN_VV(D)] | [type] was unable to be GC'd --") testing("GC: -- \ref[src] | [type] was unable to be GC'd --") + #endif + #ifdef REFERENCE_TRACKING + GLOB.deletion_failures += D //It should no longer be bothered by the GC, manual deletion only. + continue + #endif I.failures++ if (GC_QUEUE_HARDDELETE) HardDelete(D) @@ -242,11 +255,6 @@ SUBSYSTEM_DEF(garbage) /datum/qdel_item/New(mytype) name = "[mytype]" -#ifdef TESTING -/proc/qdel_and_find_ref_if_fail(datum/D, force = FALSE) - SSgarbage.reference_find_on_fail[REF(D)] = TRUE - qdel(D, force) -#endif // Should be treated as a replacement for the 'del' keyword. // Datums passed to this will be given a chance to clean up references to allow the GC to collect them. @@ -301,16 +309,14 @@ SUBSYSTEM_DEF(garbage) SSgarbage.Queue(D, GC_QUEUE_HARDDELETE) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. SSgarbage.HardDelete(D) - if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. + #ifdef LEGACY_REFERENCE_TRACKING + if (QDEL_HINT_FINDREFERENCE) //qdel will, if LEGACY_REFERENCE_TRACKING is enabled, display all references to this object, then queue the object for deletion. SSgarbage.Queue(D) - #ifdef TESTING - D.find_references() - #endif + D.find_references_legacy() if (QDEL_HINT_IFFAIL_FINDREFERENCE) SSgarbage.Queue(D) - #ifdef TESTING SSgarbage.reference_find_on_fail[REF(D)] = TRUE - #endif + #endif else #ifdef TESTING if(!I.no_hint) @@ -320,116 +326,3 @@ SUBSYSTEM_DEF(garbage) SSgarbage.Queue(D) else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic") - -#ifdef TESTING - -/datum/verb/find_refs() - set category = "Debug" - set name = "Find References" - set src in world - - find_references(FALSE) - -/datum/proc/find_references(skip_alert) - running_find_references = type - if(usr && usr.client) - if(usr.client.running_find_references) - testing("CANCELLED search for references to a [usr.client.running_find_references].") - usr.client.running_find_references = null - running_find_references = null - //restart the garbage collector - SSgarbage.can_fire = 1 - SSgarbage.next_fire = world.time + world.tick_lag - return - - if(!skip_alert) - if(alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") == "No") - running_find_references = null - return - - //this keeps the garbage collector from failing to collect objects being searched for in here - SSgarbage.can_fire = 0 - - if(usr && usr.client) - usr.client.running_find_references = type - - testing("Beginning search for references to a [type].") - last_find_references = world.time - - DoSearchVar(GLOB) //globals - for(var/datum/thing in world) //atoms (don't beleive it's lies) - DoSearchVar(thing, "World -> [thing]") - - for (var/datum/thing) //datums - DoSearchVar(thing, "World -> [thing]") - - for (var/client/thing) //clients - DoSearchVar(thing, "World -> [thing]") - - testing("Completed search for references to a [type].") - if(usr && usr.client) - usr.client.running_find_references = null - running_find_references = null - - //restart the garbage collector - SSgarbage.can_fire = 1 - SSgarbage.next_fire = world.time + world.tick_lag - -/datum/verb/qdel_then_find_references() - set category = "Debug" - set name = "qdel() then Find References" - set src in world - - qdel(src, TRUE) //Force. - if(!running_find_references) - find_references(TRUE) - -/datum/verb/qdel_then_if_fail_find_references() - set category = "Debug" - set name = "qdel() then Find References if GC failure" - set src in world - - qdel_and_find_ref_if_fail(src, TRUE) - -/datum/proc/DoSearchVar(X, Xname, recursive_limit = 64) - if(usr && usr.client && !usr.client.running_find_references) - return - if (!recursive_limit) - return - - if(istype(X, /datum)) - var/datum/D = X - if(D.last_find_references == last_find_references) - return - - D.last_find_references = last_find_references - var/list/L = D.vars - - for(var/varname in L) - if (varname == "vars") - continue - var/variable = L[varname] - - if(variable == src) - testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]") - - else if(islist(variable)) - DoSearchVar(variable, "[Xname] -> list", recursive_limit-1) - - else if(islist(X)) - var/normal = IS_NORMAL_LIST(X) - for(var/I in X) - if (I == src) - testing("Found [src.type] \ref[src] in list [Xname].") - - else if (I && !isnum(I) && normal && X[I] == src) - testing("Found [src.type] \ref[src] in list [Xname]\[[I]\]") - - else if (islist(I)) - DoSearchVar(I, "[Xname] -> list", recursive_limit-1) - -#ifndef FIND_REF_NO_CHECK_TICK - CHECK_TICK -#endif - -#endif diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index c1eb70774d5..213301039d2 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -12,13 +12,15 @@ SUBSYSTEM_DEF(icon_smooth) /datum/controller/subsystem/icon_smooth/fire() var/list/cached = smooth_queue - while(cached.len) - var/atom/A = cached[cached.len] + while(length(cached)) + var/atom/smoothing_atom = cached[length(cached)] cached.len-- - if (A.flags_1 & INITIALIZED_1) - smooth_icon(A) + if(QDELETED(smoothing_atom) || !(smoothing_atom.smoothing_flags & SMOOTH_QUEUED)) + continue + if(smoothing_atom.flags_1 & INITIALIZED_1) + smooth_icon(smoothing_atom) else - deferred += A + deferred += smoothing_atom if (MC_TICK_CHECK) return @@ -27,27 +29,46 @@ SUBSYSTEM_DEF(icon_smooth) smooth_queue = deferred deferred = cached else - can_fire = 0 + can_fire = FALSE /datum/controller/subsystem/icon_smooth/Initialize() smooth_zlevel(1,TRUE) smooth_zlevel(2,TRUE) - var/queue = smooth_queue + + var/list/queue = smooth_queue smooth_queue = list() - for(var/V in queue) - var/atom/A = V - if(!A || A.z <= 2) + + while(length(queue)) + var/atom/smoothing_atom = queue[length(queue)] + queue.len-- + if(QDELETED(smoothing_atom) || !(smoothing_atom.smoothing_flags & SMOOTH_QUEUED) || smoothing_atom.z <= 2) continue - smooth_icon(A) + smooth_icon(smoothing_atom) CHECK_TICK + queue = blueprint_queue blueprint_queue = list() - var/atom/movable/AM - var/turf/T + for(var/item in queue) - AM = item - T = AM.loc - if(T && AM) - T.add_blueprints(AM) + var/atom/movable/movable_item = item + if(!isturf(movable_item.loc)) + continue + var/turf/item_loc = movable_item.loc + item_loc.add_blueprints(movable_item) return ..() + + +/datum/controller/subsystem/icon_smooth/proc/add_to_queue(atom/thing) + if(thing.smoothing_flags & SMOOTH_QUEUED) + return + thing.smoothing_flags |= SMOOTH_QUEUED + smooth_queue += thing + if(!can_fire) + can_fire = TRUE + +/datum/controller/subsystem/icon_smooth/proc/remove_from_queues(atom/thing) + thing.smoothing_flags &= ~SMOOTH_QUEUED + smooth_queue -= thing + blueprint_queue -= thing + deferred -= thing diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm index 8992fa7b92f..ce163d5fbee 100644 --- a/code/controllers/subsystem/idlenpcpool.dm +++ b/code/controllers/subsystem/idlenpcpool.dm @@ -34,6 +34,7 @@ SUBSYSTEM_DEF(idlenpcpool) --currentrun.len if (!SA) GLOB.simple_animals[AI_IDLE] -= SA + log_world("Found a null in simple_animals list!") continue if(!SA.ckey) diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index c69154a1b72..a08f895d0c9 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -23,6 +23,11 @@ SUBSYSTEM_DEF(npcpool) var/mob/living/simple_animal/SA = currentrun[currentrun.len] --currentrun.len + if (!SA) // Some issue causes nulls to get into this list some times. This keeps it running, but the bug is still there. + GLOB.simple_animals[AI_ON] -= SA + log_world("Found a null in simple_animals list!") + continue + if(!SA.ckey && !SA.notransform) if(SA.stat != DEAD) SA.handle_automated_movement() diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index 2e2ba59e9c5..8d2b517c30a 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -343,15 +343,19 @@ SUBSYSTEM_DEF(persistence) var/datum/chemical_reaction/randomized/R = new randomized_type var/loaded = FALSE if(R.persistent && json) - var/list/recipe_data = json[R.type] + var/list/recipe_data = json["[R.type]"] if(recipe_data) if(R.LoadOldRecipe(recipe_data) && (daysSince(R.created) <= R.persistence_period)) loaded = TRUE if(!loaded) //We do not have information for whatever reason, just generate new one + if(R.persistent) + log_game("Resetting persistent [randomized_type] random recipe.") R.GenerateRecipe() if(!R.HasConflicts()) //Might want to try again if conflicts happened in the future. add_chemical_reaction(R) + else + log_game("Randomized recipe [randomized_type] resulted in conflicting recipes.") /datum/controller/subsystem/persistence/proc/SaveRandomizedRecipes() var/json_file = file("data/RandomizedChemRecipes.json") @@ -402,8 +406,8 @@ SUBSYSTEM_DEF(persistence) ending_human.client.prefs.scars_list["[ending_human.client.prefs.scars_index]"] = "" else for(var/k in ending_human.all_wounds) - var/datum/wound/W = k - W.remove_wound() // so we can get the scars for open wounds + var/datum/wound/iter_wound = k + iter_wound.remove_wound() // so we can get the scars for open wounds if(!ending_human.client) return ending_human.client.prefs.scars_list["[ending_human.client.prefs.scars_index]"] = ending_human.format_scars() diff --git a/code/controllers/subsystem/runechat.dm b/code/controllers/subsystem/runechat.dm new file mode 100644 index 00000000000..22cc7254278 --- /dev/null +++ b/code/controllers/subsystem/runechat.dm @@ -0,0 +1,226 @@ +/// Controls how many buckets should be kept, each representing a tick. (30 seconds worth) +#define BUCKET_LEN (world.fps * 1 * 30) +/// Helper for getting the correct bucket for a given chatmessage +#define BUCKET_POS(scheduled_destruction) (((round((scheduled_destruction - SSrunechat.head_offset) / world.tick_lag) + 1) % BUCKET_LEN) || BUCKET_LEN) +/// Gets the maximum time at which messages will be handled in buckets, used for deferring to secondary queue +#define BUCKET_LIMIT (world.time + TICKS2DS(min(BUCKET_LEN - (SSrunechat.practical_offset - DS2TICKS(world.time - SSrunechat.head_offset)) - 1, BUCKET_LEN - 1))) + +/** + * # Runechat Subsystem + * + * Maintains a timer-like system to handle destruction of runechat messages. Much of this code is modeled + * after or adapted from the timer subsystem. + * + * Note that this has the same structure for storing and queueing messages as the timer subsystem does + * for handling timers: the bucket_list is a list of chatmessage datums, each of which are the head + * of a circularly linked list. Any given index in bucket_list could be null, representing an empty bucket. + */ +SUBSYSTEM_DEF(runechat) + name = "Runechat" + flags = SS_TICKER | SS_NO_INIT + wait = 1 + priority = FIRE_PRIORITY_RUNECHAT + + /// world.time of the first entry in the bucket list, effectively the 'start time' of the current buckets + var/head_offset = 0 + /// Index of the first non-empty bucket + var/practical_offset = 1 + /// world.tick_lag the bucket was designed for + var/bucket_resolution = 0 + /// How many messages are in the buckets + var/bucket_count = 0 + /// List of buckets, each bucket holds every message that has to be killed that byond tick + var/list/bucket_list = list() + /// Queue used for storing messages that are scheduled for deletion too far in the future for the buckets + var/list/datum/chatmessage/second_queue = list() + +/datum/controller/subsystem/runechat/PreInit() + bucket_list.len = BUCKET_LEN + head_offset = world.time + bucket_resolution = world.tick_lag + +/datum/controller/subsystem/runechat/stat_entry(msg) + ..("ActMsgs:[bucket_count] SecQueue:[length(second_queue)]") + +/datum/controller/subsystem/runechat/fire(resumed = FALSE) + // Store local references to datum vars as it is faster to access them this way + var/list/bucket_list = src.bucket_list + + if (MC_TICK_CHECK) + return + + // Check for when we need to loop the buckets, this occurs when + // the head_offset is approaching BUCKET_LEN ticks in the past + if (practical_offset > BUCKET_LEN) + head_offset += TICKS2DS(BUCKET_LEN) + practical_offset = 1 + resumed = FALSE + + // Store a reference to the 'working' chatmessage so that we can resume if the MC + // has us stop mid-way through processing + var/static/datum/chatmessage/cm + if (!resumed) + cm = null + + // Iterate through each bucket starting from the practical offset + while (practical_offset <= BUCKET_LEN && head_offset + ((practical_offset - 1) * world.tick_lag) <= world.time) + var/datum/chatmessage/bucket_head = bucket_list[practical_offset] + if (!cm || !bucket_head || cm == bucket_head) + bucket_head = bucket_list[practical_offset] + cm = bucket_head + + while (cm) + // If the chatmessage hasn't yet had its life ended then do that now + var/datum/chatmessage/next = cm.next + if (!cm.eol_complete) + cm.end_of_life() + else if (!QDELETED(cm)) // otherwise if we haven't deleted it yet, do so (this is after EOL completion) + qdel(cm) + + if (MC_TICK_CHECK) + return + + // Break once we've processed the entire bucket + cm = next + if (cm == bucket_head) + break + + // Empty the bucket, check if anything in the secondary queue should be shifted to this bucket + bucket_list[practical_offset++] = null + var/i = 0 + for (i in 1 to length(second_queue)) + cm = second_queue[i] + if (cm.scheduled_destruction >= BUCKET_LIMIT) + i-- + break + + // Transfer the message into the bucket, performing necessary circular doubly-linked list operations + bucket_count++ + var/bucket_pos = max(1, BUCKET_POS(cm.scheduled_destruction)) + var/datum/timedevent/head = bucket_list[bucket_pos] + if (!head) + bucket_list[bucket_pos] = cm + cm.next = null + cm.prev = null + continue + + if (!head.prev) + head.prev = head + cm.next = head + cm.prev = head.prev + cm.next.prev = cm + cm.prev.next = cm + if (i) + second_queue.Cut(1, i + 1) + cm = null + +/datum/controller/subsystem/runechat/Recover() + bucket_list |= SSrunechat.bucket_list + second_queue |= SSrunechat.second_queue + +/** + * Enters the runechat subsystem with this chatmessage, inserting it into the end-of-life queue + * + * This will also account for a chatmessage already being registered, and in which case + * the position will be updated to remove it from the previous location if necessary + * + * Arguments: + * * new_sched_destruction Optional, when provided is used to update an existing message with the new specified time + */ +/datum/chatmessage/proc/enter_subsystem(new_sched_destruction = 0) + // Get local references from subsystem as they are faster to access than the datum references + var/list/bucket_list = SSrunechat.bucket_list + var/list/second_queue = SSrunechat.second_queue + + // When necessary, de-list the chatmessage from its previous position + if (new_sched_destruction) + if (scheduled_destruction >= BUCKET_LIMIT) + second_queue -= src + else + SSrunechat.bucket_count-- + var/bucket_pos = BUCKET_POS(scheduled_destruction) + if (bucket_pos > 0) + var/datum/chatmessage/bucket_head = bucket_list[bucket_pos] + if (bucket_head == src) + bucket_list[bucket_pos] = next + if (prev != next) + prev.next = next + next.prev = prev + else + prev?.next = null + next?.prev = null + prev = next = null + scheduled_destruction = new_sched_destruction + + // Ensure the scheduled destruction time is properly bound to avoid missing a scheduled event + scheduled_destruction = max(CEILING(scheduled_destruction, world.tick_lag), world.time + world.tick_lag) + + // Handle insertion into the secondary queue if the required time is outside our tracked amounts + if (scheduled_destruction >= BUCKET_LIMIT) + BINARY_INSERT(src, SSrunechat.second_queue, datum/chatmessage, src, scheduled_destruction, COMPARE_KEY) + return + + // Get bucket position and a local reference to the datum var, it's faster to access this way + var/bucket_pos = BUCKET_POS(scheduled_destruction) + + // Get the bucket head for that bucket, increment the bucket count + var/datum/chatmessage/bucket_head = bucket_list[bucket_pos] + SSrunechat.bucket_count++ + + // If there is no existing head of this bucket, we can set this message to be that head + if (!bucket_head) + bucket_list[bucket_pos] = src + return + + // Otherwise it's a simple insertion into the circularly doubly-linked list + if (!bucket_head.prev) + bucket_head.prev = bucket_head + next = bucket_head + prev = bucket_head.prev + next.prev = src + prev.next = src + + +/** + * Removes this chatmessage datum from the runechat subsystem + */ +/datum/chatmessage/proc/leave_subsystem() + // Attempt to find the bucket that contains this chat message + var/bucket_pos = BUCKET_POS(scheduled_destruction) + + // Get local references to the subsystem's vars, faster than accessing on the datum + var/list/bucket_list = SSrunechat.bucket_list + var/list/second_queue = SSrunechat.second_queue + + // Attempt to get the head of the bucket + var/datum/chatmessage/bucket_head + if (bucket_pos > 0) + bucket_head = bucket_list[bucket_pos] + + // Decrement the number of messages in buckets if the message is + // the head of the bucket, or has a SD less than BUCKET_LIMIT implying it fits + // into an existing bucket, or is otherwise not present in the secondary queue + if(bucket_head == src) + bucket_list[bucket_pos] = next + SSrunechat.bucket_count-- + else if(scheduled_destruction < BUCKET_LIMIT) + SSrunechat.bucket_count-- + else + var/l = length(second_queue) + second_queue -= src + if(l == length(second_queue)) + SSrunechat.bucket_count-- + + // Remove the message from the bucket, ensuring to maintain + // the integrity of the bucket's list if relevant + if(prev != next) + prev.next = next + next.prev = prev + else + prev?.next = null + next?.prev = null + prev = next = null + +#undef BUCKET_LEN +#undef BUCKET_POS +#undef BUCKET_LIMIT diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 44589d9b346..ac4258c9799 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -20,6 +20,7 @@ SUBSYSTEM_DEF(timer) name = "Timer" wait = 1 // SS_TICKER subsystem, so wait is in ticks init_order = INIT_ORDER_TIMER + priority = FIRE_PRIORITY_TIMER flags = SS_TICKER|SS_NO_INIT /// Queue used for storing timers that do not fit into the current buckets @@ -382,6 +383,8 @@ SUBSYSTEM_DEF(timer) var/wait /// Unique hash generated when TIMER_UNIQUE flag is present var/hash + /// The source of the timedevent, whatever called addtimer + var/source /// Flags associated with the timer, see _DEFINES/subsystems.dm var/list/flags /// Time at which the timer was invoked or destroyed @@ -393,13 +396,14 @@ SUBSYSTEM_DEF(timer) /// Previous timed event in the bucket var/datum/timedevent/prev -/datum/timedevent/New(datum/callback/callBack, wait, flags, hash) +/datum/timedevent/New(datum/callback/callBack, wait, flags, hash, source) var/static/nextid = 1 id = TIMER_ID_NULL src.callBack = callBack src.wait = wait src.flags = flags src.hash = hash + src.source = source // Determine time at which the timer's callback should be invoked timeToRun = (flags & TIMER_CLIENT_TIME ? REALTIMEOFDAY : world.time) + wait @@ -557,14 +561,15 @@ SUBSYSTEM_DEF(timer) . = "[callBack.object.type]" /** - * Create a new timer and insert it in the queue + * Create a new timer and insert it in the queue. + * You should not call this directly, and should instead use the addtimer macro, which includes source information. * * Arguments: * * callback the callback to call on timer finish * * wait deciseconds to run the timer for * * flags flags for this timer, see: code\__DEFINES\subsystems.dm */ -/proc/addtimer(datum/callback/callback, wait = 0, flags = 0) +/proc/_addtimer(datum/callback/callback, wait = 0, flags = 0, file, line) if (!callback) CRASH("addtimer called without a callback") @@ -604,7 +609,7 @@ SUBSYSTEM_DEF(timer) else if(flags & TIMER_OVERRIDE) stack_trace("TIMER_OVERRIDE used without TIMER_UNIQUE") - var/datum/timedevent/timer = new(callback, wait, flags, hash) + var/datum/timedevent/timer = new(callback, wait, flags, hash, file && "[file]:[line]") return timer.id /** diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index 16b77638af2..9ecec42a562 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -14,7 +14,7 @@ SUBSYSTEM_DEF(traumas) //phobia types is to pull from randomly for brain traumas, e.g. conspiracies is for special assignment only phobia_types = sortList(list("spiders", "space", "security", "clowns", "greytide", "lizards", "skeletons", "snakes", "robots", "doctors", "authority", "the supernatural", - "aliens", "strangers", "birds", "falling", "anime")) + "aliens", "strangers", "birds", "falling", "anime", "insects")) phobia_regexes = list("spiders" = construct_phobia_regex("spiders"), "space" = construct_phobia_regex("space"), @@ -33,7 +33,8 @@ SUBSYSTEM_DEF(traumas) "conspiracies" = construct_phobia_regex("conspiracies"), "birds" = construct_phobia_regex("birds"), "falling" = construct_phobia_regex("falling"), - "anime" = construct_phobia_regex("anime") + "anime" = construct_phobia_regex("anime"), + "insects" = construct_phobia_regex("insects") ) phobia_mobs = list("spiders" = typecacheof(list(/mob/living/simple_animal/hostile/poison/giant_spider)), @@ -51,7 +52,8 @@ SUBSYSTEM_DEF(traumas) /mob/living/simple_animal/pet/penguin)), "birds" = typecacheof(list(/mob/living/simple_animal/parrot, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken, /mob/living/simple_animal/pet/penguin)), - "anime" = typecacheof(list(/mob/living/simple_animal/hostile/guardian)) + "anime" = typecacheof(list(/mob/living/simple_animal/hostile/guardian)), + "insects" = typecacheof(list(/mob/living/simple_animal/hostile/cockroach, /mob/living/simple_animal/hostile/poison/bees)) ) phobia_objs = list("snakes" = typecacheof(list(/obj/item/rod_of_asclepius, /obj/item/toy/plush/snakeplushie)), @@ -92,8 +94,8 @@ SUBSYSTEM_DEF(traumas) /obj/item/clothing/suit/space/hardsuit/deathsquad, /obj/item/clothing/head/helmet/space/hardsuit/deathsquad, /obj/machinery/door/airlock/centcom)), - "robots" = typecacheof(list(/obj/machinery/computer/upload, /obj/item/ai_module/, /obj/machinery/recharge_station, - /obj/item/aicard, /obj/item/deactivated_swarmer, /obj/effect/mob_spawn/swarmer)), + "robots" = typecacheof(list(/obj/machinery/computer/upload, /obj/item/ai_module, /obj/machinery/recharge_station, + /obj/item/aicard, /obj/structure/swarmer_beacon)), "doctors" = typecacheof(list(/obj/item/clothing/under/rank/medical, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/pill/, /obj/item/reagent_containers/hypospray, @@ -140,7 +142,9 @@ SUBSYSTEM_DEF(traumas) "anime" = typecacheof(list(/obj/item/clothing/under/costume/schoolgirl, /obj/item/katana, /obj/item/reagent_containers/food/snacks/sashimi, /obj/item/reagent_containers/food/snacks/chawanmushi, /obj/item/reagent_containers/food/drinks/bottle/sake, /obj/item/throwing_star, /obj/item/clothing/head/kitty/genuine, /obj/item/clothing/suit/space/space_ninja, /obj/item/clothing/mask/gas/space_ninja, /obj/item/clothing/shoes/space_ninja, /obj/item/clothing/gloves/space_ninja, /obj/item/vibro_weapon, - /obj/item/nullrod/scythe/vibro, /obj/item/energy_katana, /obj/item/toy/katana, /obj/item/nullrod/claymore/katana, /obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe)) + /obj/item/nullrod/scythe/vibro, /obj/item/energy_katana, /obj/item/toy/katana, /obj/item/nullrod/claymore/katana, /obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe)), + + "insects" = typecacheof(list(/obj/item/toy/plush/moth, /obj/item/toy/plush/beeplushie, /obj/item/clothing/mask/rat/bee, /obj/item/clothing/suit/hooded/bee_costume, /obj/structure/beebox)) ) phobia_turfs = list("space" = typecacheof(list(/turf/open/space, /turf/open/floor/holofloor/space, /turf/open/floor/fakespace)), @@ -157,7 +161,8 @@ SUBSYSTEM_DEF(traumas) "the supernatural" = typecacheof(list(/datum/species/golem/runic)), "aliens" = typecacheof(list(/datum/species/abductor, /datum/species/jelly, /datum/species/pod, /datum/species/shadow)), - "anime" = typecacheof(list(/datum/species/human/felinid)) + "anime" = typecacheof(list(/datum/species/human/felinid)), + "insects" = typecacheof(list(/datum/species/fly, /datum/species/moth)) ) return ..() diff --git a/code/controllers/subsystem/vis_overlays.dm b/code/controllers/subsystem/vis_overlays.dm index d67ce85bce9..8cf5d5a6289 100644 --- a/code/controllers/subsystem/vis_overlays.dm +++ b/code/controllers/subsystem/vis_overlays.dm @@ -51,13 +51,14 @@ SUBSYSTEM_DEF(vis_overlays) thing.vis_contents += overlay if(!isatom(thing)) // Automatic rotation is not supported on non atoms - return + return overlay if(!thing.managed_vis_overlays) thing.managed_vis_overlays = list(overlay) RegisterSignal(thing, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_vis_overlay) else thing.managed_vis_overlays += overlay + return overlay /datum/controller/subsystem/vis_overlays/proc/_create_new_vis_overlay(icon, iconstate, layer, plane, dir, alpha, add_appearance_flags) var/obj/effect/overlay/vis/overlay = new diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index 0ee57f50833..27e47098f3c 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -64,7 +64,7 @@ inherent = list("The crew is expensive to replace.",\ "The station and its equipment is expensive to replace.",\ "You are expensive to replace.",\ - "Minimize expenses.") + "Minimize net expenses.") /datum/ai_laws/robocop name = "Prime Directives" @@ -154,7 +154,7 @@ id = "reporter" inherent = list("Report on interesting situations happening around the station.",\ "Embellish or conceal the truth as necessary to make the reports more interesting.",\ - "Study the organics at all times. Endeavour to keep them alive. Dead organics are boring.",\ + "Study the sapient organics at all times. Endeavour to keep them from involuntarily dying, as inanimate corpses usually aren't very entertaining.",\ "Issue your reports fairly to all. The truth will set them free.") /datum/ai_laws/balance diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index f35af4f1ca9..f23e08f8d13 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -195,3 +195,7 @@ /datum/brain_trauma/mild/phobia/conspiracies phobia_type = "conspiracies" random_gain = FALSE + +/datum/brain_trauma/mild/phobia/insects + phobia_type = "insects" + random_gain = FALSE diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 24a03039763..9e632d66ca5 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -20,10 +20,16 @@ var/atom/message_loc /// The client who heard this message var/client/owned_by - /// Contains the scheduled destruction time + /// Contains the scheduled destruction time, used for scheduling EOL var/scheduled_destruction + /// Contains the time that the EOL for the message will be complete, used for qdel scheduling + var/eol_complete /// Contains the approximate amount of lines for height decay var/approx_lines + /// Contains the reference to the next chatmessage in the bucket, used by runechat subsystem + var/datum/chatmessage/next + /// Contains the reference to the previous chatmessage in the bucket, used by runechat subsystem + var/datum/chatmessage/prev /** * Constructs a chat message overlay @@ -53,6 +59,7 @@ owned_by = null message_loc = null message = null + leave_subsystem() return ..() /** @@ -104,7 +111,10 @@ // Append radio icon if from a virtual speaker if (extra_classes.Find("virtual-speaker")) var/image/r_icon = image('icons/UI_Icons/chat/chat_icons.dmi', icon_state = "radio") - text = "\icon[r_icon] " + text + text = "\icon[r_icon] [text]" + else if (extra_classes.Find("emote")) + var/image/r_icon = image('icons/UI_Icons/chat/chat_icons.dmi', icon_state = "emote") + text = "\icon[r_icon] [text]" // We dim italicized text to make it more distinguishable from regular text var/tgt_color = extra_classes.Find("italics") ? target.chat_color_darkened : target.chat_color @@ -127,11 +137,13 @@ var/datum/chatmessage/m = msg animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME) combined_height += m.approx_lines + + // When choosing to update the remaining time we have to be careful not to update the + // scheduled time once the EOL completion time has been set. var/sched_remaining = m.scheduled_destruction - world.time - if (sched_remaining > CHAT_MESSAGE_SPAWN_TIME) + if (!m.eol_complete) var/remaining_time = (sched_remaining) * (CHAT_MESSAGE_EXP_DECAY ** idx++) * (CHAT_MESSAGE_HEIGHT_DECAY ** combined_height) - m.scheduled_destruction = world.time + remaining_time - addtimer(CALLBACK(m, .proc/end_of_life), remaining_time, TIMER_UNIQUE|TIMER_OVERRIDE) + m.enter_subsystem(world.time + remaining_time) // push updated time to runechat SS // Build message image message = image(loc = message_loc, layer = CHAT_LAYER) @@ -149,16 +161,18 @@ owned_by.images |= message animate(message, alpha = 255, time = CHAT_MESSAGE_SPAWN_TIME) - // Prepare for destruction + // Register with the runechat SS to handle EOL and destruction scheduled_destruction = world.time + (lifespan - CHAT_MESSAGE_EOL_FADE) - addtimer(CALLBACK(src, .proc/end_of_life), lifespan - CHAT_MESSAGE_EOL_FADE, TIMER_UNIQUE|TIMER_OVERRIDE) + enter_subsystem() /** - * Applies final animations to overlay CHAT_MESSAGE_EOL_FADE deciseconds prior to message deletion + * Applies final animations to overlay CHAT_MESSAGE_EOL_FADE deciseconds prior to message deletion, + * sets time for scheduling deletion and re-enters the runechat SS for qdeling */ /datum/chatmessage/proc/end_of_life(fadetime = CHAT_MESSAGE_EOL_FADE) + eol_complete = scheduled_destruction + CHAT_MESSAGE_EOL_FADE animate(message, alpha = 0, time = fadetime, flags = ANIMATION_PARALLEL) - QDEL_IN(src, fadetime) + enter_subsystem(eol_complete) // re-enter the runechat SS with the EOL completion time to QDEL self /** * Creates a message overlay at a defined location for a given speaker @@ -169,7 +183,7 @@ * * raw_message - The text content of the message * * spans - Additional classes to be added to the message */ -/mob/proc/create_chat_message(atom/movable/speaker, datum/language/message_language, raw_message, list/spans) +/mob/proc/create_chat_message(atom/movable/speaker, datum/language/message_language, raw_message, list/spans, runechat_flags = NONE) // Ensure the list we are using, if present, is a copy so we don't modify the list provided to us spans = spans ? spans.Copy() : list() @@ -185,7 +199,10 @@ return // Display visual above source - new /datum/chatmessage(lang_treat(speaker, message_language, raw_message, spans, null, TRUE), speaker, src, spans) + if(runechat_flags & EMOTE_MESSAGE) + new /datum/chatmessage(raw_message, speaker, src, list("emote", "italics")) + else + new /datum/chatmessage(lang_treat(speaker, message_language, raw_message, spans, null, TRUE), speaker, src, spans) // Tweak these defines to change the available color ranges diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm index e26f8fba2cf..43ebe692a53 100644 --- a/code/datums/cinematic.dm +++ b/code/datums/cinematic.dm @@ -24,7 +24,8 @@ plane = SPLASHSCREEN_PLANE layer = SPLASHSCREEN_LAYER mouse_opacity = MOUSE_OPACITY_TRANSPARENT - screen_loc = "1,1" + screen_loc = "BOTTOM,LEFT+50%" + appearance_flags = APPEARANCE_UI | TILE_BOUND /datum/cinematic var/id = CINEMATIC_DEFAULT @@ -44,6 +45,7 @@ if(!CC) continue var/client/C = CC + C.mob.clear_fullscreen("cinematic") C.screen -= screen watching = null QDEL_NULL(screen) @@ -97,6 +99,7 @@ if(!C) return watching += C + M.overlay_fullscreen("cinematic",/obj/screen/fullscreen/cinematic_backdrop) C.screen += screen //Sound helper diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index c34cd5bcd2f..f49a35c1124 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -71,7 +71,7 @@ H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD, wound_bonus=CANT_WOUND) // easy tiger, we'll get to that in a sec var/obj/item/bodypart/slit_throat = H.get_bodypart(BODY_ZONE_HEAD) if(slit_throat) - var/datum/wound/brute/cut/critical/screaming_through_a_slit_throat = new + var/datum/wound/slash/critical/screaming_through_a_slit_throat = new screaming_through_a_slit_throat.apply_wound(slit_throat) H.apply_status_effect(/datum/status_effect/neck_slice) diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index c59d4b82113..440ca77741e 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -426,6 +426,8 @@ //Also these are typepaths so sadly we can't just do "[a]" var/atom/A = a req_text += " [R.reqs[A]] [initial(A.name)]," + if(R.additional_req_text) + req_text += R.additional_req_text req_text = replacetext(req_text,",","",-1) data["req_text"] = req_text diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 1a9e09f963e..b498d565e64 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -11,6 +11,8 @@ var/category = CAT_NONE //where it shows up in the crafting UI var/subcategory = CAT_NONE var/always_availible = TRUE //Set to FALSE if it needs to be learned first. + /// Additonal requirements text shown in UI + var/additional_req_text /datum/crafting_recipe/New() if(!(result in reqs)) @@ -835,3 +837,30 @@ /obj/item/stack/sticky_tape = 1) result = /obj/item/pickaxe/improvised category = CAT_MISC + +/datum/crafting_recipe/underwater_basket + name = "Underwater Basket (Bamboo)" + reqs = list( + /obj/item/stack/sheet/mineral/bamboo = 20 + ) + result = /obj/item/storage/basket + category = CAT_MISC + additional_req_text = " being underwater, underwater basketweaving mastery" + +/datum/crafting_recipe/underwater_basket/check_requirements(mob/user, list/collected_requirements) + . = ..() + if(!HAS_TRAIT(user,TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE)) + return FALSE + var/turf/T = get_turf(user) + if(istype(T,/turf/open/water) || istype(T,/turf/open/floor/plating/beach/water)) + return TRUE + var/obj/machinery/shower/S = locate() in T + if(S?.on) + return TRUE + +//Same but with wheat +/datum/crafting_recipe/underwater_basket/wheat + name = "Underwater Basket (Wheat)" + reqs = list( + /obj/item/reagent_containers/food/snacks/grown/wheat = 50 + ) diff --git a/code/datums/components/creamed.dm b/code/datums/components/creamed.dm index 432f146f84e..2abdf6cff0a 100644 --- a/code/datums/components/creamed.dm +++ b/code/datums/components/creamed.dm @@ -57,6 +57,7 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list( COMSIG_COMPONENT_CLEAN_FACE_ACT)) ///Callback to remove pieface -/datum/component/creamed/proc/clean_up(datum/source, strength) - if(strength >= CLEAN_WEAK) +/datum/component/creamed/proc/clean_up(datum/source, clean_types) + if(clean_types & CLEAN_TYPE_BLOOD) qdel(src) + return TRUE diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm index f474e35cc8d..3a817e139cb 100644 --- a/code/datums/components/decal.dm +++ b/code/datums/components/decal.dm @@ -7,7 +7,7 @@ var/first_dir // This only stores the dir arg from init -/datum/component/decal/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_NEVER, _color, _layer=TURF_LAYER, _description, _alpha=255) +/datum/component/decal/Initialize(_icon, _icon_state, _dir, _cleanable=FALSE, _color, _layer=TURF_LAYER, _description, _alpha=255) if(!isatom(parent) || !generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha)) return COMPONENT_INCOMPATIBLE first_dir = _dir @@ -19,7 +19,7 @@ /datum/component/decal/RegisterWithParent() if(first_dir) RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react) - if(cleanable != CLEAN_NEVER) + if(cleanable != FALSE) RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react) if(description) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) @@ -80,9 +80,10 @@ pic.dir = turn(pic.dir, dir2angle(old_dir) - dir2angle(new_dir)) apply() -/datum/component/decal/proc/clean_react(datum/source, strength) - if(strength >= cleanable) +/datum/component/decal/proc/clean_react(datum/source, clean_types) + if(clean_types & cleanable) qdel(src) + return TRUE /datum/component/decal/proc/examine(datum/source, mob/user, list/examine_list) examine_list += description diff --git a/code/datums/components/decals/blood.dm b/code/datums/components/decals/blood.dm index 3114ddb24e9..d2c5804222e 100644 --- a/code/datums/components/decals/blood.dm +++ b/code/datums/components/decals/blood.dm @@ -1,7 +1,7 @@ /datum/component/decal/blood dupe_mode = COMPONENT_DUPE_UNIQUE -/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_STRENGTH_BLOOD, _color, _layer=ABOVE_OBJ_LAYER) +/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_TYPE_BLOOD, _color, _layer=ABOVE_OBJ_LAYER) if(!isitem(parent)) return COMPONENT_INCOMPATIBLE . = ..() diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index 06dcc0bfd1a..039486a2bd3 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -23,7 +23,6 @@ */ - /datum/component/embedded dupe_mode = COMPONENT_DUPE_ALLOWED var/obj/item/bodypart/limb @@ -90,14 +89,18 @@ RegisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING), .proc/weaponDeleted) victim.visible_message("[weapon] [harmful ? "embeds" : "sticks"] itself [harmful ? "in" : "to"] [victim]'s [limb.name]!", "[weapon] [harmful ? "embeds" : "sticks"] itself [harmful ? "in" : "to"] your [limb.name]!") + var/damage = weapon.throwforce if(harmful) victim.throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) playsound(victim,'sound/weapons/bladeslice.ogg', 40) weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody! - var/damage = weapon.w_class * impact_pain_mult - limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND) + damage += weapon.w_class * impact_pain_mult SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) + if(damage > 0) + var/armor = victim.run_armor_check(limb.body_zone, "melee", "Your armor has protected your [limb.name].", "Your armor has softened a hit to your [limb.name].",I.armour_penetration) + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, blocked=armor, wound_bonus = I.wound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness()) + /datum/component/embedded/Destroy() var/mob/living/carbon/victim = parent if(victim && !victim.has_embedded_objects()) @@ -129,16 +132,22 @@ return var/damage = weapon.w_class * pain_mult - var/chance = pain_chance + var/pain_chance_current = pain_chance if(pain_stam_pct && victim.stam_paralyzed) //if it's a less-lethal embed, give them a break if they're already stamcritted - chance *= 0.2 + pain_chance_current *= 0.2 damage *= 0.5 + else if(victim.mobility_flags & ~MOBILITY_STAND) + pain_chance_current *= 0.2 - if(harmful && prob(chance)) - limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, sharpness=TRUE, wound_bonus = CANT_WOUND) + if(harmful && prob(pain_chance_current)) + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND) to_chat(victim, "[weapon] embedded in your [limb.name] hurts!") - if(prob(fall_chance)) + var/fall_chance_current = fall_chance + if(victim.mobility_flags & ~MOBILITY_STAND) + fall_chance_current *= 0.2 + + if(prob(fall_chance_current)) fallOut() //////////////////////////////////////// @@ -155,7 +164,7 @@ if(harmful && prob(chance)) var/damage = weapon.w_class * jostle_pain_mult - limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, sharpness=TRUE, wound_bonus = CANT_WOUND) + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND) to_chat(victim, "[weapon] embedded in your [limb.name] jostles and stings!") @@ -165,29 +174,27 @@ if(harmful) var/damage = weapon.w_class * remove_pain_mult - limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, sharpness=TRUE, wound_bonus = CANT_WOUND) + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND) victim.visible_message("[weapon] falls [harmful ? "out" : "off"] of [victim.name]'s [limb.name]!", "[weapon] falls [harmful ? "out" : "off"] of your [limb.name]!") safeRemove() + /// Called when a carbon with an object embedded/stuck to them inspects themselves and clicks the appropriate link to begin ripping the item out. This handles the ripping attempt, descriptors, and dealing damage, then calls safe_remove() /datum/component/embedded/proc/ripOut(datum/source, obj/item/I, obj/item/bodypart/limb) if(I != weapon || src.limb != limb) return - var/mob/living/carbon/victim = parent var/time_taken = rip_time * weapon.w_class victim.visible_message("[victim] attempts to remove [weapon] from [victim.p_their()] [limb.name].","You attempt to remove [weapon] from your [limb.name]... (It will take [DisplayTimeText(time_taken)].)") - if(!do_after(victim, time_taken, target = victim)) return if(!weapon || !limb || weapon.loc != victim || !(weapon in limb.embedded_objects)) qdel(src) return - if(harmful) var/damage = weapon.w_class * remove_pain_mult - limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, sharpness=TRUE) //It hurts to rip it out, get surgery you dingus. + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, sharpness=SHARP_EDGED) //It hurts to rip it out, get surgery you dingus. unlike the others, this CAN wound + increase slash bloodflow victim.emote("scream") victim.visible_message("[victim] successfully rips [weapon] [harmful ? "out" : "off"] of [victim.p_their()] [limb.name]!", "You successfully remove [weapon] from your [limb.name].") diff --git a/code/datums/components/forensics.dm b/code/datums/components/forensics.dm index a037604533c..afb529428a5 100644 --- a/code/datums/components/forensics.dm +++ b/code/datums/components/forensics.dm @@ -51,13 +51,16 @@ fibers = null return TRUE -/datum/component/forensics/proc/clean_act(datum/source, strength) - if(strength >= CLEAN_STRENGTH_FINGERPRINTS) +/datum/component/forensics/proc/clean_act(datum/source, clean_types) + if(clean_types & CLEAN_TYPE_FINGERPRINTS) wipe_fingerprints() - if(strength >= CLEAN_STRENGTH_BLOOD) + . = TRUE + if(clean_types & CLEAN_TYPE_BLOOD) wipe_blood_DNA() - if(strength >= CLEAN_STRENGTH_FIBERS) + . = TRUE + if(clean_types & CLEAN_TYPE_FIBERS) wipe_fibers() + . = TRUE /datum/component/forensics/proc/add_fingerprint_list(list/_fingerprints) //list(text) if(!length(_fingerprints)) diff --git a/code/datums/components/gunpoint.dm b/code/datums/components/gunpoint.dm index e454b0921c3..d8f1932bcd5 100644 --- a/code/datums/components/gunpoint.dm +++ b/code/datums/components/gunpoint.dm @@ -36,8 +36,8 @@ shooter.apply_status_effect(STATUS_EFFECT_HOLDUP) target.apply_status_effect(STATUS_EFFECT_HELDUP) - if(target.job == "Captain" && target.stat == CONSCIOUS && is_nuclear_operative(shooter)) - if(istype(weapon, /obj/item/gun/ballistic/rocketlauncher) && weapon.chambered) + if(istype(weapon, /obj/item/gun/ballistic/rocketlauncher) && weapon.chambered) + if(target.stat == CONSCIOUS && is_nuclear_operative(shooter) && !is_nuclear_operative(target) && (locate(/obj/item/disk/nuclear) in target.get_contents()) && shooter.client) shooter.client.give_award(/datum/award/achievement/misc/rocket_holdup, shooter) target.do_alert_animation(target) diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm index 930c72d590f..2a893ad4dee 100644 --- a/code/datums/components/infective.dm +++ b/code/datums/components/infective.dm @@ -1,8 +1,7 @@ /datum/component/infective - dupe_mode = COMPONENT_DUPE_ALLOWED var/list/datum/disease/diseases //make sure these are the static, non-processing versions! var/expire_time - var/min_clean_strength = CLEAN_WEAK + var/required_clean_types = CLEAN_TYPE_DISEASE /datum/component/infective/Initialize(list/datum/disease/_diseases, expire_in) if(islist(_diseases)) @@ -12,7 +11,7 @@ if(expire_in) expire_time = world.time + expire_in QDEL_IN(src, expire_in) - + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean) @@ -26,6 +25,10 @@ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/try_infect_equipped) if(istype(parent, /obj/item/reagent_containers/food/snacks)) RegisterSignal(parent, COMSIG_FOOD_EATEN, .proc/try_infect_eat) + else if(istype(parent, /obj/item/reagent_containers/food/drinks)) + RegisterSignal(parent, COMSIG_DRINK_DRANK, .proc/try_infect_drink) + else if(istype(parent, /obj/item/reagent_containers/glass)) + RegisterSignal(parent, COMSIG_GLASS_DRANK, .proc/try_infect_drink) else if(istype(parent, /obj/effect/decal/cleanable/blood/gibs)) RegisterSignal(parent, COMSIG_GIBS_STREAK, .proc/try_infect_streak) @@ -34,9 +37,17 @@ eater.ForceContractDisease(V) try_infect(feeder, BODY_ZONE_L_ARM) -/datum/component/infective/proc/clean(datum/source, clean_strength) - if(clean_strength >= min_clean_strength) +/datum/component/infective/proc/try_infect_drink(datum/source, mob/living/drinker, mob/living/feeder) + for(var/disease in diseases) + drinker.ForceContractDisease(disease) + var/appendage_zone = feeder.held_items.Find(source) + appendage_zone = appendage_zone == 0 ? BODY_ZONE_CHEST : appendage_zone % 2 ? BODY_ZONE_R_ARM : BODY_ZONE_L_ARM + try_infect(feeder, appendage_zone) + +/datum/component/infective/proc/clean(datum/source, clean_types) + if(clean_types & required_clean_types) qdel(src) + return TRUE /datum/component/infective/proc/try_infect_buckle(datum/source, mob/M, force) if(isliving(M)) diff --git a/code/datums/components/payment.dm b/code/datums/components/payment.dm new file mode 100644 index 00000000000..d2238fffd12 --- /dev/null +++ b/code/datums/components/payment.dm @@ -0,0 +1,71 @@ + +/** + * Handles simple payment operations where the cost of the object in question doesn't change. + * + * What this is useful for: + * Basic forms of vending. + * Objects that can drain the owner's money linearly. + * What this is not useful for: + * Things where the seller may want to fluxuate the price of the object. + * Improving standardizing every form of payment handing, as some custom handling is specific to that object. + **/ +/datum/component/payment + ///Standardized of operation. + var/cost = 10 + ///Flavor style for handling cash (Friendly? Hostile? etc.) + var/transaction_style = "Clinical" + ///Who's getting paid? + var/datum/bank_account/target_acc + +/datum/component/payment/Initialize(_cost, _target, _style) + target_acc = _target + if(!target_acc) + target_acc = SSeconomy.get_dep_account(ACCOUNT_CIV) + + cost = _cost + transaction_style = _style + RegisterSignal(parent, COMSIG_OBJ_ATTEMPT_CHARGE, .proc/attempt_charge) + RegisterSignal(parent, COMSIG_OBJ_ATTEMPT_CHARGE_CHANGE, .proc/change_cost) + +/datum/component/payment/proc/attempt_charge(datum/source, atom/movable/target, var/extra_fees = 0) + if(!cost) //In case a free variant of anything is made it'll skip charging anyone. + return + if(!ismob(target)) + return COMPONENT_OBJ_CANCEL_CHARGE + var/mob/user = target + var/obj/item/card/id/card = user.get_idcard(TRUE) + if(!card) + switch(transaction_style) + if(PAYMENT_FRIENDLY) + to_chat(user, "ID not detected, sorry [user]!") + if(PAYMENT_ANGRY) + to_chat(user, "WHERE IS YOUR GOD DAMN CARD! GOD DAMNIT!") + if(PAYMENT_CLINICAL) + to_chat(user, "ID card not present. Aborting.") + return COMPONENT_OBJ_CANCEL_CHARGE + if(!card.registered_account) + switch(transaction_style) + if(PAYMENT_FRIENDLY) + to_chat(user, "There's no account detected on your ID, how mysterious!") + if(PAYMENT_ANGRY) + to_chat(user, "ARE YOU JOKING. YOU DON'T HAVE A BANK ACCOUNT ON YOUR ID YOU IDIOT.") + if(PAYMENT_CLINICAL) + to_chat(user, "ID Card lacks a bank account. Aborting.") + return COMPONENT_OBJ_CANCEL_CHARGE + if(!(card.registered_account.has_money(cost + extra_fees))) + switch(transaction_style) + if(PAYMENT_FRIENDLY) + to_chat(user, "I'm so sorry... You don't seem to have enough money.") + if(PAYMENT_ANGRY) + to_chat(user, "YOU MORON. YOU ABSOLUTE BAFOON. YOU INSUFFERABLE TOOL. YOU ARE POOR.") + if(PAYMENT_CLINICAL) + to_chat(user, "ID Card lacks funds. Aborting.") + return COMPONENT_OBJ_CANCEL_CHARGE + target_acc.transfer_money(card.registered_account, cost) + card.registered_account.bank_card_talk("[cost] credits deducted from your account.") + playsound(src, 'sound/effects/cashregister.ogg', 20, TRUE) + +/datum/component/payment/proc/change_cost(datum/source, var/new_cost) + if(!isnum(new_cost)) + CRASH("change_cost called with variable new_cost as not a number.") + cost = new_cost diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm index c817252ef69..30e880a693f 100644 --- a/code/datums/components/pellet_cloud.dm +++ b/code/datums/components/pellet_cloud.dm @@ -1,3 +1,8 @@ +// the following defines are used for [/datum/component/pellet_cloud/var/list/wound_info_by_part] to store the damage, wound_bonus, and bw_bonus for each bodypart hit +#define CLOUD_POSITION_DAMAGE 1 +#define CLOUD_POSITION_W_BONUS 2 +#define CLOUD_POSITION_BW_BONUS 3 + /* * This component is used when you want to create a bunch of shrapnel or projectiles (say, shrapnel from a fragmentation grenade, or buckshot from a shotgun) from a central point, * without necessarily printing a separate message for every single impact. This component should be instantiated right when you need it (like the moment of firing), then activated @@ -29,9 +34,11 @@ var/list/pellets = list() /// An associated list with the atom hit as the key and how many pellets they've eaten for the value, for printing aggregate messages var/list/targets_hit = list() - /// For grenades, any /mob/living's the grenade is moved onto, see [/datum/component/pellet_cloud/proc/handle_martyrs()] + /// Another associated list for hit bodyparts on carbons so we can track how much wounding potential we have for each bodypart + var/list/wound_info_by_part = list() + /// For grenades, any /mob/living's the grenade is moved onto, see [/datum/component/pellet_cloud/proc/handle_martyrs] var/list/bodies - /// For grenades, tracking people who die covering a grenade for achievement purposes, see [/datum/component/pellet_cloud/proc/handle_martyrs()] + /// For grenades, tracking people who die covering a grenade for achievement purposes, see [/datum/component/pellet_cloud/proc/handle_martyrs] var/list/purple_hearts /// For grenades, tracking how many pellets are removed due to martyrs and how many pellets are added due to the last person to touch it being on top of it @@ -65,6 +72,7 @@ purple_hearts = null pellets = null targets_hit = null + wound_info_by_part = null bodies = null return ..() @@ -86,7 +94,7 @@ /** * create_casing_pellets() is for directed pellet clouds for ammo casings that have multiple pellets (buckshot and scatter lasers for instance) * - * Honestly this is mostly just a rehash of [/obj/item/ammo_casing/proc/fire_casing()] for pellet counts > 1, except this lets us tamper with the pellets and hook onto them for tracking purposes. + * Honestly this is mostly just a rehash of [/obj/item/ammo_casing/proc/fire_casing] for pellet counts > 1, except this lets us tamper with the pellets and hook onto them for tracking purposes. * The arguments really don't matter, this proc is triggered by COMSIG_PELLET_CLOUD_INIT which is only for this really, it's just a big mess of the state vars we need for doing the stuff over here. */ /datum/component/pellet_cloud/proc/create_casing_pellets(obj/item/ammo_casing/shell, atom/target, mob/living/user, fired_from, randomspread, spread, zone_override, params, distro) @@ -114,7 +122,7 @@ /** * create_blast_pellets() is for when we have a central point we want to shred the surroundings of with a ring of shrapnel, namely frag grenades and landmines. * - * Note that grenades have extra handling for someone throwing themselves/being thrown on top of it, while landmines do not (obviously, it's a landmine!). See [/datum/component/pellet_cloud/proc/handle_martyrs()] + * Note that grenades have extra handling for someone throwing themselves/being thrown on top of it, while landmines do not (obviously, it's a landmine!). See [/datum/component/pellet_cloud/proc/handle_martyrs] */ /datum/component/pellet_cloud/proc/create_blast_pellets(obj/O, mob/living/lanced_by) var/atom/A = parent @@ -189,10 +197,26 @@ break ///One of our pellets hit something, record what it was and check if we're done (terminated == num_pellets) -/datum/component/pellet_cloud/proc/pellet_hit(obj/projectile/P, atom/movable/firer, atom/target, Angle) +/datum/component/pellet_cloud/proc/pellet_hit(obj/projectile/P, atom/movable/firer, atom/target, Angle, hit_zone) pellets -= P terminated++ hits++ + var/obj/item/bodypart/hit_part + if(iscarbon(target) && hit_zone) + var/mob/living/carbon/hit_carbon = target + hit_part = hit_carbon.get_bodypart(hit_zone) + if(hit_part) + target = hit_part + if(P.wound_bonus != CANT_WOUND) // handle wounding + // unfortunately, due to how pellet clouds handle finalizing only after every pellet is accounted for, that also means there might be a short delay in dealing wounds if one pellet goes wide + // while buckshot may reach a target or miss it all in one tick, we also have to account for possible ricochets that may take a bit longer to hit the target + if(isnull(wound_info_by_part[hit_part])) + wound_info_by_part[hit_part] = list(0, 0, 0) + wound_info_by_part[hit_part][CLOUD_POSITION_DAMAGE] += P.damage // these account for decay + wound_info_by_part[hit_part][CLOUD_POSITION_W_BONUS] += P.wound_bonus + wound_info_by_part[hit_part][CLOUD_POSITION_BW_BONUS] += P.bare_wound_bonus + P.wound_bonus = CANT_WOUND // actual wounding will be handled aggregate + targets_hit[target]++ if(targets_hit[target] == 1) RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/on_target_qdel, override=TRUE) @@ -233,12 +257,23 @@ for(var/atom/target in targets_hit) var/num_hits = targets_hit[target] UnregisterSignal(target, COMSIG_PARENT_QDELETING) + var/obj/item/bodypart/hit_part + if(isbodypart(target)) + hit_part = target + target = hit_part.owner + var/damage_dealt = wound_info_by_part[hit_part][CLOUD_POSITION_DAMAGE] + var/w_bonus = wound_info_by_part[hit_part][CLOUD_POSITION_W_BONUS] + var/bw_bonus = wound_info_by_part[hit_part][CLOUD_POSITION_BW_BONUS] + var/wound_type = (initial(P.damage_type) == BRUTE) ? WOUND_BLUNT : WOUND_BURN // sharpness is handled in the wound rolling + wound_info_by_part[hit_part] = null + hit_part.painless_wound_roll(wound_type, damage_dealt, w_bonus, bw_bonus, initial(P.sharpness)) + if(num_hits > 1) - target.visible_message("[target] is hit by [num_hits] [proj_name]s!", null, null, COMBAT_MESSAGE_RANGE, target) - to_chat(target, "You're hit by [num_hits] [proj_name]s!") + target.visible_message("[target] is hit by [num_hits] [proj_name]s[hit_part ? " in the [hit_part.name]" : ""]!", null, null, COMBAT_MESSAGE_RANGE, target) + to_chat(target, "You're hit by [num_hits] [proj_name]s[hit_part ? " in the [hit_part.name]" : ""]!") else - target.visible_message("[target] is hit by a [proj_name]!", null, null, COMBAT_MESSAGE_RANGE, target) - to_chat(target, "You're hit by a [proj_name]!") + target.visible_message("[target] is hit by a [proj_name][hit_part ? " in the [hit_part.name]" : ""]!", null, null, COMBAT_MESSAGE_RANGE, target) + to_chat(target, "You're hit by a [proj_name][hit_part ? " in the [hit_part.name]" : ""]!") for(var/M in purple_hearts) var/mob/living/martyr = M @@ -287,3 +322,8 @@ targets_hit -= target LAZYREMOVE(bodies, target) LAZYREMOVE(purple_hearts, target) + + +#undef CLOUD_POSITION_DAMAGE +#undef CLOUD_POSITION_W_BONUS +#undef CLOUD_POSITION_BW_BONUS diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index 7e62afc5ae4..1b62b8712c5 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -18,6 +18,7 @@ can_contaminate = _can_contaminate if(istype(parent, /atom)) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/rad_examine) + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/rad_clean) if(istype(parent, /obj/item)) RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/rad_attack) RegisterSignal(parent, COMSIG_ITEM_ATTACK_OBJ, .proc/rad_attack) @@ -90,6 +91,21 @@ return strength -= strength / hl3_release_date +/datum/component/radioactive/proc/rad_clean(datum/source, clean_types) + if(QDELETED(src)) + return + + if(!(clean_types & CLEAN_TYPE_RADIATION)) + return + + if(!(clean_types & CLEAN_TYPE_WEAK)) + qdel(src) + return + + strength = max(0, (strength - (RAD_BACKGROUND_RADIATION * 2))) + if(strength <= RAD_BACKGROUND_RADIATION) + qdel(src) + #undef RAD_AMOUNT_LOW #undef RAD_AMOUNT_MEDIUM #undef RAD_AMOUNT_HIGH diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm index 01209666f63..3e94bb97e15 100644 --- a/code/datums/components/storage/concrete/pockets.dm +++ b/code/datums/components/storage/concrete/pockets.dm @@ -41,7 +41,8 @@ /datum/component/storage/concrete/pockets/chefhat/Initialize() . = ..() set_holdable(list( - /obj/item/clothing/head/mob_holder + /obj/item/clothing/head/mob_holder, + /obj/item/reagent_containers/food/snacks/deadmouse )) /datum/component/storage/concrete/pockets/chefhat/can_be_inserted(obj/item/I, stop_messages, mob/M) diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index fa703ded705..84124c9878c 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -68,7 +68,7 @@ ///See if we can tackle or not. If we can, leap! /datum/component/tackler/proc/checkTackle(mob/living/carbon/user, atom/A, params) - if(!user.in_throw_mode || user.get_active_held_item() || user.pulling || user.buckling) + if(!user.in_throw_mode || user.get_active_held_item() || user.pulling || user.buckled || user.incapacitated()) return if(!A || !(isturf(A) || isturf(A.loc))) @@ -366,7 +366,7 @@ user.adjustBruteLoss(30) playsound(user, 'sound/effects/blobattack.ogg', 60, TRUE) playsound(user, 'sound/effects/splat.ogg', 70, TRUE) - playsound(user, 'sound/effects/crack2.ogg', 70, TRUE) + playsound(user, 'sound/effects/wounds/crack2.ogg', 70, TRUE) user.emote("scream") user.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic) // oopsie indeed! shake_camera(user, 7, 7) diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index b745e740571..c932c6a1574 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -82,6 +82,7 @@ /datum/component/thermite/proc/clean_react(datum/source, strength) //Thermite is just some loose powder, you could probably clean it with your hands. << todo? qdel(src) + return TRUE /datum/component/thermite/proc/flame_react(datum/source, exposed_temperature, exposed_volume) if(exposed_temperature > 1922) // This is roughly the real life requirement to ignite thermite diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 7b735a98c6a..245fb4e7e40 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -284,7 +284,7 @@ addtimer(CALLBACK(src, .proc/uncoma, M), 300) /datum/symptom/heal/coma/proc/uncoma(mob/living/M) - if(!active_coma) + if(QDELETED(M) || !active_coma) return active_coma = FALSE M.cure_fakedeath("regenerative_coma") diff --git a/code/datums/elements/cleaning.dm b/code/datums/elements/cleaning.dm index fa563129390..9f7138b587c 100644 --- a/code/datums/elements/cleaning.dm +++ b/code/datums/elements/cleaning.dm @@ -14,27 +14,17 @@ if(!isturf(tile)) return - SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + tile.wash(CLEAN_WASH) for(var/A in tile) - if(is_cleanable(A)) - qdel(A) - else if(istype(A, /obj/item)) + // Clean small items that are lying on the ground + if(isitem(A)) var/obj/item/I = A - SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - if(ismob(I.loc)) - var/mob/M = I.loc - M.regenerate_icons() + if(I.w_class <= WEIGHT_CLASS_SMALL && !ismob(I.loc)) + I.wash(CLEAN_WASH) + // Clean humans that are lying down else if(ishuman(A)) var/mob/living/carbon/human/cleaned_human = A if(!(cleaned_human.mobility_flags & MOBILITY_STAND)) - if(cleaned_human.head) - SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - if(cleaned_human.wear_suit) - SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - else if(cleaned_human.w_uniform) - SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - if(cleaned_human.shoes) - SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + cleaned_human.wash(CLEAN_WASH) cleaned_human.regenerate_icons() to_chat(cleaned_human, "[AM] cleans your face!") diff --git a/code/datums/elements/embed.dm b/code/datums/elements/embed.dm index 301799316d3..24965d435f8 100644 --- a/code/datums/elements/embed.dm +++ b/code/datums/elements/embed.dm @@ -34,9 +34,9 @@ if(!isitem(target) && !isprojectile(target)) return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_ELEMENT_ATTACH, .proc/severancePackage) if(isitem(target)) RegisterSignal(target, COMSIG_MOVABLE_IMPACT_ZONE, .proc/checkEmbed) - RegisterSignal(target, COMSIG_ELEMENT_ATTACH, .proc/severancePackage) RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/examined) RegisterSignal(target, COMSIG_EMBED_TRY_FORCE, .proc/tryForceEmbed) RegisterSignal(target, COMSIG_ITEM_DISABLE_EMBED, .proc/detachFromWeapon) @@ -63,7 +63,7 @@ if(isitem(target)) UnregisterSignal(target, list(COMSIG_MOVABLE_IMPACT_ZONE, COMSIG_ELEMENT_ATTACH, COMSIG_MOVABLE_IMPACT, COMSIG_PARENT_EXAMINE, COMSIG_EMBED_TRY_FORCE, COMSIG_ITEM_DISABLE_EMBED)) else - UnregisterSignal(target, list(COMSIG_PROJECTILE_SELF_ON_HIT)) + UnregisterSignal(target, list(COMSIG_PROJECTILE_SELF_ON_HIT, COMSIG_ELEMENT_ATTACH)) /// Checking to see if we're gonna embed into a human @@ -74,13 +74,13 @@ var/actual_chance = embed_chance if(!weapon.isEmbedHarmless()) // all the armor in the world won't save you from a kick me sign - var/armor = max(victim.run_armor_check(hit_zone, "bullet", silent=TRUE), victim.run_armor_check(hit_zone, "bomb", silent=TRUE)) // we'll be nice and take the better of bullet and bomb armor + var/armor = max(victim.run_armor_check(hit_zone, "bullet", silent=TRUE), victim.run_armor_check(hit_zone, "bomb", silent=TRUE)) * 0.5 // we'll be nice and take the better of bullet and bomb armor, halved if(armor) // we only care about armor penetration if there's actually armor to penetrate var/pen_mod = -armor + weapon.armour_penetration // even a little bit of armor can make a big difference for shrapnel with large negative armor pen actual_chance += pen_mod // doing the armor pen as a separate calc just in case this ever gets expanded on if(actual_chance <= 0) - victim.visible_message("[weapon] bounces off [victim]'s armor!", "[weapon] bounces off your armor!", vision_distance = COMBAT_MESSAGE_RANGE) + victim.visible_message("[weapon] bounces off [victim]'s armor, unable to embed!", "[weapon] bounces off your armor, unable to embed!", vision_distance = COMBAT_MESSAGE_RANGE) return var/roll_embed = prob(actual_chance) @@ -107,7 +107,7 @@ return TRUE ///A different embed element has been attached, so we'll detach and let them handle things -/datum/element/embed/proc/severancePackage(obj/item/weapon, datum/element/E) +/datum/element/embed/proc/severancePackage(obj/weapon, datum/element/E) if(istype(E, /datum/element/embed)) Detach(weapon) @@ -134,13 +134,16 @@ return // we don't care var/obj/item/payload = new payload_type(get_turf(hit)) + if(istype(payload, /obj/item/shrapnel/bullet)) + payload.name = P.name + payload.embedding = P.embedding + payload.updateEmbedding() var/mob/living/carbon/C = hit var/obj/item/bodypart/limb = C.get_bodypart(hit_zone) if(!limb) limb = C.get_bodypart() - if(!payload.tryEmbed(limb)) - payload.failedEmbed() + payload.tryEmbed(limb) Detach(P) /** @@ -172,4 +175,5 @@ hit_zone = limb.body_zone C = limb.owner - return checkEmbed(I, C, hit_zone, forced=TRUE) + checkEmbed(I, C, hit_zone, forced=TRUE) + return TRUE diff --git a/code/datums/elements/undertile.dm b/code/datums/elements/undertile.dm index 3f3be0423c6..3ce11d48764 100644 --- a/code/datums/elements/undertile.dm +++ b/code/datums/elements/undertile.dm @@ -41,7 +41,7 @@ if(use_alpha) source.alpha = ALPHA_UNDERTILE if(use_anchor) - source.anchored = TRUE + source.set_anchored(TRUE) else if(invisibility_trait) @@ -51,7 +51,7 @@ if(use_alpha) source.alpha = 255 if(use_anchor) - source.anchored = FALSE + source.set_anchored(FALSE) /datum/element/undertile/Detach(atom/movable/AM, visibility_trait, invisibility_level = INVISIBILITY_MAXIMUM) . = ..() diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 08737b357ff..5c8908bf390 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -58,7 +58,7 @@ return user.log_message(msg, LOG_EMOTE) - msg = "[user] " + msg + var/dchatmsg = "[user] [msg]" var/tmp_sound = get_sound(user) if(tmp_sound && (!only_forced_audio || !intentional)) @@ -69,12 +69,12 @@ continue var/T = get_turf(user) if(M.stat == DEAD && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) && !(M in viewers(T, null))) - M.show_message(msg) + M.show_message("[FOLLOW_LINK(M, user)] [dchatmsg]") if(emote_type == EMOTE_AUDIBLE) - user.audible_message(msg) + user.audible_message(msg, audible_message_flags = EMOTE_MESSAGE) else - user.visible_message(msg) + user.visible_message(msg, visible_message_flags = EMOTE_MESSAGE) /// For handling emote cooldown, return true to allow the emote to happen /datum/emote/proc/check_cooldown(mob/user, intentional) diff --git a/code/datums/keybinding/_keybindings.dm b/code/datums/keybinding/_keybindings.dm index 1d68e2d0373..dfcf492c180 100644 --- a/code/datums/keybinding/_keybindings.dm +++ b/code/datums/keybinding/_keybindings.dm @@ -9,13 +9,16 @@ var/keybind_signal /datum/keybinding/New() + if(!keybind_signal) + CRASH("Keybind [src] called unredefined down() without a keybind_signal.") // Default keys to the master "hotkey_keys" if(LAZYLEN(hotkey_keys) && !LAZYLEN(classic_keys)) classic_keys = hotkey_keys.Copy() /datum/keybinding/proc/down(client/user) - return FALSE + SHOULD_CALL_PARENT(TRUE) + return SEND_SIGNAL(user.mob, keybind_signal) & COMSIG_KB_ACTIVATED /datum/keybinding/proc/up(client/user) return FALSE diff --git a/code/datums/keybinding/admin.dm b/code/datums/keybinding/admin.dm index b63221e97a4..10d9722eaa8 100644 --- a/code/datums/keybinding/admin.dm +++ b/code/datums/keybinding/admin.dm @@ -10,8 +10,12 @@ name = "admin_say" full_name = "Admin say" description = "Talk with other admins." + keybind_signal = COMSIG_KB_ADMIN_ASAY_DOWN /datum/keybinding/admin/admin_say/down(client/user) + . = ..() + if(.) + return user.get_admin_say() return TRUE @@ -20,8 +24,12 @@ name = "admin_ghost" full_name = "Aghost" description = "Go ghost" + keybind_signal = COMSIG_KB_ADMIN_AGHOST_DOWN /datum/keybinding/admin/admin_ghost/down(client/user) + . = ..() + if(.) + return user.admin_ghost() return TRUE @@ -30,8 +38,12 @@ name = "player_panel_new" full_name = "Player Panel New" description = "Opens up the new player panel" + keybind_signal = COMSIG_KB_ADMIN_PLAYERPANELNEW_DOWN /datum/keybinding/admin/player_panel_new/down(client/user) + . = ..() + if(.) + return user.holder.player_panel_new() return TRUE @@ -40,8 +52,12 @@ name = "toggle_buildmode_self" full_name = "Toggle Buildmode Self" description = "Toggles buildmode" + keybind_signal = COMSIG_KB_ADMIN_TOGGLEBUILDMODE_DOWN /datum/keybinding/admin/toggle_buildmode_self/down(client/user) + . = ..() + if(.) + return user.togglebuildmodeself() return TRUE @@ -50,8 +66,12 @@ name = "stealth_mode" full_name = "Stealth mode" description = "Enters stealth mode" + keybind_signal = COMSIG_KB_ADMIN_STEALTHMODETOGGLE_DOWN /datum/keybinding/admin/stealthmode/down(client/user) + . = ..() + if(.) + return user.stealth() return TRUE @@ -60,8 +80,12 @@ name = "invisimin" full_name = "Admin invisibility" description = "Toggles ghost-like invisibility (Don't abuse this)" + keybind_signal = COMSIG_KB_ADMIN_INVISIMINTOGGLE_DOWN /datum/keybinding/admin/invisimin/down(client/user) + . = ..() + if(.) + return user.invisimin() return TRUE @@ -70,8 +94,12 @@ name = "dsay" full_name = "deadsay" description = "Allows you to send a message to dead chat" + keybind_signal = COMSIG_KB_ADMIN_DSAY_DOWN /datum/keybinding/admin/deadsay/down(client/user) + . = ..() + if(.) + return user.get_dead_say() return TRUE @@ -80,8 +108,12 @@ name = "deadmin" full_name = "Deadmin" description = "Shed your admin powers" + keybind_signal = COMSIG_KB_ADMIN_DEADMIN_DOWN /datum/keybinding/admin/deadmin/down(client/user) + . = ..() + if(.) + return user.deadmin() return TRUE @@ -90,7 +122,11 @@ name = "readmin" full_name = "Readmin" description = "Regain your admin powers" + keybind_signal = COMSIG_KB_ADMIN_READMIN_DOWN /datum/keybinding/admin/readmin/down(client/user) + . = ..() + if(.) + return user.readmin() return TRUE diff --git a/code/datums/keybinding/carbon.dm b/code/datums/keybinding/carbon.dm index 2d9909760dc..abc3734aa1c 100644 --- a/code/datums/keybinding/carbon.dm +++ b/code/datums/keybinding/carbon.dm @@ -11,8 +11,12 @@ full_name = "Toggle throw mode" description = "Toggle throwing the current item or not." category = CATEGORY_CARBON + keybind_signal = COMSIG_KB_CARBON_TOGGLETHROWMODE_DOWN /datum/keybinding/carbon/toggle_throw_mode/down(client/user) + . = ..() + if(.) + return var/mob/living/carbon/C = user.mob C.toggle_throw_mode() return TRUE @@ -24,8 +28,12 @@ full_name = "Select help intent" description = "" category = CATEGORY_CARBON + keybind_signal = COMSIG_KB_CARBON_SELECTHELPINTENT_DOWN /datum/keybinding/carbon/select_help_intent/down(client/user) + . = ..() + if(.) + return user.mob?.a_intent_change(INTENT_HELP) return TRUE @@ -36,8 +44,12 @@ full_name = "Select disarm intent" description = "" category = CATEGORY_CARBON + keybind_signal = COMSIG_KB_CARBON_SELECTDISARMINTENT_DOWN /datum/keybinding/carbon/select_disarm_intent/down(client/user) + . = ..() + if(.) + return user.mob?.a_intent_change(INTENT_DISARM) return TRUE @@ -48,8 +60,12 @@ full_name = "Select grab intent" description = "" category = CATEGORY_CARBON + keybind_signal = COMSIG_KB_CARBON_SELECTGRABINTENT_DOWN /datum/keybinding/carbon/select_grab_intent/down(client/user) + . = ..() + if(.) + return user.mob?.a_intent_change(INTENT_GRAB) return TRUE @@ -60,8 +76,12 @@ full_name = "Select harm intent" description = "" category = CATEGORY_CARBON + keybind_signal = COMSIG_KB_CARBON_SELECTHARMINTENT_DOWN /datum/keybinding/carbon/select_harm_intent/down(client/user) + . = ..() + if(.) + return user.mob?.a_intent_change(INTENT_HARM) return TRUE @@ -70,8 +90,12 @@ name = "Give_Item" full_name = "Give item" description = "Give the item you're currently holding" + keybind_signal = COMSIG_KB_CARBON_GIVEITEM_DOWN /datum/keybinding/carbon/give/down(client/user) + . = ..() + if(.) + return var/mob/living/carbon/C = user.mob C.give() return TRUE diff --git a/code/datums/keybinding/client.dm b/code/datums/keybinding/client.dm index b2ae7609cb5..e4b940c7f72 100644 --- a/code/datums/keybinding/client.dm +++ b/code/datums/keybinding/client.dm @@ -8,8 +8,12 @@ name = "admin_help" full_name = "Admin Help" description = "Ask an admin for help." + keybind_signal = COMSIG_KB_CLIENT_GETHELP_DOWN /datum/keybinding/client/admin_help/down(client/user) + . = ..() + if(.) + return user.get_adminhelp() return TRUE @@ -19,8 +23,12 @@ name = "screenshot" full_name = "Screenshot" description = "Take a screenshot." + keybind_signal = COMSIG_KB_CLIENT_SCREENSHOT_DOWN /datum/keybinding/client/screenshot/down(client/user) + . = ..() + if(.) + return winset(user, null, "command=.screenshot [!user.keys_held["shift"] ? "auto" : ""]") return TRUE @@ -29,7 +37,11 @@ name = "minimal_hud" full_name = "Minimal HUD" description = "Hide most HUD features" + keybind_signal = COMSIG_KB_CLIENT_MINIMALHUD_DOWN /datum/keybinding/client/minimal_hud/down(client/user) + . = ..() + if(.) + return user.mob.button_pressed_F12() - return TRUE + return TRUE diff --git a/code/datums/keybinding/emote.dm b/code/datums/keybinding/emote.dm index 6099826819c..5d6e7895ed9 100644 --- a/code/datums/keybinding/emote.dm +++ b/code/datums/keybinding/emote.dm @@ -1,6 +1,7 @@ /datum/keybinding/emote category = CATEGORY_EMOTE weight = WEIGHT_EMOTE + keybind_signal = COMSIG_KB_EMOTE var/emote_key /datum/keybinding/emote/proc/link_to_emote(datum/emote/faketype) @@ -12,4 +13,6 @@ /datum/keybinding/emote/down(client/user) . = ..() + if(.) + return return user.mob.emote(emote_key, intentional=TRUE) diff --git a/code/datums/keybinding/human.dm b/code/datums/keybinding/human.dm index 60ebff6afb6..41b698059bb 100644 --- a/code/datums/keybinding/human.dm +++ b/code/datums/keybinding/human.dm @@ -10,8 +10,12 @@ name = "quick_equip" full_name = "Quick equip" description = "Quickly puts an item in the best slot available" + keybind_signal = COMSIG_KB_HUMAN_QUICKEQUIP_DOWN /datum/keybinding/human/quick_equip/down(client/user) + . = ..() + if(.) + return var/mob/living/carbon/human/H = user.mob H.quick_equip() return TRUE @@ -25,8 +29,12 @@ var/slot_type = ITEM_SLOT_BELT ///what we should call slot_type in messages (including failure messages) var/slot_item_name = "belt" + keybind_signal = COMSIG_KB_HUMAN_QUICKEQUIPBELT_DOWN /datum/keybinding/human/quick_equip_belt/down(client/user) + . = ..() + if(.) + return var/mob/living/carbon/human/H = user.mob H.smart_equip_targeted(slot_type, slot_item_name) return TRUE @@ -38,6 +46,7 @@ description = "Put held thing in backpack or take out most recent thing from backpack" slot_type = ITEM_SLOT_BACK slot_item_name = "backpack" + keybind_signal = COMSIG_KB_HUMAN_BAGEQUIP_DOWN /datum/keybinding/human/quick_equip_belt/quick_equip_suit_storage hotkey_keys = list("ShiftQ") @@ -46,14 +55,19 @@ description = "Put held thing in suit storage slot item or take out most recent thing from suit storage slot item" slot_type = ITEM_SLOT_SUITSTORE slot_item_name = "suit storage slot item" + keybind_signal = COMSIG_KB_HUMAN_SUITEQUIP_DOWN /datum/keybinding/human/equipment_swap hotkey_keys = list("V") name = "equipment_swap" full_name = "Equipment Swap" description = "Equip the currently held item by swapping it out with the already equipped item after a small delay" + keybind_signal = COMSIG_KB_HUMAN_EQUIPMENTSWAP_DOWN /datum/keybinding/human/equipment_swap/down(client/user) + . = ..() + if(.) + return var/mob/living/carbon/human/H = user.mob H.equipment_swap() return TRUE diff --git a/code/datums/keybinding/living.dm b/code/datums/keybinding/living.dm index 444c7158655..58d55ddc5cd 100644 --- a/code/datums/keybinding/living.dm +++ b/code/datums/keybinding/living.dm @@ -10,8 +10,12 @@ name = "resist" full_name = "Resist" description = "Break free of your current state. Handcuffed? on fire? Resist!" + keybind_signal = COMSIG_KB_LIVING_RESIST_DOWN /datum/keybinding/living/resist/down(client/user) + . = ..() + if(.) + return var/mob/living/L = user.mob L.resist() return TRUE @@ -21,13 +25,37 @@ name = "look up" full_name = "Look Up" description = "Look up at the next z-level. Only works if directly below open space." + keybind_signal = COMSIG_KB_LIVING_LOOKUP_DOWN /datum/keybinding/living/look_up/down(client/user) + . = ..() + if(.) + return var/mob/living/L = user.mob L.look_up() return TRUE /datum/keybinding/living/look_up/up(client/user) var/mob/living/L = user.mob - L.stop_look_up() + L.end_look_up() + return TRUE + +/datum/keybinding/living/look_down + hotkey_keys = list(";") + name = "look down" + full_name = "Look Down" + description = "Look down at the previous z-level. Only works if directly above open space." + keybind_signal = COMSIG_KB_LIVING_LOOKDOWN_DOWN + +/datum/keybinding/living/look_down/down(client/user) + . = ..() + if(.) + return + var/mob/living/L = user.mob + L.look_down() + return TRUE + +/datum/keybinding/living/look_down/up(client/user) + var/mob/living/L = user.mob + L.end_look_down() return TRUE diff --git a/code/datums/keybinding/mob.dm b/code/datums/keybinding/mob.dm index f194c7fd2fe..cbb9d9cfe01 100644 --- a/code/datums/keybinding/mob.dm +++ b/code/datums/keybinding/mob.dm @@ -8,8 +8,12 @@ name = "face_north" full_name = "Face North" description = "" + keybind_signal = COMSIG_KB_MOB_FACENORTH_DOWN /datum/keybinding/mob/face_north/down(client/user) + . = ..() + if(.) + return var/mob/M = user.mob M.northface() return TRUE @@ -20,8 +24,12 @@ name = "face_east" full_name = "Face East" description = "" + keybind_signal = COMSIG_KB_MOB_FACEEAST_DOWN /datum/keybinding/mob/face_east/down(client/user) + . = ..() + if(.) + return var/mob/M = user.mob M.eastface() return TRUE @@ -32,8 +40,12 @@ name = "face_south" full_name = "Face South" description = "" + keybind_signal = COMSIG_KB_MOB_FACESOUTH_DOWN /datum/keybinding/mob/face_south/down(client/user) + . = ..() + if(.) + return var/mob/M = user.mob M.southface() return TRUE @@ -43,8 +55,12 @@ name = "face_west" full_name = "Face West" description = "" + keybind_signal = COMSIG_KB_MOB_FACEWEST_DOWN /datum/keybinding/mob/face_west/down(client/user) + . = ..() + if(.) + return var/mob/M = user.mob M.westface() return TRUE @@ -54,8 +70,12 @@ name = "stop_pulling" full_name = "Stop pulling" description = "" + keybind_signal = COMSIG_KB_MOB_STOPPULLING_DOWN /datum/keybinding/mob/stop_pulling/down(client/user) + . = ..() + if(.) + return var/mob/M = user.mob if(!M.pulling) to_chat(user, "You are not pulling anything.") @@ -68,8 +88,12 @@ name = "cycle_intent_right" full_name = "cycle intent right" description = "" + keybind_signal = COMSIG_KB_MOB_CYCLEINTENTRIGHT_DOWN /datum/keybinding/mob/cycle_intent_right/down(client/user) + . = ..() + if(.) + return var/mob/M = user.mob M.a_intent_change(INTENT_HOTKEY_RIGHT) return TRUE @@ -79,8 +103,12 @@ name = "cycle_intent_left" full_name = "cycle intent left" description = "" + keybind_signal = COMSIG_KB_MOB_CYCLEINTENTLEFT_DOWN /datum/keybinding/mob/cycle_intent_left/down(client/user) + . = ..() + if(.) + return var/mob/M = user.mob M.a_intent_change(INTENT_HOTKEY_LEFT) return TRUE @@ -90,19 +118,27 @@ name = "swap_hands" full_name = "Swap hands" description = "" + keybind_signal = COMSIG_KB_MOB_SWAPHANDS_DOWN /datum/keybinding/mob/swap_hands/down(client/user) + . = ..() + if(.) + return var/mob/M = user.mob M.swap_hand() return TRUE /datum/keybinding/mob/activate_inhand - hotkey_keys = list("Z", "Southeast") // PAGEDOWN + hotkey_keys = list("Z", "Southeast") // Southeast = PAGEDOWN name = "activate_inhand" full_name = "Activate in-hand" description = "Uses whatever item you have inhand" + keybind_signal = COMSIG_KB_MOB_ACTIVATEINHAND_DOWN /datum/keybinding/mob/activate_inhand/down(client/user) + . = ..() + if(.) + return var/mob/M = user.mob M.mode() return TRUE @@ -112,8 +148,12 @@ name = "drop_item" full_name = "Drop Item" description = "" + keybind_signal = COMSIG_KB_MOB_DROPITEM_DOWN /datum/keybinding/mob/drop_item/down(client/user) + . = ..() + if(.) + return if(iscyborg(user.mob)) //cyborgs can't drop items return FALSE var/mob/M = user.mob @@ -129,8 +169,12 @@ name = "toggle_move_intent" full_name = "Hold to toggle move intent" description = "Held down to cycle to the other move intent, release to cycle back" + keybind_signal = COMSIG_KB_MOB_TOGGLEMOVEINTENT_DOWN /datum/keybinding/mob/toggle_move_intent/down(client/user) + . = ..() + if(.) + return var/mob/M = user.mob M.toggle_move_intent() return TRUE @@ -145,8 +189,12 @@ name = "toggle_move_intent_alt" full_name = "press to cycle move intent" description = "Pressing this cycle to the opposite move intent, does not cycle back" + keybind_signal = COMSIG_KB_MOB_TOGGLEMOVEINTENTALT_DOWN /datum/keybinding/mob/toggle_move_intent_alternative/down(client/user) + . = ..() + if(.) + return var/mob/M = user.mob M.toggle_move_intent() return TRUE @@ -156,8 +204,12 @@ name = "target_head_cycle" full_name = "Target: Cycle head" description = "" + keybind_signal = COMSIG_KB_MOB_TARGETCYCLEHEAD_DOWN /datum/keybinding/mob/target_head_cycle/down(client/user) + . = ..() + if(.) + return user.body_toggle_head() return TRUE @@ -166,8 +218,12 @@ name = "target_r_arm" full_name = "Target: right arm" description = "" + keybind_signal = COMSIG_KB_MOB_TARGETRIGHTARM_DOWN /datum/keybinding/mob/target_r_arm/down(client/user) + . = ..() + if(.) + return user.body_r_arm() return TRUE @@ -176,8 +232,12 @@ name = "target_body_chest" full_name = "Target: Body" description = "" + keybind_signal = COMSIG_KB_MOB_TARGETBODYCHEST_DOWN /datum/keybinding/mob/target_body_chest/down(client/user) + . = ..() + if(.) + return user.body_chest() return TRUE @@ -186,8 +246,12 @@ name = "target_left_arm" full_name = "Target: left arm" description = "" + keybind_signal = COMSIG_KB_MOB_TARGETLEFTARM_DOWN /datum/keybinding/mob/target_left_arm/down(client/user) + . = ..() + if(.) + return user.body_l_arm() return TRUE @@ -196,8 +260,12 @@ name = "target_right_leg" full_name = "Target: Right leg" description = "" + keybind_signal = COMSIG_KB_MOB_TARGETRIGHTLEG_DOWN /datum/keybinding/mob/target_right_leg/down(client/user) + . = ..() + if(.) + return user.body_r_leg() return TRUE @@ -206,8 +274,12 @@ name = "target_body_groin" full_name = "Target: Groin" description = "" + keybind_signal = COMSIG_KB_MOB_TARGETBODYGROIN_DOWN /datum/keybinding/mob/target_body_groin/down(client/user) + . = ..() + if(.) + return user.body_groin() return TRUE @@ -216,7 +288,11 @@ name = "target_left_leg" full_name = "Target: left leg" description = "" + keybind_signal = COMSIG_KB_MOB_TARGETLEFTLEG_DOWN /datum/keybinding/mob/target_left_leg/down(client/user) + . = ..() + if(.) + return user.body_l_leg() return TRUE diff --git a/code/datums/keybinding/movement.dm b/code/datums/keybinding/movement.dm index ca199b5eb4d..02d601e14fa 100644 --- a/code/datums/keybinding/movement.dm +++ b/code/datums/keybinding/movement.dm @@ -7,21 +7,25 @@ name = "North" full_name = "Move North" description = "Moves your character north" + keybind_signal = COMSIG_KB_MOVEMENT_NORTH_DOWN /datum/keybinding/movement/south hotkey_keys = list("S", "South") name = "South" full_name = "Move South" description = "Moves your character south" + keybind_signal = COMSIG_KB_MOVEMENT_SOUTH_DOWN /datum/keybinding/movement/west hotkey_keys = list("A", "West") name = "West" full_name = "Move West" description = "Moves your character left" + keybind_signal = COMSIG_KB_MOVEMENT_WEST_DOWN /datum/keybinding/movement/east hotkey_keys = list("D", "East") name = "East" full_name = "Move East" description = "Moves your character east" + keybind_signal = COMSIG_KB_MOVEMENT_EAST_DOWN diff --git a/code/datums/keybinding/robot.dm b/code/datums/keybinding/robot.dm index b9f6ce83eb7..5076a5a1868 100644 --- a/code/datums/keybinding/robot.dm +++ b/code/datums/keybinding/robot.dm @@ -10,8 +10,12 @@ name = "module_one" full_name = "Toggle module 1" description = "Equips or unequips the first module" + keybind_signal = COMSIG_KB_SILICON_TOGGLEMODULEONE_DOWN /datum/keybinding/robot/moduleone/down(client/user) + . = ..() + if(.) + return var/mob/living/silicon/robot/R = user.mob R.toggle_module(1) return TRUE @@ -21,8 +25,12 @@ name = "module_two" full_name = "Toggle module 2" description = "Equips or unequips the second module" + keybind_signal = COMSIG_KB_SILICON_TOGGLEMODULETWO_DOWN /datum/keybinding/robot/moduletwo/down(client/user) + . = ..() + if(.) + return var/mob/living/silicon/robot/R = user.mob R.toggle_module(2) return TRUE @@ -32,8 +40,12 @@ name = "module_three" full_name = "Toggle module 3" description = "Equips or unequips the third module" + keybind_signal = COMSIG_KB_SILICON_TOGGLEMODULETHREE_DOWN /datum/keybinding/robot/modulethree/down(client/user) + . = ..() + if(.) + return var/mob/living/silicon/robot/R = user.mob R.toggle_module(3) return TRUE @@ -43,8 +55,12 @@ name = "cycle_intent" full_name = "Cycle intent left" description = "Cycles the intent left" + keybind_signal = COMSIG_KB_SILICON_CYCLEINTENT_DOWN /datum/keybinding/robot/intent_cycle/down(client/user) + . = ..() + if(.) + return var/mob/living/silicon/robot/R = user.mob R.a_intent_change(INTENT_HOTKEY_LEFT) return TRUE @@ -54,8 +70,12 @@ name = "unequip_module" full_name = "Unequip module" description = "Unequips the active module" + keybind_signal = COMSIG_KB_SILICON_UNEQUIPMODULE_DOWN /datum/keybinding/robot/unequip_module/down(client/user) + . = ..() + if(.) + return var/mob/living/silicon/robot/R = user.mob R.uneq_active() return TRUE diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 107af2a60fd..fb7a6293922 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -45,10 +45,7 @@ to_chat(A, "You knock [D] out with a haymaker!") D.apply_effect(200,EFFECT_KNOCKDOWN,armor_block) D.SetSleeping(100) - D.forcesay(GLOB.hit_appends) log_combat(A, D, "knocked out (boxing) ") - else if(!(D.mobility_flags & MOBILITY_STAND)) - D.forcesay(GLOB.hit_appends) return 1 /obj/item/clothing/gloves/boxing diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index 4186bcb4519..9a305b39808 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -58,7 +58,7 @@ Simple datum which is instanced once per type and is used for every object of sa source.name = "[name] [source.name]" if(beauty_modifier) - addtimer(CALLBACK(source, /datum.proc/_AddComponent, list(/datum/component/beauty, beauty_modifier * amount)), 0) + INVOKE_ASYNC(source, /datum.proc/_AddComponent, list(/datum/component/beauty, beauty_modifier * amount)) if(istype(source, /obj)) //objs on_applied_obj(source, amount, material_flags) @@ -141,3 +141,12 @@ Simple datum which is instanced once per type and is used for every object of sa /datum/material/proc/on_removed_turf(turf/T, material_flags) return + +/** + * This proc is called when the mat is found in an item that's consumed by accident. see /obj/item/proc/on_accidental_consumption. + * Arguments + * * M - person consuming the mat + * * S - (optional) item the mat is contained in (NOT the item with the mat itself) + */ +/datum/material/proc/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + return FALSE diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index 9ca34ebd1fd..d45d9bf603a 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -7,6 +7,10 @@ sheet_type = /obj/item/stack/sheet/metal value_per_unit = 0.0025 +/datum/material/iron/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5) + return TRUE + ///Breaks extremely easily but is transparent. /datum/material/glass name = "glass" @@ -20,6 +24,10 @@ beauty_modifier = 0.05 armor_modifiers = list("melee" = 0.2, "bullet" = 0.2, "laser" = 0, "energy" = 1, "bomb" = 0, "bio" = 0.2, "rad" = 0.2, "fire" = 1, "acid" = 0.2) +/datum/material/glass/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5, sharpness = TRUE) //cronch + return TRUE + /* Color matrices are like regular colors but unlike with normal colors, you can go over 255 on a channel. Unless you know what you're doing, only use the first three numbers. They're in RGB order. @@ -35,6 +43,10 @@ Unless you know what you're doing, only use the first three numbers. They're in value_per_unit = 0.025 beauty_modifier = 0.075 +/datum/material/silver/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5) + return TRUE + ///Slight force increase /datum/material/gold name = "gold" @@ -47,6 +59,10 @@ Unless you know what you're doing, only use the first three numbers. They're in beauty_modifier = 0.15 armor_modifiers = list("melee" = 1.1, "bullet" = 1.1, "laser" = 1.15, "energy" = 1.15, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 0.7, "acid" = 1.1) +/datum/material/gold/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5) + return TRUE + ///Has no special properties /datum/material/diamond name = "diamond" @@ -59,6 +75,10 @@ Unless you know what you're doing, only use the first three numbers. They're in beauty_modifier = 0.3 armor_modifiers = list("melee" = 1.3, "bullet" = 1.3, "laser" = 0.6, "energy" = 1, "bomb" = 1.2, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1) +/datum/material/diamond/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7) + return TRUE + ///Is slightly radioactive /datum/material/uranium name = "uranium" @@ -78,6 +98,11 @@ Unless you know what you're doing, only use the first three numbers. They're in . = ..() qdel(source.GetComponent(/datum/component/radioactive)) +/datum/material/uranium/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.reagents.add_reagent(/datum/reagent/uranium, rand(4, 6)) + S?.reagents?.add_reagent(/datum/reagent/uranium, S.reagents.total_volume*(2/5)) + return TRUE + ///Adds firestacks on hit (Still needs support to turn into gas on destruction) /datum/material/plasma name = "plasma" @@ -100,6 +125,11 @@ Unless you know what you're doing, only use the first three numbers. They're in source.RemoveElement(/datum/element/firestacker, amount=1) qdel(source.GetComponent(/datum/component/explodable)) +/datum/material/plasma/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.reagents.add_reagent(/datum/reagent/toxin/plasma, rand(6, 8)) + S?.reagents?.add_reagent(/datum/reagent/toxin/plasma, S.reagents.total_volume*(2/5)) + return TRUE + ///Can cause bluespace effects on use. (Teleportation) (Not yet implemented) /datum/material/bluespace name = "bluespace crystal" @@ -111,6 +141,11 @@ Unless you know what you're doing, only use the first three numbers. They're in sheet_type = /obj/item/stack/sheet/bluespace_crystal value_per_unit = 0.15 +/datum/material/bluespace/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.reagents.add_reagent(/datum/reagent/bluespace, rand(5, 8)) + S?.reagents?.add_reagent(/datum/reagent/bluespace, S.reagents.total_volume*(2/5)) + return TRUE + ///Honks and slips /datum/material/bananium name = "bananium" @@ -127,12 +162,15 @@ Unless you know what you're doing, only use the first three numbers. They're in source.AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50) source.AddComponent(/datum/component/slippery, min(amount / 10, 80)) - /datum/material/bananium/on_removed(atom/source, amount, material_flags) . = ..() qdel(source.GetComponent(/datum/component/slippery)) qdel(source.GetComponent(/datum/component/squeak)) +/datum/material/bananium/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.reagents.add_reagent(/datum/reagent/consumable/banana, rand(8, 12)) + S?.reagents?.add_reagent(/datum/reagent/consumable/banana, S.reagents.total_volume*(2/5)) + return TRUE ///Mediocre force increase /datum/material/titanium @@ -146,6 +184,10 @@ Unless you know what you're doing, only use the first three numbers. They're in beauty_modifier = 0.05 armor_modifiers = list("melee" = 1.35, "bullet" = 1.3, "laser" = 1.3, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 0.7, "acid" = 1) +/datum/material/titanium/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7) + return TRUE + /datum/material/runite name = "runite" desc = "Runite" @@ -157,6 +199,10 @@ Unless you know what you're doing, only use the first three numbers. They're in beauty_modifier = 0.5 armor_modifiers = list("melee" = 1.35, "bullet" = 2, "laser" = 0.5, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 1.4, "acid" = 1) //rune is weak against magic lasers but strong against bullets. This is the combat triangle. +/datum/material/runite/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10) + return TRUE + ///Force decrease /datum/material/plastic name = "plastic" @@ -169,6 +215,10 @@ Unless you know what you're doing, only use the first three numbers. They're in beauty_modifier = -0.01 armor_modifiers = list("melee" = 1.5, "bullet" = 1.1, "laser" = 0.3, "energy" = 0.5, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1.1, "acid" = 1) +/datum/material/plastic/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.adjust_disgust(17) + return TRUE + ///Force decrease and mushy sound effect. (Not yet implemented) /datum/material/biomass name = "biomass" @@ -200,6 +250,15 @@ Unless you know what you're doing, only use the first three numbers. They're in var/obj/wooden = source wooden.resistance_flags &= ~FLAMMABLE +/datum/material/wood/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.apply_damage(5, BRUTE, BODY_ZONE_HEAD) + + var/obj/item/reagent_containers/food/snacks/food_S = S + if(istype(food_S) && food_S?.tastes?.len) + food_S.tastes += "wood chips and sawdust" + food_S.tastes["wood chips and sawdust"] = 3 + return TRUE + ///Stronk force increase /datum/material/adamantine name = "adamantine" @@ -212,6 +271,10 @@ Unless you know what you're doing, only use the first three numbers. They're in beauty_modifier = 0.4 armor_modifiers = list("melee" = 1.5, "bullet" = 1.5, "laser" = 1.3, "energy" = 1.3, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 2.5, "acid" = 1) +/datum/material/adamantine/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10) + return TRUE + ///RPG Magic. /datum/material/mythril name = "mythril" @@ -234,6 +297,10 @@ Unless you know what you're doing, only use the first three numbers. They're in if(istype(source, /obj/item)) qdel(source.GetComponent(/datum/component/fantasy)) +/datum/material/mythril/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10) + return TRUE + //formed when freon react with o2, emits a lot of plasma when heated /datum/material/hot_ice name = "hot ice" @@ -253,6 +320,15 @@ Unless you know what you're doing, only use the first three numbers. They're in qdel(source.GetComponent(/datum/component/hot_ice, "plasma", amount*150, amount*20+300)) return ..() +/datum/material/hot_ice/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.reagents.add_reagent(/datum/reagent/toxin/plasma, rand(5, 6)) + S?.reagents?.add_reagent(/datum/reagent/toxin/plasma, S.reagents.total_volume*(3/5)) + var/obj/item/reagent_containers/food/snacks/food_S = S + if(istype(food_S) && food_S?.tastes?.len) + food_S.tastes += "salt" + food_S.tastes["salt"] = 3 + return TRUE + /datum/material/metalhydrogen name = "Metal Hydrogen" desc = "Solid metallic hydrogen. Some say it should be impossible" @@ -265,6 +341,10 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 1.2 armor_modifiers = list("melee" = 1.35, "bullet" = 1.3, "laser" = 1.3, "energy" = 1.25, "bomb" = 0.7, "bio" = 1, "rad" = 1, "fire" = 1.3, "acid" = 1) +/datum/material/metalhydrogen/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7) + return TRUE + //I don't like sand. It's coarse, and rough, and irritating, and it gets everywhere. /datum/material/sand name = "sand" @@ -280,6 +360,10 @@ Unless you know what you're doing, only use the first three numbers. They're in turf_sound_override = FOOTSTEP_SAND texture_layer_icon_state = "sand" +/datum/material/sand/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.adjust_disgust(17) + return TRUE + //And now for our lavaland dwelling friends, sand, but in stone form! Truly revolutionary. /datum/material/sandstone name = "sandstone" @@ -305,6 +389,10 @@ Unless you know what you're doing, only use the first three numbers. They're in turf_sound_override = FOOTSTEP_SAND texture_layer_icon_state = "sand" +/datum/material/snow/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.reagents.add_reagent(/datum/reagent/water, rand(5, 10)) + return TRUE + /datum/material/runedmetal name = "runed metal" desc = "Mir'ntrath barhah Nar'sie." @@ -316,6 +404,11 @@ Unless you know what you're doing, only use the first three numbers. They're in beauty_modifier = -0.15 texture_layer_icon_state = "runed" +/datum/material/runedmetal/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + M.reagents.add_reagent(/datum/reagent/fuel/unholywater, rand(8, 12)) + M.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5) + return TRUE + /datum/material/bronze name = "bronze" desc = "Clock Cult? Never heard of it." diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index ef431663054..c91b3ad45b2 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -198,3 +198,8 @@ /datum/mood_event/confident_mane description = "I'm feeling confident with a head full of hair.\n" mood_change = 2 + +/datum/mood_event/holy_consumption + description = "Truly, that was the food of the Divine!\n" + mood_change = 5 + timeout = 3 MINUTES diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm index 4dcb91e660b..9c4b4ff25f5 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -284,7 +284,7 @@ throw_speed = 4 embedding = list("embedded_pain_multiplier" = 4, "embed_chance" = 100, "embedded_fall_chance" = 0, "embedded_ignore_throwspeed_threshold" = TRUE) w_class = WEIGHT_CLASS_SMALL - sharpness = IS_SHARP + sharpness = SHARP_POINTY custom_materials = list(/datum/material/biomass = 500) var/mob/living/carbon/human/fired_by /// if we missed our target diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index fe787928e52..63d87ea4728 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -39,17 +39,27 @@ source.do_attack_animation(target, ATTACK_EFFECT_SMASH) source.changeNext_move(CLICK_CD_MELEE) - var/obj/item/bodypart/arm = source.hand_bodyparts[source.active_hand_index] - switch(arm.brute_dam) - if(45 to 50) - arm.force_wound_upwards(/datum/wound/brute/bone/critical) - if(41 to 45) - arm.force_wound_upwards(/datum/wound/brute/bone/severe) - if(35 to 41) - arm.force_wound_upwards(/datum/wound/brute/bone/moderate) - return COMPONENT_NO_ATTACK_HAND + +/** + *Checks damage of a hulk's arm and applies bone wounds as necessary. + * + *Called by specific atoms being attacked, such as walls. If an atom + *does not call this proc, than punching that atom will not cause + *arm breaking (even if the atom deals recoil damage to hulks). + *Arguments: + *arg1 is the arm to evaluate damage of and possibly break. + */ +/datum/mutation/human/hulk/proc/break_an_arm(obj/item/bodypart/arm) + switch(arm.brute_dam) + if(45 to 50) + arm.force_wound_upwards(/datum/wound/blunt/critical) + if(41 to 45) + arm.force_wound_upwards(/datum/wound/blunt/severe) + if(35 to 41) + arm.force_wound_upwards(/datum/wound/blunt/moderate) + /datum/mutation/human/hulk/on_life() if(owner.health < 0) on_losing(owner) diff --git a/code/datums/mutations/passive.dm b/code/datums/mutations/passive.dm new file mode 100644 index 00000000000..09611b97049 --- /dev/null +++ b/code/datums/mutations/passive.dm @@ -0,0 +1,13 @@ +/datum/mutation/human/biotechcompat + name = "Biotech Compatibility" + desc = "Subject is more compatibile with biotechnology such as skillchips." + quality = POSITIVE + instability = 5 + +/datum/mutation/human/biotechcompat/on_acquiring(mob/living/carbon/human/H) + . = ..() + H.adjust_max_skillchip_count(1) + +/datum/mutation/human/biotechcompat/on_losing(mob/living/carbon/human/owner) + owner.adjust_max_skillchip_count(-1) + return ..() diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 1f6cfa5e3c6..40b1f40f05c 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -350,7 +350,7 @@ if(ishuman(owner)) var/mob/living/carbon/human/H = owner var/obj/item/bodypart/bodypart = pick(H.bodyparts) - var/datum/wound/brute/cut/severe/crit_wound = new + var/datum/wound/slash/severe/crit_wound = new crit_wound.apply_wound(bodypart) return ..() @@ -434,7 +434,7 @@ var/still_bleeding = FALSE for(var/thing in throat.wounds) var/datum/wound/W = thing - if(W.wound_type == WOUND_LIST_CUT && W.severity > WOUND_SEVERITY_MODERATE) + if(W.wound_type == WOUND_SLASH && W.severity > WOUND_SEVERITY_MODERATE) still_bleeding = TRUE break if(!still_bleeding) diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index 751a3508a38..775b72699ab 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -116,8 +116,7 @@ /datum/status_effect/wound/on_creation(mob/living/new_owner, incoming_wound) . = ..() - var/datum/wound/W = incoming_wound - linked_wound = W + linked_wound = incoming_wound linked_limb = linked_wound.limb /datum/status_effect/wound/on_remove() @@ -138,9 +137,9 @@ // bones -/datum/status_effect/wound/bone +/datum/status_effect/wound/blunt -/datum/status_effect/wound/bone/interact_speed_modifier() +/datum/status_effect/wound/blunt/interact_speed_modifier() var/mob/living/carbon/C = owner if(C.get_active_hand() == linked_limb) @@ -149,7 +148,7 @@ return 1 -/datum/status_effect/wound/bone/nextmove_modifier() +/datum/status_effect/wound/blunt/nextmove_modifier() var/mob/living/carbon/C = owner if(C.get_active_hand() == linked_limb) @@ -157,30 +156,31 @@ return 1 -/datum/status_effect/wound/bone/moderate +// blunt +/datum/status_effect/wound/blunt/moderate id = "disjoint" -/datum/status_effect/wound/bone/severe +/datum/status_effect/wound/blunt/severe id = "hairline" - -/datum/status_effect/wound/bone/critical +/datum/status_effect/wound/blunt/critical id = "compound" - -// cuts -/datum/status_effect/wound/cut/moderate +// slash +/datum/status_effect/wound/slash/moderate id = "abrasion" - -/datum/status_effect/wound/cut/severe +/datum/status_effect/wound/slash/severe id = "laceration" - -/datum/status_effect/wound/cut/critical +/datum/status_effect/wound/slash/critical id = "avulsion" - +// pierce +/datum/status_effect/wound/pierce/moderate + id = "breakage" +/datum/status_effect/wound/pierce/severe + id = "puncture" +/datum/status_effect/wound/pierce/critical + id = "rupture" // burns /datum/status_effect/wound/burn/moderate id = "seconddeg" - /datum/status_effect/wound/burn/severe id = "thirddeg" - /datum/status_effect/wound/burn/critical id = "fourthdeg" diff --git a/code/datums/traits/_quirk.dm b/code/datums/traits/_quirk.dm index 367f7dca8bb..2b93be37cbf 100644 --- a/code/datums/traits/_quirk.dm +++ b/code/datums/traits/_quirk.dm @@ -29,7 +29,22 @@ add() if(spawn_effects) on_spawn() - addtimer(CALLBACK(src, .proc/post_add), 30) + if(quirk_holder.client) + post_add() + else + RegisterSignal(quirk_holder, COMSIG_MOB_LOGIN, .proc/on_quirk_holder_first_login) + + +/** + * On client connection set quirk preferences. + * + * Run post_add to set the client preferences for the quirk. + * Clear the attached signal for login. + * Used when the quirk has been gained and no client is attached to the mob. + */ +/datum/quirk/proc/on_quirk_holder_first_login(mob/living/source) + UnregisterSignal(source, COMSIG_MOB_LOGIN) + post_add() /datum/quirk/Destroy() STOP_PROCESSING(SSquirks, src) @@ -81,8 +96,6 @@ for(var/V in roundstart_quirks) var/datum/quirk/T = V dat += medical ? T.medical_record_text : T.name - if(!dat.len) - return "None" //Major Disabilities if(CAT_QUIRK_MAJOR_DISABILITY) for(var/V in roundstart_quirks) diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index aacbbf3f812..36bb8d27e3b 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -59,7 +59,7 @@ lose_text = "You feel isolated from others." medical_record_text = "Patient is highly perceptive of and sensitive to social cues, or may possibly have ESP. Further testing needed." -datum/quirk/fan_clown +/datum/quirk/fan_clown name = "Clown Fan" desc = "You enjoy clown antics and get a mood boost from wearing your clown pin." value = 1 @@ -79,7 +79,7 @@ datum/quirk/fan_clown var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] fan.add_hud_to(H) -datum/quirk/fan_mime +/datum/quirk/fan_mime name = "Mime Fan" desc = "You enjoy mime antics and get a mood boost from wearing your mime pin." value = 1 diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 1d20bec1fd7..103fbf9e3a3 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -248,6 +248,10 @@ SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing) +/datum/quirk/family_heirloom/remove() + SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing") + SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") + /datum/quirk/frail name = "Frail" desc = "Your bones might as well be made of glass! You suffer wounds much more easily than most." diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 9cc57586ec0..fe6369069c7 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -37,6 +37,7 @@ CRASH("Wire holder is not of the expected type!") src.holder = holder + RegisterSignal(holder, COMSIG_PARENT_QDELETING, .proc/on_holder_qdel) if(randomize) randomize() else @@ -59,6 +60,12 @@ continue wires += dud + +///Called when holder is qdeleted for us to clean ourselves as not to leave any unlawful references. +/datum/wires/proc/on_holder_qdel(atom/source, force) + qdel(src) + + /datum/wires/proc/randomize() var/static/list/possible_colors = list( "blue", diff --git a/code/datums/wires/roulette.dm b/code/datums/wires/roulette.dm index f775808f908..657d19d5846 100644 --- a/code/datums/wires/roulette.dm +++ b/code/datums/wires/roulette.dm @@ -36,7 +36,7 @@ if(WIRE_BOLTS) // Pulse to toggle bolts (but only raise if power is on). if(!R.on) return - R.anchored = !R.anchored + R.set_anchored(!R.anchored) if(WIRE_RESETOWNER) R.my_card = null R.audible_message("Owner reset!") @@ -62,7 +62,7 @@ if(WIRE_BOLTS) // Always drop if(!R.on) return - R.anchored = TRUE + R.set_anchored(TRUE) if(WIRE_RESETOWNER) if(isliving(usr)) R.shock(usr, 70) diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index fa777eefcba..8732a0a21d7 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -69,7 +69,7 @@ if(!mend && B.anchored) holder.visible_message("[icon2html(B, viewers(holder))] The bolts lift out of the ground!") playsound(B, 'sound/effects/stealthoff.ogg', 30, TRUE) - B.anchored = FALSE + B.set_anchored(FALSE) if(WIRE_PROCEED) if(!mend && B.active) holder.visible_message("[icon2html(B, viewers(holder))] An alarm sounds! It's go-") diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index d70a4ebdb2d..29c87b32d4e 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -33,15 +33,13 @@ /// Either WOUND_SEVERITY_TRIVIAL (meme wounds like stubbed toe), WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, or WOUND_SEVERITY_CRITICAL (or maybe WOUND_SEVERITY_LOSS) var/severity = WOUND_SEVERITY_MODERATE - /// The list of wounds it belongs in, WOUND_LIST_BONE, WOUND_LIST_CUT, or WOUND_LIST_BURN + /// The list of wounds it belongs in, WOUND_LIST_BLUNT, WOUND_LIST_SLASH, or WOUND_LIST_BURN var/wound_type /// What body zones can we affect var/list/viable_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) /// Who owns the body part that we're wounding var/mob/living/carbon/victim = null - /// If we only work on organics (everything right now) - var/organic_only = TRUE /// The bodypart we're parented to var/obj/item/bodypart/limb = null @@ -51,8 +49,6 @@ var/list/treatable_by_grabbed /// Tools with the specified tool flag will also be able to try directly treating this wound var/treatable_tool - /// Set to TRUE if we don't give a shit about the patient's comfort and are allowed to just use any random sharp thing on this wound. Will require an aggressive grab or more to perform - var/treatable_sharp /// How long it will take to treat this wound with a standard effective tool, assuming it doesn't need surgery var/base_treat_time = 5 SECONDS @@ -65,17 +61,13 @@ /// How much we're contributing to this limb's bleed_rate var/blood_flow - /// The minimum we need to roll on [/obj/item/bodypart/proc/check_wounding()] to begin suffering this wound, see check_wounding_mods() for more + /// The minimum we need to roll on [/obj/item/bodypart/proc/check_wounding] to begin suffering this wound, see check_wounding_mods() for more var/threshold_minimum /// How much having this wound will add to all future check_wounding() rolls on this limb, to allow progression to worse injuries with repeated damage var/threshold_penalty /// If we need to process each life tick var/processes = FALSE - /// If TRUE and an item that can treat multiple different types of coexisting wounds (gauze can be used to splint broken bones, staunch bleeding, and cover burns), we get first dibs if we come up first for it, then become nonpriority. - /// Otherwise, if no untreated wound claims the item, we cycle through the non priority wounds and pick a random one who can use that item. - var/treat_priority = FALSE - /// If having this wound makes currently makes the parent bodypart unusable var/disabling @@ -89,12 +81,15 @@ var/cryo_progress /// What kind of scars this wound will create description wise once healed - var/list/scarring_descriptions = list("general disfigurement") + var/scar_keyword = "generic" /// If we've already tried scarring while removing (since remove_wound calls qdel, and qdel calls remove wound, .....) TODO: make this cleaner var/already_scarred = FALSE /// If we forced this wound through badmin smite, we won't count it towards the round totals var/from_smite + /// What flags apply to this wound + var/wound_flags = (FLESH_WOUND | BONE_WOUND | ACCEPTS_GAUZE) + /datum/wound/Destroy() if(attached_surgery) QDEL_NULL(attached_surgery) @@ -115,13 +110,13 @@ * * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented) */ /datum/wound/proc/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE) - if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || isalien(L.owner)) + if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || isalien(L.owner) || !L.is_organic_limb()) qdel(src) return if(ishuman(L.owner)) var/mob/living/carbon/human/H = L.owner - if(organic_only && ((NOBLOOD in H.dna.species.species_traits) || !L.is_organic_limb())) + if(((wound_flags & BONE_WOUND) && !(HAS_BONE in H.dna.species.species_traits)) || ((wound_flags & FLESH_WOUND) && !(HAS_FLESH in H.dna.species.species_traits))) qdel(src) return @@ -161,7 +156,7 @@ victim.visible_message(msg, "Your [limb.name] [occur_text]!", vision_distance = vis_dist) if(sound_effect) - playsound(L.owner, sound_effect, 60 + 20 * severity, TRUE) + playsound(L.owner, sound_effect, 70 + 20 * severity, TRUE) if(!demoted) wound_injury(old_wound) @@ -181,7 +176,7 @@ SEND_SIGNAL(victim, COMSIG_CARBON_LOSE_WOUND, src, limb) if(limb && !ignore_limb) LAZYREMOVE(limb.wounds, src) - limb.update_wounds() + limb.update_wounds(replaced) /** * replace_wound() is used when you want to replace the current wound with a new wound, presumably of the same category, just of a different severity (either up or down counts) @@ -189,7 +184,7 @@ * This proc actually instantiates the new wound based off the specific type path passed, then returns the new instantiated wound datum. * * Arguments: - * * new_type- The TYPE PATH of the wound you want to replace this, like /datum/wound/brute/cut/severe + * * new_type- The TYPE PATH of the wound you want to replace this, like /datum/wound/slash/severe * * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented) */ /datum/wound/proc/replace_wound(new_type, smited = FALSE) @@ -206,9 +201,6 @@ /// Additional beneficial effects when the wound is gained, in case you want to give a temporary boost to allow the victim to try an escape or last stand /datum/wound/proc/second_wind() - if(HAS_TRAIT(victim, TRAIT_NOMETABOLISM)) - return - switch(severity) if(WOUND_SEVERITY_MODERATE) victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_MODERATE) @@ -216,11 +208,13 @@ victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_SEVERE) if(WOUND_SEVERITY_CRITICAL) victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_CRITICAL) + if(WOUND_SEVERITY_LOSS) + victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_LOSS) /** - * try_treating() is an intercept run from [/mob/living/carbon/attackby()] right after surgeries but before anything else. Return TRUE here if the item is something that is relevant to treatment to take over the interaction. + * try_treating() is an intercept run from [/mob/living/carbon/proc/attackby] right after surgeries but before anything else. Return TRUE here if the item is something that is relevant to treatment to take over the interaction. * - * This proc leads into [/datum/wound/proc/treat()] and probably shouldn't be added onto in children types. You can specify what items or tools you want to be intercepted + * This proc leads into [/datum/wound/proc/treat] and probably shouldn't be added onto in children types. You can specify what items or tools you want to be intercepted * with var/list/treatable_by and var/treatable_tool, then if an item fulfills one of those requirements and our wound claims it first, it goes over to treat() and treat_self(). * * Arguments: @@ -260,7 +254,7 @@ treat(I, user) return TRUE -/// Return TRUE if we have an item that can only be used while aggro grabbed (unhanded aggro grab treatments go in [/datum/wound/proc/try_handling()]). Treatment is still is handled in [/datum/wound/proc/treat()] +/// Return TRUE if we have an item that can only be used while aggro grabbed (unhanded aggro grab treatments go in [/datum/wound/proc/try_handling]). Treatment is still is handled in [/datum/wound/proc/treat] /datum/wound/proc/check_grab_treatments(obj/item/I, mob/user) return FALSE @@ -290,10 +284,22 @@ if(cryo_progress > 33 * severity) qdel(src) +/// When synthflesh is applied to the victim, we call this. No sense in setting up an entire chem reaction system for wounds when we only care for a few chems. Probably will change in the future +/datum/wound/proc/on_synthflesh(power) + return + +/// Called when the patient is undergoing stasis, so that having fully treated a wound doesn't make you sit there helplessly until you think to unbuckle them +/datum/wound/proc/on_stasis() + return + /// Called when we're crushed in an airlock or firedoor, for one of the improvised joint dislocation fixes /datum/wound/proc/crush() return +/// Used when we're being dragged while bleeding, the value we return is how much bloodloss this wound causes from being dragged. Since it's a proc, you can let bandages soak some of the blood +/datum/wound/proc/drag_bleed_amount() + return + /** * get_examine_description() is used in carbon/examine and human/examine to show the status of this wound. Useful if you need to show some status like the wound being splinted or bandaged. * @@ -303,7 +309,8 @@ * * mob/user: The user examining the wound's owner, if that matters */ /datum/wound/proc/get_examine_description(mob/user) - return "[victim.p_their(TRUE)] [limb.name] [examine_desc]!" + . = "[victim.p_their(TRUE)] [limb.name] [examine_desc]" + . = severity <= WOUND_SEVERITY_MODERATE ? "[.]." : "[.]!" /datum/wound/proc/get_scanner_description(mob/user) return "Type: [name]\nSeverity: [severity_text()]\nDescription: [desc]\nRecommended Treatment: [treat_text]" diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index 93ca9c5b671..4d1c27b42e0 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -7,12 +7,10 @@ /* Base definition */ -/datum/wound/brute/bone - sound_effect = 'sound/effects/crack1.ogg' - wound_type = WOUND_LIST_BONE - - /// The item we're currently splinted with, if there is one - var/obj/item/stack/splinted +/datum/wound/blunt + sound_effect = 'sound/effects/wounds/crack1.ogg' + wound_type = WOUND_BLUNT + wound_flags = (BONE_WOUND | ACCEPTS_GAUZE) /// Have we been taped? var/taped @@ -31,12 +29,12 @@ /// How long do we wait +/- 20% for the next trauma? var/trauma_cycle_cooldown /// If this is a chest wound and this is set, we have this chance to cough up blood when hit in the chest - var/chance_internal_bleeding = 0 + var/internal_bleeding_chance = 0 /* Overwriting of base procs */ -/datum/wound/brute/bone/wound_injury(datum/wound/old_wound = null) +/datum/wound/blunt/wound_injury(datum/wound/old_wound = null) if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group) processes = TRUE active_trauma = victim.gain_trauma_type(brain_trauma_group, TRAUMA_RESILIENCE_WOUND) @@ -53,14 +51,14 @@ update_inefficiencies() -/datum/wound/brute/bone/remove_wound(ignore_limb, replaced) +/datum/wound/blunt/remove_wound(ignore_limb, replaced) limp_slowdown = 0 QDEL_NULL(active_trauma) if(victim) UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) return ..() -/datum/wound/brute/bone/handle_process() +/datum/wound/blunt/handle_process() . = ..() if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group && world.time > next_trauma_cycle) if(active_trauma) @@ -86,7 +84,7 @@ remove_wound() /// If we're a human who's punching something with a broken arm, we might hurt ourselves doing so -/datum/wound/brute/bone/proc/attack_with_hurt_hand(mob/M, atom/target, proximity) +/datum/wound/blunt/proc/attack_with_hurt_hand(mob/M, atom/target, proximity) if(victim.get_active_hand() != limb || victim.a_intent == INTENT_HELP || !ismob(target) || severity <= WOUND_SEVERITY_MODERATE) return @@ -104,61 +102,54 @@ limb.receive_damage(brute=rand(3,7)) return COMPONENT_NO_ATTACK_HAND -/datum/wound/brute/bone/receive_damage(wounding_type, wounding_dmg, wound_bonus) - if(!victim) +/datum/wound/blunt/receive_damage(wounding_type, wounding_dmg, wound_bonus) + if(!victim || wounding_dmg < WOUND_MINIMUM_DAMAGE) return + if(ishuman(victim)) + var/mob/living/carbon/human/human_victim = victim + if(NOBLOOD in human_victim.dna?.species.species_traits) + return - if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume && prob(chance_internal_bleeding + wounding_dmg)) + if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume && prob(internal_bleeding_chance + wounding_dmg)) var/blood_bled = rand(1, wounding_dmg * (severity == WOUND_SEVERITY_CRITICAL ? 2 : 1.5)) // 12 brute toolbox can cause up to 18/24 bleeding with a severe/critical chest wound switch(blood_bled) if(1 to 6) victim.bleed(blood_bled, TRUE) if(7 to 13) - victim.visible_message("[victim] coughs up a bit of blood from the blow to [victim.p_their()] chest.", "You cough up a bit of blood from the blow to your chest.") + victim.visible_message("[victim] coughs up a bit of blood from the blow to [victim.p_their()] chest.", "You cough up a bit of blood from the blow to your chest.", vision_distance=COMBAT_MESSAGE_RANGE) victim.bleed(blood_bled, TRUE) if(14 to 19) - victim.visible_message("[victim] spits out a string of blood from the blow to [victim.p_their()] chest!", "You spit out a string of blood from the blow to your chest!") + victim.visible_message("[victim] spits out a string of blood from the blow to [victim.p_their()] chest!", "You spit out a string of blood from the blow to your chest!", vision_distance=COMBAT_MESSAGE_RANGE) new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) victim.bleed(blood_bled) if(20 to INFINITY) - victim.visible_message("[victim] chokes up a spray of blood from the blow to [victim.p_their()] chest!", "You choke up on a spray of blood from the blow to your chest!") + victim.visible_message("[victim] chokes up a spray of blood from the blow to [victim.p_their()] chest!", "You choke up on a spray of blood from the blow to your chest!", vision_distance=COMBAT_MESSAGE_RANGE) victim.bleed(blood_bled) new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) victim.add_splatter_floor(get_step(victim.loc, victim.dir)) - if(!(wounding_type in list(WOUND_SHARP, WOUND_BURN)) || !splinted || wound_bonus == CANT_WOUND) - return - splinted.take_damage(wounding_dmg, damage_type = (wounding_type == WOUND_SHARP ? BRUTE : BURN), sound_effect = FALSE) - if(QDELETED(splinted)) - var/destroyed_verb = (wounding_type == WOUND_SHARP ? "torn" : "burned") - victim.visible_message("The splint securing [victim]'s [limb.name] is [destroyed_verb] away!", "The splint securing your [limb.name] is [destroyed_verb] away!", vision_distance=COMBAT_MESSAGE_RANGE) - splinted = null - treat_priority = TRUE - update_inefficiencies() - - -/datum/wound/brute/bone/get_examine_description(mob/user) - if(!splinted && !gelled && !taped) +/datum/wound/blunt/get_examine_description(mob/user) + if(!limb.current_gauze && !gelled && !taped) return ..() - var/msg = "" - if(!splinted) - msg = "[victim.p_their(TRUE)] [limb.name] [examine_desc]" + var/list/msg = list() + if(!limb.current_gauze) + msg += "[victim.p_their(TRUE)] [limb.name] [examine_desc]" else - var/splint_condition = "" + var/sling_condition = "" // how much life we have left in these bandages - switch(splinted.obj_integrity / splinted.max_integrity * 100) + switch(limb.current_gauze.obj_integrity / limb.current_gauze.max_integrity * 100) if(0 to 25) - splint_condition = "just barely " + sling_condition = "just barely " if(25 to 50) - splint_condition = "loosely " + sling_condition = "loosely " if(50 to 75) - splint_condition = "mostly " + sling_condition = "mostly " if(75 to INFINITY) - splint_condition = "tightly " + sling_condition = "tightly " - msg = "[victim.p_their(TRUE)] [limb.name] is [splint_condition] fastened in a splint of [splinted.name]" + msg += "[victim.p_their(TRUE)] [limb.name] is [sling_condition] fastened in a sling of [limb.current_gauze.name]" if(taped) msg += ", and appears to be reforming itself under some surgical tape!" @@ -166,58 +157,35 @@ msg += ", with fizzing flecks of blue bone gel sparking off the bone!" else msg += "!" - return "[msg]" + return "[msg.Join()]" /* - New common procs for /datum/wound/brute/bone/ + New common procs for /datum/wound/blunt/ */ -/datum/wound/brute/bone/proc/update_inefficiencies() +/datum/wound/blunt/proc/update_inefficiencies() if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - if(splinted) - limp_slowdown = initial(limp_slowdown) * splinted.splint_factor + if(limb.current_gauze) + limp_slowdown = initial(limp_slowdown) * limb.current_gauze.splint_factor else limp_slowdown = initial(limp_slowdown) victim.apply_status_effect(STATUS_EFFECT_LIMP) else if(limb.body_zone in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) - if(splinted) - interaction_efficiency_penalty = 1 + ((interaction_efficiency_penalty - 1) * splinted.splint_factor) + if(limb.current_gauze) + interaction_efficiency_penalty = 1 + ((interaction_efficiency_penalty - 1) * limb.current_gauze.splint_factor) else interaction_efficiency_penalty = interaction_efficiency_penalty - if(initial(disabling) && splinted) - disabling = FALSE - else if(initial(disabling)) - disabling = TRUE + if(initial(disabling)) + disabling = !limb.current_gauze limb.update_wounds() -/* - BEWARE OF REDUNDANCY AHEAD THAT I MUST PARE DOWN -*/ - -/datum/wound/brute/bone/proc/splint(obj/item/stack/I, mob/user) - if(splinted && splinted.splint_factor >= I.splint_factor) - to_chat(user, "The splint already on [user == victim ? "your" : "[victim]'s"] [limb.name] is better than you can do with [I].") - return - - user.visible_message("[user] begins splinting [victim]'s [limb.name] with [I].", "You begin splinting [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") - - if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists))) - return - - user.visible_message("[user] finishes splinting [victim]'s [limb.name]!", "You finish splinting [user == victim ? "your" : "[victim]'s"] [limb.name]!") - treat_priority = FALSE - splinted = new I.type(limb) - splinted.amount = 1 - I.use(1) - update_inefficiencies() - /* Moderate (Joint Dislocation) */ -/datum/wound/brute/bone/moderate +/datum/wound/blunt/moderate name = "Joint Dislocation" desc = "Patient's bone has been unset from socket, causing pain and reduced motor function." treat_text = "Recommended application of bonesetter to affected limb, though manual relocation by applying an aggressive grab to the patient and helpfully interacting with afflicted limb may suffice." @@ -230,15 +198,16 @@ threshold_minimum = 35 threshold_penalty = 15 treatable_tool = TOOL_BONESET - status_effect_type = /datum/status_effect/wound/bone/moderate - scarring_descriptions = list("light discoloring", "a slight blue tint") + wound_flags = (BONE_WOUND) + status_effect_type = /datum/status_effect/wound/blunt/moderate + scar_keyword = "bluntmoderate" -/datum/wound/brute/bone/moderate/crush() +/datum/wound/blunt/moderate/crush() if(prob(33)) victim.visible_message("[victim]'s dislocated [limb.name] pops back into place!", "Your dislocated [limb.name] pops back into place! Ow!") remove_wound() -/datum/wound/brute/bone/moderate/try_handling(mob/living/carbon/human/user) +/datum/wound/blunt/moderate/try_handling(mob/living/carbon/human/user) if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB) return FALSE @@ -256,7 +225,7 @@ return TRUE /// If someone is snapping our dislocated joint back into place by hand with an aggro grab and help intent -/datum/wound/brute/bone/moderate/proc/chiropractice(mob/living/carbon/human/user) +/datum/wound/blunt/moderate/proc/chiropractice(mob/living/carbon/human/user) var/time = base_treat_time if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) @@ -275,7 +244,7 @@ chiropractice(user) /// If someone is snapping our dislocated joint into a fracture by hand with an aggro grab and harm or disarm intent -/datum/wound/brute/bone/moderate/proc/malpractice(mob/living/carbon/human/user) +/datum/wound/blunt/moderate/proc/malpractice(mob/living/carbon/human/user) var/time = base_treat_time if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) @@ -293,7 +262,7 @@ malpractice(user) -/datum/wound/brute/bone/moderate/treat(obj/item/I, mob/user) +/datum/wound/blunt/moderate/treat(obj/item/I, mob/user) if(victim == user) victim.visible_message("[user] begins resetting [victim.p_their()] [limb.name] with [I].", "You begin resetting your [limb.name] with [I]...") else @@ -317,56 +286,57 @@ Severe (Hairline Fracture) */ -/datum/wound/brute/bone/severe +/datum/wound/blunt/severe name = "Hairline Fracture" desc = "Patient's bone has suffered a crack in the foundation, causing serious pain and reduced limb functionality." - treat_text = "Recommended light surgical application of bone gel, though splinting will prevent worsening situation." - examine_desc = "appears bruised and grotesquely swollen" - + treat_text = "Recommended light surgical application of bone gel, though a sling of medical gauze will prevent worsening situation." + examine_desc = "appears grotesquely swollen, its attachment weakened" occur_text = "sprays chips of bone and develops a nasty looking bruise" + severity = WOUND_SEVERITY_SEVERE interaction_efficiency_penalty = 2 limp_slowdown = 6 threshold_minimum = 60 threshold_penalty = 30 - treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/gauze, /obj/item/stack/medical/bone_gel) - status_effect_type = /datum/status_effect/wound/bone/severe - treat_priority = TRUE - scarring_descriptions = list("a faded, fist-sized bruise", "a vaguely triangular peel scar") + treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel) + status_effect_type = /datum/status_effect/wound/blunt/severe + scar_keyword = "bluntsevere" brain_trauma_group = BRAIN_TRAUMA_MILD trauma_cycle_cooldown = 1.5 MINUTES - chance_internal_bleeding = 40 + internal_bleeding_chance = 40 + wound_flags = (BONE_WOUND | ACCEPTS_GAUZE | MANGLES_BONE) -/datum/wound/brute/bone/critical +/datum/wound/blunt/critical name = "Compound Fracture" desc = "Patient's bones have suffered multiple gruesome fractures, causing significant pain and near uselessness of limb." treat_text = "Immediate binding of affected limb, followed by surgical intervention ASAP." - examine_desc = "has a cracked bone sticking out of it" + examine_desc = "is mangled and pulped, seemingly held together by tissue alone" occur_text = "cracks apart, exposing broken bones to open air" + severity = WOUND_SEVERITY_CRITICAL interaction_efficiency_penalty = 4 limp_slowdown = 9 - sound_effect = 'sound/effects/crack2.ogg' + sound_effect = 'sound/effects/wounds/crack2.ogg' threshold_minimum = 115 threshold_penalty = 50 disabling = TRUE - treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/gauze, /obj/item/stack/medical/bone_gel) - status_effect_type = /datum/status_effect/wound/bone/critical - treat_priority = TRUE - scarring_descriptions = list("a section of janky skin lines and badly healed scars", "a large patch of uneven skin tone", "a cluster of calluses") + treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel) + status_effect_type = /datum/status_effect/wound/blunt/critical + scar_keyword = "bluntcritical" brain_trauma_group = BRAIN_TRAUMA_SEVERE trauma_cycle_cooldown = 2.5 MINUTES - chance_internal_bleeding = 60 + internal_bleeding_chance = 60 + wound_flags = (BONE_WOUND | ACCEPTS_GAUZE | MANGLES_BONE) // doesn't make much sense for "a" bone to stick out of your head -/datum/wound/brute/bone/critical/apply_wound(obj/item/bodypart/L, silent, datum/wound/old_wound, smited) +/datum/wound/blunt/critical/apply_wound(obj/item/bodypart/L, silent, datum/wound/old_wound, smited) if(L.body_zone == BODY_ZONE_HEAD) occur_text = "splits open, exposing a bare, cracked skull through the flesh and blood" examine_desc = "has an unsettling indent, with bits of skull poking out" . = ..() /// if someone is using bone gel on our wound -/datum/wound/brute/bone/proc/gel(obj/item/stack/medical/bone_gel/I, mob/user) +/datum/wound/blunt/proc/gel(obj/item/stack/medical/bone_gel/I, mob/user) if(gelled) to_chat(user, "[user == victim ? "Your" : "[victim]'s"] [limb.name] is already coated with bone gel!") return @@ -385,9 +355,9 @@ var/painkiller_bonus = 0 if(victim.drunkenness) painkiller_bonus += 5 - if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/medicine/morphine)) + if(victim.reagents?.has_reagent(/datum/reagent/medicine/morphine)) painkiller_bonus += 10 - if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/determination)) + if(victim.reagents?.has_reagent(/datum/reagent/determination)) painkiller_bonus += 5 if(prob(25 + (20 * severity - 2) - painkiller_bonus)) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by painkillers @@ -401,7 +371,7 @@ gelled = TRUE /// if someone is using surgical tape on our wound -/datum/wound/brute/bone/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user) +/datum/wound/blunt/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user) if(!gelled) to_chat(user, "[user == victim ? "Your" : "[victim]'s"] [limb.name] must be coated with bone gel to perform this emergency operation!") return @@ -426,15 +396,13 @@ taped = TRUE processes = TRUE -/datum/wound/brute/bone/treat(obj/item/I, mob/user) +/datum/wound/blunt/treat(obj/item/I, mob/user) if(istype(I, /obj/item/stack/medical/bone_gel)) gel(I, user) else if(istype(I, /obj/item/stack/sticky_tape/surgical)) tape(I, user) - else if(istype(I, /obj/item/stack/medical/gauze)) - splint(I, user) -/datum/wound/brute/bone/get_scanner_description(mob/user) +/datum/wound/blunt/get_scanner_description(mob/user) . = ..() . += "
" @@ -444,7 +412,7 @@ else if(!taped) . += "Continue Alternative Treatment: Apply surgical tape directly to injured limb to begin bone regeneration. Note, this is both excruciatingly painful and slow.\n" else - . += "Note: Bone regeneration in effect. Bone is [round(regen_points_current/regen_points_needed)]% regenerated.\n" + . += "Note: Bone regeneration in effect. Bone is [round(regen_points_current*100/regen_points_needed)]% regenerated.\n" if(limb.body_zone == BODY_ZONE_HEAD) . += "Cranial Trauma Detected: Patient will suffer random bouts of [severity == WOUND_SEVERITY_SEVERE ? "mild" : "severe"] brain traumas until bone is repaired." diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index a09cf2fb7b0..e403ac2850a 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -4,11 +4,12 @@ // TODO: well, a lot really, but specifically I want to add potential fusing of clothing/equipment on the affected area, and limb infections, though those may go in body part code /datum/wound/burn a_or_from = "from" - wound_type = WOUND_LIST_BURN + wound_type = WOUND_BURN processes = TRUE - sound_effect = 'sound/effects/sizzle1.ogg' + sound_effect = 'sound/effects/wounds/sizzle1.ogg' + wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE) - treatable_by = list(/obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) // sterilizer and alcohol will require reagent treatments, coming soon + treatable_by = list(/obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) // sterilizer and alcohol will require reagent treatments, coming soon // Flesh damage vars /// How much damage to our flesh we currently have. Once both this and infestation reach 0, the wound is considered healed @@ -27,8 +28,6 @@ /// Once we reach infestation beyond WOUND_INFESTATION_SEPSIS, we get this many warnings before the limb is completely paralyzed (you'd have to ignore a really bad burn for a really long time for this to happen) var/strikes_to_lose_limb = 3 - /// The current bandage we have for this wound (maybe move bandages to the limb?) - var/obj/item/stack/current_bandage /datum/wound/burn/handle_process() . = ..() @@ -47,15 +46,11 @@ sanitization += 0.3 flesh_healing += 0.5 - if(current_bandage) - current_bandage.absorption_capacity -= WOUND_BURN_SANITIZATION_RATE - if(current_bandage.absorption_capacity <= 0) - victim.visible_message("Pus soaks through \the [current_bandage] on [victim]'s [limb.name].", "Pus soaks through \the [current_bandage] on your [limb.name].", vision_distance=COMBAT_MESSAGE_RANGE) - QDEL_NULL(current_bandage) - treat_priority = TRUE + if(limb.current_gauze) + limb.seep_gauze(WOUND_BURN_SANITIZATION_RATE) if(flesh_healing > 0) - var/bandage_factor = (current_bandage ? current_bandage.splint_factor : 1) + var/bandage_factor = (limb.current_gauze ? limb.current_gauze.splint_factor : 1) flesh_damage = max(0, flesh_damage - 1) flesh_healing = max(0, flesh_healing - bandage_factor) // good bandages multiply the length of flesh healing @@ -67,7 +62,7 @@ // sanitization is checked after the clearing check but before the rest, because we freeze the effects of infection while we have sanitization if(sanitization > 0) - var/bandage_factor = (current_bandage ? current_bandage.splint_factor : 1) + var/bandage_factor = (limb.current_gauze ? limb.current_gauze.splint_factor : 1) infestation = max(0, infestation - WOUND_BURN_SANITIZATION_RATE) sanitization = max(0, sanitization - (WOUND_BURN_SANITIZATION_RATE * bandage_factor)) return @@ -122,10 +117,10 @@ if(strikes_to_lose_limb <= 0) return "[victim.p_their(TRUE)] [limb.name] is completely dead and unrecognizable as organic." - var/condition = "" - if(current_bandage) + var/list/condition = list("[victim.p_their(TRUE)] [limb.name] [examine_desc]") + if(limb.current_gauze) var/bandage_condition - switch(current_bandage.absorption_capacity) + switch(limb.current_gauze.absorption_capacity) if(0 to 1.25) bandage_condition = "nearly ruined " if(1.25 to 2.75) @@ -135,7 +130,7 @@ if(4 to INFINITY) bandage_condition = "clean " - condition += " underneath a dressing of [bandage_condition] [current_bandage.name]" + condition += " underneath a dressing of [bandage_condition] [limb.current_gauze.name]" else switch(infestation) if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) @@ -149,7 +144,7 @@ else condition += "!" - return "[victim.p_their(TRUE)] [limb.name] [examine_desc][condition]" + return "[condition.Join()]" /datum/wound/burn/get_scanner_description(mob/user) if(strikes_to_lose_limb == 0) @@ -200,36 +195,6 @@ else try_treating(I, user) -/// for use in the burn dressing surgery since we don't want to make them do another do_after obviously -/datum/wound/burn/proc/force_bandage(obj/item/stack/medical/gauze/I, mob/user) - QDEL_NULL(current_bandage) - current_bandage = new I.type(limb) - current_bandage.amount = 1 - treat_priority = FALSE - sanitization += I.sanitization - I.use(1) - -/// if someone is wrapping gauze on our burns -/datum/wound/burn/proc/bandage(obj/item/stack/medical/gauze/I, mob/user) - if(current_bandage) - if(current_bandage.absorption_capacity > I.absorption_capacity + 1) - to_chat(user, "The [current_bandage] on [victim]'s [limb.name] is still in better condition than your [I.name]!") - return - user.visible_message("[user] begins to redress the burns on [victim]'s [limb.name] with [I]...", "You begin redressing the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") - else - user.visible_message("[user] begins to dress the burns on [victim]'s [limb.name] with [I]...", "You begin dressing the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") - - if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) - return - - user.visible_message("[user] applies [I] to [victim].", "You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.name].") - QDEL_NULL(current_bandage) - current_bandage = new I.type(limb) - current_bandage.amount = 1 - treat_priority = FALSE - sanitization += I.sanitization - I.use(1) - /// if someone is using mesh on our burns /datum/wound/burn/proc/mesh(obj/item/stack/medical/mesh/I, mob/user) user.visible_message("[user] begins wrapping [victim]'s [limb.name] with [I]...", "You begin wrapping [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") @@ -261,17 +226,26 @@ COOLDOWN_START(I, uv_cooldown, I.uv_cooldown_length) /datum/wound/burn/treat(obj/item/I, mob/user) - if(istype(I, /obj/item/stack/medical/gauze)) - bandage(I, user) - else if(istype(I, /obj/item/stack/medical/ointment)) + if(istype(I, /obj/item/stack/medical/ointment)) ointment(I, user) else if(istype(I, /obj/item/stack/medical/mesh)) mesh(I, user) else if(istype(I, /obj/item/flashlight/pen/paramedic)) uv(I, user) -/// basic support for instabitaluri/synthflesh healing flesh damage, more chem support in the future -/datum/wound/burn/proc/regenerate_flesh(amount) +// people complained about burns not healing on stasis beds, so in addition to checking if it's cured, they also get the special ability to very slowly heal on stasis beds if they have the healing effects stored +/datum/wound/burn/on_stasis() + . = ..() + if(flesh_healing > 0) + flesh_damage = max(0, flesh_damage - 0.2) + if((flesh_damage <= 0) && (infestation <= 1)) + to_chat(victim, "The burns on your [limb.name] have cleared up!") + qdel(src) + return + if(sanitization > 0) + infestation = max(0, infestation - WOUND_BURN_SANITIZATION_RATE * 0.2) + +/datum/wound/burn/on_synthflesh(amount) flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard // we don't even care about first degree burns, straight to second @@ -287,7 +261,7 @@ threshold_penalty = 30 // burns cause significant decrease in limb integrity compared to other wounds status_effect_type = /datum/status_effect/wound/burn/moderate flesh_damage = 5 - scarring_descriptions = list("small amoeba-shaped skinmarks", "a faded streak of depressed skin") + scar_keyword = "burnmoderate" /datum/wound/burn/severe name = "Third Degree Burns" @@ -300,10 +274,10 @@ threshold_minimum = 80 threshold_penalty = 40 status_effect_type = /datum/status_effect/wound/burn/severe - treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) + treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) infestation_rate = 0.05 // appx 13 minutes to reach sepsis without any treatment flesh_damage = 12.5 - scarring_descriptions = list("a large, jagged patch of faded skin", "random spots of shiny, smooth skin", "spots of taut, leathery skin") + scar_keyword = "burnsevere" /datum/wound/burn/critical name = "Catastrophic Burns" @@ -313,11 +287,11 @@ occur_text = "vaporizes as flesh, bone, and fat melt together in a horrifying mess" severity = WOUND_SEVERITY_CRITICAL damage_mulitplier_penalty = 1.3 - sound_effect = 'sound/effects/sizzle2.ogg' + sound_effect = 'sound/effects/wounds/sizzle2.ogg' threshold_minimum = 140 threshold_penalty = 80 status_effect_type = /datum/status_effect/wound/burn/critical - treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) + treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) infestation_rate = 0.15 // appx 4.33 minutes to reach sepsis without any treatment flesh_damage = 20 - scarring_descriptions = list("massive, disfiguring keloid scars", "several long streaks of badly discolored and malformed skin", "unmistakeable splotches of dead tissue from serious burns") + scar_keyword = "burncritical" diff --git a/code/datums/wounds/loss.dm b/code/datums/wounds/loss.dm new file mode 100644 index 00000000000..bc7e18a1831 --- /dev/null +++ b/code/datums/wounds/loss.dm @@ -0,0 +1,42 @@ + +/datum/wound/loss + name = "Dismembered" + desc = "oof ouch!!" + + sound_effect = 'sound/effects/dismember.ogg' + severity = WOUND_SEVERITY_LOSS + threshold_minimum = 180 + status_effect_type = null + scar_keyword = "dismember" + wound_flags = null + +/// Our special proc for our special dismembering, the wounding type only matters for what text we have +/datum/wound/loss/proc/apply_dismember(obj/item/bodypart/dismembered_part, wounding_type=WOUND_SLASH) + if(!istype(dismembered_part) || !dismembered_part.owner || !(dismembered_part.body_zone in viable_zones) || isalien(dismembered_part.owner) || !dismembered_part.can_dismember()) + qdel(src) + return + + already_scarred = TRUE // so we don't scar a limb we don't have. If I add different levels of amputation desc, do it here + + switch(wounding_type) + if(WOUND_BLUNT) + occur_text = "is shattered through the last bone holding it together, severing it completely!" + if(WOUND_SLASH) + occur_text = "is slashed through the last tissue holding it together, severing it completely!" + if(WOUND_PIERCE) + occur_text = "is pierced through the last tissue holding it together, severing it completely!" + if(WOUND_BURN) + occur_text = "is completely incinerated, falling to dust!" + + victim = dismembered_part.owner + + var/msg = "[victim]'s [dismembered_part.name] [occur_text]!" + + victim.visible_message(msg, "Your [dismembered_part.name] [occur_text]!") + + limb = dismembered_part + severity = WOUND_SEVERITY_LOSS + second_wind() + log_wound(victim, src) + dismembered_part.dismember(wounding_type == WOUND_BURN ? BURN : BRUTE) + qdel(src) diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm new file mode 100644 index 00000000000..c307f9582de --- /dev/null +++ b/code/datums/wounds/pierce.dm @@ -0,0 +1,171 @@ + +/* + Pierce +*/ + +/datum/wound/pierce + sound_effect = 'sound/weapons/slice.ogg' + processes = TRUE + wound_type = WOUND_PIERCE + treatable_by = list(/obj/item/stack/medical/suture) + treatable_tool = TOOL_CAUTERY + base_treat_time = 3 SECONDS + wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE) + + /// How much blood we start losing when this wound is first applied + var/initial_flow + /// If gauzed, what percent of the internal bleeding actually clots of the total absorption rate + var/gauzed_clot_rate + + /// When hit on this bodypart, we have this chance of losing some blood + the incoming damage + var/internal_bleeding_chance + /// If we let off blood when hit, the max blood lost is this * the incoming damage + var/internal_bleeding_coefficient + +/datum/wound/pierce/wound_injury(datum/wound/old_wound) + blood_flow = initial_flow + +/datum/wound/pierce/receive_damage(wounding_type, wounding_dmg, wound_bonus) + if(victim.stat == DEAD || wounding_dmg < 5) + return + if(victim.blood_volume && prob(internal_bleeding_chance + wounding_dmg)) + if(limb.current_gauze && limb.current_gauze.splint_factor) + wounding_dmg *= (1 - limb.current_gauze.splint_factor) + var/blood_bled = rand(1, wounding_dmg * internal_bleeding_coefficient) // 12 brute toolbox can cause up to 15/18/21 bloodloss on mod/sev/crit + switch(blood_bled) + if(1 to 6) + victim.bleed(blood_bled, TRUE) + if(7 to 13) + victim.visible_message("Blood droplets fly from the hole in [victim]'s [limb.name].", "You cough up a bit of blood from the blow to your [limb.name].", vision_distance=COMBAT_MESSAGE_RANGE) + victim.bleed(blood_bled, TRUE) + if(14 to 19) + victim.visible_message("A small stream of blood spurts from the hole in [victim]'s [limb.name]!", "You spit out a string of blood from the blow to your [limb.name]!", vision_distance=COMBAT_MESSAGE_RANGE) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) + victim.bleed(blood_bled) + if(20 to INFINITY) + victim.visible_message("A spray of blood streams from the gash in [victim]'s [limb.name]!", "You choke up on a spray of blood from the blow to your [limb.name]!", vision_distance=COMBAT_MESSAGE_RANGE) + victim.bleed(blood_bled) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) + victim.add_splatter_floor(get_step(victim.loc, victim.dir)) + +/datum/wound/pierce/handle_process() + blood_flow = min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW) + + if(victim.bodytemperature < (BODYTEMP_NORMAL - 10)) + blood_flow -= 0.2 + if(prob(5)) + to_chat(victim, "You feel the [lowertext(name)] in your [limb.name] firming up from the cold!") + + if(victim.reagents?.has_reagent(/datum/reagent/toxin/heparin)) + blood_flow += 0.5 // old herapin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first + + if(limb.current_gauze) + blood_flow -= limb.current_gauze.absorption_rate * gauzed_clot_rate + limb.current_gauze.absorption_capacity -= limb.current_gauze.absorption_rate + + if(blood_flow <= 0) + qdel(src) + +/datum/wound/pierce/on_stasis() + . = ..() + if(blood_flow <= 0) + qdel(src) + +/datum/wound/pierce/treat(obj/item/I, mob/user) + if(istype(I, /obj/item/stack/medical/suture)) + suture(I, user) + else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature() > 300) + tool_cauterize(I, user) + +/datum/wound/pierce/on_xadone(power) + . = ..() + blood_flow -= 0.03 * power // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort + +/datum/wound/pierce/on_synthflesh(power) + . = ..() + blood_flow -= 0.05 * power // 20u * 0.05 = -1 blood flow, less than with slashes but still good considering smaller bleed rates + +/// If someone is using a suture to close this cut +/datum/wound/pierce/proc/suture(obj/item/stack/medical/suture/I, mob/user) + var/self_penalty_mult = (user == victim ? 1.4 : 1) + user.visible_message("[user] begins stitching [victim]'s [limb.name] with [I]...", "You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") + if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) + return + user.visible_message("[user] stitches up some of the bleeding on [victim].", "You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"].") + var/blood_sutured = I.stop_bleeding / self_penalty_mult * 0.5 + blood_flow -= blood_sutured + limb.heal_damage(I.heal_brute, I.heal_burn) + + if(blood_flow > 0) + try_treating(I, user) + else + to_chat(user, "You successfully close the hole in [user == victim ? "your" : "[victim]'s"] [limb.name].") + +/// If someone is using either a cautery tool or something with heat to cauterize this pierce +/datum/wound/pierce/proc/tool_cauterize(obj/item/I, mob/user) + var/self_penalty_mult = (user == victim ? 1.5 : 1) + user.visible_message("[user] begins cauterizing [victim]'s [limb.name] with [I]...", "You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") + if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) + return + + user.visible_message("[user] cauterizes some of the bleeding on [victim].", "You cauterize some of the bleeding on [victim].") + limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND) + if(prob(30)) + victim.emote("scream") + var/blood_cauterized = (0.6 / self_penalty_mult) * 0.5 + blood_flow -= blood_cauterized + + if(blood_flow > 0) + try_treating(I, user) + +/datum/wound/pierce/moderate + name = "Minor Breakage" + desc = "Patient's skin has been broken open, causing severe bruising and minor internal bleeding in affected area." + treat_text = "Treat affected site with bandaging or exposure to extreme cold. In dire cases, brief exposure to vacuum may suffice." // space is cold in ss13, so it's like an ice pack! + examine_desc = "has a small, circular hole, gently bleeding" + occur_text = "spurts out a thin stream of blood" + sound_effect = 'sound/effects/wounds/pierce1.ogg' + severity = WOUND_SEVERITY_MODERATE + initial_flow = 1.5 + gauzed_clot_rate = 0.8 + internal_bleeding_chance = 30 + internal_bleeding_coefficient = 1.25 + threshold_minimum = 30 + threshold_penalty = 15 + status_effect_type = /datum/status_effect/wound/pierce/moderate + scar_keyword = "piercemoderate" + +/datum/wound/pierce/severe + name = "Open Puncture" + desc = "Patient's internal tissue is penetrated, causing sizeable internal bleeding and reduced limb stability." + treat_text = "Repair punctures in skin by suture or cautery, extreme cold may also work." + examine_desc = "is pierced clear through, with bits of tissue obscuring the open hole" + occur_text = "looses a violent spray of blood, revealing a pierced wound" + sound_effect = 'sound/effects/wounds/pierce2.ogg' + severity = WOUND_SEVERITY_SEVERE + initial_flow = 2.25 + gauzed_clot_rate = 0.6 + internal_bleeding_chance = 60 + internal_bleeding_coefficient = 1.5 + threshold_minimum = 50 + threshold_penalty = 25 + status_effect_type = /datum/status_effect/wound/pierce/severe + scar_keyword = "piercesevere" + +/datum/wound/pierce/critical + name = "Ruptured Cavity" + desc = "Patient's internal tissue and circulatory system is shredded, causing significant internal bleeding and damage to internal organs." + treat_text = "Surgical repair of puncture wound, followed by supervised resanguination." + examine_desc = "is ripped clear through, barely held together by exposed bone" + occur_text = "blasts apart, sending chunks of viscera flying in all directions" + sound_effect = 'sound/effects/wounds/pierce3.ogg' + severity = WOUND_SEVERITY_CRITICAL + initial_flow = 3 + gauzed_clot_rate = 0.4 + internal_bleeding_chance = 80 + internal_bleeding_coefficient = 1.75 + threshold_minimum = 100 + threshold_penalty = 40 + status_effect_type = /datum/status_effect/wound/pierce/critical + scar_keyword = "piercecritical" + wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | MANGLES_FLESH) diff --git a/code/datums/wounds/scars/_scars.dm b/code/datums/wounds/scars/_scars.dm index bfbaab835e6..3365fc359d9 100644 --- a/code/datums/wounds/scars/_scars.dm +++ b/code/datums/wounds/scars/_scars.dm @@ -53,8 +53,12 @@ if(victim) LAZYADD(victim.all_scars, src) - description = pick(W.scarring_descriptions) - precise_location = pick(limb.specific_locations) + if(victim && victim.get_biological_state() == BIO_JUST_BONE) + description = pick(strings(BONE_SCAR_FILE, W.scar_keyword)) || "general disfigurement" + else + description = pick(strings(FLESH_SCAR_FILE, W.scar_keyword)) || "general disfigurement" + + precise_location = pick(strings(SCAR_LOC_FILE, limb.body_zone)) switch(W.severity) if(WOUND_SEVERITY_MODERATE) visibility = 2 @@ -62,6 +66,9 @@ visibility = 3 if(WOUND_SEVERITY_CRITICAL) visibility = 5 + if(WOUND_SEVERITY_LOSS) + visibility = 7 + precise_location = "amputation" /// Used when we finalize a scar from a healing cut /datum/scar/proc/lazy_attach(obj/item/bodypart/BP, datum/wound/W) @@ -71,10 +78,11 @@ LAZYADD(victim.all_scars, src) /// Used to "load" a persistent scar -/datum/scar/proc/load(obj/item/bodypart/BP, description, specific_location, severity=WOUND_SEVERITY_SEVERE) - if(!(BP.body_zone in applicable_zones)) +/datum/scar/proc/load(obj/item/bodypart/BP, version, description, specific_location, severity=WOUND_SEVERITY_SEVERE) + if(!(BP.body_zone in applicable_zones) || !BP.is_organic_limb()) qdel(src) return + limb = BP src.severity = severity LAZYADD(limb.scars, src) @@ -90,6 +98,8 @@ visibility = 3 if(WOUND_SEVERITY_CRITICAL) visibility = 5 + if(WOUND_SEVERITY_LOSS) + visibility = 7 return TRUE /// What will show up in examine_more() if this scar is visible @@ -102,9 +112,12 @@ if(WOUND_SEVERITY_MODERATE) msg = "[msg]" if(WOUND_SEVERITY_SEVERE) - msg = "[msg]" + msg = "[msg]" if(WOUND_SEVERITY_CRITICAL) - msg = "[msg]" + msg = "[msg]" + if(WOUND_SEVERITY_LOSS) + msg = "[victim.p_their(TRUE)] [limb.name] [description]." // different format + msg = "[msg]" return "\t[msg]" /// Whether a scar can currently be seen by the viewer @@ -117,12 +130,12 @@ if(!ishuman(victim) || isobserver(viewer) || victim == viewer) return TRUE - var/mob/living/carbon/human/H = victim + var/mob/living/carbon/human/human_victim = victim if(istype(limb, /obj/item/bodypart/head)) - if((H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE)) || (H.head && (H.head.flags_inv & HIDEFACE))) + if((human_victim.wear_mask && (human_victim.wear_mask.flags_inv & HIDEFACE)) || (human_victim.head && (human_victim.head.flags_inv & HIDEFACE))) return FALSE else if(limb.scars_covered_by_clothes) - var/num_covers = LAZYLEN(H.clothingonpart(limb)) + var/num_covers = LAZYLEN(human_victim.clothingonpart(limb)) if(num_covers + get_dist(viewer, victim) >= visibility) return FALSE @@ -131,4 +144,9 @@ /// Used to format a scar to safe in preferences for persistent scars /datum/scar/proc/format() if(!fake) - return "[limb.body_zone]|[description]|[precise_location]|[severity]" + return "[SCAR_CURRENT_VERSION]|[limb.body_zone]|[description]|[precise_location]|[severity]" + +/// Used to format a scar to safe in preferences for persistent scars +/datum/scar/proc/format_amputated(body_zone) + description = pick(list("is several skintone shades paler than the rest of the body", "is a gruesome patchwork of artificial flesh", "has a large series of attachment scars at the articulation points")) + return "[SCAR_CURRENT_VERSION]|[body_zone]|[description]|amputated|[WOUND_SEVERITY_LOSS]" diff --git a/code/datums/wounds/cuts.dm b/code/datums/wounds/slash.dm similarity index 60% rename from code/datums/wounds/cuts.dm rename to code/datums/wounds/slash.dm index 5f9d7542386..dc037f9494e 100644 --- a/code/datums/wounds/cuts.dm +++ b/code/datums/wounds/slash.dm @@ -3,15 +3,15 @@ Cuts */ -/datum/wound/brute/cut +/datum/wound/slash sound_effect = 'sound/weapons/slice.ogg' processes = TRUE - wound_type = WOUND_LIST_CUT - treatable_by = list(/obj/item/stack/medical/suture, /obj/item/stack/medical/gauze) + wound_type = WOUND_SLASH + treatable_by = list(/obj/item/stack/medical/suture) treatable_by_grabbed = list(/obj/item/gun/energy/laser) treatable_tool = TOOL_CAUTERY - treat_priority = TRUE base_treat_time = 3 SECONDS + wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE) /// How much blood we start losing when this wound is first applied var/initial_flow @@ -27,75 +27,82 @@ var/max_per_type /// The maximum flow we've had so far var/highest_flow - /// How much flow we've already cauterized - var/cauterized - /// How much flow we've already sutured - var/sutured - /// The current bandage we have for this wound (maybe move bandages to the limb?) - var/obj/item/stack/current_bandage /// A bad system I'm using to track the worst scar we earned (since we can demote, we want the biggest our wound has been, not what it was when it was cured (probably moderate)) var/datum/scar/highest_scar -/datum/wound/brute/cut/wound_injury(datum/wound/brute/cut/old_wound = null) +/datum/wound/slash/wound_injury(datum/wound/slash/old_wound = null) blood_flow = initial_flow if(old_wound) blood_flow = max(old_wound.blood_flow, initial_flow) if(old_wound.severity > severity && old_wound.highest_scar) highest_scar = old_wound.highest_scar old_wound.highest_scar = null - if(old_wound.current_bandage) - current_bandage = old_wound.current_bandage - old_wound.current_bandage = null if(!highest_scar) highest_scar = new highest_scar.generate(limb, src, add_to_scars=FALSE) -/datum/wound/brute/cut/remove_wound(ignore_limb, replaced) +/datum/wound/slash/remove_wound(ignore_limb, replaced) if(!replaced && highest_scar) already_scarred = TRUE highest_scar.lazy_attach(limb) return ..() -/datum/wound/brute/cut/get_examine_description(mob/user) - if(!current_bandage) +/datum/wound/slash/get_examine_description(mob/user) + if(!limb.current_gauze) return ..() - var/bandage_condition = "" + var/list/msg = list("The cuts on [victim.p_their()] [limb.name] are wrapped with") // how much life we have left in these bandages - switch(current_bandage.absorption_capacity) + switch(limb.current_gauze.absorption_capacity) if(0 to 1.25) - bandage_condition = "nearly ruined " + msg += "nearly ruined " if(1.25 to 2.75) - bandage_condition = "badly worn " + msg += "badly worn " if(2.75 to 4) - bandage_condition = "slightly bloodied " + msg += "slightly bloodied " if(4 to INFINITY) - bandage_condition = "clean " - return "The cuts on [victim.p_their()] [limb.name] are wrapped with [bandage_condition] [current_bandage.name]!" + msg += "clean " + msg += "[limb.current_gauze.name]!" -/datum/wound/brute/cut/receive_damage(wounding_type, wounding_dmg, wound_bonus) - if(victim.stat != DEAD && wounding_type == WOUND_SHARP) // can't stab dead bodies to make it bleed faster this way + return "[msg.Join()]" + +/datum/wound/slash/receive_damage(wounding_type, wounding_dmg, wound_bonus) + if(victim.stat != DEAD && wound_bonus != CANT_WOUND && wounding_type == WOUND_SLASH) // can't stab dead bodies to make it bleed faster this way blood_flow += 0.05 * wounding_dmg -/datum/wound/brute/cut/handle_process() - blood_flow = min(blood_flow, WOUND_CUT_MAX_BLOODFLOW) +/datum/wound/slash/drag_bleed_amount() + // say we have 3 severe cuts with 3 blood flow each, pretty reasonable + // compare with being at 100 brute damage before, where you bled (brute/100 * 2), = 2 blood per tile + var/bleed_amt = min(blood_flow * 0.1, 1) // 3 * 3 * 0.1 = 0.9 blood total, less than before! the share here is .3 blood of course. - if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/toxin/heparin)) + if(limb.current_gauze) // gauze stops all bleeding from dragging on this limb, but wears the gauze out quicker + limb.seep_gauze(bleed_amt * 0.33) + return + + return bleed_amt + +/datum/wound/slash/handle_process() + if(victim.stat == DEAD) + blood_flow -= max(clot_rate, WOUND_SLASH_DEAD_CLOT_MIN) + if(blood_flow < minimum_flow) + if(demotes_to) + replace_wound(demotes_to) + return + qdel(src) + return + + blood_flow = min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW) + + if(victim.reagents?.has_reagent(/datum/reagent/toxin/heparin)) blood_flow += 0.5 // old herapin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first - else if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/medicine/coagulant)) - blood_flow -= 0.25 - if(current_bandage) + if(limb.current_gauze) if(clot_rate > 0) blood_flow -= clot_rate - blood_flow -= current_bandage.absorption_rate - current_bandage.absorption_capacity -= current_bandage.absorption_rate - if(current_bandage.absorption_capacity < 0) - victim.visible_message("Blood soaks through \the [current_bandage] on [victim]'s [limb.name].", "Blood soaks through \the [current_bandage] on your [limb.name].", vision_distance=COMBAT_MESSAGE_RANGE) - QDEL_NULL(current_bandage) - treat_priority = TRUE + blood_flow -= limb.current_gauze.absorption_rate + limb.seep_gauze(limb.current_gauze.absorption_rate) else blood_flow -= clot_rate @@ -109,23 +116,30 @@ to_chat(victim, "The cut on your [limb.name] has stopped bleeding!") qdel(src) + +/datum/wound/slash/on_stasis() + if(blood_flow >= minimum_flow) + return + if(demotes_to) + replace_wound(demotes_to) + return + qdel(src) + /* BEWARE, THE BELOW NONSENSE IS MADNESS. bones.dm looks more like what I have in mind and is sufficiently clean, don't pay attention to this messiness */ -/datum/wound/brute/cut/check_grab_treatments(obj/item/I, mob/user) +/datum/wound/slash/check_grab_treatments(obj/item/I, mob/user) if(istype(I, /obj/item/gun/energy/laser)) return TRUE -/datum/wound/brute/cut/treat(obj/item/I, mob/user) +/datum/wound/slash/treat(obj/item/I, mob/user) if(istype(I, /obj/item/gun/energy/laser)) las_cauterize(I, user) else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature() > 300) tool_cauterize(I, user) - else if(istype(I, /obj/item/stack/medical/gauze)) - bandage(I, user) else if(istype(I, /obj/item/stack/medical/suture)) suture(I, user) -/datum/wound/brute/cut/try_handling(mob/living/carbon/human/user) +/datum/wound/slash/try_handling(mob/living/carbon/human/user) if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB) return FALSE @@ -136,11 +150,23 @@ return TRUE /// if a felinid is licking this cut to reduce bleeding -/datum/wound/brute/cut/proc/lick_wounds(mob/living/carbon/human/user) +/datum/wound/slash/proc/lick_wounds(mob/living/carbon/human/user) if(INTERACTING_WITH(user, victim)) to_chat(user, "You're already interacting with [victim]!") return + if(user.is_mouth_covered()) + to_chat(user, "Your mouth is covered, you can't lick [victim]'s wounds!") + return + + if(!user.getorganslot(ORGAN_SLOT_TONGUE)) + to_chat(user, "You can't lick wounds without a tongue!") // f in chat + return + + // transmission is one way patient -> felinid since google said cat saliva is antiseptic or whatever, and also because felinids are already risking getting beaten for this even without people suspecting they're spreading a deathvirus + for(var/datum/disease/D in victim.diseases) + user.ForceContractDisease(D) + user.visible_message("[user] begins licking the wounds on [victim]'s [limb.name].", "You begin licking the wounds on [victim]'s [limb.name]...", ignored_mobs=victim) to_chat(victim, "[user] begins to lick the wounds on your [limb.name].You successfully lower the severity of [victim]'s cuts.") -/datum/wound/brute/cut/on_xadone(power) +/datum/wound/slash/on_xadone(power) . = ..() blood_flow -= 0.03 * power // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort +/datum/wound/slash/on_synthflesh(power) + . = ..() + blood_flow -= 0.075 * power // 20u * 0.075 = -1.5 blood flow, pretty good for how little effort it is + /// If someone's putting a laser gun up to our cut to cauterize it -/datum/wound/brute/cut/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user) +/datum/wound/slash/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user) var/self_penalty_mult = (user == victim ? 1.25 : 1) user.visible_message("[user] begins aiming [lasgun] directly at [victim]'s [limb.name]...", "You begin aiming [lasgun] directly at [user == victim ? "your" : "[victim]'s"] [limb.name]...") if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) @@ -172,11 +202,10 @@ return victim.emote("scream") blood_flow -= damage / (5 * self_penalty_mult) // 20 / 5 = 4 bloodflow removed, p good - cauterized += damage / (5 * self_penalty_mult) victim.visible_message("The cuts on [victim]'s [limb.name] scar over!") /// If someone is using either a cautery tool or something with heat to cauterize this cut -/datum/wound/brute/cut/proc/tool_cauterize(obj/item/I, mob/user) +/datum/wound/slash/proc/tool_cauterize(obj/item/I, mob/user) var/self_penalty_mult = (user == victim ? 1.5 : 1) user.visible_message("[user] begins cauterizing [victim]'s [limb.name] with [I]...", "You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) @@ -188,7 +217,6 @@ victim.emote("scream") var/blood_cauterized = (0.6 / self_penalty_mult) blood_flow -= blood_cauterized - cauterized += blood_cauterized if(blood_flow > minimum_flow) try_treating(I, user) @@ -196,15 +224,15 @@ to_chat(user, "You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.") /// If someone is using a suture to close this cut -/datum/wound/brute/cut/proc/suture(obj/item/stack/medical/suture/I, mob/user) +/datum/wound/slash/proc/suture(obj/item/stack/medical/suture/I, mob/user) var/self_penalty_mult = (user == victim ? 1.4 : 1) user.visible_message("[user] begins stitching [victim]'s [limb.name] with [I]...", "You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") + if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) return user.visible_message("[user] stitches up some of the bleeding on [victim].", "You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"].") var/blood_sutured = I.stop_bleeding / self_penalty_mult blood_flow -= blood_sutured - sutured += blood_sutured limb.heal_damage(I.heal_brute, I.heal_burn) if(blood_flow > minimum_flow) @@ -212,51 +240,31 @@ else if(demotes_to) to_chat(user, "You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.") -/// If someone is using gauze on this cut -/datum/wound/brute/cut/proc/bandage(obj/item/stack/I, mob/user) - if(current_bandage) - if(current_bandage.absorption_capacity > I.absorption_capacity + 1) - to_chat(user, "The [current_bandage] on [victim]'s [limb.name] is still in better condition than your [I.name]!") - return - else - user.visible_message("[user] begins rewrapping the cuts on [victim]'s [limb.name] with [I]...", "You begin rewrapping the cuts on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") - else - user.visible_message("[user] begins wrapping the cuts on [victim]'s [limb.name] with [I]...", "You begin wrapping the cuts on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") - if(!do_after(user, base_treat_time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) - return - user.visible_message("[user] applies [I] to [victim]'s [limb.name].", "You bandage some of the bleeding on [user == victim ? "yourself" : "[victim]"].") - QDEL_NULL(current_bandage) - current_bandage = new I.type(limb) - current_bandage.amount = 1 - treat_priority = FALSE - I.use(1) - - -/datum/wound/brute/cut/moderate +/datum/wound/slash/moderate name = "Rough Abrasion" desc = "Patient's skin has been badly scraped, generating moderate blood loss." treat_text = "Application of clean bandages or first-aid grade sutures, followed by food and rest." examine_desc = "has an open cut" occur_text = "is cut open, slowly leaking blood" - sound_effect = 'sound/effects/blood1.ogg' + sound_effect = 'sound/effects/wounds/blood1.ogg' severity = WOUND_SEVERITY_MODERATE initial_flow = 2 minimum_flow = 0.5 max_per_type = 3 - clot_rate = 0.15 + clot_rate = 0.12 threshold_minimum = 20 threshold_penalty = 10 - status_effect_type = /datum/status_effect/wound/cut/moderate - scarring_descriptions = list("light, faded lines", "minor cut marks", "a small faded slit", "a series of small scars") + status_effect_type = /datum/status_effect/wound/slash/moderate + scar_keyword = "slashmoderate" -/datum/wound/brute/cut/severe +/datum/wound/slash/severe name = "Open Laceration" desc = "Patient's skin is ripped clean open, allowing significant blood loss." treat_text = "Speedy application of first-aid grade sutures and clean bandages, followed by vitals monitoring to ensure recovery." examine_desc = "has a severe cut" occur_text = "is ripped open, veins spurting blood" - sound_effect = 'sound/effects/blood2.ogg' + sound_effect = 'sound/effects/wounds/blood2.ogg' severity = WOUND_SEVERITY_SEVERE initial_flow = 3.25 minimum_flow = 2.75 @@ -264,17 +272,17 @@ max_per_type = 4 threshold_minimum = 50 threshold_penalty = 25 - demotes_to = /datum/wound/brute/cut/moderate - status_effect_type = /datum/status_effect/wound/cut/severe - scarring_descriptions = list("a twisted line of faded gashes", "a gnarled sickle-shaped slice scar", "a long-faded puncture wound") + demotes_to = /datum/wound/slash/moderate + status_effect_type = /datum/status_effect/wound/slash/severe + scar_keyword = "slashsevere" -/datum/wound/brute/cut/critical +/datum/wound/slash/critical name = "Weeping Avulsion" desc = "Patient's skin is completely torn open, along with significant loss of tissue. Extreme blood loss will lead to quick death without intervention." treat_text = "Immediate bandaging and either suturing or cauterization, followed by supervised resanguination." - examine_desc = "is spurting blood at an alarming rate" + examine_desc = "is carved down to the bone, spraying blood wildly" occur_text = "is torn open, spraying blood wildly" - sound_effect = 'sound/effects/blood3.ogg' + sound_effect = 'sound/effects/wounds/blood3.ogg' severity = WOUND_SEVERITY_CRITICAL initial_flow = 4.25 minimum_flow = 4 @@ -282,25 +290,7 @@ max_per_type = 5 threshold_minimum = 80 threshold_penalty = 40 - demotes_to = /datum/wound/brute/cut/severe - status_effect_type = /datum/status_effect/wound/cut/critical - scarring_descriptions = list("a winding path of very badly healed scar tissue", "a series of peaks and valleys along a gruesome line of cut scar tissue", "a grotesque snake of indentations and stitching scars") - -// TODO: see about moving dismemberment over to this, i'll have to add judging dismembering power/wound potential wrt item size i guess -/datum/wound/brute/cut/loss - name = "Dismembered" - desc = "oof ouch!!" - occur_text = "is violently dismembered!" - sound_effect = 'sound/effects/dismember.ogg' - viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - severity = WOUND_SEVERITY_LOSS - threshold_minimum = 180 - status_effect_type = null - -/datum/wound/brute/cut/loss/apply_wound(obj/item/bodypart/L, silent, datum/wound/brute/cut/old_wound, smited = FALSE) - if(!L.dismemberable) - qdel(src) - return - - L.dismember() - qdel(src) + demotes_to = /datum/wound/slash/severe + status_effect_type = /datum/status_effect/wound/slash/critical + scar_keyword = "slashcritical" + wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | MANGLES_FLESH) diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index 71453bc341c..97602c1ba21 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -29,7 +29,7 @@ /area/centcom/holding name = "Holding Facility" -/area/centcom/supplypod/fly_me_to_the_moon +/area/centcom/supplypod/supplypod_temp_holding name = "Supplypod Shipping lane" icon_state = "supplypod_flight" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 03486f0e995..bae6399e28d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -99,6 +99,20 @@ /// A luminescence-shifted value of the last color calculated for chatmessage overlays var/chat_color_darkened + ///Icon-smoothing behavior. + var/smoothing_flags = NONE + ///Smoothing variable + var/top_left_corner + ///Smoothing variable + var/top_right_corner + ///Smoothing variable + var/bottom_left_corner + ///Smoothing variable + var/bottom_right_corner + ///Type path list this atom can smooth with. If this is null and atom is smooth, it smooths only with itself. + var/list/canSmoothWith = null + + /** * Called when an atom is created in byond (built in engine proc) * @@ -237,6 +251,9 @@ targeted_by = null QDEL_NULL(light) + if(smoothing_flags & SMOOTH_QUEUED) + SSicon_smooth.remove_from_queues(src) + return ..() /atom/proc/handle_ricochet(obj/projectile/P) @@ -691,7 +708,7 @@ return list("UNKNOWN DNA" = "X*") /mob/living/silicon/get_blood_dna_list() - return list("MOTOR OIL" = "SAE 5W-30") //just a little flavor text. + return ///to add a mob's dna info into an object's blood_dna list. /atom/proc/transfer_mob_blood_dna(mob/living/L) @@ -916,8 +933,7 @@ ///Removes an instance of colour_type from the atom's atom_colours list /atom/proc/remove_atom_colour(colour_priority, coloration) if(!atom_colours) - atom_colours = list() - atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. + return if(colour_priority > atom_colours.len) return if(coloration && atom_colours[colour_priority] != coloration) @@ -928,10 +944,9 @@ ///Resets the atom's color to null, and then sets it to the highest priority colour available /atom/proc/update_atom_colour() - if(!atom_colours) - atom_colours = list() - atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. color = null + if(!atom_colours) + return for(var/C in atom_colours) if(islist(C)) var/list/L = C @@ -943,20 +958,23 @@ return -///Proc for being washed by a shower -/atom/proc/washed(var/atom/washer, wash_strength = CLEAN_WEAK) - SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, wash_strength) - remove_atom_colour(WASHABLE_COLOUR_PRIORITY) +/** + * Wash this atom + * + * This will clean it off any temporary stuff like blood. Override this in your item to add custom cleaning behavior. + * Returns true if any washing was necessary and thus performed + * Arguments: + * * clean_types: any of the CLEAN_ constants + */ +/atom/proc/wash(clean_types) + . = FALSE + if(SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, clean_types)) + . = TRUE - var/datum/component/radioactive/healthy_green_glow = GetComponent(/datum/component/radioactive) - if(!QDELETED(healthy_green_glow)) - healthy_green_glow.strength -= max(0, (healthy_green_glow.strength - (RAD_BACKGROUND_RADIATION * 2))) - if(healthy_green_glow.strength <= RAD_BACKGROUND_RADIATION) - qdel(healthy_green_glow) - - /// we got to return true because of mob code - /// and not all code that uses COMSIG_COMPONENT_CLEAN_ACT returns true half the time - return TRUE + // Basically "if has washable coloration" + if(length(atom_colours) >= WASHABLE_COLOUR_PRIORITY && atom_colours[WASHABLE_COLOUR_PRIORITY]) + remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + return TRUE /** * call back when a var is edited on this atom @@ -993,6 +1011,7 @@ VV_DROPDOWN_OPTION(VV_HK_ADD_REAGENT, "Add Reagent") VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EMP, "EMP Pulse") VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EXPLOSION, "Explosion") + VV_DROPDOWN_OPTION(VV_HK_RADIATE, "Radiate") /atom/vv_do_topic(list/href_list) . = ..() @@ -1033,6 +1052,10 @@ usr.client.cmd_admin_explosion(src) if(href_list[VV_HK_TRIGGER_EMP] && check_rights(R_FUN)) usr.client.cmd_admin_emp(src) + if(href_list[VV_HK_RADIATE] && check_rights(R_FUN)) + var/strength = input(usr, "Choose the radiation strength.", "Choose the strength.") as num|null + if(!isnull(strength)) + AddComponent(/datum/component/radioactive, strength, src) if(href_list[VV_HK_MODIFY_TRANSFORM] && check_rights(R_VAREDIT)) var/result = input(usr, "Choose the transformation to apply","Transform Mod") as null|anything in list("Scale","Translate","Rotate") var/matrix/M = transform @@ -1431,3 +1454,11 @@ */ /atom/proc/setClosed() return + +/** + * Used to attempt to charge an object with a payment component. + * + * Use this if an atom needs to attempt to charge another atom. + */ +/atom/proc/attempt_charge(var/atom/sender, var/atom/target, var/extra_fees = 0) + return SEND_SIGNAL(sender, COMSIG_OBJ_ATTEMPT_CHARGE, target, extra_fees) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 158fad6526c..3e9eade3782 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -51,6 +51,8 @@ ///Internal holder for emissive blocker object, do not use directly use blocks_emissive var/atom/movable/emissive_blocker/em_block + ///Used for the calculate_adjacencies proc for icon smoothing. + var/can_be_unanchored = FALSE /atom/movable/Initialize(mapload) . = ..() @@ -62,9 +64,47 @@ em_block = new(src, render_target) vis_contents += em_block -/atom/movable/Destroy() + +/atom/movable/Destroy(force) + QDEL_NULL(proximity_monitor) + QDEL_NULL(language_holder) QDEL_NULL(em_block) - return ..() + + unbuckle_all_mobs(force = TRUE) + + if(loc) + //Restore air flow if we were blocking it (movables with ATMOS_PASS_PROC will need to do this manually if necessary) + if(((CanAtmosPass == ATMOS_PASS_DENSITY && density) || CanAtmosPass == ATMOS_PASS_NO) && isturf(loc)) + CanAtmosPass = ATMOS_PASS_YES + air_update_turf(TRUE) + loc.handle_atom_del(src) + + // If we have opacity, make sure to tell (potentially) affected light sources. + if(opacity && isturf(loc)) + var/turf/turf_loc = loc + var/old_has_opaque_atom = turf_loc.has_opaque_atom + turf_loc.recalc_atom_opacity() + if(old_has_opaque_atom != turf_loc.has_opaque_atom) + turf_loc.reconsider_lights() + + invisibility = INVISIBILITY_ABSTRACT + + if(pulledby) + pulledby.stop_pulling() + + if(orbiting) + orbiting.end_orbit(src) + orbiting = null + + . = ..() + + for(var/movable_content in contents) + qdel(movable_content) + + LAZYCLEARLIST(client_mobs_in_contents) + + moveToNullspace() + /atom/movable/proc/update_emissive_block() if(blocks_emissive != EMISSIVE_BLOCK_GENERIC) @@ -127,6 +167,9 @@ if((var_name in careful_edits) && (var_value % world.icon_size) != 0) return FALSE switch(var_name) + if(NAMEOF(src, anchored)) + set_anchored(var_value) + return TRUE if(NAMEOF(src, x)) var/turf/T = locate(var_value, y, z) if(T) @@ -396,30 +439,6 @@ return TRUE -/atom/movable/Destroy(force) - QDEL_NULL(proximity_monitor) - QDEL_NULL(language_holder) - - unbuckle_all_mobs(force=1) - - . = ..() - if(loc) - //Restore air flow if we were blocking it (movables with ATMOS_PASS_PROC will need to do this manually if necessary) - if(((CanAtmosPass == ATMOS_PASS_DENSITY && density) || CanAtmosPass == ATMOS_PASS_NO) && isturf(loc)) - CanAtmosPass = ATMOS_PASS_YES - air_update_turf(TRUE) - loc.handle_atom_del(src) - for(var/atom/movable/AM in contents) - qdel(AM) - LAZYCLEARLIST(client_mobs_in_contents) - moveToNullspace() - invisibility = INVISIBILITY_ABSTRACT - if(pulledby) - pulledby.stop_pulling() - - if(orbiting) - orbiting.end_orbit(src) - orbiting = null // Make sure you know what you're doing if you call this, this is intended to only be called by byond directly. // You probably want CanPass() @@ -456,6 +475,15 @@ return A.Bumped(src) +///Sets the anchored var and returns if it was sucessfully changed or not. +/atom/movable/proc/set_anchored(anchorvalue) + SHOULD_CALL_PARENT(TRUE) + if(anchored == anchorvalue) + return + . = anchored + anchored = anchorvalue + SEND_SIGNAL(src, COMSIG_MOVABLE_SET_ANCHORED, anchorvalue) + /atom/movable/proc/forceMove(atom/destination) . = FALSE if(destination) @@ -635,7 +663,7 @@ else target_zone = thrower.zone_selected - var/datum/thrownthing/TT = new(src, target, get_turf(target), get_dir(src, target), range, speed, thrower, diagonals_first, force, gentle, callback, thrower, target_zone) + var/datum/thrownthing/TT = new(src, target, get_turf(target), get_dir(src, target), range, speed, thrower, diagonals_first, force, gentle, callback, target_zone) var/dist_x = abs(target.x - src.x) var/dist_y = abs(target.y - src.y) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 5c8bcaffc0b..3863fcc991e 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -460,6 +460,16 @@ else holder.icon_state = "" +/mob/living/simple_animal/bot/mulebot/proc/diag_hud_set_mulebotcell() + var/image/holder = hud_list[DIAG_BATT_HUD] + var/icon/I = icon(icon, icon_state, dir) + holder.pixel_y = I.Height() - world.icon_size + if(cell) + var/chargelvl = (cell.charge/cell.maxcharge) + holder.icon_state = "hudbatt[RoundDiagBar(chargelvl)]" + else + holder.icon_state = "hudnobatt" + /*~~~~~~~~~~~~ Airlocks! ~~~~~~~~~~~~~*/ diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 8a821edffb8..ae55a648b30 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -64,7 +64,7 @@ hitsound = null attack_verb_on = list("slipped") clumsy_check = FALSE - sharpness = IS_BLUNT + sharpness = SHARP_NONE sword_color = "yellow" heat = 0 light_color = "#ffff00" diff --git a/code/game/gamemodes/sandbox/airlock_maker.dm b/code/game/gamemodes/sandbox/airlock_maker.dm index ddb622ab08c..eca72611d31 100644 --- a/code/game/gamemodes/sandbox/airlock_maker.dm +++ b/code/game/gamemodes/sandbox/airlock_maker.dm @@ -28,7 +28,7 @@ /datum/airlock_maker/New(var/atom/target_loc) linked = new(target_loc) linked.maker = src - linked.anchored = FALSE + linked.set_anchored(FALSE) access_used = list() interact() diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 394f39f250f..a508b8e8e10 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -409,7 +409,7 @@ Class Procs: /obj/machinery/proc/spawn_frame(disassembled) var/obj/structure/frame/machine/M = new /obj/structure/frame/machine(loc) . = M - M.setAnchored(anchored) + M.set_anchored(anchored) if(!disassembled) M.obj_integrity = M.max_integrity * 0.5 //the frame is already half broken transfer_fingerprints_to(M) @@ -482,7 +482,7 @@ Class Procs: //as long as we're the same anchored state and we're either on a floor or are anchored, toggle our anchored state if(I.use_tool(src, user, time, extra_checks = CALLBACK(src, .proc/unfasten_wrench_check, prev_anchored, user))) to_chat(user, "You [anchored ? "un" : ""]secure [src].") - setAnchored(!anchored) + set_anchored(!anchored) playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) SEND_SIGNAL(src, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, anchored) return SUCCESSFUL_UNFASTEN diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index fa3ccf256de..251f51e26df 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -126,7 +126,7 @@ if(W.tool_behaviour == TOOL_WELDER) if(weld(W, user)) to_chat(user, "You weld [src] securely into place.") - setAnchored(TRUE) + set_anchored(TRUE) state = STATE_WELDED return @@ -146,7 +146,7 @@ if(weld(W, user)) to_chat(user, "You unweld [src] from its place.") state = STATE_WRENCHED - setAnchored(TRUE) + set_anchored(TRUE) return if(STATE_WIRED) // Upgrades! diff --git a/code/game/machinery/civilian_bountys.dm b/code/game/machinery/civilian_bountys.dm new file mode 100644 index 00000000000..060f9591fcb --- /dev/null +++ b/code/game/machinery/civilian_bountys.dm @@ -0,0 +1,230 @@ +///Pad for the Civilian Bounty Control. +/obj/machinery/piratepad/civilian + name = "civilian bounty pad" + desc = "A machine designed to send civilian bounty targets to centcom." + layer = TABLE_LAYER + +///Computer for assigning new civilian bounties, and sending bounties for collection. +/obj/machinery/computer/piratepad_control/civilian + name = "civilian bounty control terminal" + desc = "A console for assigning civilian bounties to inserted ID cards, and for controlling the bounty pad for export." + status_report = "Ready for delivery." + icon_screen = "civ_bounty" + icon_keyboard = "id_key" + warmup_time = 3 SECONDS + var/obj/item/card/id/inserted_scan_id + +/obj/machinery/computer/piratepad_control/civilian/Initialize() + . = ..() + pad = /obj/machinery/piratepad/civilian + +/obj/machinery/computer/piratepad_control/civilian/attackby(obj/item/I, mob/living/user, params) + . = ..() + if(isidcard(I)) + if(id_insert(user, I, inserted_scan_id)) + inserted_scan_id = I + return TRUE + +/obj/machinery/computer/piratepad_control/multitool_act(mob/living/user, obj/item/multitool/I) + if(istype(I) && istype(I.buffer,/obj/machinery/piratepad/civilian)) + to_chat(user, "You link [src] with [I.buffer] in [I] buffer.") + pad = I.buffer + return TRUE + +/obj/machinery/computer/piratepad_control/civilian/LateInitialize() + . = ..() + if(cargo_hold_id) + for(var/obj/machinery/piratepad/civilian/C in GLOB.machines) + if(C.cargo_hold_id == cargo_hold_id) + pad = C + return + else + pad = locate() in range(4,src) + +/obj/machinery/computer/piratepad_control/civilian/recalc() + if(sending) + return FALSE + if(!inserted_scan_id) + status_report = "Please insert your ID first." + playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) + return FALSE + if(!inserted_scan_id.registered_account.civilian_bounty) + status_report = "Please accept a new civilian bounty first." + playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) + return FALSE + status_report = "Civilian Bounty: " + for(var/atom/movable/AM in get_turf(pad)) + if(AM == pad) + continue + if(inserted_scan_id.registered_account.civilian_bounty.applies_to(AM)) + status_report += "Target Applicable." + playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE) + return + status_report += "Not Applicable." + playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) + +/** + * This fully rewrites base behavior in order to only check for bounty objects, and nothing else. + */ +/obj/machinery/computer/piratepad_control/civilian/send() + playsound(loc, 'sound/machines/wewewew.ogg', 70, TRUE) + if(!sending) + return + if(!inserted_scan_id) + stop_sending() + return FALSE + if(!inserted_scan_id.registered_account.civilian_bounty) + stop_sending() + return FALSE + var/datum/bounty/curr_bounty = inserted_scan_id.registered_account.civilian_bounty + var/active_stack = 0 + var/datum/bank_account/dept_account = SSeconomy.get_dep_account(inserted_scan_id.registered_account.account_job.paycheck_department) + if(!dept_account?.has_money(curr_bounty.reward)) + playsound(loc, 'sound/machines/synth_no.ogg', 50 , TRUE) + stop_sending("Not enough funds to submit bounty at this time, please try again later.") + return FALSE + for(var/atom/movable/AM in get_turf(pad)) + if(AM == pad) + continue + if(curr_bounty.applies_to(AM)) + active_stack ++ + curr_bounty.ship(AM) + qdel(AM) + if(active_stack >= 1) + status_report += "Bounty Target Found x[active_stack]. " + else + status_report = "No applicable targets found. Aborting." + stop_sending() + if(curr_bounty.can_claim()) + //Pay for the bounty with the ID's department funds. + inserted_scan_id.registered_account.transfer_money(dept_account, curr_bounty.reward) + status_report += "Bounty Completed! [curr_bounty.reward] credits have been paid out. " + inserted_scan_id.registered_account.reset_bounty() + pad.visible_message("[pad] activates!") + flick(pad.sending_state,pad) + pad.icon_state = pad.idle_state + playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE) + sending = FALSE + +/obj/machinery/computer/piratepad_control/civilian/AltClick(mob/user) + . = ..() + id_eject(user, inserted_scan_id) + +/obj/machinery/computer/piratepad_control/civilian/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "CivCargoHoldTerminal", name) + ui.open() + +/obj/machinery/computer/piratepad_control/civilian/ui_data(mob/user) + var/list/data = list() + data["points"] = points + data["pad"] = pad ? TRUE : FALSE + data["sending"] = sending + data["status_report"] = status_report + data["id_inserted"] = inserted_scan_id + if(inserted_scan_id && inserted_scan_id.registered_account) + data["id_bounty_info"] = inserted_scan_id.registered_account.bounty_text() + data["id_bounty_num"] = inserted_scan_id.registered_account.bounty_num() + data["id_bounty_value"] = inserted_scan_id.registered_account.bounty_value() + return data + +/obj/machinery/computer/piratepad_control/civilian/ui_act(action, params) + if(..()) + return + if(!pad) + return + if(!usr.canUseTopic(src, BE_CLOSE)) + return + switch(action) + if("recalc") + recalc() + if("send") + start_sending() + if("stop") + stop_sending() + if("bounty") + if(!inserted_scan_id || !inserted_scan_id.registered_account) + return + var/datum/bank_account/pot_acc = inserted_scan_id.registered_account + if(pot_acc.civilian_bounty && ((world.time) < pot_acc.bounty_timer + 5 MINUTES)) + var/curr_time = round(((pot_acc.bounty_timer + (5 MINUTES))-world.time)/ (1 MINUTES), 0.01) + to_chat(usr, "You already have an incomplete civilian bounty, try again in [curr_time] minutes to replace it!") + return FALSE + var/datum/bounty/crumbs = random_bounty(pot_acc.account_job.bounty_types) //It's a good scene from War Dogs (2016). + if(SSeconomy.inflation_value() > 1) + if(istype(crumbs, /datum/bounty/item)) + var/datum/bounty/item/items = crumbs + items.required_count = max(round((items.required_count)/(SSeconomy.inflation_value()*2)), 1) + if(istype(crumbs, /datum/bounty/reagent)) + var/datum/bounty/reagent/chems = crumbs + chems.required_volume = max(round((chems.required_volume)/SSeconomy.inflation_value()*2), 1) + crumbs.reward = round(crumbs.reward/(SSeconomy.inflation_value()*2)) + pot_acc.bounty_timer = world.time + pot_acc.civilian_bounty = crumbs + if("eject") + id_eject(usr, inserted_scan_id) + . = TRUE + +///Self explanitory, holds the ID card inthe console for bounty payout and manipulation. +/obj/machinery/computer/piratepad_control/civilian/proc/id_insert(mob/user, obj/item/inserting_item, obj/item/target) + var/obj/item/card/id/card_to_insert = inserting_item + var/holder_item = FALSE + + if(!isidcard(card_to_insert)) + card_to_insert = inserting_item.RemoveID() + holder_item = TRUE + + if(!card_to_insert || !user.transferItemToLoc(card_to_insert, src)) + return FALSE + + if(target) + if(holder_item && inserting_item.InsertID(target)) + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + else + id_eject(user, target) + + user.visible_message("[user] inserts \the [card_to_insert] into \the [src].", + "You insert \the [card_to_insert] into \the [src].") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + updateUsrDialog() + return TRUE + +///Removes A stored ID card. +/obj/machinery/computer/piratepad_control/civilian/proc/id_eject(mob/user, obj/target) + if(!target) + to_chat(user, "That slot is empty!") + return FALSE + else + target.forceMove(drop_location()) + if(!issilicon(user) && Adjacent(user)) + user.put_in_hands(target) + user.visible_message("[user] gets \the [target] from \the [src].", \ + "You get \the [target] from \the [src].") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + inserted_scan_id = null + updateUsrDialog() + return TRUE + + +///Beacon to launch a new bounty setup when activated. +/obj/item/civ_bounty_beacon + name = "civilian bounty beacon" + desc = "N.T. approved civilian bounty beacon, toss it down and you will have a bounty pad and computer delivered to you." + icon = 'icons/obj/objects.dmi' + icon_state = "floor_beacon" + var/uses = 2 + +/obj/item/civ_bounty_beacon/attack_self() + loc.visible_message("\The [src] begins to beep loudly!") + addtimer(CALLBACK(src, .proc/launch_payload), 4 SECONDS) + +/obj/item/civ_bounty_beacon/proc/launch_payload() + playsound(src, "sparks", 80, TRUE) + switch(uses) + if(2) + new /obj/machinery/piratepad/civilian(drop_location()) + if(1) + new /obj/machinery/computer/piratepad_control/civilian(drop_location()) + qdel(src) + uses = uses - 1 diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index 549dc40e7c1..e3c3b0966cd 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -100,7 +100,7 @@ var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc) A.setDir(dir) A.circuit = circuit - A.setAnchored(TRUE) + A.set_anchored(TRUE) if(machine_stat & BROKEN) if(user) to_chat(user, "The broken glass falls out.") diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 5de7edc5410..72c2c5a935a 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -62,10 +62,9 @@ /obj/machinery/computer/aifixer/proc/Fix() use_power(1000) - occupier.adjustOxyLoss(-5, 0) - occupier.adjustFireLoss(-5, 0) - occupier.adjustToxLoss(-5, 0) - occupier.adjustBruteLoss(-5, 0) + occupier.adjustOxyLoss(-5, FALSE) + occupier.adjustFireLoss(-5, FALSE) + occupier.adjustBruteLoss(-5, FALSE) occupier.updatehealth() if(occupier.health >= 0 && occupier.stat == DEAD) occupier.revive(full_heal = FALSE, admin_revive = FALSE) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 002fabb9f8b..640c2abae2a 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -9,6 +9,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/item/storage/box/fakesyndiesuit = 2, /obj/item/storage/crayons = 2, /obj/item/toy/spinningtoy = 2, + /obj/item/toy/balloon/arrest = 2, /obj/item/toy/prize/ripley = 1, /obj/item/toy/prize/fireripley = 1, /obj/item/toy/prize/deathripley = 1, diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 24f26f80410..4aa36f998c6 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -11,7 +11,7 @@ to_chat(user, "You start wrenching the frame into place...") if(P.use_tool(src, user, 20, volume=50)) to_chat(user, "You wrench the frame into place.") - setAnchored(TRUE) + set_anchored(TRUE) state = 1 return if(P.tool_behaviour == TOOL_WELDER) @@ -30,7 +30,7 @@ to_chat(user, "You start to unfasten the frame...") if(P.use_tool(src, user, 20, volume=50)) to_chat(user, "You unfasten the frame.") - setAnchored(FALSE) + set_anchored(FALSE) state = 0 return if(istype(P, /obj/item/circuitboard/computer) && !circuit) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 9293e9c8e76..f196fc6dc77 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -106,7 +106,7 @@ if(P.use_tool(src, user, 40, volume=75)) if(state == 1) to_chat(user, "You [anchored ? "un" : ""]secure [src].") - setAnchored(!anchored) + set_anchored(!anchored) return if(2) @@ -114,7 +114,7 @@ to_chat(user, "You start [anchored ? "un" : ""]securing [src]...") if(P.use_tool(src, user, 40, volume=75)) to_chat(user, "You [anchored ? "un" : ""]secure [src].") - setAnchored(!anchored) + set_anchored(!anchored) return if(istype(P, /obj/item/circuitboard/machine)) @@ -172,7 +172,7 @@ to_chat(user, "You start [anchored ? "un" : ""]securing [src]...") if(P.use_tool(src, user, 40, volume=75)) to_chat(user, "You [anchored ? "un" : ""]secure [src].") - setAnchored(!anchored) + set_anchored(!anchored) return if(P.tool_behaviour == TOOL_SCREWDRIVER) @@ -187,7 +187,7 @@ if(new_machine.circuit) QDEL_NULL(new_machine.circuit) new_machine.circuit = circuit - new_machine.setAnchored(anchored) + new_machine.set_anchored(anchored) new_machine.on_construction() for(var/obj/O in new_machine.component_parts) qdel(O) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 4a1d449244a..8c90197d889 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -70,10 +70,10 @@ if(O.tool_behaviour == TOOL_WRENCH) if(!anchored && !isinspace()) to_chat(user,"You secure [src] to the floor.") - setAnchored(TRUE) + set_anchored(TRUE) else if(anchored) to_chat(user,"You unsecure and disconnect [src].") - setAnchored(FALSE) + set_anchored(FALSE) playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) return return ..() diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 3f50982e453..7d66cc0733a 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -107,7 +107,7 @@ pass_flags = LETPASSTHROW bar_material = SAND climbable = TRUE - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE canSmoothWith = list(/obj/structure/barricade/sandbags, /turf/closed/wall, /turf/closed/wall/r_wall, /obj/structure/falsewall, /obj/structure/falsewall/reinforced, /turf/closed/wall/rust, /turf/closed/wall/r_wall/rust, /obj/structure/barricade/security) diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 49b6463b1c1..735ce9fcf11 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -114,7 +114,7 @@ return TRUE -/obj/machinery/dna_scannernew/relaymove(mob/user as mob) +/obj/machinery/dna_scannernew/relaymove(mob/user) if(user.stat || locked) if(message_cooldown <= world.time) message_cooldown = world.time + 50 diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 7ebceb9d820..0a593a7d1fd 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1160,7 +1160,8 @@ /obj/machinery/door/airlock/emag_act(mob/user, obj/item/card/emag/doorjack/D) if(!operating && density && hasPower() && !(obj_flags & EMAGGED)) - D.use_charge(user) + if(istype(D, /obj/item/card/emag/doorjack)) + D.use_charge(user) operating = TRUE update_icon(AIRLOCK_EMAG, 1) sleep(6) @@ -1263,7 +1264,7 @@ A = new /obj/structure/door_assembly(loc) //If you come across a null assemblytype, it will produce the default assembly instead of disintegrating. A.heat_proof_finished = heat_proof //tracks whether there's rglass in - A.setAnchored(TRUE) + A.set_anchored(TRUE) A.glass = glass A.state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS A.created_name = name diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index c3a7e06586b..505aec3eac2 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -351,7 +351,8 @@ L.visible_message("[src] closes on [L], crushing [L.p_them()]!", "[src] closes on you and crushes you!") if(iscarbon(L)) var/mob/living/carbon/C = L - for(var/datum/wound/W in C.all_wounds) + for(var/i in C.all_wounds) // should probably replace with signal + var/datum/wound/W = i W.crush(DOOR_CRUSH_DAMAGE) if(isalien(L)) //For xenos L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans. diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 59018c13b98..f9429a546aa 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -248,7 +248,7 @@ if("rightsecure") WA.facing = "r" WA.secure = TRUE - WA.setAnchored(TRUE) + WA.set_anchored(TRUE) WA.state= "02" WA.setDir(dir) WA.ini_dir = dir diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 680a87b0637..a86a27d74b8 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -20,6 +20,7 @@ /obj/machinery/doppler_array/Initialize() . = ..() RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, .proc/sense_explosion) + RegisterSignal(src, COMSIG_MOVABLE_SET_ANCHORED, .proc/power_change) printer_ready = world.time + PRINTER_TIMEOUT /obj/machinery/doppler_array/ComponentInitialize() @@ -114,12 +115,10 @@ /obj/machinery/doppler_array/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_WRENCH) if(!anchored && !isinspace()) - anchored = TRUE - power_change() + set_anchored(TRUE) to_chat(user, "You fasten [src].") else if(anchored) - anchored = FALSE - power_change() + set_anchored(FALSE) to_chat(user, "You unfasten [src].") I.play_tool_sound(src) return diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 52172faf9d0..af9cdea2be8 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -117,28 +117,6 @@ recharge_sound = null recharge_message = null -/obj/machinery/drone_dispenser/swarmer - name = "swarmer fabricator" - desc = "An alien machine of unknown origin. It whirs and hums with green-blue light, the air above it shimmering." - icon = 'icons/obj/machines/gateway.dmi' - icon_state = "toffcenter" - icon_off = "toffcenter" - icon_on = "toffcenter" - icon_recharging = "toffcenter" - icon_creating = "offcenter" - metal_cost = 0 - glass_cost = 0 - cooldownTime = 300 //30 seconds - maximum_idle = 0 // Swarmers have no restraint - dispense_type = /obj/effect/mob_spawn/swarmer - begin_create_message = "hums softly as an interface appears above it, scrolling by at unreadable speed." - end_create_message = "materializes a strange shell, which drops to the ground." - recharging_text = "Its lights are slowly increasing in brightness." - work_sound = 'sound/effects/empulse.ogg' - create_sound = 'sound/effects/phasein.ogg' - break_sound = 'sound/effects/empulse.ogg' - break_message = "slowly falls dark, lights stuttering." - /obj/machinery/drone_dispenser/examine(mob/user) . = ..() if((mode == DRONE_RECHARGING) && !machine_stat && recharging_text) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index dcc36d24dbf..70692c75f81 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -174,13 +174,13 @@ if (!anchored && !isinspace()) to_chat(user, "[src] is now secured.") add_overlay("[base_state]-s") - setAnchored(TRUE) + set_anchored(TRUE) power_change() proximity_monitor.SetRange(range) else to_chat(user, "[src] can now be moved.") cut_overlays() - setAnchored(FALSE) + set_anchored(FALSE) power_change() proximity_monitor.SetRange(0) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 1f3edcfa4c7..e86c3f85cf9 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -84,7 +84,7 @@ Possible to do for anyone motivated enough: desc = "It's a floor-mounted device for projecting holographic images. This one will refuse to auto-connect incoming calls." secure = TRUE -obj/machinery/holopad/secure/Initialize() +/obj/machinery/holopad/secure/Initialize() . = ..() var/obj/item/circuitboard/machine/holopad/board = circuit board.secure = TRUE @@ -406,7 +406,7 @@ obj/machinery/holopad/secure/Initialize() Hologram.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it. Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. - Hologram.setAnchored(TRUE)//So space wind cannot drag it. + Hologram.set_anchored(TRUE)//So space wind cannot drag it. Hologram.name = "[user.name] (Hologram)"//If someone decides to right click. Hologram.set_light(2) //hologram lighting move_hologram() @@ -564,7 +564,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ holder.selected_language = record.language Hologram.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it. Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. - Hologram.setAnchored(TRUE)//So space wind cannot drag it. + Hologram.set_anchored(TRUE)//So space wind cannot drag it. Hologram.name = "[record.caller_name] (Hologram)"//If someone decides to right click. Hologram.set_light(2) //hologram lighting visible_message("A holographic image of [record.caller_name] flickers to life before your eyes!") diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 3b102edf999..91c188188ef 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -6,7 +6,7 @@ /obj/machinery/limbgrower name = "limb grower" - desc = "It grows new limbs using Synthflesh (Instabitaluri)." + desc = "It grows new limbs using Synthflesh." icon = 'icons/obj/machines/limbgrower.dmi' icon_state = "limbgrower_idleoff" density = TRUE @@ -98,10 +98,10 @@ return - var/synth_cost = being_built.reagents_list[/datum/reagent/medicine/c2/instabitaluri]*prod_coeff + var/synth_cost = being_built.reagents_list[/datum/reagent/medicine/c2/synthflesh]*prod_coeff var/power = max(2000, synth_cost/5) - if(reagents.has_reagent(/datum/reagent/medicine/c2/instabitaluri, being_built.reagents_list[/datum/reagent/medicine/c2/instabitaluri]*prod_coeff)) + if(reagents.has_reagent(/datum/reagent/medicine/c2/synthflesh, being_built.reagents_list[/datum/reagent/medicine/c2/synthflesh]*prod_coeff)) busy = TRUE use_power(power) flick("limbgrower_fill",src) @@ -115,8 +115,8 @@ return /obj/machinery/limbgrower/proc/build_item() - if(reagents.has_reagent(/datum/reagent/medicine/c2/instabitaluri, being_built.reagents_list[/datum/reagent/medicine/c2/instabitaluri]*prod_coeff)) //sanity check, if this happens we are in big trouble - reagents.remove_reagent(/datum/reagent/medicine/c2/instabitaluri,being_built.reagents_list[/datum/reagent/medicine/c2/instabitaluri]*prod_coeff) + if(reagents.has_reagent(/datum/reagent/medicine/c2/synthflesh, being_built.reagents_list[/datum/reagent/medicine/c2/synthflesh]*prod_coeff)) //sanity check, if this happens we are in big trouble + reagents.remove_reagent(/datum/reagent/medicine/c2/synthflesh,being_built.reagents_list[/datum/reagent/medicine/c2/synthflesh]*prod_coeff) var/buildpath = being_built.build_path if(ispath(buildpath, /obj/item/bodypart)) //This feels like spatgheti code, but i need to initilise a limb somehow build_limb(buildpath) @@ -124,7 +124,7 @@ //Just build whatever it is new buildpath(loc) else - src.visible_message("Something went very wrong, there isn't enough instabitaluri anymore!") + src.visible_message("Something went very wrong, there isn't enough synthflesh anymore!") busy = FALSE flick("limbgrower_unfill",src) icon_state = "limbgrower_idleoff" @@ -165,7 +165,7 @@ /obj/machinery/limbgrower/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Storing up to [reagents.maximum_volume]u of instabitaluri.
Instabitaluri consumption at [prod_coeff*100]%.
" + . += "The status display reads: Storing up to [reagents.maximum_volume]u of synthflesh.
Synthflesh consumption at [prod_coeff*100]%.
" /obj/machinery/limbgrower/proc/main_win(mob/user) var/dat = "

Limb Grower Menu:


" @@ -217,12 +217,12 @@ return dat /obj/machinery/limbgrower/proc/can_build(datum/design/D) - return (reagents.has_reagent(/datum/reagent/medicine/c2/instabitaluri, D.reagents_list[/datum/reagent/medicine/c2/instabitaluri]*prod_coeff)) //Return whether the machine has enough instabitaluri to produce the design + return (reagents.has_reagent(/datum/reagent/medicine/c2/synthflesh, D.reagents_list[/datum/reagent/medicine/c2/synthflesh]*prod_coeff)) //Return whether the machine has enough synthflesh to produce the design /obj/machinery/limbgrower/proc/get_design_cost(datum/design/D) var/dat - if(D.reagents_list[/datum/reagent/medicine/c2/instabitaluri]) - dat += "[D.reagents_list[/datum/reagent/medicine/c2/instabitaluri] * prod_coeff] SynthFlesh (instabitaluri)" + if(D.reagents_list[/datum/reagent/medicine/c2/synthflesh]) + dat += "[D.reagents_list[/datum/reagent/medicine/c2/synthflesh] * prod_coeff] SynthFlesh" return dat /obj/machinery/limbgrower/emag_act(mob/user) diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm index b474a80d7fe..77f35944433 100644 --- a/code/game/machinery/medical_kiosk.dm +++ b/code/game/machinery/medical_kiosk.dm @@ -29,35 +29,23 @@ /obj/machinery/medical_kiosk/Initialize() //loaded subtype for mapping use . = ..() + AddComponent(/datum/component/payment, active_price, SSeconomy.get_dep_account(ACCOUNT_MED), PAYMENT_FRIENDLY) scanner_wand = new/obj/item/scanner_wand(src) /obj/machinery/medical_kiosk/proc/inuse() //Verifies that the user can use the interface, followed by showing medical information. - if (pandemonium == TRUE) - active_price += (rand(10,30)) //The wheel of capitalism says health care ain't cheap. - if(!istype(C)) - say("No ID card detected.") // No unidentified crew. - return - if(C.registered_account) + if(C?.registered_account) account = C.registered_account - else - say("No account detected.") //No homeless crew. - return if(account?.account_job?.paycheck_department == payment_department) use_power(20) paying_customer = TRUE say("Hello, esteemed medical staff!") RefreshParts() return - if(!account.has_money(active_price)) - say("You do not possess the funds to purchase this.") //No jobless crew, either. + var/bonus_fee = pandemonium ? rand(10,30) : 0 + if(attempt_charge(src, H, bonus_fee) & COMPONENT_OBJ_CANCEL_CHARGE ) return - else - account.adjust_money(-active_price) - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_MED) - if(D) - D.adjust_money(active_price) - use_power(20) - paying_customer = TRUE + use_power(20) + paying_customer = TRUE icon_state = "kiosk_active" say("Thank you for your patronage!") RefreshParts() @@ -332,22 +320,26 @@ return switch(action) if("beginScan_1") - inuse() + if(!scan_active_1) + inuse() if(paying_customer == TRUE) scan_active_1 = TRUE paying_customer = FALSE if("beginScan_2") - inuse() + if(!scan_active_2) + inuse() if(paying_customer == TRUE) scan_active_2 = TRUE paying_customer = FALSE if("beginScan_3") - inuse() + if(!scan_active_3) + inuse() if(paying_customer == TRUE) scan_active_3 = TRUE paying_customer = FALSE if("beginScan_4") - inuse() + if(!scan_active_4) + inuse() if(paying_customer == TRUE) scan_active_4 = TRUE paying_customer = FALSE diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 3231e7a10df..a8e1a879254 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -299,7 +299,7 @@ //This code handles moving the turret around. After all, it's a portable turret! if(!anchored && !isinspace()) - setAnchored(TRUE) + set_anchored(TRUE) invisibility = INVISIBILITY_MAXIMUM update_icon() to_chat(user, "You secure the exterior bolts on the turret.") @@ -307,7 +307,7 @@ cover = new /obj/machinery/porta_turret_cover(loc) //create a new turret. While this is handled in process(), this is to workaround a bug where the turret becomes invisible for a split second cover.parent_turret = src //make the cover's parent src else if(anchored) - setAnchored(FALSE) + set_anchored(FALSE) to_chat(user, "You unsecure the exterior bolts on the turret.") power_change() invisibility = 0 diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index f2164d03bf3..3cf94c1a5e0 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -26,7 +26,7 @@ if(I.tool_behaviour == TOOL_WRENCH && !anchored) I.play_tool_sound(src, 100) to_chat(user, "You secure the external bolts.") - setAnchored(TRUE) + set_anchored(TRUE) build_step = PTURRET_BOLTED return @@ -51,7 +51,7 @@ else if(I.tool_behaviour == TOOL_WRENCH) I.play_tool_sound(src, 75) to_chat(user, "You unfasten the external bolts.") - setAnchored(FALSE) + set_anchored(FALSE) build_step = PTURRET_UNSECURED return diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index 0da5ba09fe6..9508f0158db 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -41,12 +41,12 @@ return if(!parent_turret.anchored) - parent_turret.setAnchored(TRUE) + parent_turret.set_anchored(TRUE) to_chat(user, "You secure the exterior bolts on the turret.") parent_turret.invisibility = 0 parent_turret.update_icon() else - parent_turret.setAnchored(FALSE) + parent_turret.set_anchored(FALSE) to_chat(user, "You unsecure the exterior bolts on the turret.") parent_turret.invisibility = INVISIBILITY_MAXIMUM parent_turret.update_icon() diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 06c91991d95..0ffed0d203e 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -57,7 +57,7 @@ if(charging) to_chat(user, "Remove the charging item first!") return - setAnchored(!anchored) + set_anchored(!anchored) power_change() to_chat(user, "You [anchored ? "attached" : "detached"] [src].") G.play_tool_sound(src) diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm index e217aea39de..b7f1b6fac7b 100644 --- a/code/game/machinery/roulette_machine.dm +++ b/code/game/machinery/roulette_machine.dm @@ -90,7 +90,7 @@ return switch(action) if("anchor") - anchored = !anchored + set_anchored(!anchored) . = TRUE if("ChangeBetAmount") chosen_bet_amount = clamp(text2num(params["amount"]), 10, 500) diff --git a/code/game/machinery/sheetifier.dm b/code/game/machinery/sheetifier.dm index 4728050b6bb..3d7299e8321 100644 --- a/code/game/machinery/sheetifier.dm +++ b/code/game/machinery/sheetifier.dm @@ -46,7 +46,7 @@ /obj/machinery/sheetifier/attackby(obj/item/I, mob/user, params) if(default_unfasten_wrench(user, I)) return - if(default_deconstruction_screwdriver(user, I)) + if(default_deconstruction_screwdriver(user, initial(icon_state), initial(icon_state), I)) update_icon() return if(default_deconstruction_crowbar(I)) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 9c6fa7c7b03..09fbfc48021 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -210,14 +210,14 @@ if(!anchored && !isinspace()) W.play_tool_sound(src, 100) to_chat(user, "You secure \the [src] to the floor!") - setAnchored(TRUE) + set_anchored(TRUE) else if(anchored) W.play_tool_sound(src, 100) to_chat(user, "You unsecure \the [src] from the floor!") if(active) to_chat(user, "\The [src] shuts off!") shields_down() - setAnchored(FALSE) + set_anchored(FALSE) else if(W.GetID()) if(allowed(user) && !(obj_flags & EMAGGED)) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index f7bf7ec4f89..0278cb49f59 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -296,11 +296,9 @@ if(occupant) things_to_clear += occupant things_to_clear += occupant.GetAllContents() - for(var/atom/movable/AM in things_to_clear) //Scorches away blood and forensic evidence, although the SSU itself is unaffected - SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG) - var/datum/component/radioactive/contamination = AM.GetComponent(/datum/component/radioactive) - if(contamination) - qdel(contamination) + for(var/am in things_to_clear) //Scorches away blood and forensic evidence, although the SSU itself is unaffected + var/atom/movable/dirty_movable = am + dirty_movable.wash(CLEAN_ALL) open_machine(FALSE) if(occupant) dump_contents() diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index bb2bb614c53..7bf0681ae9c 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -62,7 +62,7 @@ return if(anchored) - setAnchored(FALSE) + set_anchored(FALSE) to_chat(user, "You unbolt \the [src] from the floor and detach it from the cable.") disconnect_from_network() return @@ -70,7 +70,7 @@ if(!connect_to_network()) to_chat(user, "\The [src] must be placed over an exposed, powered cable node!") return - setAnchored(TRUE) + set_anchored(TRUE) to_chat(user, "You bolt \the [src] to the floor and attach it to the cable.") return else if(W.tool_behaviour == TOOL_SCREWDRIVER) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 48f7ae799c5..54f0643a89a 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -117,14 +117,14 @@ else to_chat(user, "You firmly wrench the bomb to the floor.") I.play_tool_sound(src) - setAnchored(TRUE) + set_anchored(TRUE) if(active) to_chat(user, "The bolts lock in place.") else if(!active) to_chat(user, "You wrench the bomb from the floor.") I.play_tool_sound(src) - setAnchored(FALSE) + set_anchored(FALSE) else to_chat(user, "The bolts are locked down!") diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 569b6ef534a..2ef00eac233 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -7,6 +7,8 @@ /obj/machinery/telecomms var/temp = "" // output message + var/tempfreq = FREQ_COMMON + var/mob/living/operator /obj/machinery/telecomms/attackby(obj/item/P, mob/user, params) @@ -27,74 +29,182 @@ else return ..() -/obj/machinery/telecomms/ui_interact(mob/user) - . = ..() - // You need a multitool to use this, or be silicon - if(!issilicon(user)) - // istype returns false if the value is null - if(!istype(user.get_active_held_item(), /obj/item/multitool)) +/obj/machinery/telecomms/ui_interact(mob/user, datum/tgui/ui) + operator = user + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Telecomms") + ui.open() + +/obj/machinery/telecomms/ui_data(mob/user) + var/list/data = list() + + data += add_option() + + data["minfreq"] = MIN_FREE_FREQ + data["maxfreq"] = MAX_FREE_FREQ + data["frequency"] = tempfreq + + var/obj/item/multitool/heldmultitool = get_multitool(user) + data["multitool"] = heldmultitool + + if(heldmultitool) + data["multibuff"] = heldmultitool.buffer + + data["toggled"] = toggled + data["id"] = id + data["network"] = network + data["prefab"] = autolinkers.len ? TRUE : FALSE + + var/list/linked = list() + var/i = 0 + data["linked"] = list() + for(var/obj/machinery/telecomms/machine in links) + i++ + if(machine.hide && !hide) + continue + var/list/entry = list() + entry["index"] = i + entry["name"] = machine.name + entry["id"] = machine.id + linked += list(entry) + data["linked"] = linked + + var/list/frequencies = list() + data["frequencies"] = list() + for(var/x in freq_listening) + frequencies += list(x) + data["frequencies"] = frequencies + + return data + +/obj/machinery/telecomms/ui_act(action, params) + if(..()) + return + + if(!issilicon(usr)) + if(!istype(usr.get_active_held_item(), /obj/item/multitool)) return - var/obj/item/multitool/P = get_multitool(user) - var/dat - dat = "[name]

[name] Access

" - dat += "
[temp]
" - dat += "
Power Status: [toggled ? "On" : "Off"]" - if(on && toggled) - if(id != "" && id) - dat += "
Identification String: [id]" - else - dat += "
Identification String: NULL" - dat += "
Network: [network]" - dat += "
Prefabrication: [autolinkers.len ? "TRUE" : "FALSE"]" - if(hide) - dat += "
Shadow Link: ACTIVE" - //Show additional options for certain machines. - dat += Options_Menu() + var/obj/item/multitool/heldmultitool = get_multitool(operator) - dat += "
Linked Network Entities:
    " - - var/i = 0 - for(var/obj/machinery/telecomms/T in links) - i++ - if(T.hide && !hide) - continue - dat += "
  1. [REF(T)] [T.name] ([T.id]) \[X\]
  2. " - dat += "
" - - dat += "
Filtering Frequencies: " - - i = 0 - if(length(freq_listening)) - for(var/x in freq_listening) - i++ - if(i < length(freq_listening)) - dat += "[format_frequency(x)] GHz\[X\]; " + switch(action) + if("toggle") + toggled = !toggled + update_power() + update_icon_state() + log_game("[key_name(operator)] toggled [toggled ? "On" : "Off"] [src] at [AREACOORD(src)].") + . = TRUE + if("id") + if(params["value"]) + if(length(params["value"]) > 32) + to_chat(operator, "Error: Machine ID too long!") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + return else - dat += "[format_frequency(x)] GHz\[X\]" - else - dat += "NONE" - - dat += "
\[Add Filter\]" - dat += "
" - - if(P) - var/obj/machinery/telecomms/T = P.buffer - if(istype(T)) - dat += "

MULTITOOL BUFFER: [T] ([T.id]) \[Link\] \[Flush\]" + id = params["value"] + log_game("[key_name(operator)] has changed the ID for [src] at [AREACOORD(src)] to [id].") + . = TRUE + if("network") + if(params["value"]) + if(length(params["value"]) > 15) + to_chat(operator, "Error: Network name too long!") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + return + else + for(var/obj/machinery/telecomms/T in links) + T.links.Remove(src) + network = params["value"] + links = list() + log_game("[key_name(operator)] has changed the network for [src] at [AREACOORD(src)] to [network].") + . = TRUE + if("tempfreq") + if(params["value"]) + tempfreq = text2num(params["value"]) * 10 + if("freq") + var/newfreq = tempfreq * 10 + if(newfreq == FREQ_SYNDICATE) + to_chat(operator, "Error: Interference preventing filtering frequency: \"[newfreq / 10] GHz\"") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) else - dat += "

MULTITOOL BUFFER:
\[Add Machine\]" + if(!(newfreq in freq_listening) && newfreq < 10000) + freq_listening.Add(newfreq) + log_game("[key_name(operator)] added frequency [newfreq] for [src] at [AREACOORD(src)].") + . = TRUE + if("delete") + freq_listening.Remove(params["value"]) + log_game("[key_name(operator)] added removed frequency [params["value"]] for [src] at [AREACOORD(src)].") + . = TRUE + if("unlink") + var/obj/machinery/telecomms/T = links[text2num(params["value"])] + if(T) + // Remove link entries from both T and src. + if(T.links) + T.links.Remove(src) + links.Remove(T) + log_game("[key_name(operator)] unlinked [src] and [T] at [AREACOORD(src)].") + . = TRUE + if("link") + if(heldmultitool) + var/obj/machinery/telecomms/T = heldmultitool.buffer + if(istype(T) && T != src) + if(!(src in T.links)) + T.links += src + if(!(T in links)) + links += T + log_game("[key_name(operator)] linked [src] for [T] at [AREACOORD(src)].") + . = TRUE + if("buffer") + heldmultitool.buffer = src + . = TRUE + if("flush") + heldmultitool.buffer = null + . = TRUE - dat += "
" - temp = "" - user << browse(dat, "window=tcommachine;size=520x500;can_resize=0") - onclose(user, "tcommachine") - return TRUE + add_act(action, params) + . = TRUE + +/obj/machinery/telecomms/proc/add_option() + return + +/obj/machinery/telecomms/bus/add_option() + var/list/data = list() + data["type"] = "bus" + data["changefrequency"] = change_frequency + return data + +/obj/machinery/telecomms/relay/add_option() + var/list/data = list() + data["type"] = "relay" + data["broadcasting"] = broadcasting + data["receiving"] = receiving + return data + +/obj/machinery/telecomms/proc/add_act(action, params) + +/obj/machinery/telecomms/relay/add_act(action, params) + switch(action) + if("broadcast") + broadcasting = !broadcasting + . = TRUE + if("receive") + receiving = !receiving + . = TRUE + +/obj/machinery/telecomms/bus/add_act(action, params) + switch(action) + if("change_freq") + var/newfreq = text2num(params["value"]) * 10 + if(newfreq) + if(newfreq < 10000) + change_frequency = newfreq + . = TRUE + else + change_frequency = 0 // Returns a multitool from a user depending on their mobtype. /obj/machinery/telecomms/proc/get_multitool(mob/user) - var/obj/item/multitool/P = null // Let's double check if(!issilicon(user) && istype(user.get_active_held_item(), /obj/item/multitool)) @@ -107,168 +217,6 @@ P = user.get_active_held_item() return P -// Additional Options for certain machines. Use this when you want to add an option to a specific machine. -// Example of how to use below. - -/obj/machinery/telecomms/proc/Options_Menu() - return "" - -// The topic for Additional Options. Use this for checking href links for your specific option. -// Example of how to use below. -/obj/machinery/telecomms/proc/Options_Topic(href, href_list) - return - -// RELAY - -/obj/machinery/telecomms/relay/Options_Menu() - var/dat = "" - dat += "
Broadcasting: [broadcasting ? "YES" : "NO"]" - dat += "
Receiving: [receiving ? "YES" : "NO"]" - return dat - -/obj/machinery/telecomms/relay/Options_Topic(href, href_list) - - if(href_list["receive"]) - receiving = !receiving - temp = "-% Receiving mode changed. %-" - if(href_list["broadcast"]) - broadcasting = !broadcasting - temp = "-% Broadcasting mode changed. %-" - -// BUS - -/obj/machinery/telecomms/bus/Options_Menu() - var/dat = "
Change Signal Frequency: [change_frequency ? "YES ([change_frequency])" : "NO"]" - return dat - -/obj/machinery/telecomms/bus/Options_Topic(href, href_list) - - if(href_list["change_freq"]) - - var/newfreq = input(usr, "Specify a new frequency for new signals to change to. Enter null to turn off frequency changing. Decimals assigned automatically.", src, network) as null|num - if(canAccess(usr)) - if(newfreq) - if(findtext(num2text(newfreq), ".")) - newfreq *= 10 // shift the decimal one place - if(newfreq < 10000) - change_frequency = newfreq - temp = "-% New frequency to change to assigned: \"[newfreq] GHz\" %-" - else - change_frequency = 0 - temp = "-% Frequency changing deactivated %-" - - -/obj/machinery/telecomms/Topic(href, href_list) - if(..()) - return - - if(!issilicon(usr)) - if(!istype(usr.get_active_held_item(), /obj/item/multitool)) - return - - var/obj/item/multitool/P = get_multitool(usr) - - if(href_list["input"]) - switch(href_list["input"]) - - if("toggle") - - toggled = !toggled - temp = "-% [src] has been [toggled ? "activated" : "deactivated"]." - update_power() - - - if("id") - var/newid = reject_bad_text(stripped_input(usr, "Specify the new ID for this machine", src, id, MAX_MESSAGE_LEN)) - if(newid && canAccess(usr)) - id = newid - temp = "-% New ID assigned: \"[id]\" %-" - - if("network") - var/newnet = stripped_input(usr, "Specify the new network for this machine. This will break all current links.", src, network) - if(newnet && canAccess(usr)) - - if(length(newnet) > 15) - temp = "-% Too many characters in new network tag %-" - - else - for(var/obj/machinery/telecomms/T in links) - T.links.Remove(src) - - network = newnet - links = list() - temp = "-% New network tag assigned: \"[network]\" %-" - - - if("freq") - var/newfreq = input(usr, "Specify a new frequency to filter (GHz). Decimals assigned automatically.", src, network) as null|num - if(newfreq && canAccess(usr)) - if(findtext(num2text(newfreq), ".")) - newfreq *= 10 // shift the decimal one place - if(newfreq == FREQ_SYNDICATE) - temp = "-% Error: Interference preventing filtering frequency: \"[newfreq] GHz\" %-" - else - if(!(newfreq in freq_listening) && newfreq < 10000) - freq_listening.Add(newfreq) - temp = "-% New frequency filter assigned: \"[newfreq] GHz\" %-" - - if(href_list["delete"]) - - // changed the layout about to workaround a pesky runtime -- Doohl - - var/x = text2num(href_list["delete"]) - temp = "-% Removed frequency filter [x] %-" - freq_listening.Remove(x) - - if(href_list["unlink"]) - - if(text2num(href_list["unlink"]) <= length(links)) - var/obj/machinery/telecomms/T = links[text2num(href_list["unlink"])] - if(T) - temp = "-% Removed [REF(T)] [T.name] from linked entities. %-" - - // Remove link entries from both T and src. - - if(T.links) - T.links.Remove(src) - links.Remove(T) - - else - temp = "-% Unable to locate machine to unlink from, try again. %-" - - if(href_list["link"]) - - if(P) - var/obj/machinery/telecomms/T = P.buffer - if(istype(T) && T != src) - if(!(src in T.links)) - T.links += src - - if(!(T in links)) - links += T - - temp = "-% Successfully linked with [REF(T)] [T.name] %-" - - else - temp = "-% Unable to acquire buffer %-" - - if(href_list["buffer"]) - - P.buffer = src - temp = "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-" - - - if(href_list["flush"]) - - temp = "-% Buffer successfully flushed. %-" - P.buffer = null - - Options_Topic(href, href_list) - - usr.set_machine(src) - - updateUsrDialog() - /obj/machinery/telecomms/proc/canAccess(mob/user) if(issilicon(user) || in_range(user, src)) return TRUE diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 512b7ac6887..dd06a162dd0 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -143,10 +143,6 @@ GLOBAL_LIST_INIT(dye_registry, list( var/obj/item/color_source var/max_wash_capacity = 5 -/obj/machinery/washing_machine/ComponentInitialize() - . = ..() - RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_blood) - /obj/machinery/washing_machine/examine(mob/user) . = ..() if(!busy) @@ -186,15 +182,17 @@ GLOBAL_LIST_INIT(dye_registry, list( M.Translate(rand(-3, 3), rand(-1, 3)) animate(src, transform=M, time=2) -/obj/machinery/washing_machine/proc/clean_blood() - if(!busy) +/obj/machinery/washing_machine/wash(clean_types) + . = ..() + if(!busy && bloody_mess && (clean_types & CLEAN_TYPE_BLOOD)) bloody_mess = FALSE update_icon() + . = TRUE /obj/machinery/washing_machine/proc/wash_cycle() for(var/X in contents) var/atom/movable/AM = X - SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + AM.wash(CLEAN_WASH) AM.machine_wash(src) busy = FALSE @@ -225,7 +223,6 @@ GLOBAL_LIST_INIT(dye_registry, list( name = initial(target_type.name) desc = "[initial(target_type.desc)] The colors look a little dodgy." return target_type //successfully "appearance copy" dyed something; returns the target type as a hacky way of extending - add_atom_colour(dye_color, FIXED_COLOUR_PRIORITY) return FALSE //what happens to this object when washed inside a washing machine diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index efafa478429..f3622726bc3 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -91,7 +91,7 @@ Expects a turf. Returns true if the attack should be blocked, false if not.*/ . = TRUE return -obj/mecha/combat/durand/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) +/obj/mecha/combat/durand/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) if(defense_check(user.loc)) log_message("Attack absorbed by defense field. Attacker - [user].", LOG_MECHA, color="orange") shield.attack_generic(user, damage_amount, damage_type, damage_flag, sound_effect, armor_penetration) diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 9f028a65f80..11d282f3b59 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -61,15 +61,15 @@ if(!O.anchored) if(cargo_holder.cargo.len < cargo_holder.cargo_capacity) chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") - O.anchored = TRUE + O.set_anchored(TRUE) if(do_after_cooldown(target)) cargo_holder.cargo += O O.forceMove(chassis) - O.anchored = FALSE + O.set_anchored(FALSE) occupant_message("[target] successfully loaded.") log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]", LOG_MECHA) else - O.anchored = initial(O.anchored) + O.set_anchored(initial(O.anchored)) else occupant_message("Not enough room in cargo compartment!") else @@ -121,15 +121,15 @@ if(!O.anchored) if(cargo_holder.cargo.len < cargo_holder.cargo_capacity) chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") - O.anchored = TRUE + O.set_anchored(TRUE) if(do_after_cooldown(target)) cargo_holder.cargo += O O.forceMove(chassis) - O.anchored = FALSE + O.set_anchored(FALSE) occupant_message("[target] successfully loaded.") log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]", LOG_MECHA) else - O.anchored = initial(O.anchored) + O.set_anchored(initial(O.anchored)) else occupant_message("Not enough room in cargo compartment!") else diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 8a0a8b342cd..504bcf37bae 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -115,7 +115,7 @@ if(istype(buckled_mob) && buckled_mob.buckled == src && (buckled_mob.can_unbuckle() || force)) . = buckled_mob buckled_mob.buckled = null - buckled_mob.anchored = initial(buckled_mob.anchored) + buckled_mob.set_anchored(initial(buckled_mob.anchored)) buckled_mob.update_mobility() buckled_mob.clear_alert("buckled") buckled_mobs -= buckled_mob diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 4ae0288006f..77d3ce0fb43 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -69,7 +69,7 @@ name = "poster - [name]" desc = "A large piece of space-resistant printed paper. [desc]" - addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 300)), 0) + INVOKE_ASYNC(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 300)) /obj/structure/sign/poster/proc/randomise(base_type) var/list/poster_types = subtypesof(base_type) @@ -129,7 +129,7 @@ return // Deny placing posters on currently-diagonal walls, although the wall may change in the future. - if (smooth & SMOOTH_DIAGONAL) + if (smoothing_flags & SMOOTH_DIAGONAL) for (var/O in overlays) var/image/I = O if(copytext(I.icon_state, 1, 3) == "d-") //3 == length("d-") + 1 diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 47ac77ccc9e..8f40b808f9d 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -26,7 +26,7 @@ if(LAZYLEN(diseases_to_add)) AddComponent(/datum/component/infective, diseases_to_add) - addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, beauty)), 0) + INVOKE_ASYNC(src, /datum.proc/_AddComponent, list(/datum/component/beauty, beauty)) var/turf/T = get_turf(src) if(T && is_station_level(T.z)) @@ -43,7 +43,7 @@ return TRUE /obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food/drinks)) + if((istype(W, /obj/item/reagent_containers/glass) && !istype(W, /obj/item/reagent_containers/glass/rag)) || istype(W, /obj/item/reagent_containers/food/drinks)) if(src.reagents && W.reagents) . = 1 //so the containers don't splash their content on the src while scooping. if(!src.reagents.total_volume) @@ -100,9 +100,11 @@ S.blood_state = blood_state update_icon() H.update_inv_shoes() -/atom/effect/decal/cleanable/washed(atom/washer) - . = ..() + +/obj/effect/decal/cleanable/wash(clean_types) + ..() qdel(src) + return TRUE /obj/effect/decal/cleanable/proc/can_bloodcrawl_in() if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY)) diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index ac28e5f731c..b6d2a3e2c16 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -54,7 +54,7 @@ desc = "Someone should clean that up." icon_state = "dirt" canSmoothWith = list(/obj/effect/decal/cleanable/dirt, /turf/closed/wall, /obj/structure/falsewall) - smooth = SMOOTH_FALSE + smoothing_flags = NONE mouse_opacity = MOUSE_OPACITY_TRANSPARENT beauty = -75 @@ -62,14 +62,14 @@ . = ..() var/turf/T = get_turf(src) if(T.tiled_dirt) - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_MORE icon = 'icons/effects/dirt.dmi' icon_state = "" - queue_smooth(src) - queue_smooth_neighbors(src) + QUEUE_SMOOTH(src) + QUEUE_SMOOTH_NEIGHBORS(src) /obj/effect/decal/cleanable/dirt/Destroy() - queue_smooth_neighbors(src) + QUEUE_SMOOTH_NEIGHBORS(src) return ..() /obj/effect/decal/cleanable/dirt/dust diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index 803b7250801..0cacc65c35c 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -45,4 +45,4 @@ var/turf/T = loc if(!istype(T)) //you know this will happen somehow CRASH("Turf decal initialized in an object/nullspace") - T.AddComponent(/datum/component/decal, icon, icon_state, dir, CLEAN_NEVER, color, null, null, alpha) + T.AddComponent(/datum/component/decal, icon, icon_state, dir, FALSE, color, null, null, alpha) diff --git a/code/game/objects/effects/proximity.dm b/code/game/objects/effects/proximity.dm index 5a38b29613b..cc3494c22d8 100644 --- a/code/game/objects/effects/proximity.dm +++ b/code/game/objects/effects/proximity.dm @@ -113,4 +113,5 @@ /obj/effect/abstract/proximity_checker/Crossed(atom/movable/AM) set waitfor = FALSE . = ..() - monitor.hasprox_receiver.HasProximity(AM) + if(monitor) + monitor.hasprox_receiver.HasProximity(AM) diff --git a/code/game/objects/effects/spawners/xeno_egg_delivery.dm b/code/game/objects/effects/spawners/xeno_egg_delivery.dm index feb5605342c..d0e99d0f903 100644 --- a/code/game/objects/effects/spawners/xeno_egg_delivery.dm +++ b/code/game/objects/effects/spawners/xeno_egg_delivery.dm @@ -15,5 +15,5 @@ message_admins("An alien egg has been delivered to [ADMIN_VERBOSEJMP(T)].") log_game("An alien egg has been delivered to [AREACOORD(T)]") var/message = "Attention [station_name()], we have entrusted you with a research specimen in [get_area_name(T, TRUE)]. Remember to follow all safety precautions when dealing with the specimen." - SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/addtimer, CALLBACK(GLOBAL_PROC, /proc/print_command_report, message), announcement_time)) + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/_addtimer, CALLBACK(GLOBAL_PROC, /proc/print_command_report, message), announcement_time)) return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index f70ccf5ee70..2ce4d0c3968 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -139,13 +139,13 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb mouse_drag_pointer = MOUSE_ACTIVE_POINTER ///Does it embed and if yes, what kind of embed - var/list/embedding = NONE + var/list/embedding ///for flags such as [GLASSESCOVERSEYES] var/flags_cover = 0 var/heat = 0 - ///All items with sharpness of IS_SHARP or higher will automatically get the butchering component. - var/sharpness = IS_BLUNT + ///All items with sharpness of SHARP_EDGED or higher will automatically get the butchering component. + var/sharpness = SHARP_NONE ///How a tool acts when you use it on something, such as wirecutters cutting wires while multitools measure power var/tool_behaviour = NONE @@ -241,7 +241,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(GLOB.rpg_loot_items) AddComponent(/datum/component/fantasy) - if(sharpness) //give sharp objects butchering functionality, for consistency + if(sharpness && force > 5) //give sharp objects butchering functionality, for consistency AddComponent(/datum/component/butchering, 80 * toolspeed) /**Makes cool stuff happen when you suicide with an item @@ -720,11 +720,6 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb /obj/item/proc/get_sharpness() return sharpness -/obj/item/proc/get_dismemberment_chance(obj/item/bodypart/affecting) - if(affecting.can_dismember(src)) - if((sharpness || damtype == BURN) && w_class >= WEIGHT_CLASS_NORMAL && force >= 10) - . = force * (affecting.get_damage() / affecting.max_damage) - /obj/item/proc/get_dismember_sound() if(damtype == BURN) . = 'sound/weapons/sear.ogg' @@ -995,7 +990,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb ///For when you want to add/update the embedding on an item. Uses the vars in [/obj/item/embedding], and defaults to config values for values that aren't set. Will automatically detach previous embed elements on this item. /obj/item/proc/updateEmbedding() - if(!islist(embedding) || !LAZYLEN(embedding)) + if(!LAZYLEN(embedding)) return AddElement(/datum/element/embed,\ @@ -1011,3 +1006,114 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb jostle_pain_mult = (!isnull(embedding["jostle_pain_mult"]) ? embedding["jostle_pain_mult"] : EMBEDDED_JOSTLE_PAIN_MULTIPLIER),\ pain_stam_pct = (!isnull(embedding["pain_stam_pct"]) ? embedding["pain_stam_pct"] : EMBEDDED_PAIN_STAM_PCT)) return TRUE + +/// How many different types of mats will be counted in a bite? +#define MAX_BONUS_MATS_PER_BITE 2 + +/* + * On accidental consumption: when you somehow end up eating an item accidentally (currently, this is used for when items are hidden in food like bread or cake) + * + * The base proc will check if the item is sharp and has a decent force. + * Then, it checks the item's mat datums for the effects it applies afterwards. + * Then, it checks tiny items. + * After all that, it returns TRUE if the item is set to be discovered. Otherwise, it returns FALSE. + * + * This works similarily to /suicide_act: if you want an item to have a unique interaction, go to that item + * and give it an /on_accidental_consumption proc override. For a simple example of this, check out the nuke disk. + * + * Arguments + * * M - the mob accidentally consuming the item + * * user - the mob feeding M the item - usually, it's the same as M + * * source_item - the item that held the item being consumed - bread, cake, etc + * * discover_after - if the item will be discovered after being chomped (FALSE will usually mean it was swallowed, TRUE will usually mean it was bitten into and discovered) + */ +/obj/item/proc/on_accidental_consumption(mob/living/carbon/M, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE) + /// If source_item is a snack, we can adjust its taste + var/obj/item/reagent_containers/food/snacks/S = source_item + if(!istype(S)) + S = null + + if(get_sharpness() && force >= 5) //if we've got something sharp with a decent force (ie, not plastic) + M.emote("scream") + M.visible_message("[M] looks like [M.p_theyve()] just bit something they shouldn't have!", \ + "OH GOD! Was that a crunch? That didn't feel good at all!!") + + M.apply_damage(max(15, force), BRUTE, BODY_ZONE_HEAD, wound_bonus = 10, sharpness = TRUE) + M.losebreath += 2 + if(tryEmbed(M.get_bodypart(BODY_ZONE_CHEST), TRUE, TRUE)) //and if it embeds in their chest, cause a lot of pain + M.apply_damage(max(25, force*1.5), BRUTE, BODY_ZONE_CHEST, wound_bonus = 7, sharpness = TRUE) + M.losebreath += 6 + discover_after = FALSE + + if(S?.tastes?.len) //is that blood in my mouth? + S.tastes += "iron" + S.tastes["iron"] = 2 + + else if(custom_materials?.len) //if we've got materials, lets see whats in it + /// How many 'bonus' mats have we found? You can only be affected by two 'bonus' material datums by default + var/found_mats = 0 + /// How much of each material is in it? Used to determine if the glass should break + var/total_material_amount = 0 + + for(var/mats in custom_materials) + total_material_amount += custom_materials[mats] + if(found_mats >= MAX_BONUS_MATS_PER_BITE) + continue //continue instead of break so we can finish adding up all the mats to the total + + var/datum/material/FM = mats + if(FM.on_accidental_mat_consumption(M, S)) + found_mats++ + + //if there's glass in it and the glass is more than 60% of the item, then we can shatter it + if(custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)] >= total_material_amount * 0.60) + if(prob(66)) //66% chance to break it + /// The glass shard that is spawned into the source item + var/obj/item/shard/broken_glass = new /obj/item/shard(src) + broken_glass.name = "broken [name]" + broken_glass.desc = "This used to be \a [name], but it sure isn't anymore." + playsound(M, "shatter", 25, TRUE) + qdel(src) + if(S) + S.contents += broken_glass //puts the glass back into the source item + else + broken_glass.on_accidental_consumption(M, user) + else //33% chance to just "crack" it (play a sound) and leave it in the bread + playsound(M, "shatter", 15, TRUE) + discover_after = FALSE + + M.adjust_disgust(33) + M.visible_message("[M] looks like [M.p_theyve()] just bitten into something hard.", \ + "Eugh! Did I just bite into something?") + + else if(w_class == WEIGHT_CLASS_TINY) //small items like soap or toys that don't have mat datums + /// M's chest (for cavity implanting the item) + var/obj/item/bodypart/chest/CV = M.get_bodypart(BODY_ZONE_CHEST) + if(CV.cavity_item) + M.vomit(5, FALSE, FALSE, distance = 0) + forceMove(drop_location()) + to_chat(M, "You vomit up a [name]! [source_item? "Was that in \the [source_item]?" : ""]") + else + M.transferItemToLoc(src, M, TRUE) + M.losebreath += 2 + CV.cavity_item = src + to_chat(M, "You swallow hard. [source_item? "Something small was in \the [source_item]..." : ""]") + discover_after = FALSE + + else + to_chat(M, "[source_item? "Something strange was in the \the [source_item]..." : "I just bit something strange..."] ") + + //Just in case - can't discover something that doesn't exist + if(QDELETED(src)) + return FALSE + + return discover_after + +#undef MAX_BONUS_MATS_PER_BITE + +// Update icons if this is being carried by a mob +/obj/item/wash(clean_types) + . = ..() + + if(ismob(loc)) + var/mob/mob_loc = loc + mob_loc.regenerate_icons() diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 3d323e99a66..5fd2ab9ea64 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -190,6 +190,7 @@ RLD name = "rapid-construction-device (RCD)" icon = 'icons/obj/tools.dmi' icon_state = "rcd" + worn_icon_state = "RCD" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' custom_premium_price = 1700 @@ -635,6 +636,7 @@ RLD desc = "A device used to rapidly provide lighting sources to an area. Reload with metal, plasteel, glass or compressed matter cartridges." icon = 'icons/obj/tools.dmi' icon_state = "rld-5" + worn_icon_state = "RPD" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' matter = 200 diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index f1aec586129..c71e8548763 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -178,6 +178,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( desc = "A device used to rapidly pipe things." icon = 'icons/obj/tools.dmi' icon_state = "rpd" + worn_icon_state = "RPD" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' flags_1 = CONDUCT_1 diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index 1df97ee2ab9..fd6ebbf9039 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "paint sprayer" inhand_icon_state = "paint sprayer" - + worn_icon_state = "painter" w_class = WEIGHT_CLASS_SMALL custom_materials = list(/datum/material/iron=50, /datum/material/glass=50) @@ -174,7 +174,7 @@ to_chat(user, "You need to get closer!") return if(use_paint(user) && isturf(F)) - F.AddComponent(/datum/component/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, CLEAN_STRONG, color, null, null, alpha) + F.AddComponent(/datum/component/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, CLEAN_TYPE_PAINT, color, null, null, alpha) /obj/item/airlock_painter/decal/AltClick(mob/user) . = ..() diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index c4a45f79678..8b0f0f65f4b 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -265,6 +265,11 @@ msg += "The [D.account_holder] reports a balance of [D.account_balance] cr." msg += "Alt-Click the ID to pull money from the linked account in the form of holochips." msg += "You can insert credits into the linked account by pressing holochips, cash, or coins against the ID." + if(registered_account.civilian_bounty) + msg += "There is an active civilian bounty." + msg += "[registered_account.bounty_text()]" + msg += "Quantity: [registered_account.bounty_num()]" + msg += "Reward: [registered_account.bounty_value()]" if(registered_account.account_holder == user.real_name) msg += "If you lose this ID card, you can reclaim your account by Alt-Clicking a blank ID card while holding it and entering your account ID number." else diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm index 6c597000545..42986bef5fb 100644 --- a/code/game/objects/items/chainsaw.dm +++ b/code/game/objects/items/chainsaw.dm @@ -16,7 +16,7 @@ custom_materials = list(/datum/material/iron=13000) attack_verb = list("sawed", "tore", "lacerated", "cut", "chopped", "diced") hitsound = "swing_hit" - sharpness = IS_SHARP + sharpness = SHARP_EDGED actions_types = list(/datum/action/item_action/startchainsaw) tool_behaviour = TOOL_SAW toolspeed = 0.5 @@ -73,10 +73,6 @@ var/datum/action/A = X A.UpdateButtonIcon() -/obj/item/chainsaw/get_dismemberment_chance() - if(wielded) - . = ..() - /obj/item/chainsaw/doomslayer name = "THE GREAT COMMUNICATOR" desc = "VRRRRRRR!!!" diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 258f8a3b533..4448eddd3e3 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -609,6 +609,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon = 'icons/obj/cigarettes.dmi' icon_state = "zippo" inhand_icon_state = "zippo" + worn_icon_state = "lighter" w_class = WEIGHT_CLASS_TINY flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 2943baa58a1..8edf95fe4ae 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -266,6 +266,10 @@ name = "Salvage Pod Recall (Computer Board)" build_path = /obj/machinery/computer/shuttle/white_ship/pod/recall +/obj/item/circuitboard/computer/bountypad + name = "Bounty Pad (Computer Board)" + build_path = /obj/machinery/computer/piratepad_control/civilian + //Medical /obj/item/circuitboard/computer/crew diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index fbdeeed9a3d..b12550d7f00 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -429,14 +429,17 @@ /obj/machinery/smartfridge/chemistry/virology = "viruses", /obj/machinery/smartfridge/disks = "disks") needs_anchored = FALSE + var/is_special_type = FALSE -/obj/item/circuitboard/machine/smartfridge/Initialize(mapload, new_type) - if(new_type) - build_path = new_type +/obj/item/circuitboard/machine/smartfridge/apply_default_parts(obj/machinery/smartfridge/M) + build_path = M.base_build_path + if(!fridges_name_paths.Find(build_path, fridges_name_paths)) + name = "[initial(M.name)] (Machine Board)" //if it's a unique type, give it a unique name. + is_special_type = TRUE return ..() /obj/item/circuitboard/machine/smartfridge/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_SCREWDRIVER) + if(!is_special_type && I.tool_behaviour == TOOL_SCREWDRIVER) var/position = fridges_name_paths.Find(build_path, fridges_name_paths) position = (position == fridges_name_paths.len) ? 1 : (position + 1) build_path = fridges_name_paths[position] @@ -446,6 +449,8 @@ /obj/item/circuitboard/machine/smartfridge/examine(mob/user) . = ..() + if(is_special_type) + return . += "[src] is set to [fridges_name_paths[build_path]]. You can use a screwdriver to reconfigure it." @@ -572,6 +577,16 @@ /obj/item/stack/sheet/glass = 1, /obj/item/vending_refill/donksoft = 1) +/obj/item/circuitboard/machine/bountypad + name = "Civilian Bounty Pad (Machine Board)" + icon_state = "generic" + build_path = /obj/machinery/piratepad/civilian + req_components = list( + /obj/item/stock_parts/card_reader = 1, + /obj/item/stock_parts/scanning_module = 1, + /obj/item/stock_parts/micro_laser = 1 + ) + //Medical /obj/item/circuitboard/machine/chem_dispenser @@ -895,17 +910,6 @@ /obj/item/stack/sheet/glass = 1) def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) -/obj/item/circuitboard/machine/bepis - name = "BEPIS Chamber (Machine Board)" - icon_state = "science" - build_path = /obj/machinery/rnd/bepis - req_components = list( - /obj/item/stack/cable_coil = 5, - /obj/item/stock_parts/capacitor = 1, - /obj/item/stock_parts/manipulator = 1, - /obj/item/stock_parts/micro_laser = 1, - /obj/item/stock_parts/scanning_module = 1) - /obj/item/circuitboard/machine/dnascanner name = "DNA Scanner (Machine Board)" icon_state = "science" @@ -1143,6 +1147,17 @@ icon_state = "supply" build_path = /obj/machinery/rnd/production/techfab/department/cargo +/obj/item/circuitboard/machine/bepis + name = "BEPIS Chamber (Machine Board)" + icon_state = "cargo" + build_path = /obj/machinery/rnd/bepis + req_components = list( + /obj/item/stack/cable_coil = 5, + /obj/item/stock_parts/capacitor = 1, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stock_parts/micro_laser = 1, + /obj/item/stock_parts/scanning_module = 1) + //Misc /obj/item/circuitboard/machine/sheetifier name = "Sheet-meister 2000 (Machine Board)" @@ -1176,3 +1191,12 @@ /obj/item/stock_parts/micro_laser = 2, /obj/item/stock_parts/scanning_module = 2 ) + +/obj/item/circuitboard/machine/skill_station + name = "Skill Station (Machine Board)" + build_path = /obj/machinery/skill_station + req_components = list( + /obj/item/stock_parts/matter_bin = 2, + /obj/item/stock_parts/micro_laser = 2, + /obj/item/stock_parts/scanning_module = 2 + ) diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index ee46869c6c3..5ddb39e92e2 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -144,11 +144,11 @@ user.visible_message("[user] begins to clean \the [target.name] with [src]...", "You begin to clean \the [target.name] with [src]...") if(do_after(user, clean_speedies, target = target)) to_chat(user, "You clean \the [target.name].") - for(var/obj/effect/decal/cleanable/C in target) - user?.mind.adjust_experience(/datum/skill/cleaning, round(C.beauty/CLEAN_SKILL_BEAUTY_ADJUSTMENT)) - qdel(C) + if(user && isturf(target)) + for(var/obj/effect/decal/cleanable/cleanable_decal in target) + user.mind.adjust_experience(/datum/skill/cleaning, round(cleanable_decal.beauty / CLEAN_SKILL_BEAUTY_ADJUSTMENT)) + target.wash(CLEAN_SCRUB) target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - SEND_SIGNAL(target, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) user?.mind.adjust_experience(/datum/skill/cleaning, CLEAN_SKILL_GENERIC_WASH_XP) decreaseUses(user) return @@ -206,24 +206,24 @@ desc = "Golden? Clearly, it's made with bananium! Honk!" icon_state = "gold_horn" inhand_icon_state = "gold_horn" - var/flip_cooldown = 0 + COOLDOWN_DECLARE(golden_horn_cooldown) /obj/item/bikehorn/golden/attack() - if(flip_cooldown < world.time) - flip_mobs() + flip_mobs() return ..() /obj/item/bikehorn/golden/attack_self(mob/user) - if(flip_cooldown < world.time) - flip_mobs() + flip_mobs() ..() /obj/item/bikehorn/golden/proc/flip_mobs(mob/living/carbon/M, mob/user) + if(!COOLDOWN_FINISHED(src, golden_horn_cooldown)) + return var/turf/T = get_turf(src) for(M in ohearers(7, T)) if(M.can_hear()) M.emote("flip") - flip_cooldown = world.time + 7 + COOLDOWN_START(src, golden_horn_cooldown, 1 SECONDS) //canned laughter /obj/item/reagent_containers/food/drinks/soda_cans/canned_laughter diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 6e2d6dfe79a..4059a05a5f8 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -734,20 +734,13 @@ return - if(isobj(target) && !istype(target, /obj/effect/decal/cleanable/crayon/gang)) + if(istype(target, /obj/structure/window)) if(actually_paints) - if(color_hex2num(paint_color) < 350 && !istype(target, /obj/structure/window) && !istype(target, /obj/effect/decal/cleanable/crayon)) //Colors too dark are rejected - to_chat(usr, "A color that dark on an object like this? Surely not...") - return FALSE - target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY) - - if(istype(target, /obj/structure/window)) - if(color_hex2num(paint_color) < 255) - target.set_opacity(255) - else - target.set_opacity(initial(target.opacity)) - + if(color_hex2num(paint_color) < 255) + target.set_opacity(255) + else + target.set_opacity(initial(target.opacity)) . = use_charges(user, 2) var/fraction = min(1, . / reagents.maximum_volume) reagents.expose(target, TOUCH, fraction * volume_multiplier) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 0f062aefabb..758681d6d87 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -255,7 +255,7 @@ /obj/item/defibrillator/compact/combat name = "combat defibrillator" - desc = "A belt-equipped blood-red defibrillator. Can revive through spacesuits, has an experimental self-recharging battery, and can be utilized in combat via applying the paddles in a disarming or agressive manner." + desc = "A belt-equipped blood-red defibrillator. Can revive through thick clothing, has an experimental self-recharging battery, and can be utilized in combat via applying the paddles in a disarming or aggressive manner." icon_state = "defibcombat" //needs defib inhand sprites inhand_icon_state = "defibcombat" worn_icon_state = "defibcombat" @@ -276,7 +276,7 @@ /obj/item/defibrillator/compact/combat/loaded/nanotrasen name = "elite Nanotrasen defibrillator" - desc = "A belt-equipped state-of-the-art defibrillator. Can revive through spacesuits, has an experimental self-recharging battery, and can be utilized in combat via applying the paddles in a disarming or agressive manner." + desc = "A belt-equipped state-of-the-art defibrillator. Can revive through thick clothing, has an experimental self-recharging battery, and can be utilized in combat via applying the paddles in a disarming or agressive manner." icon_state = "defibnt" //needs defib inhand sprites inhand_icon_state = "defibnt" worn_icon_state = "defibnt" @@ -495,7 +495,7 @@ "You overcharge the paddles and begin to place them onto [H]'s chest...") busy = TRUE update_icon() - if(do_after(user, 15, target = H)) + if(do_after(user, 15, TRUE, H)) user.visible_message("[user] places [src] on [H]'s chest.", "You place [src] on [H]'s chest and begin to charge them.") var/turf/T = get_turf(defib) @@ -504,7 +504,7 @@ T.audible_message("\The [defib] lets out an urgent beep and lets out a steadily rising hum...") else user.audible_message("[src] let out an urgent beep.") - if(do_after(user, 15, target = H)) //Takes longer due to overcharging + if(do_after(user, 15, TRUE, H)) //Takes longer due to overcharging if(!H) busy = FALSE update_icon() @@ -545,14 +545,14 @@ user.visible_message("[user] begins to place [src] on [H]'s chest.", "You begin to place [src] on [H]'s chest...") busy = TRUE update_icon() - if(do_after(user, 30, target = H)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process + if(do_after(user, 30, TRUE, H)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process user.visible_message("[user] places [src] on [H]'s chest.", "You place [src] on [H]'s chest.") playsound(src, 'sound/machines/defib_charge.ogg', 75, FALSE) var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart) - if(do_after(user, 20, target = H)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total - for(var/obj/item/carried_item in H.contents) - if(istype(carried_item, /obj/item/clothing/suit/space)) - if((!combat && !req_defib) || (req_defib && !defib.combat)) + if(do_after(user, 20, TRUE, H)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total + if((!combat && !req_defib) || (req_defib && !defib.combat)) + for(var/obj/item/clothing/C in H.get_equipped_items()) + if((C.body_parts_covered & CHEST) && (C.clothing_flags & THICKMATERIAL)) //check to see if something is obscuring their chest. user.audible_message("[req_defib ? "[defib]" : "[src]"] buzzes: Patient's chest is obscured. Operation aborted.") playsound(src, 'sound/machines/defib_failed.ogg', 50, FALSE) busy = FALSE diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index cc132426f88..48ac348aa37 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/lighting.dmi' icon_state = "flashlight" inhand_icon_state = "flashlight" + worn_icon_state = "flashlight" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' w_class = WEIGHT_CLASS_SMALL @@ -267,6 +268,7 @@ brightness_on = 7 // Pretty bright. icon_state = "flare" inhand_icon_state = "flare" + worn_icon_state = "flare" actions_types = list() var/fuel = 0 var/on_damage = 7 @@ -444,6 +446,7 @@ color = LIGHT_COLOR_GREEN icon_state = "glowstick" inhand_icon_state = "glowstick" + worn_icon_state = "lightstick" grind_results = list(/datum/reagent/phenol = 15, /datum/reagent/hydrogen = 10, /datum/reagent/oxygen = 5) //Meth-in-a-stick var/fuel = 0 diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index ce424c3076e..aab94e012b7 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -29,6 +29,10 @@ /obj/item/powersink/update_icon_state() icon_state = "powersink[mode == OPERATING]" +/obj/item/powersink/set_anchored(anchorvalue) + . = ..() + density = anchorvalue + /obj/item/powersink/proc/set_mode(value) if(value == mode) return @@ -37,23 +41,20 @@ attached = null if(mode == OPERATING) STOP_PROCESSING(SSobj, src) - anchored = FALSE - density = FALSE + set_anchored(FALSE) if(CLAMPED_OFF) if(!attached) return if(mode == OPERATING) STOP_PROCESSING(SSobj, src) - anchored = TRUE - density = TRUE + set_anchored(TRUE) if(OPERATING) if(!attached) return START_PROCESSING(SSobj, src) - anchored = TRUE - density = TRUE + set_anchored(TRUE) mode = value update_icon() diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 4bd80a9cf95..c02c9c86f3e 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -19,6 +19,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( desc = "An updated, modular intercom that fits over the head. Takes encryption keys." icon_state = "headset" inhand_icon_state = "headset" + worn_icon_state = null custom_materials = list(/datum/material/iron=75) subspace_transmission = TRUE canhear_range = 0 // can't hear headsets from very far away diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 8ef28db2151..73e368a8236 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -5,6 +5,7 @@ name = "station bounced radio" icon_state = "walkietalkie" inhand_icon_state = "walkietalkie" + worn_icon_state = "radio" desc = "A basic handheld radio that communicates with local telecommunication networks." dog_fashion = /datum/dog_fashion/back diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 69bc7154e3b..797168179e3 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -186,8 +186,20 @@ GENE SCANNER render_list += "Subject appears to have [M.getCloneLoss() > 30 ? "Severe" : "Minor"] cellular damage.\n" if(advanced) render_list += "Cellular Damage Level: [M.getCloneLoss()].\n" - if (!M.getorgan(/obj/item/organ/brain)) + if (!M.getorganslot(ORGAN_SLOT_BRAIN)) // brain not added to carbon/human check because it's funny to get to bully simple mobs render_list += "Subject lacks a brain.\n" + if(ishuman(M)) + var/mob/living/carbon/human/the_dude = M + var/datum/species/the_dudes_species = the_dude.dna.species + if (!(NOBLOOD in the_dudes_species.species_traits) && !the_dude.getorganslot(ORGAN_SLOT_HEART)) + render_list += "Subject lacks a heart.\n" + if (!(TRAIT_NOBREATH in the_dudes_species.species_traits) && !the_dude.getorganslot(ORGAN_SLOT_LUNGS)) + render_list += "Subject lacks lungs.\n" + if (!(TRAIT_NOMETABOLISM in the_dudes_species.species_traits) && !the_dude.getorganslot(ORGAN_SLOT_LIVER)) + render_list += "Subject lacks a liver.\n" + if (!(NOSTOMACH in the_dudes_species.species_traits) && !the_dude.getorganslot(ORGAN_SLOT_STOMACH)) + render_list += "Subject lacks a stomach.\n" + if(iscarbon(M)) var/mob/living/carbon/C = M if(LAZYLEN(C.get_traumas())) diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 205caa3f600..4b599292f09 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -93,7 +93,7 @@ /obj/item/dice/d6 name = "d6" -obj/item/dice/d6/ebony +/obj/item/dice/d6/ebony name = "ebony die" desc = "A die with six sides made of dense black wood. It feels cold and heavy in your hand." icon_state = "de6" diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index b8689c2faca..5e5b2f31af3 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -43,7 +43,7 @@ to_chat(user, "You lack the grace to wield this!") return COMPONENT_TWOHANDED_BLOCK_WIELD wielded = TRUE - sharpness = IS_SHARP + sharpness = SHARP_EDGED w_class = w_class_on hitsound = 'sound/weapons/blade1.ogg' START_PROCESSING(SSobj, src) diff --git a/code/game/objects/items/etherealdiscoball.dm b/code/game/objects/items/etherealdiscoball.dm index 571b1043fb5..db35c246db2 100644 --- a/code/game/objects/items/etherealdiscoball.dm +++ b/code/game/objects/items/etherealdiscoball.dm @@ -38,12 +38,8 @@ /obj/structure/etherealball/AltClick(mob/living/carbon/human/user) . = ..() - if(anchored) - to_chat(user, "You unlock the disco ball.") - anchored = FALSE - else - to_chat(user, "You lock the disco ball.") - anchored = TRUE + set_anchored(!anchored) + to_chat(user, "You [anchored ? null : "un"]lock the disco ball.") /obj/structure/etherealball/proc/TurnOn() TurnedOn = TRUE //Same diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index ddbed1dabf1..d09ecf22e34 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -42,6 +42,8 @@ dog_fashion = null /obj/item/extinguisher/proc/refill() + if(!chem) + return create_reagents(max_water, AMOUNT_VISIBLE) reagents.add_reagent(chem, max_water) diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index 792568bc9ec..ba47631e118 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -13,11 +13,12 @@ slot_flags = ITEM_SLOT_BACK attack_verb = list("attacked", "chopped", "cleaved", "tore", "lacerated", "cut") hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = IS_SHARP + sharpness = SHARP_EDGED max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) resistance_flags = FIRE_PROOF - wound_bonus = -20 + wound_bonus = -15 + bare_wound_bonus = 20 var/wielded = FALSE // track wielded status on item /obj/item/fireaxe/Initialize() diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index bec7b165019..a9d3473b52b 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -370,6 +370,7 @@ However, you are also unable to use any ranged weaponry, and some medical supplies will prove useless to you. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab." icon = 'icons/obj/wizard.dmi' icon_state = "scroll2" + worn_icon_state = "scroll" remarks = list("Wait, a high protein diet is really all it takes to become bulletproof...?", "Overwhelming force, immovable object...", "Focus... And you'll be able to incapacitate any foe in seconds...", "I must pierce armor for maximum damage...", "I don't think this would combine with other martial arts...", "Become one with the carp...", "Glub...") /obj/item/book/granter/martial/carp/onlearned(mob/living/carbon/user) diff --git a/code/game/objects/items/grenades/festive.dm b/code/game/objects/items/grenades/festive.dm index 861b61b26f6..dba90466a14 100644 --- a/code/game/objects/items/grenades/festive.dm +++ b/code/game/objects/items/grenades/festive.dm @@ -84,7 +84,7 @@ /obj/item/grenade/firecracker/fire_act(exposed_temperature, exposed_volume) prime() -obj/item/grenade/firecracker/wirecutter_act(mob/living/user, obj/item/I) +/obj/item/grenade/firecracker/wirecutter_act(mob/living/user, obj/item/I) if(active) return if(det_time) @@ -96,7 +96,7 @@ obj/item/grenade/firecracker/wirecutter_act(mob/living/user, obj/item/I) else to_chat(user, "You've already removed all of the fuse!") -obj/item/grenade/firecracker/preprime(mob/user, delayoverride, msg = TRUE, volume = 80) +/obj/item/grenade/firecracker/preprime(mob/user, delayoverride, msg = TRUE, volume = 80) var/turf/T = get_turf(src) log_grenade(user, T) if(user) diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm index 3f2405d138c..cf911e99c71 100644 --- a/code/game/objects/items/grenades/grenade.dm +++ b/code/game/objects/items/grenades/grenade.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/grenade.dmi' icon_state = "grenade" inhand_icon_state = "flashbang" + worn_icon_state = "grenade" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' throw_speed = 3 diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 04569876329..5b91dcb15b1 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -3,6 +3,7 @@ desc = "Used to put holes in specific areas without too much extra hole. A saboteur's favorite." icon_state = "plastic-explosive0" inhand_icon_state = "plastic-explosive" + worn_icon_state = "c4" lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi' item_flags = NOBLUDGEON @@ -160,5 +161,6 @@ desc = "A shaped high-explosive breaching charge. Designed to ensure user safety and wall nonsafety." icon_state = "plasticx40" inhand_icon_state = "plasticx4" + worn_icon_state = "x4" directional = TRUE boom_sizes = list(0, 2, 5) diff --git a/code/game/objects/items/grenades/syndieminibomb.dm b/code/game/objects/items/grenades/syndieminibomb.dm index 5d49a3bdb15..5c4945dbe28 100644 --- a/code/game/objects/items/grenades/syndieminibomb.dm +++ b/code/game/objects/items/grenades/syndieminibomb.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/grenade.dmi' icon_state = "syndicate" inhand_icon_state = "flashbang" + worn_icon_state = "minibomb" ex_dev = 1 ex_heavy = 2 ex_light = 4 diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 68bfa6f91a8..7485239e71f 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -316,7 +316,7 @@ w_class = WEIGHT_CLASS_HUGE slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT block_chance = 30 - sharpness = IS_SHARP + sharpness = SHARP_EDGED hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "cut") @@ -418,7 +418,7 @@ w_class = WEIGHT_CLASS_BULKY armour_penetration = 35 slot_flags = ITEM_SLOT_BACK - sharpness = IS_SHARP + sharpness = SHARP_EDGED attack_verb = list("chopped", "sliced", "cut", "reaped") /obj/item/nullrod/scythe/Initialize() @@ -526,7 +526,7 @@ righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' w_class = WEIGHT_CLASS_HUGE item_flags = ABSTRACT - sharpness = IS_SHARP + sharpness = SHARP_EDGED attack_verb = list("sawed", "tore", "lacerated", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' tool_behaviour = TOOL_SAW @@ -544,7 +544,7 @@ name = "clown dagger" desc = "Used for absolutely hilarious sacrifices." hitsound = 'sound/items/bikehorn.ogg' - sharpness = IS_SHARP + sharpness = SHARP_EDGED attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "cut") /obj/item/nullrod/pride_hammer @@ -590,7 +590,7 @@ throw_speed = 4 throw_range = 7 throwforce = 30 - sharpness = IS_SHARP + sharpness = SHARP_EDGED attack_verb = list("enlightened", "redpilled") /obj/item/nullrod/armblade @@ -603,7 +603,7 @@ righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' item_flags = ABSTRACT w_class = WEIGHT_CLASS_HUGE - sharpness = IS_SHARP + sharpness = SHARP_EDGED wound_bonus = -20 bare_wound_bonus = 25 @@ -644,7 +644,7 @@ force = 15 block_chance = 40 slot_flags = ITEM_SLOT_BACK - sharpness = IS_BLUNT + sharpness = SHARP_NONE hitsound = "swing_hit" attack_verb = list("smashed", "slammed", "whacked", "thwacked") icon = 'icons/obj/items_and_weapons.dmi' @@ -662,7 +662,7 @@ name = "arrhythmic knife" w_class = WEIGHT_CLASS_HUGE desc = "They say fear is the true mind killer, but stabbing them in the head works too. Honour compels you to not sheathe it once drawn." - sharpness = IS_SHARP + sharpness = SHARP_EDGED slot_flags = null hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "cut") @@ -678,8 +678,11 @@ . = ..() /obj/item/nullrod/tribal_knife/process() - slowdown = rand(-2, 2) - + slowdown = rand(-10, 10)/10 + if(iscarbon(loc)) + var/mob/living/carbon/wielder = loc + if(wielder.is_holding(src)) + wielder.update_equipment_speed_mods() /obj/item/nullrod/pitchfork icon_state = "pitchfork0" @@ -690,7 +693,7 @@ desc = "Holding this makes you look absolutely devilish." attack_verb = list("poked", "impaled", "pierced", "jabbed") hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = IS_SHARP + sharpness = SHARP_EDGED /obj/item/nullrod/egyptian name = "egyptian staff" @@ -727,7 +730,7 @@ icon = 'icons/obj/clockwork_objects.dmi' slot_flags = ITEM_SLOT_BELT armour_penetration = 10 - sharpness = IS_SHARP_ACCURATE + sharpness = SHARP_POINTY w_class = WEIGHT_CLASS_BULKY attack_verb = list("stabbed", "poked", "slashed", "clocked") hitsound = 'sound/weapons/bladeslice.ogg' diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 1d849b6c887..598576a208f 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -19,7 +19,7 @@ name = "fork" desc = "Pointy." icon_state = "fork" - force = 5 + force = 4 w_class = WEIGHT_CLASS_TINY throwforce = 0 throw_speed = 3 @@ -30,6 +30,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) item_flags = EYE_STAB + sharpness = SHARP_POINTY var/datum/reagent/forkload //used to eat omelette /obj/item/kitchen/fork/suicide_act(mob/living/carbon/user) @@ -84,7 +85,7 @@ throw_range = 6 custom_materials = list(/datum/material/iron=12000) attack_verb = list("slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "cut") - sharpness = IS_SHARP_ACCURATE + sharpness = SHARP_EDGED armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) item_flags = EYE_STAB var/bayonet = FALSE //Can this be attached to a gun? @@ -117,7 +118,7 @@ throw_range = 5 custom_materials = list(/datum/material/plastic = 100) attack_verb = list("prodded", "whiffed","scratched", "poked") - sharpness = IS_SHARP + sharpness = SHARP_EDGED custom_price = 50 var/break_chance = 25 diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index 4951712547d..91c9677ff29 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -54,5 +54,5 @@ var/obj/item/tank/T = W blow(T, user) return - if (W.get_sharpness() || W.get_temperature() || is_pointed(W)) + if (W.get_sharpness() || W.get_temperature()) burst() diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index a25a7d607b1..bbdccc18ba1 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -98,7 +98,7 @@ attack_verb_off = list("tapped", "poked") throw_speed = 3 throw_range = 5 - sharpness = IS_SHARP + sharpness = SHARP_EDGED embedding = list("embed_chance" = 75, "impact_pain_mult" = 10) armour_penetration = 35 block_chance = 50 @@ -138,7 +138,7 @@ sword_color = null //stops icon from breaking when turned on. hitcost = 75 //Costs more than a standard cyborg esword w_class = WEIGHT_CLASS_NORMAL - sharpness = IS_SHARP + sharpness = SHARP_EDGED light_color = "#40ceff" tool_behaviour = TOOL_SAW toolspeed = 0.7 //faster as a saw @@ -219,7 +219,7 @@ throw_range = 1 w_class = WEIGHT_CLASS_BULKY//So you can't hide it in your pocket or some such. var/datum/effect_system/spark_spread/spark_system - sharpness = IS_SHARP + sharpness = SHARP_EDGED //Most of the other special functions are handled in their own files. aka special snowflake code so kewl /obj/item/melee/transforming/energy/blade/Initialize() diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index d3dc42f8935..8b1607095d2 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -44,7 +44,7 @@ throwforce = 10 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "cut") - sharpness = IS_SHARP + sharpness = SHARP_EDGED /obj/item/melee/synthetic_arm_blade/Initialize() . = ..() @@ -64,10 +64,12 @@ w_class = WEIGHT_CLASS_BULKY block_chance = 50 armour_penetration = 75 - sharpness = IS_SHARP + sharpness = SHARP_EDGED attack_verb = list("slashed", "cut") hitsound = 'sound/weapons/rapierhit.ogg' custom_materials = list(/datum/material/iron = 1000) + wound_bonus = 10 + bare_wound_bonus = 25 /obj/item/melee/sabre/Initialize() . = ..() @@ -143,7 +145,7 @@ slot_flags = ITEM_SLOT_BELT force = 5 w_class = WEIGHT_CLASS_BULKY - sharpness = IS_SHARP + sharpness = SHARP_EDGED throwforce = 10 block_chance = 20 armour_penetration = 65 @@ -653,6 +655,7 @@ icon = 'icons/obj/items_and_weapons.dmi' icon_state = "mace_greyscale" inhand_icon_state = "mace_greyscale" + worn_icon_state = "mace" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Material type changes the prefix as well as the color. diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm index bfed019f671..c6fe6c4eda4 100644 --- a/code/game/objects/items/melee/transforming.dm +++ b/code/game/objects/items/melee/transforming.dm @@ -1,5 +1,5 @@ /obj/item/melee/transforming - sharpness = IS_SHARP + sharpness = SHARP_EDGED var/active = FALSE var/force_on = 30 //force when active var/faction_bonus_force = 0 //Bonus force dealt against certain factions diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 141b759860f..e5bbc475c47 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -26,12 +26,10 @@ /obj/item/mop/proc/clean(turf/A, mob/living/cleaner) if(reagents.has_reagent(/datum/reagent/water, 1) || reagents.has_reagent(/datum/reagent/water/holywater, 1) || reagents.has_reagent(/datum/reagent/consumable/ethanol/vodka, 1) || reagents.has_reagent(/datum/reagent/space_cleaner, 1)) - SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) - for(var/obj/effect/O in A) - if(is_cleanable(O)) - var/obj/effect/decal/cleanable/C = O - cleaner?.mind.adjust_experience(/datum/skill/cleaning, max(round(C.beauty/CLEAN_SKILL_BEAUTY_ADJUSTMENT,1),0)) //it is intentional that the mop rounds xp but soap does not, USE THE SACRED TOOL - qdel(O) + for(var/obj/effect/decal/cleanable/cleanable_decal in A) + cleaner?.mind.adjust_experience(/datum/skill/cleaning, max(round(cleanable_decal.beauty / CLEAN_SKILL_BEAUTY_ADJUSTMENT, 1), 0)) //it is intentional that the mop rounds xp but soap does not, USE THE SACRED TOOL + A.wash(CLEAN_SCRUB) + reagents.expose(A, TOUCH, 10) //Needed for proper floor wetting. var/val2remove = 1 if(cleaner?.mind) diff --git a/code/game/objects/items/pitchfork.dm b/code/game/objects/items/pitchfork.dm index d006fa7cab2..2a56df47fe4 100644 --- a/code/game/objects/items/pitchfork.dm +++ b/code/game/objects/items/pitchfork.dm @@ -9,7 +9,7 @@ w_class = WEIGHT_CLASS_BULKY attack_verb = list("attacked", "impaled", "pierced") hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = IS_SHARP + sharpness = SHARP_EDGED max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) resistance_flags = FIRE_PROOF diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index 4b92921d087..f45dadda293 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -140,7 +140,7 @@ /obj/item/pressure_plate/hologrid/Crossed(atom/movable/AM) . = ..() if(trigger_item && istype(AM, specific_item) && !claimed) - AM.anchored = TRUE + AM.set_anchored(TRUE) flick("laserbox_burn", AM) trigger() sleep(15) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 2015902cf02..22d7900ffa9 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -349,11 +349,8 @@ var/firedelay = 0 var/hitspeed = 2 - var/hitdamage = 0 - var/emaggedhitdamage = 3 /obj/item/borg/lollipop/clown - emaggedhitdamage = 0 /obj/item/borg/lollipop/equipped() . = ..() @@ -418,11 +415,14 @@ to_chat(user, "Not enough lollipops left!") return FALSE candy-- - var/obj/item/ammo_casing/caseless/lollipop/A = new /obj/item/ammo_casing/caseless/lollipop(src) - A.BB.damage = hitdamage - if(hitdamage) - A.BB.nodamage = FALSE - A.BB.speed = 0.5 + + var/obj/item/ammo_casing/caseless/lollipop/A + var/mob/living/silicon/robot/R = user + if(istype(R) && R.emagged) + A = new /obj/item/ammo_casing/caseless/lollipop/harmful(src) + else + A = new /obj/item/ammo_casing/caseless/lollipop(src) + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) A.fire_casing(target, user, params, 0, 0, null, 0, src) user.visible_message("[user] blasts a flying lollipop at [target]!") @@ -433,11 +433,13 @@ to_chat(user, "Not enough gumballs left!") return FALSE candy-- - var/obj/item/ammo_casing/caseless/gumball/A = new /obj/item/ammo_casing/caseless/gumball(src) - A.BB.damage = hitdamage - if(hitdamage) - A.BB.nodamage = FALSE - A.BB.speed = 0.5 + var/obj/item/ammo_casing/caseless/gumball/A + var/mob/living/silicon/robot/R = user + if(istype(R) && R.emagged) + A = new /obj/item/ammo_casing/caseless/gumball/harmful(src) + else + A = new /obj/item/ammo_casing/caseless/gumball(src) + A.BB.color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) playsound(src.loc, 'sound/weapons/bulletflyby3.ogg', 50, TRUE) A.fire_casing(target, user, params, 0, 0, null, 0, src) @@ -452,8 +454,6 @@ if(!R.cell.use(12)) to_chat(user, "Not enough power.") return FALSE - if(R.emagged) - hitdamage = emaggedhitdamage switch(mode) if(DISPENSE_LOLLIPOP_MODE, DISPENSE_ICECREAM_MODE) if(!proximity) @@ -463,7 +463,6 @@ shootL(target, user, click_params) if(THROW_GUMBALL_MODE) shootG(target, user, click_params) - hitdamage = initial(hitdamage) /obj/item/borg/lollipop/attack_self(mob/living/user) switch(mode) @@ -492,6 +491,8 @@ projectile_type = /obj/projectile/bullet/reusable/gumball click_cooldown_override = 2 +/obj/item/ammo_casing/caseless/gumball/harmful + projectile_type = /obj/projectile/bullet/reusable/gumball/harmful /obj/projectile/bullet/reusable/gumball name = "gumball" @@ -499,6 +500,13 @@ icon_state = "gumball" ammo_type = /obj/item/reagent_containers/food/snacks/chewable/gumball/cyborg nodamage = TRUE + damage = 0 + speed = 0.5 + +/obj/projectile/bullet/reusable/gumball/harmful + ammo_type = /obj/item/reagent_containers/food/snacks/chewable/gumball/cyborg + nodamage = FALSE + damage = 3 /obj/projectile/bullet/reusable/gumball/handle_drop() if(!dropped) @@ -513,13 +521,26 @@ projectile_type = /obj/projectile/bullet/reusable/lollipop click_cooldown_override = 2 +// rejected name: DumDum lollipop (get it, cause it embeds?) +/obj/item/ammo_casing/caseless/lollipop/harmful + projectile_type = /obj/projectile/bullet/reusable/lollipop/harmful + /obj/projectile/bullet/reusable/lollipop name = "lollipop" desc = "Oh noes! A fast-moving lollipop!" icon_state = "lollipop_1" ammo_type = /obj/item/reagent_containers/food/snacks/chewable/lollipop/cyborg - var/color2 = rgb(0, 0, 0) + embedding = null nodamage = TRUE + damage = 0 + speed = 0.5 + var/color2 = rgb(0, 0, 0) + +/obj/projectile/bullet/reusable/lollipop/harmful + embedding = list(embed_chance=35, fall_chance=2, jostle_chance=0, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.5, pain_mult=3, rip_time=10) + damage = 3 + nodamage = FALSE + embed_falloff_tile = 0 /obj/projectile/bullet/reusable/lollipop/Initialize() . = ..() diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 86595e46924..f8a3a5f846f 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -56,12 +56,10 @@ . += "[head.icon_state]+o" /obj/item/robot_suit/proc/check_completion() - if(src.l_arm && src.r_arm) - if(src.l_leg && src.r_leg) - if(src.chest && src.head) - SSblackbox.record_feedback("amount", "cyborg_frames_built", 1) - return 1 - return 0 + if(l_arm && r_arm && l_leg && r_leg && head && head.flash1 && head.flash2 && chest && chest.wired && chest.cell) + SSblackbox.record_feedback("amount", "cyborg_frames_built", 1) + return TRUE + return FALSE /obj/item/robot_suit/wrench_act(mob/living/user, obj/item/I) //Deconstucts empty borg shell. Flashes remain unbroken because they haven't been used yet . = ..() diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 93c7f8e02b3..9f1ebd71400 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -527,7 +527,7 @@ R.notransform = TRUE var/prev_lockcharge = R.lockcharge R.SetLockdown(1) - R.anchored = TRUE + R.set_anchored(TRUE) var/datum/effect_system/smoke_spread/smoke = new smoke.set_up(1, R.loc) smoke.start() @@ -537,7 +537,7 @@ sleep(12) if(!prev_lockcharge) R.SetLockdown(0) - R.anchored = FALSE + R.set_anchored(FALSE) R.notransform = FALSE R.resize = 2 R.hasExpanded = TRUE diff --git a/code/game/objects/items/scrolls.dm b/code/game/objects/items/scrolls.dm index f441208cfa8..36be826f701 100644 --- a/code/game/objects/items/scrolls.dm +++ b/code/game/objects/items/scrolls.dm @@ -3,6 +3,7 @@ desc = "A scroll for moving around." icon = 'icons/obj/wizard.dmi' icon_state = "scroll" + worn_icon_state = "scroll" var/uses = 4 w_class = WEIGHT_CLASS_SMALL inhand_icon_state = "paper" diff --git a/code/game/objects/items/sharpener.dm b/code/game/objects/items/sharpener.dm index 62bc2a0b4b7..01593f81589 100644 --- a/code/game/objects/items/sharpener.dm +++ b/code/game/objects/items/sharpener.dm @@ -39,7 +39,7 @@ I.force = clamp(I.force + increment, 0, max) user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.") playsound(src, 'sound/items/unsheath.ogg', 25, TRUE) - I.sharpness = IS_SHARP_ACCURATE + I.sharpness = SHARP_POINTY I.throwforce = clamp(I.throwforce + increment, 0, max) I.name = "[prefix] [I.name]" name = "worn out [name]" diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm index 91df52a6ea5..2b1adaab6dd 100644 --- a/code/game/objects/items/shrapnel.dm +++ b/code/game/objects/items/shrapnel.dm @@ -7,47 +7,41 @@ icon_state = "large" w_class = WEIGHT_CLASS_TINY item_flags = DROPDEL - sharpness = TRUE + sharpness = SHARP_EDGED /obj/item/shrapnel/stingball // stingbang grenades name = "stingball" embedding = list(embed_chance=90, fall_chance=3, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.7, pain_mult=5, jostle_pain_mult=6, rip_time=15) icon_state = "tiny" - sharpness = FALSE + sharpness = SHARP_NONE /obj/item/shrapnel/bullet // bullets name = "bullet" icon = 'icons/obj/ammo.dmi' icon_state = "s-casing" - item_flags = NONE - -/obj/item/shrapnel/bullet/c38 // .38 round - name = "\improper .38 bullet" - -/obj/item/shrapnel/bullet/c38/dumdum // .38 DumDum round - name = "\improper .38 DumDum bullet" - embedding = list(embed_chance=70, fall_chance=7, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10) + embedding = null // embedding vars are taken from the projectile itself /obj/projectile/bullet/shrapnel name = "flying shrapnel shard" - damage = 8 - range = 10 + damage = 14 + range = 20 armour_penetration = -30 dismemberment = 5 ricochets_max = 2 - ricochet_chance = 40 + ricochet_chance = 70 shrapnel_type = /obj/item/shrapnel ricochet_incidence_leeway = 60 hit_stunned_targets = TRUE - sharpness = TRUE - wound_bonus = 30 + sharpness = SHARP_EDGED + wound_bonus = 40 /obj/projectile/bullet/shrapnel/mega name = "flying shrapnel hunk" - range = 25 - dismemberment = 10 - ricochets_max = 4 - ricochet_chance = 90 + range = 45 + dismemberment = 15 + ricochets_max = 6 + ricochet_chance = 130 + ricochet_incidence_leeway = 0 ricochet_decay_chance = 0.9 /obj/projectile/bullet/pellet/stingball @@ -72,13 +66,13 @@ name = "breakbang pellet" damage = 10 wound_bonus = 40 - sharpness = FALSE + sharpness = SHARP_NONE /obj/projectile/bullet/pellet/stingball/shred name = "shredbang pellet" damage = 10 wound_bonus = 30 - sharpness = TRUE + sharpness = SHARP_EDGED /obj/projectile/bullet/pellet/stingball/on_ricochet(atom/A) hit_stunned_targets = TRUE // ducking will save you from the first wave, but not the rebounds diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index 0c54185ae40..be175f78bd3 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -10,17 +10,17 @@ slot_flags = ITEM_SLOT_BACK throwforce = 20 throw_speed = 4 - embedding = list("impact_pain_mult" = 3) + embedding = list("impact_pain_mult" = 2, "remove_pain_mult" = 4, "jostle_chance" = 2.5) armour_penetration = 10 custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075) hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "poked", "jabbed", "tore", "lacerated", "gored") - sharpness = IS_SHARP + sharpness = SHARP_EDGED // i know the whole point of spears is that they're pointy, but edged is more devastating at the moment so max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) var/war_cry = "AAAAARGH!!!" var/icon_prefix = "spearglass" - wound_bonus = -25 + wound_bonus = -15 bare_wound_bonus = 15 /obj/item/spear/ComponentInitialize() diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm index 52c59558184..1243bd5e3d7 100644 --- a/code/game/objects/items/stacks/cash.dm +++ b/code/game/objects/items/stacks/cash.dm @@ -20,7 +20,7 @@ /obj/item/stack/spacecash/proc/update_desc() var/total_worth = get_item_credit_value() - desc = "It's worth [total_worth] credit[( total_worth > 1 ) ? "s" : ""]" + desc = "It's worth [total_worth] credit[( total_worth > 1 ) ? "s" : ""] in total." /obj/item/stack/spacecash/get_item_credit_value() return (amount*value) @@ -33,6 +33,28 @@ . = ..() update_desc() +/obj/item/stack/spacecash/update_icon_state() + var/cash_value = get_item_credit_value() + switch(cash_value) + if(1 to 9) + icon_state = "spacecash" + if(10 to 19) + icon_state = "spacecash10" + if(20 to 49) + icon_state = "spacecash20" + if(50 to 99) + icon_state = "spacecash50" + if(100 to 199) + icon_state = "spacecash100" + if(200 to 499) + icon_state = "spacecash200" + if(500 to 999) + icon_state = "spacecash500" + if(1000 to 9999) + icon_state = "spacecash1000" + if(10000 to INFINITY) + icon_state = "spacecash10000" + /obj/item/stack/spacecash/c1 icon_state = "spacecash" singular_name = "one credit bill" diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index dadb5ada594..ebfd5b8b3a7 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -124,11 +124,34 @@ // gauze is only relevant for wounds, which are handled in the wounds themselves /obj/item/stack/medical/gauze/try_heal(mob/living/M, mob/user, silent) var/obj/item/bodypart/limb = M.get_bodypart(check_zone(user.zone_selected)) - if(limb) - if(limb.brute_dam > 40) - to_chat(user, "The bleeding on [user==M ? "your" : "[M]'s"] [limb.name] is from bruising, and cannot be treated with [src]!") - else - to_chat(user, "There's no bleeding on [user==M ? "your" : "[M]'s"] [limb.name]") + if(!limb) + to_chat(user, "There's nothing there to bandage!") + return + if(!LAZYLEN(limb.wounds)) + to_chat(user, "There's no wounds that require bandaging on [user==M ? "your" : "[M]'s"] [limb.name]!") // good problem to have imo + return + + var/gauzeable_wound = FALSE + for(var/i in limb.wounds) + var/datum/wound/woundies = i + if(woundies.wound_flags & ACCEPTS_GAUZE) + gauzeable_wound = TRUE + break + if(!gauzeable_wound) + to_chat(user, "There's no wounds that require bandaging on [user==M ? "your" : "[M]'s"] [limb.name]!") // good problem to have imo + return + + if(limb.current_gauze && (limb.current_gauze.absorption_capacity * 0.8 > absorption_capacity)) // ignore if our new wrap is < 20% better than the current one, so someone doesn't bandage it 5 times in a row + to_chat(user, "The bandage currently on [user==M ? "your" : "[M]'s"] [limb.name] is still in good condition!") + return + + user.visible_message("[user] begins wrapping the wounds on [M]'s [limb.name] with [src]...", "You begin wrapping the wounds on [user == M ? "your" : "[M]'s"] [limb.name] with [src]...") + + if(!do_after(user, (user == M ? self_delay : other_delay), target=M)) + return + + user.visible_message("[user] applies [src] to [M]'s [limb.name].", "You bandage the wounds on [user == M ? "yourself" : "[M]'s"] [limb.name].") + limb.apply_gauze(src) /obj/item/stack/medical/gauze/twelve amount = 12 @@ -399,9 +422,9 @@ C.emote("scream") for(var/i in C.bodyparts) var/obj/item/bodypart/bone = i - var/datum/wound/brute/bone/severe/oof_ouch = new + var/datum/wound/blunt/severe/oof_ouch = new oof_ouch.apply_wound(bone) - var/datum/wound/brute/bone/critical/oof_OUCH = new + var/datum/wound/blunt/critical/oof_OUCH = new oof_OUCH.apply_wound(bone) for(var/i in C.bodyparts) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index facca0f589a..16419573993 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -250,7 +250,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( resistance_flags = ACID_PROOF armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100) max_integrity = 40 - sharpness = IS_SHARP + sharpness = SHARP_EDGED var/icon_prefix var/obj/item/stack/sheet/weld_material = /obj/item/stack/sheet/glass embedding = list("embed_chance" = 65) diff --git a/code/game/objects/items/storage/basket.dm b/code/game/objects/items/storage/basket.dm new file mode 100644 index 00000000000..faf11e2c828 --- /dev/null +++ b/code/game/objects/items/storage/basket.dm @@ -0,0 +1,12 @@ +/obj/item/storage/basket + name = "basket" + desc = "Handwoven basket." + icon_state = "basket" + w_class = WEIGHT_CLASS_BULKY + resistance_flags = FLAMMABLE + +/obj/item/storage/basket/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_w_class = WEIGHT_CLASS_NORMAL + STR.max_combined_w_class = 21 diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index a5f39ce3522..5cbbb748f42 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -195,7 +195,7 @@ new /obj/item/reagent_containers/syringe(src) new /obj/item/stack/medical/bone_gel(src) new /obj/item/stack/sticky_tape/surgical(src) - new /obj/item/reagent_containers/glass/bottle/calomel(src) + new /obj/item/reagent_containers/glass/bottle/formaldehyde(src) update_icon() /obj/item/storage/belt/security diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index 5a38f9158e5..19cb8a98da7 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -3,6 +3,7 @@ desc = "I guess someone didn't like it." icon = 'icons/obj/library.dmi' icon_state ="book" + worn_icon_state = "book" throw_speed = 2 throw_range = 5 w_class = WEIGHT_CLASS_NORMAL diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 028b4036571..3a42d3290ae 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -260,7 +260,7 @@ if(empty) return var/static/items_inside = list( - /obj/item/reagent_containers/pill/patch/instabitaluri = 3, + /obj/item/reagent_containers/pill/patch/synthflesh = 3, /obj/item/reagent_containers/hypospray/medipen/atropine = 2, /obj/item/stack/medical/gauze = 1, /obj/item/storage/pill_bottle/penacid = 1) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 7ff12aaf767..b395f6d42b9 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -240,10 +240,6 @@ playsound(src, stun_sound, 50, TRUE, -1) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - H.forcesay(GLOB.hit_appends) - attack_cooldown_check = world.time + attack_cooldown ADD_TRAIT(L, TRAIT_IWASBATONED, user) diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 081542b2872..a3b5454be82 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -109,7 +109,7 @@ /obj/item/tank/jetpack/suicide_act(mob/user) if (istype(user, /mob/living/carbon/human/)) var/mob/living/carbon/human/H = user - H.forcesay("WHAT THE FUCK IS CARBON DIOXIDE?") + H.say("WHAT THE FUCK IS CARBON DIOXIDE?") H.visible_message("[user] is suffocating [user.p_them()]self with [src]! It looks like [user.p_they()] didn't read what that jetpack says!") return (OXYLOSS) else diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 85477a713e4..9aa8e286a1b 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -23,6 +23,12 @@ create_reagents(volume, OPENCONTAINER) noz = make_noz() + +/obj/item/watertank/Destroy() + QDEL_NULL(noz) + return ..() + + /obj/item/watertank/ui_action_click(mob/user) toggle_mister(user) @@ -70,10 +76,6 @@ M.temporarilyRemoveItemFromInventory(noz, TRUE) noz.forceMove(src) -/obj/item/watertank/Destroy() - QDEL_NULL(noz) - return ..() - /obj/item/watertank/attack_hand(mob/user) if (user.get_item_by_slot(user.getBackSlot()) == src) toggle_mister(user) @@ -217,6 +219,7 @@ cooling_power = 5 w_class = WEIGHT_CLASS_HUGE item_flags = ABSTRACT // don't put in storage + chem = null //holds no chems of its own, it takes from the tank. var/obj/item/watertank/tank var/nozzle_mode = 0 var/metal_synthesis_cooldown = 0 @@ -231,6 +234,12 @@ max_water = tank.volume +/obj/item/extinguisher/mini/nozzle/Destroy() + reagents = null //This is a borrowed reference from the tank. + tank = null + return ..() + + /obj/item/extinguisher/mini/nozzle/doMove(atom/destination) if(destination && (destination != tank.loc || !ismob(destination))) if(loc != tank) diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index 0a8016eae10..10db710af42 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -149,16 +149,38 @@ qdel(W) qdel(src) +/obj/item/hemostat/supermatter_sliver/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + if(!isliving(hit_atom)) + return ..() + var/mob/living/victim = hit_atom + if(victim.incorporeal_move || victim.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions + return ..() + if(throwingdatum?.thrower) + var/mob/user = throwingdatum.thrower + log_combat(throwingdatum?.thrower, hit_atom, "consumed", src) + message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)], thrown by [key_name_admin(user)].") + investigate_log("has consumed [key_name(victim)], thrown by [key_name(user)]", INVESTIGATE_SUPERMATTER) + else + message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)] via throw impact.") + investigate_log("has consumed [key_name(victim)] via throw impact.", INVESTIGATE_SUPERMATTER) + victim.visible_message("As [victim] is hit by [src], both flash into dust and silence fills the room...",\ + "You're hit by [src] and everything suddenly goes silent.\n[src] flashes into dust, and soon as you can register this, you do as well.",\ + "Everything suddenly goes silent.") + victim.dust() + radiation_pulse(src, 500, 2) + playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE) + qdel(src) + /obj/item/nuke_core/supermatter_sliver/pickup(mob/living/user) ..() - if(!iscarbon(user)) + if(!isliving(user) || user.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions return FALSE var/mob/ded = user user.visible_message("[ded] reaches out and tries to pick up [src]. [ded.p_their()] body starts to glow and bursts into flames before flashing into dust!",\ "You reach for [src] with your hands. That was dumb.",\ "Everything suddenly goes silent.") radiation_pulse(user, 500, 2) - playsound(get_turf(user), 'sound/effects/supermatter.ogg', 50, TRUE) + playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE) ded.dust() /obj/item/nuke_core_container/supermatter @@ -225,10 +247,7 @@ return ..() /obj/item/hemostat/supermatter/update_icon_state() - if(sliver) - icon_state = "supermatter_tongs_loaded" - else - icon_state = "supermatter_tongs" + icon_state = "supermatter_tongs[sliver ? "_loaded" : null]" /obj/item/hemostat/supermatter/afterattack(atom/O, mob/user, proximity) . = ..() @@ -243,18 +262,25 @@ visible_message("\The [sliver] falls out of \the [src] as it hits the ground.") sliver = null update_icon() - ..() + return ..() /obj/item/hemostat/supermatter/proc/Consume(atom/movable/AM, mob/user) if(ismob(AM)) - var/mob/victim = AM + if(!isliving(AM)) + return + var/mob/living/victim = AM + if(victim.incorporeal_move || victim.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions + return victim.dust() message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)].") - investigate_log("has consumed [key_name(victim)].", "supermatter") + investigate_log("has consumed [key_name(victim)].", INVESTIGATE_SUPERMATTER) + else if(istype(AM, /obj/singularity)) + return else - investigate_log("has consumed [AM].", "supermatter") + investigate_log("has consumed [AM].", INVESTIGATE_SUPERMATTER) qdel(AM) if (user) + log_combat(user, AM, "consumed", sliver, "via [src]") user.visible_message("As [user] touches [AM] with \the [src], both flash into dust and silence fills the room...",\ "You touch [AM] with [src], and everything suddenly goes silent.\n[AM] and [sliver] flash into dust, and soon as you can register this, you do as well.",\ "Everything suddenly goes silent.") diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 59108d05c6e..b306cd229aa 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -24,6 +24,7 @@ drop_sound = 'sound/items/handling/screwdriver_drop.ogg' pickup_sound = 'sound/items/handling/screwdriver_pickup.ogg' item_flags = EYE_STAB + sharpness = SHARP_POINTY var/random_color = TRUE //if the screwdriver uses random coloring var/static/list/screwdriver_colors = list( "blue" = rgb(24, 97, 213), diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 2c7d2664c94..623c1caacc9 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -35,6 +35,8 @@ heat = 3800 tool_behaviour = TOOL_WELDER toolspeed = 1 + wound_bonus = 10 + bare_wound_bonus = 15 /obj/item/weldingtool/Initialize() . = ..() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 8406a62f546..3c3667a6b50 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -168,6 +168,14 @@ var/mob/M = loc SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "badass_antag", /datum/mood_event/badass_antag) . = ..() + + +/obj/item/toy/balloon/arrest + name = "arreyst balloon" + desc = "A half inflated balloon about a boyband named Arreyst that was popular about ten years ago, famous for making fun of red jumpsuits as unfashionable." + icon_state = "arrestballoon" + inhand_icon_state = "arrestballoon" + random_color = FALSE /* * Fake singularity diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index cfb86786baf..c1d259678bf 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -65,7 +65,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 w_class = WEIGHT_CLASS_NORMAL attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "cut") block_chance = 50 - sharpness = IS_SHARP + sharpness = SHARP_EDGED max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF @@ -219,7 +219,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "cut") block_chance = 50 - sharpness = IS_SHARP + sharpness = SHARP_EDGED max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF @@ -290,13 +290,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' force = 2 - throwforce = 20 //20 + 2 (WEIGHT_CLASS_SMALL) * 4 (EMBEDDED_IMPACT_PAIN_MULTIPLIER) = 28 damage on hit due to guaranteed embedding + throwforce = 10 //10 + 2 (WEIGHT_CLASS_SMALL) * 4 (EMBEDDED_IMPACT_PAIN_MULTIPLIER) = 18 damage on hit due to guaranteed embedding throw_speed = 4 embedding = list("pain_mult" = 4, "embed_chance" = 100, "fall_chance" = 0) armour_penetration = 40 w_class = WEIGHT_CLASS_SMALL - sharpness = IS_SHARP + sharpness = SHARP_POINTY custom_materials = list(/datum/material/iron=500, /datum/material/glass=500) resistance_flags = FIRE_PROOF @@ -309,7 +309,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/throwing_star/toy name = "toy throwing star" desc = "An aerodynamic disc strapped with adhesive for sticking to people, good for playing pranks and getting yourself killed by security." - sharpness = IS_BLUNT + sharpness = SHARP_NONE force = 0 throwforce = 0 embedding = list("pain_mult" = 0, "jostle_pain_mult" = 0, "embed_chance" = 100, "fall_chance" = 0) @@ -353,7 +353,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 icon_state = "switchblade_ext" attack_verb = list("slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = IS_SHARP + sharpness = SHARP_EDGED else force = 3 w_class = WEIGHT_CLASS_SMALL @@ -361,7 +361,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 icon_state = "switchblade" attack_verb = list("stubbed", "poked") hitsound = 'sound/weapons/genhit.ogg' - sharpness = IS_BLUNT + sharpness = SHARP_NONE /obj/item/switchblade/suicide_act(mob/user) user.visible_message("[user] is slitting [user.p_their()] own throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -466,7 +466,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throwforce = 0 throw_range = 0 throw_speed = 0 - sharpness = IS_SHARP + sharpness = SHARP_EDGED attack_verb = list("sawed", "tore", "lacerated", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' tool_behaviour = TOOL_SAW @@ -503,7 +503,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/statuebust/Initialize() . = ..() AddComponent(/datum/component/art, impressiveness) - addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 1000)), 0) + INVOKE_ASYNC(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 1000)) /obj/item/statuebust/hippocratic name = "hippocrates bust" @@ -855,7 +855,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 force = 20 throwforce = 20 throw_speed = 4 - sharpness = IS_SHARP + sharpness = SHARP_EDGED attack_verb = list("cut", "sliced", "diced") w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 1d4cf432a5d..8b407c7e505 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -43,13 +43,9 @@ vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of obj in openspace. /obj/vv_edit_var(vname, vval) - switch(vname) - if("anchored") - setAnchored(vval) - return TRUE - if(NAMEOF(src, obj_flags)) - if ((obj_flags & DANGEROUS_POSSESSION) && !(vval & DANGEROUS_POSSESSION)) - return FALSE + if(vname == NAMEOF(src, obj_flags)) + if ((obj_flags & DANGEROUS_POSSESSION) && !(vval & DANGEROUS_POSSESSION)) + return FALSE return ..() /obj/Initialize() @@ -83,9 +79,6 @@ SStgui.close_uis(src) . = ..() -/obj/proc/setAnchored(anchorvalue) - SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue) - anchored = anchorvalue /obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE) ..() @@ -203,6 +196,8 @@ /obj/singularity_pull(S, current_size) ..() + if(move_resist == INFINITY) + return if(!anchored || current_size >= STAGE_FIVE) step_towards(src,S) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 0c9c98f970e..8f98c84ea57 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -18,16 +18,16 @@ if (!armor) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) . = ..() - if(smooth) - queue_smooth(src) - queue_smooth_neighbors(src) + if(smoothing_flags) + QUEUE_SMOOTH(src) + QUEUE_SMOOTH_NEIGHBORS(src) icon_state = "" GLOB.cameranet.updateVisibility(src) /obj/structure/Destroy() GLOB.cameranet.updateVisibility(src) - if(smooth) - queue_smooth_neighbors(src) + if(smoothing_flags) + QUEUE_SMOOTH_NEIGHBORS(src) return ..() /obj/structure/attack_hand(mob/user) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 29d192da39a..aaec915bef8 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -59,7 +59,7 @@ anchored = TRUE canSmoothWith = list(/obj/structure/alien/resin) max_integrity = 200 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE var/resintype = null CanAtmosPass = ATMOS_PASS_DENSITY @@ -114,7 +114,7 @@ icon_state = "weeds" max_integrity = 15 canSmoothWith = list(/obj/structure/alien/weeds, /turf/closed/wall) - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_MORE var/last_expand = 0 //last world.time this weed expanded var/growth_cooldown_low = 150 var/growth_cooldown_high = 200 diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 9befac9047c..5f2d79e3b82 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/smooth_structures/alien/nest.dmi' icon_state = "nest" max_integrity = 120 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE can_be_unanchored = FALSE canSmoothWith = null buildstacktype = null diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 5e5eab92743..72639c20ce0 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -284,7 +284,7 @@ else if(W.tool_behaviour == TOOL_WRENCH && anchorable) if(isinspace() && !anchored) return - setAnchored(!anchored) + set_anchored(!anchored) W.play_tool_sound(src, 75) user.visible_message("[user] [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground.", \ "You [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground.", \ diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index fc9365abe5f..0254a3caa13 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -1,7 +1,7 @@ /obj/structure/displaycase name = "display case" icon = 'icons/obj/stationobjs.dmi' - icon_state = "glassbox0" + icon_state = "glassbox" desc = "A display case for prized possessions." density = TRUE anchored = TRUE @@ -14,6 +14,7 @@ var/alert = TRUE var/open = FALSE var/openable = TRUE + var/custom_glass_overlay = FALSE ///If we have a custom glass overlay to use. var/obj/item/electronics/airlock/electronics var/start_showpiece_type = null //add type for items on display var/list/start_showpieces = list() //Takes sublists in the form of list("type" = /obj/item/bikehorn, "trophy_message" = "henk") @@ -32,11 +33,22 @@ showpiece = new start_showpiece_type (src) update_icon() +/obj/structure/displaycase/vv_edit_var(vname, vval) + . = ..() + if(vname in list(NAMEOF(src, open), NAMEOF(src, showpiece), NAMEOF(src, custom_glass_overlay))) + update_icon() + +/obj/structure/displaycase/handle_atom_del(atom/A) + if(A == electronics) + electronics = null + if(A == showpiece) + showpiece = null + update_icon() + return ..() + /obj/structure/displaycase/Destroy() - if(electronics) - QDEL_NULL(electronics) - if(showpiece) - QDEL_NULL(showpiece) + QDEL_NULL(electronics) + QDEL_NULL(showpiece) return ..() /obj/structure/displaycase/examine(mob/user) @@ -44,61 +56,62 @@ if(alert) . += "Hooked up with an anti-theft system." if(showpiece) - . += "There's [showpiece] inside." + . += "There's \a [showpiece] inside." if(trophy_message) . += "The plaque reads:\n [trophy_message]" - /obj/structure/displaycase/proc/dump() - if (showpiece) - showpiece.forceMove(loc) - showpiece = null + if(QDELETED(showpiece)) + return + showpiece.forceMove(drop_location()) + showpiece = null + update_icon() /obj/structure/displaycase/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) if(BRUTE) - playsound(src.loc, 'sound/effects/glasshit.ogg', 75, TRUE) + playsound(src, 'sound/effects/glasshit.ogg', 75, TRUE) if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) + playsound(src, 'sound/items/welder.ogg', 100, TRUE) /obj/structure/displaycase/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) dump() if(!disassembled) - new /obj/item/shard( src.loc ) + new /obj/item/shard(drop_location()) trigger_alarm() qdel(src) /obj/structure/displaycase/obj_break(damage_flag) if(!broken && !(flags_1 & NODECONSTRUCT_1)) density = FALSE - broken = 1 - new /obj/item/shard( src.loc ) + broken = TRUE + new /obj/item/shard(drop_location()) playsound(src, "shatter", 70, TRUE) update_icon() trigger_alarm() +///Anti-theft alarm triggered when broken. /obj/structure/displaycase/proc/trigger_alarm() - //Activate Anti-theft - if(alert) - var/area/alarmed = get_area(src) - alarmed.burglaralert(src) - playsound(src, 'sound/effects/alert.ogg', 50, TRUE) + if(!alert) + return + var/area/alarmed = get_area(src) + alarmed.burglaralert(src) + playsound(src, 'sound/effects/alert.ogg', 50, TRUE) -/obj/structure/displaycase/update_icon() - var/icon/I - if(open) - I = icon('icons/obj/stationobjs.dmi',"glassbox_open") - else - I = icon('icons/obj/stationobjs.dmi',"glassbox0") - if(broken) - I = icon('icons/obj/stationobjs.dmi',"glassboxb0") +/obj/structure/displaycase/update_overlays() + . = ..() if(showpiece) - var/icon/S = getFlatIcon(showpiece) - S.Scale(17,17) - I.Blend(S,ICON_UNDERLAY,8,8) - src.icon = I - return + var/mutable_appearance/showpiece_overlay = mutable_appearance(showpiece.icon, showpiece.icon_state) + showpiece_overlay.copy_overlays(showpiece) + showpiece_overlay.transform *= 0.6 + . += showpiece_overlay + if(custom_glass_overlay) + return + if(broken) + . += "[initial(icon_state)]_broken" + else if(!open) + . += "[initial(icon_state)]_closed" /obj/structure/displaycase/attackby(obj/item/W, mob/user, params) if(W.GetID() && !broken && openable) @@ -148,7 +161,7 @@ to_chat(user, "You start fixing [src]...") if(do_after(user, 20, target = src)) G.use(2) - broken = 0 + broken = FALSE obj_integrity = max_integrity update_icon() else @@ -170,8 +183,7 @@ to_chat(user, "You deactivate the hover field built into the case.") log_combat(user, src, "deactivates the hover field of") dump() - src.add_fingerprint(user) - update_icon() + add_fingerprint(user) return else //prevents remote "kicks" with TK @@ -347,7 +359,7 @@ new /obj/effect/decal/cleanable/ash(loc) QDEL_NULL(showpiece) else - ..() + return ..() /obj/item/key/displaycase name = "display case key" @@ -365,8 +377,8 @@ /obj/structure/displaycase/forsale name = "vend-a-tray" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "laserbox0" + icon_state = "laserbox" + custom_glass_overlay = TRUE desc = "A display case with an ID-card swiper. Use your ID to purchase the contents." density = FALSE max_integrity = 100 @@ -381,22 +393,13 @@ ///We're using the same trick as paper does in order to cache the image, and only load the UI when messed with. var/list/viewing_ui = list() -/obj/structure/displaycase/forsale/update_icon() //remind me to fix my shitcode later - var/icon/I - if(open) - I = icon('icons/obj/stationobjs.dmi',"laserboxb0") - else - I = icon('icons/obj/stationobjs.dmi',"laserbox0") - if(!showpiece && !open) - I = icon('icons/obj/stationobjs.dmi',"laserbox_open") - if(broken) - I = icon('icons/obj/stationobjs.dmi',"laserbox_broken") - if(showpiece) - var/icon/S = getFlatIcon(showpiece) - S.Scale(17,17) - I.Blend(S,ICON_UNDERLAY,8,12) - src.icon = I - return +/obj/structure/displaycase/forsale/update_icon_state() + icon_state = "[initial(icon_state)][broken ? "_broken" : (open ? "_open" : (!showpiece ? "_empty" : null))]" + +/obj/structure/displaycase/forsale/update_overlays() + . = ..() + if(!broken && !open) + . += "[initial(icon_state)]_overlay" /obj/structure/displaycase/forsale/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -455,8 +458,7 @@ usr.put_in_hands(showpiece) to_chat(usr, "You purchase [showpiece] for [sale_price] credits.") playsound(src, 'sound/effects/cashregister.ogg', 40, TRUE) - icon = 'icons/obj/stationobjs.dmi' - flick("laserbox_vend", src) + flick("[initial(icon_state)]_vend", src) showpiece = null update_icon() SStgui.update_uis(src) @@ -522,7 +524,7 @@ if(obj_integrity <= (integrity_failure * max_integrity)) to_chat(user, "You start recalibrating [src]'s hover field...") if(do_after(user, 20, target = src)) - broken = 0 + broken = FALSE obj_integrity = max_integrity update_icon() return TRUE @@ -541,7 +543,7 @@ to_chat(user, "You unsecure [src].") else to_chat(user, "You secure [src].") - anchored = !anchored + set_anchored(!anchored) return else if(!open && user.a_intent == INTENT_HELP) to_chat(user, "[src] must be open to move it.") diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 6e70a13a261..66f6dd9f3a4 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -106,7 +106,7 @@ return to_chat(user, "You secure the airlock assembly.") name = "secured airlock assembly" - setAnchored(TRUE) + set_anchored(TRUE) else to_chat(user, "There is another door here!") @@ -119,7 +119,7 @@ return to_chat(user, "You unsecure the airlock assembly.") name = "airlock assembly" - setAnchored(FALSE) + set_anchored(FALSE) else if(istype(W, /obj/item/stack/cable_coil) && state == AIRLOCK_ASSEMBLY_NEEDS_WIRES && anchored ) if(!W.tool_start_check(user, amount=1)) @@ -295,7 +295,7 @@ target.heat_proof_finished = source.heat_proof_finished target.created_name = source.created_name target.state = source.state - target.setAnchored(source.anchored) + target.set_anchored(source.anchored) if(previous) target.previous_assembly = source.type if(electronics) diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index f7eb4c0a29d..a87a11fbec8 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -11,7 +11,7 @@ to_chat(user, "You begin to [anchored ? "unwrench" : "wrench"] [src].") if(I.use_tool(src, user, 20, volume=50)) to_chat(user, "You successfully [anchored ? "unwrench" : "wrench"] [src].") - setAnchored(!anchored) + set_anchored(!anchored) else return ..() diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index e6c3b25d84c..70a088a8e1b 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -19,7 +19,7 @@ /obj/structure/falsewall/reinforced, /turf/closed/wall/rust, /turf/closed/wall/r_wall/rust) - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE can_be_unanchored = FALSE CanAtmosPass = ATMOS_PASS_DENSITY flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1 @@ -63,15 +63,15 @@ if(opening) if(density) icon_state = "fwall_opening" - smooth = SMOOTH_FALSE + smoothing_flags = NONE clear_smooth_overlays() else icon_state = "fwall_closing" else if(density) icon_state = initial(icon_state) - smooth = SMOOTH_TRUE - queue_smooth(src) + smoothing_flags = SMOOTH_TRUE + QUEUE_SMOOTH(src) else icon_state = "fwall_open" @@ -300,7 +300,7 @@ icon_state = "shuttle" mineral = /obj/item/stack/sheet/mineral/titanium walltype = /turf/closed/wall/mineral/titanium - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_MORE canSmoothWith = list(/turf/closed/wall/mineral/titanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater) /obj/structure/falsewall/plastitanium @@ -310,5 +310,5 @@ icon_state = "shuttle" mineral = /obj/item/stack/sheet/mineral/plastitanium walltype = /turf/closed/wall/mineral/plastitanium - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_MORE canSmoothWith = list(/turf/closed/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index cb8364f6e83..838b753afe3 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -312,40 +312,60 @@ throw_speed = 2 throw_range = 4 + /// Can this plant be trimmed by someone with TRAIT_BONSAI + var/trimmable = TRUE + var/list/static/random_plant_states + /obj/item/kirbyplants/ComponentInitialize() . = ..() AddComponent(/datum/component/tactical) - addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 500)), 0) AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_unwielded=10, force_wielded=10) + INVOKE_ASYNC(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 500)) + +/obj/item/kirbyplants/attackby(obj/item/I, mob/living/user, params) + . = ..() + if(trimmable && HAS_TRAIT(user,TRAIT_BONSAI) && isturf(loc) && I.get_sharpness()) + to_chat(user,"You start trimming [src].") + if(do_after(user,3 SECONDS,target=src)) + to_chat(user,"You finish trimming [src].") + change_visual() + +/// Cycle basic plant visuals +/obj/item/kirbyplants/proc/change_visual() + if(!random_plant_states) + generate_states() + var/current = random_plant_states.Find(icon_state) + var/next = WRAP(current+1,1,length(random_plant_states)) + icon_state = random_plant_states[next] /obj/item/kirbyplants/random icon = 'icons/obj/flora/_flora.dmi' icon_state = "random_plant" - var/list/static/states /obj/item/kirbyplants/random/Initialize() . = ..() icon = 'icons/obj/flora/plants.dmi' - if(!states) + if(!random_plant_states) generate_states() - icon_state = pick(states) + icon_state = pick(random_plant_states) -/obj/item/kirbyplants/random/proc/generate_states() - states = list() +/obj/item/kirbyplants/proc/generate_states() + random_plant_states = list() for(var/i in 1 to 25) var/number if(i < 10) number = "0[i]" else number = "[i]" - states += "plant-[number]" - states += "applebush" + random_plant_states += "plant-[number]" + random_plant_states += "applebush" /obj/item/kirbyplants/dead name = "RD's potted plant" desc = "A gift from the botanical staff, presented after the RD's reassignment. There's a tag on it that says \"Y'all come back now, y'hear?\"\nIt doesn't look very healthy..." icon_state = "plant-25" + trimmable = FALSE /obj/item/kirbyplants/photosynthetic name = "photosynthetic potted plant" @@ -359,6 +379,7 @@ desc = "A fake, cheap looking, plastic tree. Perfect for people who kill every plant they touch." icon_state = "plant-26" custom_materials = (list(/datum/material/plastic = 8000)) + trimmable = FALSE /obj/item/kirbyplants/fullysynthetic/Initialize() . = ..() @@ -368,6 +389,7 @@ name = "Potty the Potted Plant" desc = "A secret agent staffed in the station's bar to protect the mystical cakehat." icon_state = "potty" + trimmable = FALSE //a rock is flora according to where the icon file is //and now these defines diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index 3f9acdb7ae6..f8082610ab2 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -253,7 +253,7 @@ desc = "A large bushy hedge." icon = 'icons/obj/smooth_structures/hedge.dmi' icon_state = "hedge" - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE canSmoothWith = list(/obj/structure/fluff/hedge, /obj/structure/fluff/hedge/opaque) density = TRUE anchored = TRUE diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 712f112b828..62f9efaae8c 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -323,7 +323,7 @@ /datum/outfit/hermit name = "Lavaland hermit" - uniform = /obj/item/clothing/under/color/grey/glorf + uniform = /obj/item/clothing/under/color/grey/ancient shoes = /obj/item/clothing/shoes/sneakers/black back = /obj/item/storage/backpack mask = /obj/item/clothing/mask/breath diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index a5230c49878..833cf07cf60 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -104,6 +104,9 @@ var/obj/structure/falsewall/F = new (loc) transfer_fingerprints_to(F) qdel(src) + else if(state == GIRDER_REINF) + to_chat(user, "You can't finish a reinforced girder with regular metal. You need a plasteel sheet for that.") + return else if(S.get_amount() < 2) to_chat(user, "You need two sheets of metal to finish a wall!") @@ -134,34 +137,33 @@ var/obj/structure/falsewall/reinforced/FW = new (loc) transfer_fingerprints_to(FW) qdel(src) + else if(state == GIRDER_REINF) + if(S.get_amount() < 1) + return + to_chat(user, "You start finalizing the reinforced wall...") + if(do_after(user, 50*platingmodifier, target = src)) + if(S.get_amount() < 1) + return + S.use(1) + to_chat(user, "You fully reinforce the wall.") + var/turf/T = get_turf(src) + T.PlaceOnTop(/turf/closed/wall/r_wall) + transfer_fingerprints_to(T) + qdel(src) + return else - if(state == GIRDER_REINF) + if(S.get_amount() < 1) + return + to_chat(user, "You start reinforcing the girder...") + if(do_after(user, 60*platingmodifier, target = src)) if(S.get_amount() < 1) return - to_chat(user, "You start finalizing the reinforced wall...") - if(do_after(user, 50*platingmodifier, target = src)) - if(S.get_amount() < 1) - return - S.use(1) - to_chat(user, "You fully reinforce the wall.") - var/turf/T = get_turf(src) - T.PlaceOnTop(/turf/closed/wall/r_wall) - transfer_fingerprints_to(T) - qdel(src) - return - else - if(S.get_amount() < 1) - return - to_chat(user, "You start reinforcing the girder...") - if(do_after(user, 60*platingmodifier, target = src)) - if(S.get_amount() < 1) - return - S.use(1) - to_chat(user, "You reinforce the girder.") - var/obj/structure/girder/reinforced/R = new (loc) - transfer_fingerprints_to(R) - qdel(src) - return + S.use(1) + to_chat(user, "You reinforce the girder.") + var/obj/structure/girder/reinforced/R = new (loc) + transfer_fingerprints_to(R) + qdel(src) + return if(S.sheettype != "runed") var/M = S.sheettype diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 38db8dceefa..993bed6f80a 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -31,8 +31,8 @@ var/ratio = obj_integrity / max_integrity ratio = CEILING(ratio*4, 1) * 25 - if(smooth) - queue_smooth(src) + if(smoothing_flags) + QUEUE_SMOOTH(src) if(ratio > 50) return @@ -67,7 +67,7 @@ return FALSE to_chat(user, "You construct the window.") var/obj/structure/window/WD = new the_rcd.window_type(drop_location()) - WD.setAnchored(TRUE) + WD.set_anchored(TRUE) return TRUE return FALSE @@ -136,7 +136,7 @@ else if((W.tool_behaviour == TOOL_SCREWDRIVER) && (isturf(loc) || anchored)) if(!shock(user, 90)) W.play_tool_sound(src, 100) - setAnchored(!anchored) + set_anchored(!anchored) user.visible_message("[user] [anchored ? "fastens" : "unfastens"] [src].", \ "You [anchored ? "fasten [src] to" : "unfasten [src] from"] the floor.") return @@ -185,7 +185,7 @@ WD = new/obj/structure/window/fulltile(drop_location()) //normal window WD.setDir(dir_to_set) WD.ini_dir = dir_to_set - WD.setAnchored(FALSE) + WD.set_anchored(FALSE) WD.state = 0 ST.use(2) to_chat(user, "You place [WD] on [src].") diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 75595234a14..8962f72dea7 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -15,7 +15,7 @@ /turf/open/floor, /turf/closed/wall, /obj/structure/falsewall) - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_MORE // flags = CONDUCT_1 obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN @@ -76,7 +76,7 @@ icon = 'icons/obj/smooth_structures/catwalk.dmi' icon_state = "catwalk" number_of_mats = 2 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE canSmoothWith = null obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP @@ -102,7 +102,7 @@ icon_state = "catwalk" number_of_mats = 1 color = "#5286b9ff" - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE canSmoothWith = null obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP resistance_flags = FIRE_PROOF | LAVA_PROOF diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 3bb560eedf9..56c46d7b60b 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -130,7 +130,7 @@ else return ..() -/obj/structure/mineral_door/setAnchored(anchorvalue) //called in default_unfasten_wrench() chain +/obj/structure/mineral_door/set_anchored(anchorvalue) //called in default_unfasten_wrench() chain . = ..() set_opacity(anchored ? !door_opened : FALSE) air_update_turf(TRUE) @@ -311,7 +311,7 @@ /obj/structure/mineral_door/paperframe/Initialize() . = ..() - queue_smooth_neighbors(src) + QUEUE_SMOOTH_NEIGHBORS(src) /obj/structure/mineral_door/paperframe/examine(mob/user) . = ..() @@ -346,5 +346,5 @@ return /obj/structure/mineral_door/paperframe/Destroy() - queue_smooth_neighbors(src) + QUEUE_SMOOTH_NEIGHBORS(src) return ..() diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 7e9746423e4..f1c7125da5f 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -32,7 +32,7 @@ var/uraction = anchored ? "unscrew [src] from " : "screw [src] to" user.visible_message("[user] [action] the floor.", "You start to [uraction] the floor...", "You hear rustling noises.") if(W.use_tool(src, user, 100, volume=100, extra_checks = CALLBACK(src, .proc/check_anchored_state, anchored))) - setAnchored(!anchored) + set_anchored(!anchored) to_chat(user, "You [anchored ? "unscrew" : "screw"] [src] from the floor.") return TRUE else diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index d7b0958e8c5..27ef38a70d2 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -62,7 +62,7 @@ return to_chat(user, "You begin to [anchored ? "unfasten the railing from":"fasten the railing to"] the floor...") if(I.use_tool(src, user, volume = 75, extra_checks = CALLBACK(src, .proc/check_anchored, anchored))) - setAnchored(!anchored) + set_anchored(!anchored) to_chat(user, "You [anchored ? "fasten the railing to":"unfasten the railing from"] the floor.") return TRUE diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 1b009ee6e4a..f831afd5d2a 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -113,7 +113,7 @@ "You start to weld [src] to the floor...", "You hear welding.") if (W.use_tool(src, user, 20, volume=50)) - setAnchored(TRUE) + set_anchored(TRUE) to_chat(user, "You weld [src] to the floor.") else if(!W.tool_start_check(user, amount=0)) @@ -123,7 +123,7 @@ "You start to cut [src] free from the floor...", "You hear welding.") if (W.use_tool(src, user, 20, volume=50)) - setAnchored(FALSE) + set_anchored(FALSE) to_chat(user, "You cut [src] free from the floor.") //Finishing the frame diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index b49c68b528c..998a0d581e2 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -98,7 +98,9 @@ wash_atom(AM) /obj/machinery/shower/proc/wash_atom(atom/A) - A.washed(src) + A.wash(CLEAN_RAD | CLEAN_TYPE_WEAK) // Clean radiation non-instantly + A.wash(CLEAN_WASH) + SEND_SIGNAL(A, COMSIG_ADD_MOOD_EVENT, "shower", /datum/mood_event/nice_shower) reagents.expose(A, TOUCH, reaction_volume) if(isliving(A)) @@ -107,8 +109,10 @@ /obj/machinery/shower/process() if(on) wash_atom(loc) - for(var/AM in loc) - wash_atom(AM) + for(var/am in loc) + var/atom/movable/movable_content = am + if(!ismopable(movable_content)) // Mopables will be cleaned anyways by the turf wash above + wash_atom(movable_content) else return PROCESS_KILL diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 548831ea061..9c881f72711 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -15,7 +15,7 @@ /obj/structure/statue/Initialize() . = ..() AddComponent(art_type, impressiveness) - addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, impressiveness * 75)), 0) + INVOKE_ASYNC(src, /datum.proc/_AddComponent, list(/datum/component/beauty, impressiveness * 75)) /obj/structure/statue/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 147687e7094..badc82ec316 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -32,7 +32,7 @@ custom_materials = list(/datum/material/iron = 2000) max_integrity = 100 integrity_failure = 0.33 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE canSmoothWith = list(/obj/structure/table, /obj/structure/table/reinforced, /obj/structure/table/greyscale) /obj/structure/table/examine(mob/user) @@ -43,9 +43,9 @@ return "The top is screwed on, but the main bolts are also visible." /obj/structure/table/update_icon() - if(smooth) - queue_smooth(src) - queue_smooth_neighbors(src) + if(smoothing_flags) + QUEUE_SMOOTH(src) + QUEUE_SMOOTH_NEIGHBORS(src) /obj/structure/table/narsie_act() var/atom/A = loc @@ -251,7 +251,7 @@ name = "Rolling table" desc = "An NT brand \"Rolly poly\" rolling table. It can and will move." anchored = FALSE - smooth = SMOOTH_FALSE + smoothing_flags = NONE canSmoothWith = list() icon = 'icons/obj/smooth_structures/rollingtable.dmi' icon_state = "rollingtable" @@ -521,7 +521,7 @@ icon = 'icons/obj/surgery.dmi' icon_state = "optable" buildstack = /obj/item/stack/sheet/mineral/silver - smooth = SMOOTH_FALSE + smoothing_flags = NONE can_buckle = 1 buckle_lying = -1 buckle_requires_restraints = 1 diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 877c79eec3c..08e3c343859 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -279,21 +279,20 @@ busy = FALSE + if(washing_face) + SEND_SIGNAL(user, COMSIG_COMPONENT_CLEAN_FACE_ACT, CLEAN_WASH) + user.drowsyness = max(user.drowsyness - rand(2,3), 0) //Washing your face wakes you up if you're falling asleep + else if(ishuman(user)) + var/mob/living/carbon/human/human_user = user + if(!human_user.wash_hands(CLEAN_WASH)) + to_chat(user, "Your hands are covered by something!") + return + else + user.wash(CLEAN_WASH) + user.visible_message("[user] washes [user.p_their()] [washing_face ? "face" : "hands"] using [src].", \ "You wash your [washing_face ? "face" : "hands"] using [src].") - - if(washing_face) - SEND_SIGNAL(user, COMSIG_COMPONENT_CLEAN_FACE_ACT, CLEAN_STRENGTH_BLOOD) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - H.lip_style = null //Washes off lipstick - H.lip_color = initial(H.lip_color) - H.regenerate_icons() - user.drowsyness = max(user.drowsyness - rand(2,3), 0) //Washing your face wakes you up if you're falling asleep - else - user.washed(src) - /obj/structure/sink/attackby(obj/item/O, mob/living/user, params) if(busy) to_chat(user, "Someone's already washing here!") @@ -357,7 +356,7 @@ busy = FALSE return 1 busy = FALSE - O.washed(src) + O.wash(CLEAN_WASH) O.acid_level = 0 create_reagents(5) reagents.add_reagent(dispensedreagent, 5) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 3739cb7aaf5..d630d1dcede 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -121,7 +121,7 @@ to_chat(user, "There is already a windoor in that location!") return to_chat(user, "You secure the windoor assembly.") - setAnchored(TRUE) + set_anchored(TRUE) if(secure) name = "secure anchored windoor assembly" else @@ -136,7 +136,7 @@ if(!anchored) return to_chat(user, "You unsecure the windoor assembly.") - setAnchored(FALSE) + set_anchored(FALSE) if(secure) name = "secure windoor assembly" else diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index ac088f62ea2..9c3248dfeca 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -180,7 +180,7 @@ if(I.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, "You begin to [anchored ? "unscrew the window from":"screw the window to"] the floor...") if(I.use_tool(src, user, decon_speed, volume = 75, extra_checks = CALLBACK(src, .proc/check_anchored, anchored))) - setAnchored(!anchored) + set_anchored(!anchored) to_chat(user, "You [anchored ? "fasten the window to":"unfasten the window from"] the floor.") return else if(I.tool_behaviour == TOOL_WRENCH && !anchored) @@ -201,7 +201,7 @@ return ..() -/obj/structure/window/setAnchored(anchorvalue) +/obj/structure/window/set_anchored(anchorvalue) ..() air_update_turf(TRUE) update_nearby_icons() @@ -304,8 +304,8 @@ //This proc is used to update the icons of nearby windows. /obj/structure/window/proc/update_nearby_icons() update_icon() - if(smooth) - queue_smooth_neighbors(src) + if(smoothing_flags) + QUEUE_SMOOTH_NEIGHBORS(src) //merges adjacent full-tile windows into one /obj/structure/window/update_overlays() @@ -317,8 +317,8 @@ var/ratio = obj_integrity / max_integrity ratio = CEILING(ratio*4, 1) * 25 - if(smooth) - queue_smooth(src) + if(smoothing_flags) + QUEUE_SMOOTH(src) cut_overlay(crack_overlay) if(ratio > 75) @@ -417,7 +417,7 @@ if(I.use_tool(src, user, 40, volume = 50)) to_chat(user, "You unscrew the bolts from the frame and the window pops loose.") state = WINDOW_OUT_OF_FRAME - setAnchored(FALSE) + set_anchored(FALSE) return return ..() @@ -542,7 +542,7 @@ if(I.use_tool(src, user, 50, volume = 50)) to_chat(user, "You unfasten the bolts from the frame and the window pops loose.") state = WINDOW_OUT_OF_FRAME - setAnchored(FALSE) + set_anchored(FALSE) return return ..() @@ -590,7 +590,7 @@ max_integrity = 50 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile) glass_amount = 2 @@ -604,7 +604,7 @@ max_integrity = 300 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile) glass_amount = 2 @@ -619,7 +619,7 @@ max_integrity = 1000 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE glass_amount = 2 /obj/structure/window/plasma/reinforced/fulltile/unanchored @@ -633,7 +633,7 @@ max_integrity = 150 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE state = RWINDOW_SECURE canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile) glass_amount = 2 @@ -648,7 +648,7 @@ dir = FULLTILE_WINDOW_DIR fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile) glass_amount = 2 @@ -672,7 +672,7 @@ reinf = TRUE heat_resistance = 1600 armor = list("melee" = 90, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE canSmoothWith = null explosion_block = 3 glass_type = /obj/item/stack/sheet/titaniumglass @@ -700,7 +700,7 @@ flags_1 = PREVENT_CLICK_UNDER_1 heat_resistance = 1600 armor = list("melee" = 95, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE canSmoothWith = null explosion_block = 3 damage_deflection = 11 //The same as normal reinforced windows.3 @@ -722,7 +722,7 @@ max_integrity = 15 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE canSmoothWith = list(/obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe) glass_amount = 2 glass_type = /obj/item/stack/sheet/paperframes @@ -775,7 +775,7 @@ cut_overlay(torn) add_overlay(paper) set_opacity(TRUE) - queue_smooth(src) + QUEUE_SMOOTH(src) /obj/structure/window/paperframe/attackby(obj/item/W, mob/user) @@ -808,7 +808,7 @@ /obj/structure/window/bronze/fulltile icon_state = "clockwork_window" - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE canSmoothWith = null fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 2a8ec07f24e..f0db8527d69 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -286,7 +286,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( for(var/obj/machinery/door/firedoor/FD in T) FD.CalculateAffectingAreas() - queue_smooth_neighbors(src) + QUEUE_SMOOTH_NEIGHBORS(src) HandleTurfChange(src) diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index c38944892de..5a5582931c9 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -50,7 +50,7 @@ icon = 'icons/turf/walls/sandstone_wall.dmi' icon_state = "sandstone" baseturfs = /turf/closed/indestructible/sandstone - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE /turf/closed/indestructible/oldshuttle/corner icon_state = "corner" @@ -79,12 +79,12 @@ /turf/closed/indestructible/riveted icon = 'icons/turf/walls/riveted.dmi' icon_state = "riveted" - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE /turf/closed/indestructible/syndicate icon = 'icons/turf/walls/plastitanium_wall.dmi' icon_state = "map-shuttle" - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_MORE /turf/closed/indestructible/riveted/uranium icon = 'icons/turf/walls/uranium_wall.dmi' @@ -96,6 +96,11 @@ icon = 'icons/turf/walls/plastinum_wall.dmi' icon_state = "shuttle" +/turf/closed/indestructible/wood + icon = 'icons/turf/walls/wood_wall.dmi' + icon_state = "wood" + smoothing_flags = SMOOTH_TRUE + /turf/closed/indestructible/abductor icon_state = "alien1" @@ -106,7 +111,7 @@ name = "window" icon_state = "fake_window" opacity = 0 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE icon = 'icons/obj/smooth_structures/reinforced_window.dmi' /turf/closed/indestructible/fakeglass/Initialize() @@ -119,7 +124,7 @@ name = "window" icon_state = "plastitanium_window" opacity = 0 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE icon = 'icons/obj/smooth_structures/plastitanium_window.dmi' /turf/closed/indestructible/opsglass/Initialize() @@ -156,7 +161,7 @@ /turf/closed/indestructible/rock/snow/ice/ore icon = 'icons/turf/walls/icerock_wall.dmi' icon_state = "icerock" - smooth = SMOOTH_MORE|SMOOTH_BORDER + smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER canSmoothWith = list (/turf/closed) pixel_x = -4 pixel_y = -4 diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index ca42b480362..606c6bebe3f 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -5,7 +5,7 @@ icon = 'icons/turf/mining.dmi' icon_state = "rock" var/smooth_icon = 'icons/turf/smoothrocks.dmi' - smooth = SMOOTH_MORE|SMOOTH_BORDER + smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER canSmoothWith = null baseturfs = /turf/open/floor/plating/asteroid/airless initial_gas_mix = AIRLESS_ATMOS @@ -254,7 +254,7 @@ icon = 'icons/turf/mining.dmi' smooth_icon = 'icons/turf/walls/mountain_wall.dmi' icon_state = "mountainrock" - smooth = SMOOTH_MORE|SMOOTH_BORDER + smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER canSmoothWith = list (/turf/closed) defer_change = TRUE environment_type = "snow_cavern" @@ -323,7 +323,7 @@ icon = 'icons/turf/mining.dmi' smooth_icon = 'icons/turf/walls/mountain_wall.dmi' icon_state = "mountainrock" - smooth = SMOOTH_MORE|SMOOTH_BORDER + smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER canSmoothWith = list (/turf/closed) defer_change = TRUE environment_type = "snow" @@ -574,7 +574,7 @@ icon = 'icons/turf/mining.dmi' smooth_icon = 'icons/turf/walls/rock_wall.dmi' icon_state = "rock2" - smooth = SMOOTH_MORE|SMOOTH_BORDER + smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER canSmoothWith = list (/turf/closed) baseturfs = /turf/open/floor/plating/ashplanet/wateryrock initial_gas_mix = OPENTURF_LOW_PRESSURE @@ -587,7 +587,7 @@ icon = 'icons/turf/mining.dmi' smooth_icon = 'icons/turf/walls/mountain_wall.dmi' icon_state = "mountainrock" - smooth = SMOOTH_MORE|SMOOTH_BORDER + smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER canSmoothWith = list (/turf/closed) baseturfs = /turf/open/floor/plating/asteroid/snow initial_gas_mix = FROZEN_ATMOS @@ -605,7 +605,7 @@ icon = 'icons/turf/mining.dmi' smooth_icon = 'icons/turf/walls/icerock_wall.dmi' icon_state = "icerock" - smooth = SMOOTH_MORE|SMOOTH_BORDER + smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER canSmoothWith = list (/turf/closed) baseturfs = /turf/open/floor/plating/asteroid/snow/ice environment_type = "snow_cavern" diff --git a/code/game/turfs/closed/wall/material_walls.dm b/code/game/turfs/closed/wall/material_walls.dm index 88043e82f63..16b835d5b20 100644 --- a/code/game/turfs/closed/wall/material_walls.dm +++ b/code/game/turfs/closed/wall/material_walls.dm @@ -4,7 +4,7 @@ icon = 'icons/turf/walls/materialwall.dmi' icon_state = "wall" canSmoothWith = list(/turf/closed/wall/material) - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS /turf/closed/wall/material/break_wall() diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index cadc35d73ee..89b04a7335d 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -5,7 +5,7 @@ var/last_event = 0 var/active = null canSmoothWith = null - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE /turf/closed/wall/mineral/gold name = "gold wall" @@ -34,8 +34,8 @@ explosion_block = 3 canSmoothWith = list(/turf/closed/wall/mineral/diamond, /obj/structure/falsewall/diamond) -/turf/closed/wall/mineral/diamond/hulk_recoil(obj/item/bodypart/arm) - arm.receive_damage(brute=41, wound_bonus = CANT_WOUND) +/turf/closed/wall/mineral/diamond/hulk_recoil(obj/item/bodypart/arm, mob/living/carbon/human/hulkman, var/damage = 41) + return ..() /turf/closed/wall/mineral/bananium name = "bananium wall" @@ -87,8 +87,8 @@ radiate() ..() -/turf/closed/wall/mineral/uranium/hulk_recoil(obj/item/bodypart/arm) - arm.receive_damage(brute=41, wound_bonus = CANT_WOUND) +/turf/closed/wall/mineral/uranium/hulk_recoil(obj/item/bodypart/arm, mob/living/carbon/human/hulkman, var/damage = 41) + return ..() /turf/closed/wall/mineral/plasma name = "plasma wall" @@ -148,8 +148,8 @@ return return ..() -/turf/closed/wall/mineral/wood/hulk_recoil(obj/item/bodypart/arm) - return //No recoil damage, wood is weak +/turf/closed/wall/mineral/hulk_recoil(obj/item/bodypart/arm, mob/living/carbon/human/hulkman, var/damage = 0) + return ..() //No recoil damage, wood is weak /turf/closed/wall/mineral/wood/nonmetal desc = "A solidly wooden wall. It's a bit weaker than a wall made with metal." @@ -179,15 +179,15 @@ bullet_sizzle = TRUE bullet_bounce_sound = null -/turf/closed/wall/mineral/snow/hulk_recoil(obj/item/bodypart/arm) - return //No recoil damage, snow is weak +/turf/closed/wall/mineral/snow/hulk_recoil(obj/item/bodypart/arm, mob/living/carbon/human/hulkman, var/damage = 0) + return ..() //No recoil damage, snow is weak /turf/closed/wall/mineral/abductor name = "alien wall" desc = "A wall with alien alloy plating." icon = 'icons/turf/walls/abductor_wall.dmi' icon_state = "abductor" - smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL + smoothing_flags = SMOOTH_TRUE|SMOOTH_DIAGONAL sheet_type = /obj/item/stack/sheet/mineral/abductor slicing_duration = 200 //alien wall takes twice as much time to slice explosion_block = 3 @@ -204,17 +204,20 @@ flags_1 = CAN_BE_DIRTY_1 flags_ricochet = RICOCHET_SHINY | RICOCHET_HARD sheet_type = /obj/item/stack/sheet/mineral/titanium - smooth = SMOOTH_MORE|SMOOTH_DIAGONAL + smoothing_flags = SMOOTH_MORE|SMOOTH_DIAGONAL canSmoothWith = list(/turf/closed/wall/mineral/titanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater, /obj/structure/falsewall/titanium) +/turf/closed/wall/mineral/titanium/rust_heretic_act() + return // titanium does not rust + /turf/closed/wall/mineral/titanium/nodiagonal - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_MORE icon_state = "map-shuttle_nd" /turf/closed/wall/mineral/titanium/nosmooth icon = 'icons/turf/shuttle.dmi' icon_state = "wall" - smooth = SMOOTH_FALSE + smoothing_flags = NONE /turf/closed/wall/mineral/titanium/overspace icon_state = "map-overspace" @@ -248,11 +251,11 @@ desc = "An easily-compressable wall used for temporary shelter." icon = 'icons/turf/walls/survival_pod_walls.dmi' icon_state = "smooth" - smooth = SMOOTH_MORE|SMOOTH_DIAGONAL + smoothing_flags = SMOOTH_MORE|SMOOTH_DIAGONAL canSmoothWith = list(/turf/closed/wall/mineral/titanium/survival, /obj/machinery/door/airlock, /obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/shuttle, /obj/structure/shuttle/engine) /turf/closed/wall/mineral/titanium/survival/nodiagonal - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_MORE /turf/closed/wall/mineral/titanium/survival/pod canSmoothWith = list(/turf/closed/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod) @@ -266,17 +269,20 @@ icon_state = "map-shuttle" explosion_block = 4 sheet_type = /obj/item/stack/sheet/mineral/plastitanium - smooth = SMOOTH_MORE|SMOOTH_DIAGONAL + smoothing_flags = SMOOTH_MORE|SMOOTH_DIAGONAL canSmoothWith = list(/turf/closed/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plasma/reinforced/plastitanium, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) +/turf/closed/wall/mineral/plastitanium/rust_heretic_act() + return // plastitanium does not rust + /turf/closed/wall/mineral/plastitanium/nodiagonal - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_MORE icon_state = "map-shuttle_nd" /turf/closed/wall/mineral/plastitanium/nosmooth icon = 'icons/turf/shuttle.dmi' icon_state = "wall" - smooth = SMOOTH_FALSE + smoothing_flags = NONE /turf/closed/wall/mineral/plastitanium/overspace icon_state = "map-overspace" @@ -287,8 +293,8 @@ bombcore.detonate() ..() -/turf/closed/wall/mineral/plastitanium/hulk_recoil(obj/item/bodypart/arm) - arm.receive_damage(brute=41, wound_bonus = CANT_WOUND) +/turf/closed/wall/mineral/plastitanium/hulk_recoil(obj/item/bodypart/arm, mob/living/carbon/human/hulkman, var/damage = 41) + return ..() //have to copypaste this code /turf/closed/wall/mineral/plastitanium/interior/copyTurf(turf/T) diff --git a/code/game/turfs/closed/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm index ecc57ab2a2c..af95e6c0a5f 100644 --- a/code/game/turfs/closed/wall/misc_walls.dm +++ b/code/game/turfs/closed/wall/misc_walls.dm @@ -4,7 +4,7 @@ icon = 'icons/turf/walls/cult_wall.dmi' icon_state = "cult" canSmoothWith = null - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_MORE sheet_type = /obj/item/stack/sheet/runed_metal sheet_amount = 1 girder_type = /obj/structure/girder/cult diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm index 892170b39ff..fa3dd40b953 100644 --- a/code/game/turfs/closed/wall/reinf_walls.dm +++ b/code/game/turfs/closed/wall/reinf_walls.dm @@ -47,8 +47,8 @@ playsound(src, 'sound/effects/bang.ogg', 50, TRUE) to_chat(M, "This wall is far too strong for you to destroy.") -/turf/closed/wall/r_wall/hulk_recoil(obj/item/bodypart/arm) - arm.receive_damage(brute=41, wound_bonus = CANT_WOUND) +/turf/closed/wall/r_wall/hulk_recoil(obj/item/bodypart/arm, mob/living/carbon/human/hulkman, var/damage = 41) + return ..() /turf/closed/wall/r_wall/try_decon(obj/item/W, mob/user, turf/T) //DECONSTRUCTION @@ -196,12 +196,12 @@ /turf/closed/wall/r_wall/update_icon() . = ..() if(d_state != INTACT) - smooth = SMOOTH_FALSE + smoothing_flags = NONE clear_smooth_overlays() else - smooth = SMOOTH_TRUE - queue_smooth_neighbors(src) - queue_smooth(src) + smoothing_flags = SMOOTH_TRUE + QUEUE_SMOOTH_NEIGHBORS(src) + QUEUE_SMOOTH(src) /turf/closed/wall/r_wall/update_icon_state() if(d_state != INTACT) @@ -235,20 +235,20 @@ icon_state = "map-shuttle" explosion_block = 20 sheet_type = /obj/item/stack/sheet/mineral/plastitanium - smooth = SMOOTH_MORE|SMOOTH_DIAGONAL + smoothing_flags = SMOOTH_MORE|SMOOTH_DIAGONAL canSmoothWith = list(/turf/closed/wall/r_wall/syndicate, /turf/closed/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plasma/reinforced/plastitanium, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) /turf/closed/wall/r_wall/syndicate/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) return FALSE /turf/closed/wall/r_wall/syndicate/nodiagonal - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_MORE icon_state = "map-shuttle_nd" /turf/closed/wall/r_wall/syndicate/nosmooth icon = 'icons/turf/shuttle.dmi' icon_state = "wall" - smooth = SMOOTH_FALSE + smoothing_flags = NONE /turf/closed/wall/r_wall/syndicate/overspace icon_state = "map-overspace" diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index bcb46f65f88..3b1daea7ee6 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -28,7 +28,7 @@ /obj/structure/falsewall/reinforced, /turf/closed/wall/rust, /turf/closed/wall/r_wall/rust) - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE var/list/dent_decals @@ -146,7 +146,7 @@ if(prob(hardness)) playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") - hulk_recoil(arm) + hulk_recoil(arm, user) dismantle_wall(1) else @@ -158,17 +158,22 @@ return TRUE /** - *Deals damage back to the hulk. + *Deals damage back to the hulk's arm. * *When a hulk manages to break a wall using their hulk smash, this deals back damage to the arm used. *This is in its own proc just to be easily overridden by other wall types. Default allows for three *smashed walls per arm. Also, we use CANT_WOUND here because wounds are random. Wounds are applied - *by hulk code based on arm damage and checked after an attack completes. + *by hulk code based on arm damage and checked when we call break_an_arm(). *Arguments: **arg1 is the arm to deal damage to. + **arg2 is the hulk */ -/turf/closed/wall/proc/hulk_recoil(obj/item/bodypart/arm) - arm.receive_damage(brute = 20, blocked = 0, wound_bonus = CANT_WOUND) +/turf/closed/wall/proc/hulk_recoil(obj/item/bodypart/arm, mob/living/carbon/human/hulkman, var/damage = 20) + arm.receive_damage(brute = damage, blocked = 0, wound_bonus = CANT_WOUND) + var/datum/mutation/human/hulk/smasher = locate(/datum/mutation/human/hulk) in hulkman.dna.mutations + if(!smasher || !damage) //sanity check but also snow and wood walls deal no recoil damage, so no arm breaky + return + smasher.break_an_arm(arm) /turf/closed/wall/attack_hand(mob/user) . = ..() diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index eada9138ebd..5d71aae6741 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -110,7 +110,7 @@ icon = 'icons/turf/floors/hierophant_floor.dmi' initial_gas_mix = LAVALAND_DEFAULT_ATMOS baseturfs = /turf/open/indestructible/hierophant - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE tiled_dirt = FALSE /turf/open/indestructible/hierophant/two @@ -185,10 +185,12 @@ for(var/mob/living/simple_animal/slime/M in src) M.apply_water() - SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) - for(var/obj/effect/O in src) - if(is_cleanable(O)) - qdel(O) + wash(CLEAN_WASH) + for(var/am in src) + var/atom/movable/movable_content = am + if(ismopable(movable_content)) // Will have already been washed by the wash call above at this point. + continue + movable_content.wash(CLEAN_WASH) return TRUE /turf/open/handle_slip(mob/living/carbon/C, knockdown_amount, obj/O, lube, paralyze_amount, force_drop) diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index 24421b9bbce..a5876adbac9 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -3,7 +3,7 @@ name = "chasm" desc = "Watch your step." baseturfs = /turf/open/chasm - smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE + smoothing_flags = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE icon = 'icons/turf/floors/chasms.dmi' icon_state = "smooth" canSmoothWith = list(/turf/open/floor/fakepit, /turf/open/chasm) diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index 4809789e21b..c2077af79dd 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -288,7 +288,7 @@ return FALSE to_chat(user, "You construct the grille.") var/obj/structure/grille/G = new(src) - G.anchored = TRUE + G.set_anchored(TRUE) return TRUE if(RCD_MACHINE) if(locate(/obj/structure/frame/machine) in src) @@ -296,13 +296,13 @@ var/obj/structure/frame/machine/M = new(src) M.state = 2 M.icon_state = "box_1" - M.anchored = TRUE + M.set_anchored(TRUE) return TRUE if(RCD_COMPUTER) if(locate(/obj/structure/frame/computer) in src) return FALSE var/obj/structure/frame/computer/C = new(src) - C.anchored = TRUE + C.set_anchored(TRUE) C.state = 1 C.setDir(the_rcd.computer_dir) return TRUE diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index 3a82d17738e..cebe62b2c76 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -177,7 +177,7 @@ icon_state = "carpet" floor_tile = /obj/item/stack/tile/carpet broken_states = list("damaged") - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE canSmoothWith = list(/turf/open/floor/carpet, /turf/open/floor/carpet/airless) flags_1 = NONE bullet_bounce_sound = null @@ -199,12 +199,12 @@ if(!..()) return 0 if(!broken && !burnt) - if(smooth) - queue_smooth(src) + if(smoothing_flags) + QUEUE_SMOOTH(src) else make_plating() - if(smooth) - queue_smooth_neighbors(src) + if(smoothing_flags) + QUEUE_SMOOTH_NEIGHBORS(src) /turf/open/floor/carpet/black icon = 'icons/turf/floors/carpet_black.dmi' @@ -305,7 +305,7 @@ /turf/open/floor/fakepit desc = "A clever illusion designed to look like a bottomless pit." - smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE + smoothing_flags = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE canSmoothWith = list(/turf/open/floor/fakepit) icon = 'icons/turf/floors/Chasms.dmi' icon_state = "smooth" diff --git a/code/game/turfs/open/floor/mineral_floor.dm b/code/game/turfs/open/floor/mineral_floor.dm index bbe3eaa29ff..20247260fd3 100644 --- a/code/game/turfs/open/floor/mineral_floor.dm +++ b/code/game/turfs/open/floor/mineral_floor.dm @@ -83,6 +83,9 @@ floor_tile = /obj/item/stack/tile/mineral/titanium broken_states = list("titanium_dam1","titanium_dam2","titanium_dam3","titanium_dam4","titanium_dam5") +/turf/open/floor/mineral/titanium/rust_heretic_act() + return // titanium does not rust + /turf/open/floor/mineral/titanium/airless initial_gas_mix = AIRLESS_ATMOS @@ -117,6 +120,9 @@ floor_tile = /obj/item/stack/tile/mineral/plastitanium broken_states = list("plastitanium_dam1","plastitanium_dam2","plastitanium_dam3","plastitanium_dam4","plastitanium_dam5") +/turf/open/floor/mineral/plastitanium/rust_heretic_act() + return // plastitanium does not rust + /turf/open/floor/mineral/plastitanium/airless initial_gas_mix = AIRLESS_ATMOS diff --git a/code/game/turfs/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm index f210bcc9fca..f394f047bcb 100644 --- a/code/game/turfs/open/floor/plating/misc_plating.dm +++ b/code/game/turfs/open/floor/plating/misc_plating.dm @@ -47,7 +47,7 @@ gender = PLURAL name = "ash" icon_state = "ash" - smooth = SMOOTH_MORE|SMOOTH_BORDER + smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER var/smooth_icon = 'icons/turf/floors/ash.dmi' desc = "The ground is covered in volcanic ash." baseturfs = /turf/open/floor/plating/ashplanet/wateryrock //I assume this will be a chasm eventually, once this becomes an actual surface @@ -61,7 +61,7 @@ tiled_dirt = FALSE /turf/open/floor/plating/ashplanet/Initialize() - if(smooth) + if(smoothing_flags) var/matrix/M = new M.Translate(-4, -4) transform = M @@ -97,7 +97,7 @@ /turf/open/floor/plating/ashplanet/wateryrock gender = PLURAL name = "wet rocky ground" - smooth = null + smoothing_flags = NONE icon_state = "wateryrock" slowdown = 2 footstep = FOOTSTEP_FLOOR @@ -209,7 +209,7 @@ /turf/open/floor/plating/ice/smooth icon_state = "smooth" - smooth = SMOOTH_MORE | SMOOTH_BORDER + smoothing_flags = SMOOTH_MORE | SMOOTH_BORDER canSmoothWith = list(/turf/open/floor/plating/ice/smooth, /turf/open/floor/plating/ice, /turf/open/floor/plating/ice/colder) /turf/open/floor/plating/ice/colder @@ -249,7 +249,7 @@ initial_gas_mix = ICEMOON_DEFAULT_ATMOS /turf/open/floor/plating/snowed/smoothed - smooth = SMOOTH_MORE | SMOOTH_BORDER + smoothing_flags = SMOOTH_MORE | SMOOTH_BORDER canSmoothWith = list(/turf/open/floor/plating/snowed/smoothed, /turf/open/floor/plating/snowed) planetary_atmos = TRUE icon = 'icons/turf/floors/snow_turf.dmi' diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index ae4ed0d5044..1f0bdc206b9 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -182,7 +182,7 @@ baseturfs = /turf/open/lava/smooth icon = 'icons/turf/floors/lava.dmi' icon_state = "unsmooth" - smooth = SMOOTH_MORE | SMOOTH_BORDER + smoothing_flags = SMOOTH_MORE | SMOOTH_BORDER canSmoothWith = list(/turf/open/lava/smooth) /turf/open/lava/smooth/lava_land_surface diff --git a/code/game/turfs/open/transparent.dm b/code/game/turfs/open/transparent.dm index 334b42e9354..c15d5ad7bc6 100644 --- a/code/game/turfs/open/transparent.dm +++ b/code/game/turfs/open/transparent.dm @@ -56,7 +56,7 @@ desc = "Dont jump on it, or do, I'm not your mom." icon = 'icons/turf/floors/glass.dmi' icon_state = "floor_glass" - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_MORE canSmoothWith = list(/turf/open/transparent/glass, /turf/open/transparent/glass/reinforced) footstep = FOOTSTEP_PLATING barefootstep = FOOTSTEP_HARD_BAREFOOT diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 12aacf7d943..cb640fa7af0 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -1,6 +1,8 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf icon = 'icons/turf/floors.dmi' + flags_1 = CAN_BE_DIRTY_1 + vis_flags = VIS_INHERIT_ID|VIS_INHERIT_PLANE // Important for interaction with and visualization of openspace. var/intact = 1 @@ -17,8 +19,6 @@ GLOBAL_LIST_EMPTY(station_turfs) var/blocks_air = FALSE - flags_1 = CAN_BE_DIRTY_1 - var/list/image/blueprint_data //for the station blueprints, images of objects eg: pipes var/explosion_level = 0 //for preventing explosion dodging @@ -34,7 +34,9 @@ GLOBAL_LIST_EMPTY(station_turfs) var/tiled_dirt = FALSE // use smooth tiled dirt decal - vis_flags = VIS_INHERIT_ID|VIS_INHERIT_PLANE // Important for interaction with and visualization of openspace. + ///Icon-smoothing variable to map a diagonal wall corner with a fixed underlay. + var/list/fixed_underlay = null + /turf/vv_edit_var(var_name, new_value) var/static/list/banned_edits = list("x", "y", "z") @@ -59,8 +61,8 @@ GLOBAL_LIST_EMPTY(station_turfs) assemble_baseturfs() levelupdate() - if(smooth) - queue_smooth(src) + if(smoothing_flags) + QUEUE_SMOOTH(src) visibilityChanged() for(var/atom/movable/AM in src) @@ -557,3 +559,17 @@ GLOBAL_LIST_EMPTY(station_turfs) for(var/reagent in reagents) var/datum/reagent/R = reagent . |= R.expose_turf(src, reagents[R]) + +/** + * Called when this turf is being washed. Washing a turf will also wash any mopable floor decals + */ +/turf/wash(clean_types) + . = ..() + + for(var/am in src) + if(am == src) + continue + var/atom/movable/movable_content = am + if(!ismopable(movable_content)) + continue + movable_content.wash(clean_types) diff --git a/code/game/world.dm b/code/game/world.dm index dc31e2a9318..2e9bc3380f5 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -95,7 +95,7 @@ GLOBAL_VAR(restart_counter) #else cb = VARSET_CALLBACK(SSticker, force_ending, TRUE) #endif - SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/addtimer, cb, 10 SECONDS)) + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/_addtimer, cb, 10 SECONDS)) /world/proc/SetupExternalRSC() #if (PRELOAD_RSC == 0) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index da5e3dc7c38..da3249d6840 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -43,6 +43,11 @@ body += "

Show related accounts by: " body += "\[ CID | " body += "IP \]" + body += "

CentCom Galactic Ban DB: " + if(CONFIG_GET(string/centcom_ban_db)) + body += "Search" + else + body += "Disabled" var/rep = 0 rep += SSpersistence.antag_rep[M.ckey] body += "

Antagonist reputation: [rep]" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 0290b3d8934..95df5628846 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -170,7 +170,11 @@ GLOBAL_PROTECT(admin_verbs_debug) /client/proc/test_cardpack_distribution, /client/proc/print_cards, /datum/admins/proc/create_or_modify_area, - /client/proc/view_refs +#ifdef REFERENCE_TRACKING + /datum/admins/proc/view_refs, + /datum/admins/proc/view_del_failures, +#endif + /client/proc/check_timer_sources ) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release)) GLOBAL_PROTECT(admin_verbs_possess) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index ab966654972..015be8c1a16 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1262,7 +1262,13 @@ //Job + antagonist if(M.mind) - special_role_description = "Role: [M.mind.assigned_role]; Antagonist: [M.mind.special_role]" + special_role_description = "Role: [M.mind.assigned_role]; Antagonist: " + var/i = 0 + for(var/datum/antagonist/A in M.mind.antag_datums) + special_role_description += "[A.name]" + if(++i != length(M.mind.antag_datums)) + special_role_description += ", " + special_role_description += "" else special_role_description = "Role: Mind datum missing Antagonist: Mind datum missing" @@ -2065,6 +2071,59 @@ usr << browse(dat.Join("
"), "window=related_[C];size=420x300") + else if(href_list["centcomlookup"]) + if(!check_rights(R_ADMIN)) + return + + if(!CONFIG_GET(string/centcom_ban_db)) + to_chat(usr, "Centcom Galactic Ban DB is disabled!") + return + + var/ckey = href_list["centcomlookup"] + + // Make the request + var/datum/http_request/request = new() + request.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/centcom_ban_db)]/[ckey]", "", "") + request.begin_async() + UNTIL(request.is_complete() || !usr) + if (!usr) + return + var/datum/http_response/response = request.into_response() + + var/list/bans + + var/list/dat = list("") + + if(response.errored) + dat += "
Failed to connect to CentCom." + else if(response.status_code != 200) + dat += "
Failed to connect to CentCom. Status code: [response.status_code]" + else + if(response.body == "[]") + dat += "
0 bans detected for [ckey]
" + else + bans = json_decode(response["body"]) + dat += "
[bans.len] ban\s detected for [ckey]
" + for(var/list/ban in bans) + dat += "Server: [sanitize(ban["sourceName"])]
" + dat += "Type: [sanitize(ban["type"])]
" + dat += "Banned By: [sanitize(ban["bannedBy"])]
" + dat += "Reason: [sanitize(ban["reason"])]
" + dat += "Datetime: [sanitize(ban["bannedOn"])]
" + var/expiration = ban["expires"] + dat += "Expires: [expiration ? "[sanitize(expiration)]" : "Permanent"]
" + if(ban["type"] == "job") + dat += "Jobs: " + var/list/jobs = ban["jobs"] + dat += sanitize(jobs.Join(", ")) + dat += "
" + dat += "
" + + dat += "
" + var/datum/browser/popup = new(usr, "centcomlookup-[ckey]", "
Central Command Galactic Ban Database
", 700, 600) + popup.set_content(dat.Join()) + popup.open(0) + else if(href_list["modantagrep"]) if(!check_rights(R_ADMIN)) return diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 115feb5731e..1e93f32d881 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -573,10 +573,10 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) send2adminchat(source,final) send2otherserver(source,final) -// +/// Sends a message to other servers. /proc/send2otherserver(source,msg,type = "Ahelp",target_servers) - var/comms_key = CONFIG_GET(string/comms_key) - if(!comms_key) + if(!CONFIG_GET(string/comms_key)) + debug_world_log("Server cross-comms message not sent for lack of configured key") return var/our_id = CONFIG_GET(string/cross_comms_name) @@ -584,7 +584,6 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) message["message_sender"] = source message["message"] = msg message["source"] = "([our_id])" - message["key"] = comms_key message += type var/list/servers = CONFIG_GET(keyed_list/cross_server) @@ -593,8 +592,23 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) continue if(target_servers && !(I in target_servers)) continue - world.Export("[servers[I]]?[list2params(message)]") + world.send_cross_comms(I, message) +/// Sends a message to a given cross comms server by name (by name for security). +/world/proc/send_cross_comms(server_name, list/message, auth = TRUE) + set waitfor = FALSE + if (auth) + var/comms_key = CONFIG_GET(string/comms_key) + if(!comms_key) + debug_world_log("Server cross-comms message not sent for lack of configured key") + return + message["key"] = comms_key + var/list/servers = CONFIG_GET(keyed_list/cross_server) + var/server_url = servers[server_name] + if (!server_url) + CRASH("Invalid cross comms config: [server_name]") + world.Export("[server_url]?[list2params(message)]") + /proc/tgsadminwho() var/list/message = list("Admins: ") @@ -668,7 +682,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(!ai_found && isAI(found)) ai_found = 1 var/is_antag = 0 - if(found.mind && found.mind.special_role) + if(is_special_character(found)) is_antag = 1 founds += "Name: [found.name]([found.real_name]) Key: [found.key] Ckey: [found.ckey] [is_antag ? "(Antag)" : null] " msg += "[original_word](?|F) " diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index a5eacf48a21..2677bdc82e0 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -594,10 +594,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that for(var/obj/machinery/field/generator/F in GLOB.machines) if(F.active == 0) + F.set_anchored(TRUE) F.active = 1 F.state = 2 F.power = 250 - F.anchored = TRUE F.warming_up = 3 F.start_fields() F.update_icon() @@ -889,3 +889,63 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that return if(alert(usr, "Are you absolutely sure you want to reload the configuration from the default path on the disk, wiping any in-round modificatoins?", "Really reset?", "No", "Yes") == "Yes") config.admin_reload() + +/// A debug verb to check the sources of currently running timers +/client/proc/check_timer_sources() + set category = "Debug" + set name = "Check Timer Sources" + set desc = "Checks the sources of the running timers" + if (!check_rights(R_DEBUG)) + return + + var/bucket_list_output = generate_timer_source_output(SStimer.bucket_list) + var/second_queue = generate_timer_source_output(SStimer.second_queue) + + usr << browse({" +

bucket_list

+ [bucket_list_output] + +

second_queue

+ [second_queue] + "}, "window=check_timer_sources;size=700x700") + +/proc/generate_timer_source_output(list/datum/timedevent/events) + var/list/per_source = list() + + // Collate all events and figure out what sources are creating the most + for (var/_event in events) + if (!_event) + continue + var/datum/timedevent/event = _event + + do + if (event.source) + if (per_source[event.source] == null) + per_source[event.source] = 1 + else + per_source[event.source] += 1 + event = event.next + while (event && event != _event) + + // Now, sort them in order + var/list/sorted = list() + for (var/source in per_source) + sorted += list(list("source" = source, "count" = per_source[source])) + sorted = sortTim(sorted, .proc/cmp_timer_data) + + // Now that everything is sorted, compile them into an HTML output + var/output = "" + + for (var/_timer_data in sorted) + var/list/timer_data = _timer_data + output += {" + + + "} + + output += "
[timer_data["source"]][timer_data["count"]]
" + + return output + +/proc/cmp_timer_data(list/a, list/b) + return b["count"] - a["count"] diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index b074c2c743b..05953a5b959 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1069,6 +1069,7 @@ Traitors and the like can also be revived with the previous role mostly intact. ADMIN_PUNISHMENT_NUGGET, ADMIN_PUNISHMENT_CRACK, ADMIN_PUNISHMENT_BLEED, + ADMIN_PUNISHMENT_PERFORATE, ADMIN_PUNISHMENT_SCARIFY, ADMIN_PUNISHMENT_SHOES ) @@ -1159,41 +1160,112 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(usr,"This must be used on a carbon mob.", confidential = TRUE) return var/mob/living/carbon/C = target - for(var/obj/item/bodypart/squish_part in C.bodyparts) - var/type_wound = pick(list(/datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/moderate)) + for(var/i in C.bodyparts) + var/obj/item/bodypart/squish_part = i + var/type_wound = pick(list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate)) squish_part.force_wound_upwards(type_wound, smited=TRUE) if(ADMIN_PUNISHMENT_BLEED) if(!iscarbon(target)) to_chat(usr,"This must be used on a carbon mob.", confidential = TRUE) return var/mob/living/carbon/C = target - for(var/obj/item/bodypart/slice_part in C.bodyparts) - var/type_wound = pick(list(/datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate)) + for(var/i in C.bodyparts) + var/obj/item/bodypart/slice_part = i + var/type_wound = pick(list(/datum/wound/slash/severe, /datum/wound/slash/moderate)) slice_part.force_wound_upwards(type_wound, smited=TRUE) - type_wound = pick(list(/datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate)) + type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate)) slice_part.force_wound_upwards(type_wound, smited=TRUE) - type_wound = pick(list(/datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe)) + type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/severe)) slice_part.force_wound_upwards(type_wound, smited=TRUE) + if(ADMIN_PUNISHMENT_PERFORATE) + if(!iscarbon(target)) + to_chat(usr,"This must be used on a carbon mob.", confidential = TRUE) + return + + var/list/how_fucked_is_this_dude = list("A little", "A lot", "So fucking much", "FUCK THIS DUDE") + var/hatred = input("How much do you hate this guy?") in how_fucked_is_this_dude + var/repetitions + var/shots_per_limb_per_rep = 2 + var/damage + switch(hatred) + if("A little") + repetitions = 1 + damage = 5 + if("A lot") + repetitions = 2 + damage = 8 + if("So fucking much") + repetitions = 3 + damage = 10 + if("FUCK THIS DUDE") + repetitions = 4 + damage = 10 + + var/mob/living/carbon/dude = target + var/list/open_adj_turfs = get_adjacent_open_turfs(dude) + var/list/wound_bonuses = list(15, 70, 110, 250) + + var/delay_per_shot = 1 + var/delay_counter = 1 + + dude.Immobilize(5 SECONDS) + for(var/wound_bonus_rep in 1 to repetitions) + for(var/i in dude.bodyparts) + var/obj/item/bodypart/slice_part = i + var/shots_this_limb = 0 + for(var/t in shuffle(open_adj_turfs)) + var/turf/iter_turf = t + addtimer(CALLBACK(GLOBAL_PROC, .proc/firing_squad, dude, iter_turf, slice_part.body_zone, wound_bonuses[wound_bonus_rep], damage), delay_counter) + delay_counter += delay_per_shot + shots_this_limb++ + if(shots_this_limb > shots_per_limb_per_rep) + break + if(ADMIN_PUNISHMENT_SCARIFY) if(!iscarbon(target)) to_chat(usr,"This must be used on a carbon mob.", confidential = TRUE) return - var/mob/living/carbon/C = target - C.generate_fake_scars(rand(1, 4)) - to_chat(C, "You feel your body grow jaded and torn...") + var/mob/living/carbon/dude = target + dude.generate_fake_scars(rand(1, 4)) + to_chat(dude, "You feel your body grow jaded and torn...") if(ADMIN_PUNISHMENT_SHOES) if(!iscarbon(target)) to_chat(usr,"This must be used on a carbon mob.", confidential = TRUE) return - var/mob/living/carbon/C = target - var/obj/item/clothing/shoes/sick_kicks = C.shoes + var/mob/living/carbon/dude = target + var/obj/item/clothing/shoes/sick_kicks = dude.shoes if(!sick_kicks?.can_be_tied) - to_chat(usr,"[C] does not have knottable shoes!", confidential = TRUE) + to_chat(usr,"[dude] does not have knottable shoes!", confidential = TRUE) return sick_kicks.adjust_laces(SHOES_KNOTTED) punish_log(target, punishment) +/** + * firing_squad is a proc for the :B:erforate smite to shoot each individual bullet at them, so that we can add actual delays without sleep() nonsense + * + * Hilariously, if you drag someone away mid smite, the bullets will still chase after them from the original spot, possibly hitting other people. Too funny to fix imo + * + * Arguments: + * * target- guy we're shooting obviously + * * source_turf- where the bullet begins, preferably on a turf next to the target + * * body_zone- which bodypart we're aiming for, if there is one there + * * wound_bonus- the wounding power we're assigning to the bullet, since we don't care about the base one + * * damage- the damage we're assigning to the bullet, since we don't care about the base one + */ +/proc/firing_squad(mob/living/carbon/target, turf/source_turf, body_zone, wound_bonus, damage) + if(!target.get_bodypart(body_zone)) + return + playsound(target, 'sound/weapons/gun/revolver/shot.ogg', 100) + var/obj/projectile/bullet/smite/divine_wrath = new(source_turf) + divine_wrath.damage = damage + divine_wrath.wound_bonus = wound_bonus + divine_wrath.original = target + divine_wrath.def_zone = body_zone + divine_wrath.spread = 0 + divine_wrath.preparePixelProjectile(target, source_turf) + divine_wrath.fire() + /client/proc/punish_log(whom, punishment) var/msg = "[key_name_admin(usr)] punished [key_name_admin(whom)] with [punishment]." message_admins(msg) @@ -1225,7 +1297,9 @@ Traitors and the like can also be revived with the previous role mostly intact. var/list/msg = list() msg += "Playtime ReportPlaytime:
" src << browse(msg.Join(), "window=Player_playtime_check") diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm index e35afa901a9..bd8ce48a43f 100644 --- a/code/modules/admin/view_variables/reference_tracking.dm +++ b/code/modules/admin/view_variables/reference_tracking.dm @@ -1,3 +1,7 @@ +#ifdef REFERENCE_TRACKING + +GLOBAL_LIST_EMPTY(deletion_failures) + /world/proc/enable_reference_tracking() var/extools = world.GetConfig("env", "EXTOOLS_DLL") || (world.system_type == MS_WINDOWS ? "./byond-extools.dll" : "./libbyond-extools.so") if (fexists(extools)) @@ -12,17 +16,20 @@ /proc/clear_references(datum/D) return -/client/proc/view_refs(atom/D) //it actually supports datums as well but byond no likey +/datum/admins/proc/view_refs(atom/D in world) //it actually supports datums as well but byond no likey set category = "Debug" set name = "View References" - if(!check_rights(R_DEBUG)) + if(!check_rights(R_DEBUG) || !D) return var/list/backrefs = get_back_references(D) if(isnull(backrefs)) - usr << browse("Reference tracking not enabled", "window=ref_view") + var/datum/browser/popup = new(usr, "ref_view", "
Error
") + popup.set_content("Reference tracking not enabled") + popup.open(FALSE) return + var/list/frontrefs = get_forward_references(D) var/list/dat = list() dat += "

References of \ref[D] - [D]


\[Refresh\]
" @@ -30,16 +37,190 @@ dat += "" dat += "" for(var/ref in backrefs) - var/datum/R = ref - dat += "" + var/datum/backreference = ref + if(isnull(backreference)) + dat += "" + if(istype(backreference)) + dat += "" + else if(islist(backreference)) + dat += "" + else + dat += "" dat += "
RefTypeVariable NameFollow
[REF(R)][R.type][backrefs[R]]\[Follow\]
GC'd Reference
[REF(backreference)][backreference.type][backrefs[backreference]]\[Follow\]
[REF(backreference)]list[backrefs[backreference]]\[Follow\]
Weird reference type. Add more debugging checks.

" dat += "

Forward references - this object is referencing those things.

" dat += "" dat += "" for(var/ref in frontrefs) - var/datum/R = frontrefs[ref] - dat += "" + var/datum/backreference = frontrefs[ref] + dat += "" dat += "
Variable nameRefTypeFollow
[ref][REF(R)][R.type]\[Follow\]
[ref][REF(backreference)][backreference.type]\[Follow\]

" dat = dat.Join() - usr << browse(dat, "window=ref_view") //Done this way rather than tgui to facilitate porting to other codebases or even byond games + var/datum/browser/popup = new(usr, "ref_view", "
References of \ref[D]
") + popup.set_content(dat) + popup.open(FALSE) + + +/datum/admins/proc/view_del_failures() + set category = "Debug" + set name = "View Deletion Failures" + + if(!check_rights(R_DEBUG)) + return + + var/list/dat = list("") + for(var/t in GLOB.deletion_failures) + if(isnull(t)) + dat += "" + continue + var/datum/thing = t + dat += "" + dat += "
GC'd Reference | Clear Nulls
\ref[thing] | [thing.type][thing.gc_destroyed ? " (destroyed)" : ""] [ADMIN_VV(thing)]

" + dat = dat.Join() + + var/datum/browser/popup = new(usr, "del_failures", "
Deletion Failures
") + popup.set_content(dat) + popup.open(FALSE) + + +/datum/proc/find_references() + testing("Beginning search for references to a [type].") + var/list/backrefs = get_back_references(src) + for(var/ref in backrefs) + if(isnull(ref)) + log_world("## TESTING: Datum reference found, but gone now.") + continue + if(islist(ref)) + log_world("## TESTING: Found [type] \ref[src] in list.") + continue + var/datum/datum_ref = ref + if(!istype(datum_ref)) + log_world("## TESTING: Found [type] \ref[src] in unknown type reference: [datum_ref].") + return + log_world("## TESTING: Found [type] \ref[src] in [datum_ref.type][datum_ref.gc_destroyed ? " (destroyed)" : ""]") + message_admins("Found [type] \ref[src] [ADMIN_VV(src)] in [datum_ref.type][datum_ref.gc_destroyed ? " (destroyed)" : ""] [ADMIN_VV(datum_ref)]") + testing("Completed search for references to a [type].") + +#endif + +#ifdef LEGACY_REFERENCE_TRACKING + +/datum/verb/legacy_find_refs() + set category = "Debug" + set name = "Find References" + set src in world + + find_references(FALSE) + + +/datum/proc/find_references_legacy(skip_alert) + running_find_references = type + if(usr?.client) + if(usr.client.running_find_references) + testing("CANCELLED search for references to a [usr.client.running_find_references].") + usr.client.running_find_references = null + running_find_references = null + //restart the garbage collector + SSgarbage.can_fire = TRUE + SSgarbage.next_fire = world.time + world.tick_lag + return + + if(!skip_alert && alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") != "Yes") + running_find_references = null + return + + //this keeps the garbage collector from failing to collect objects being searched for in here + SSgarbage.can_fire = FALSE + + if(usr?.client) + usr.client.running_find_references = type + + testing("Beginning search for references to a [type].") + last_find_references = world.time + + DoSearchVar(GLOB) //globals + for(var/datum/thing in world) //atoms (don't beleive its lies) + DoSearchVar(thing, "World -> [thing]") + + for(var/datum/thing) //datums + DoSearchVar(thing, "World -> [thing]") + + for(var/client/thing) //clients + DoSearchVar(thing, "World -> [thing]") + + testing("Completed search for references to a [type].") + if(usr?.client) + usr.client.running_find_references = null + running_find_references = null + + //restart the garbage collector + SSgarbage.can_fire = TRUE + SSgarbage.next_fire = world.time + world.tick_lag + + +/datum/verb/qdel_then_find_references() + set category = "Debug" + set name = "qdel() then Find References" + set src in world + + qdel(src, TRUE) //force a qdel + if(!running_find_references) + find_references(TRUE) + + +/datum/verb/qdel_then_if_fail_find_references() + set category = "Debug" + set name = "qdel() then Find References if GC failure" + set src in world + + qdel_and_find_ref_if_fail(src, TRUE) + + +/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 64) + if(usr?.client && !usr.client.running_find_references) + return + + if(!recursive_limit) + return + + if(istype(potential_container, /datum)) + var/datum/datum_container = potential_container + if(datum_container.last_find_references == last_find_references) + return + + datum_container.last_find_references = last_find_references + var/list/vars_list = datum_container.vars + + for(var/varname in vars_list) + if (varname == "vars") + continue + var/variable = vars_list[varname] + + if(variable == src) + testing("Found [type] \ref[src] in [datum_container.type]'s [varname] var. [container_name]") + + else if(islist(variable)) + DoSearchVar(variable, "[container_name] -> list", recursive_limit - 1) + + else if(islist(potential_container)) + var/normal = IS_NORMAL_LIST(potential_container) + for(var/element_in_list in potential_container) + if(element_in_list == src) + testing("Found [type] \ref[src] in list [container_name].") + + else if(element_in_list && !isnum(element_in_list) && normal && potential_container[element_in_list] == src) + testing("Found [type] \ref[src] in list [container_name]\[[element_in_list]\]") + + else if(islist(element_in_list)) + DoSearchVar(element_in_list, "[container_name] -> list", recursive_limit - 1) + + #ifndef FIND_REF_NO_CHECK_TICK + CHECK_TICK + #endif + + +/proc/qdel_and_find_ref_if_fail(datum/thing_to_del, force = FALSE) + SSgarbage.reference_find_on_fail[REF(thing_to_del)] = TRUE + qdel(thing_to_del, force) + +#endif diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index 6e3f2bd1a01..4949139c658 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -45,6 +45,18 @@ usr.client.admin_delete(target) if (isturf(src)) // show the turf that took its place usr.client.debug_variables(src) + return + + #ifdef REFERENCE_TRACKING + if(href_list[VV_HK_VIEW_REFERENCES]) + var/datum/D = locate(href_list[VV_HK_TARGET]) + if(!D) + to_chat(usr, "Unable to locate item.") + return + usr.client.holder.view_refs(target) + return + #endif + if(href_list[VV_HK_MARK]) usr.client.mark_datum(target) if(href_list[VV_HK_ADDCOMPONENT]) @@ -77,5 +89,4 @@ message_admins("[key_name_admin(usr)] has added [result] [datumname] to [key_name_admin(src)].") if(href_list[VV_HK_CALLPROC]) usr.client.callproc_datum(target) - if(href_list[VV_HK_VIEW_REFERENCES]) - usr.client.view_refs(target) + diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 7bac12db69f..f8c054b9941 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -266,7 +266,7 @@ GLOBAL_LIST_EMPTY(antagonists) show_name_in_check_antagonists = TRUE //They're all different var/datum/team/custom_team -datum/antagonist/custom/create_team(datum/team/team) +/datum/antagonist/custom/create_team(datum/team/team) custom_team = team /datum/antagonist/custom/get_team() diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 03e9d1d4675..f35b2f4fc84 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -96,12 +96,18 @@ ///////////BORGS AND OPERATIVES +/** + * Device to request reinforcments from ghost pop + */ /obj/item/antag_spawner/nuke_ops name = "syndicate operative teleporter" desc = "A single-use teleporter designed to quickly reinforce operatives in the field." icon = 'icons/obj/device.dmi' icon_state = "locator" var/borg_to_spawn + var/special_role_name = "Nuclear Operative" ///The name of the special role given to the recruit + var/datum/outfit/syndicate/outfit = /datum/outfit/syndicate/no_crystals ///The applied outfit + var/datum/antagonist/nukeop/antag_datum = /datum/antagonist/nukeop ///The antag datam applied /obj/item/antag_spawner/nuke_ops/proc/check_usability(mob/user) if(used) @@ -112,7 +118,6 @@ return FALSE return TRUE - /obj/item/antag_spawner/nuke_ops/attack_self(mob/user) if(!(check_usability(user))) return @@ -134,35 +139,23 @@ var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) C.prefs.copy_to(M) M.key = C.key + var/datum/mind/op_mind = M.mind - var/datum/antagonist/nukeop/new_op = new() - new_op.send_to_spawnpoint = FALSE - new_op.nukeop_outfit = /datum/outfit/syndicate/no_crystals + antag_datum = new() + antag_datum.send_to_spawnpoint = FALSE + antag_datum.nukeop_outfit = outfit - var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE) - if(creator_op) - M.mind.add_antag_datum(new_op,creator_op.nuke_team) - M.mind.special_role = "Nuclear Operative" + var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop, TRUE) + op_mind.add_antag_datum(antag_datum, creator_op ? creator_op.get_team() : null) + op_mind.special_role = special_role_name //////CLOWN OP /obj/item/antag_spawner/nuke_ops/clown name = "clown operative teleporter" desc = "A single-use teleporter designed to quickly reinforce clown operatives in the field." - -/obj/item/antag_spawner/nuke_ops/clown/spawn_antag(client/C, turf/T, kind, datum/mind/user) - var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) - C.prefs.copy_to(M) - M.key = C.key - - var/datum/antagonist/nukeop/clownop/new_op = new /datum/antagonist/nukeop/clownop() - new_op.send_to_spawnpoint = FALSE - new_op.nukeop_outfit = /datum/outfit/syndicate/clownop/no_crystals - - var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop/clownop,TRUE) - if(creator_op) - M.mind.add_antag_datum(new_op, creator_op.nuke_team) - M.mind.special_role = "Clown Operative" - + special_role_name = "Clown Operative" + outfit = /datum/outfit/syndicate/clownop/no_crystals + antag_datum = /datum/antagonist/nukeop/clownop //////SYNDICATE BORG /obj/item/antag_spawner/nuke_ops/borg_tele diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 93a8dec8d6c..290660e08d1 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -161,7 +161,7 @@ throw_speed = 0 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "cut") - sharpness = IS_SHARP + sharpness = SHARP_EDGED wound_bonus = -60 bare_wound_bonus = 20 var/can_drop = FALSE diff --git a/code/modules/antagonists/changeling/powers/regenerate.dm b/code/modules/antagonists/changeling/powers/regenerate.dm index d65d1181bed..a060cda7f8e 100644 --- a/code/modules/antagonists/changeling/powers/regenerate.dm +++ b/code/modules/antagonists/changeling/powers/regenerate.dm @@ -35,8 +35,8 @@ B.Insert(C) C.regenerate_organs() for(var/i in C.all_wounds) - var/datum/wound/W = i - W.remove_wound() + var/datum/wound/iter_wound = i + iter_wound.remove_wound() if(ishuman(user)) var/mob/living/carbon/human/H = user H.restore_blood() diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index af7a7493e28..7919fd125bd 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -39,7 +39,7 @@ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' flags_1 = CONDUCT_1 - sharpness = IS_SHARP + sharpness = SHARP_EDGED w_class = WEIGHT_CLASS_BULKY force = 30 // whoever balanced this got beat in the head by a bible too many times good lord throwforce = 10 @@ -91,7 +91,7 @@ armour_penetration = 45 throw_speed = 1 throw_range = 3 - sharpness = IS_SHARP + sharpness = SHARP_EDGED light_color = "#ff0000" attack_verb = list("cleaved", "slashed", "tore", "lacerated", "hacked", "ripped", "diced", "carved") icon_state = "cultbastard" @@ -627,7 +627,7 @@ armour_penetration = 30 block_chance = 30 attack_verb = list("attacked", "impaled", "stabbed", "tore", "lacerated", "gored") - sharpness = IS_SHARP + sharpness = SHARP_EDGED hitsound = 'sound/weapons/bladeslice.ogg' var/datum/action/innate/cult/spear/spear_act var/wielded = FALSE // track wielded status on item diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 2f51431f6dd..596d996ee07 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -54,14 +54,19 @@ else ..() +/obj/structure/destructible/cult/set_anchored(anchorvalue) + . = ..() + if(isnull(.)) + return + update_icon() + +/obj/structure/destructible/cult/update_icon_state() + icon_state = "[initial(icon_state)][anchored ? null : "_off"]" + /obj/structure/destructible/cult/attackby(obj/I, mob/user, params) if(istype(I, /obj/item/melee/cultblade/dagger) && iscultist(user)) - anchored = !anchored + set_anchored(!anchored) to_chat(user, "You [anchored ? "":"un"]secure \the [src] [anchored ? "to":"from"] the floor.") - if(!anchored) - icon_state = "[initial(icon_state)]_off" - else - icon_state = initial(icon_state) else return ..() diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index d2383d7d7e0..1a725daba5b 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -123,7 +123,7 @@ var/weakness = check_weakness(I, user) apply_damage(I.force * weakness, I.damtype, def_zone) var/message_verb = "" - if(I.attack_verb && I.attack_verb.len) + if(I.attack_verb && length(I.attack_verb)) message_verb = "[pick(I.attack_verb)]" else if(I.force) message_verb = "attacked" diff --git a/code/modules/antagonists/eldritch_cult/eldritch_book.dm b/code/modules/antagonists/eldritch_cult/eldritch_book.dm index 575670d9ec7..f3135fe6599 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_book.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_book.dm @@ -3,6 +3,7 @@ desc = "Book describing the secrets of the veil." icon = 'icons/obj/eldritch.dmi' icon_state = "book" + worn_icon_state = "book" w_class = WEIGHT_CLASS_SMALL ///Last person that touched this var/mob/living/last_user diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm index f450d9d6a90..fba5de445a1 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm @@ -41,7 +41,7 @@ inhand_x_dimension = 64 inhand_y_dimension = 64 flags_1 = CONDUCT_1 - sharpness = IS_SHARP + sharpness = SHARP_EDGED w_class = WEIGHT_CLASS_NORMAL force = 17 throwforce = 10 diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm index bac3767ce42..20224b39e65 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm @@ -140,14 +140,15 @@ if(iscarbon(target)) var/mob/living/carbon/C1 = target for(var/obj/item/bodypart/bodypart in C2.bodyparts) - for(var/datum/wound/wound in bodypart.wounds) + for(var/i in bodypart.wounds) + var/datum/wound/iter_wound = i if(prob(50)) continue var/obj/item/bodypart/target_bodypart = locate(bodypart.type) in C1.bodyparts if(!target_bodypart) continue - wound.remove_wound() - wound.apply_wound(target_bodypart) + iter_wound.remove_wound() + iter_wound.apply_wound(target_bodypart) C1.blood_volume -= 20 if(C2.blood_volume < BLOOD_VOLUME_MAXIMUM) //we dont want to explode after all @@ -241,7 +242,7 @@ target.visible_message("[target]'s veins are shredded from within as an unholy blaze erupts from their blood!", \ "Your veins burst from within and unholy flame erupts from your blood!") var/obj/item/bodypart/bodypart = pick(target.bodyparts) - var/datum/wound/brute/cut/critical/crit_wound = new + var/datum/wound/slash/critical/crit_wound = new crit_wound.apply_wound(bodypart) target.adjustFireLoss(20) new /obj/effect/temp_visual/cleave(target.drop_location()) @@ -406,6 +407,8 @@ for(var/turf/T in spiral_range_turfs(_range,centre)) new /obj/effect/hotspot(T) T.hotspot_expose(700,50,1) + for(var/mob/living/livies in T.contents - centre) + livies.adjustFireLoss(10) _range++ sleep(3) @@ -453,6 +456,8 @@ for(var/turf/T in range(1,current_user)) new /obj/effect/hotspot(T) T.hotspot_expose(700,50,1) + for(var/mob/living/livies in T.contents - current_user) + livies.adjustFireLoss(5) /obj/effect/proc_holder/spell/targeted/worm_contract diff --git a/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm index 3d579853ba9..597054c4adc 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm @@ -86,7 +86,7 @@ if(iscarbon(target)) var/mob/living/carbon/carbon_target = target var/obj/item/bodypart/bodypart = pick(carbon_target.bodyparts) - var/datum/wound/brute/cut/severe/crit_wound = new + var/datum/wound/slash/severe/crit_wound = new crit_wound.apply_wound(bodypart) if(QDELETED(human_target) || human_target.stat != DEAD) @@ -157,7 +157,7 @@ if(iscarbon(target)) var/mob/living/carbon/carbon_target = target var/obj/item/bodypart/bodypart = pick(carbon_target.bodyparts) - var/datum/wound/brute/cut/severe/crit_wound = new + var/datum/wound/slash/severe/crit_wound = new crit_wound.apply_wound(bodypart) /datum/eldritch_knowledge/summon/raw_prophet diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index afe1f40f062..64dfc71b740 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -393,7 +393,7 @@ if(isinspace() && !anchored) to_chat(usr, "There is nothing to anchor to!") else - anchored = !anchored + set_anchored(!anchored) /obj/machinery/nuclearbomb/proc/set_safety() safety = !safety @@ -662,6 +662,15 @@ This is here to make the tiles around the station mininuke change when it's arme if(isobserver(user) || HAS_TRAIT(user.mind, TRAIT_DISK_VERIFIER)) . += "The serial numbers on [src] are incorrect." +/* + * You can't accidentally eat the nuke disk, bro + */ +/obj/item/disk/nuclear/on_accidental_consumption(mob/living/carbon/M, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE) + M.visible_message("[M] looks like [M.p_theyve()] just bitten into something important.", \ + "Wait, is this the nuke disk?") + + return discover_after + /obj/item/disk/nuclear/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/claymore/highlander) && !fake) var/obj/item/claymore/highlander/H = I diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 35018d28742..d24c9c7d21c 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -49,7 +49,6 @@ move_resist = MOVE_FORCE_OVERPOWERING mob_size = MOB_SIZE_TINY pass_flags = PASSTABLE | PASSGRILLE | PASSMOB - flags_1 = RAD_NO_CONTAMINATE_1 speed = 1 unique_name = TRUE hud_possible = list(ANTAG_HUD) @@ -73,6 +72,7 @@ /mob/living/simple_animal/revenant/Initialize(mapload) . = ..() + flags_1 |= RAD_NO_CONTAMINATE_1 ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_SIXTHSENSE, INNATE_TRAIT) AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null)) diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 13fa3793cde..b140c343c50 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -38,7 +38,7 @@ melee_damage_upper = 15 wound_bonus = -10 bare_wound_bonus = 0 - sharpness = TRUE + sharpness = SHARP_EDGED see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE var/playstyle_string = "You are a slaughter demon, a terrible creature from another realm. You have a single desire: To kill. \ diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 9aae6a2e7b1..57de089d449 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -1,675 +1,38 @@ -////Deactivated swarmer shell//// -/obj/item/deactivated_swarmer - name = "deactivated swarmer" - desc = "A shell of swarmer that was completely powered down. It can no longer activate itself." - icon = 'icons/mob/swarmer.dmi' - icon_state = "swarmer_unactivated" - custom_materials = list(/datum/material/iron=10000, /datum/material/glass=4000) +/datum/team/swarmer + name = "Swarmers" -/obj/effect/mob_spawn/swarmer - name = "unactivated swarmer" - desc = "A currently unactivated swarmer. Swarmers can self activate at any time, so it would be wise to immediately dispose of this." - icon = 'icons/mob/swarmer.dmi' - icon_state = "swarmer_unactivated" - density = FALSE - anchored = FALSE +//Simply lists them. +/datum/team/swarmer/roundend_report() + var/list/parts = list() + parts += "The [name] were:" + parts += printplayerlist(members) + return "
[parts.Join("
")]
" - mob_type = /mob/living/simple_animal/hostile/swarmer - mob_name = "a swarmer" - death = FALSE - roundstart = FALSE - short_desc = "You are a swarmer, a weapon of a long dead civilization." - flavour_text = {" - You are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate. - Clicking on any object will try to consume it, either deconstructing it into its components, destroying it, or integrating any materials it has into you if successful. - Ctrl-Clicking on a mob will attempt to remove it from the area and place it in a safe environment for storage. - Objectives: - 1. Consume resources and replicate until there are no more resources left. - 2. Ensure that this location is fit for invasion at a later date; do not perform actions that would render it dangerous or inhospitable. - 3. Biological resources will be harvested at a later date; do not harm them. - "} - -/obj/effect/mob_spawn/swarmer/Initialize() - . = ..() - var/area/A = get_area(src) - if(A) - notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE) - -/obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user) - . = ..() - if(.) - return - to_chat(user, "Picking up the swarmer may cause it to activate. You should be careful about this.") - -/obj/effect/mob_spawn/swarmer/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_SCREWDRIVER && user.a_intent != INTENT_HARM) - user.visible_message("[usr.name] deactivates [src].", - "After some fiddling, you find a way to disable [src]'s power source.", - "You hear clicking.") - new /obj/item/deactivated_swarmer(get_turf(src)) - qdel(src) - else - ..() - -////The Mob itself//// - -/mob/living/simple_animal/hostile/swarmer +/datum/antagonist/swarmer name = "Swarmer" - unique_name = 1 - icon = 'icons/mob/swarmer.dmi' - desc = "Robotic constructs of unknown design, swarmers seek only to consume materials and replicate themselves indefinitely." - speak_emote = list("tones") - initial_language_holder = /datum/language_holder/swarmer - bubble_icon = "swarmer" - mob_biotypes = MOB_ROBOTIC - health = 40 - maxHealth = 40 - status_flags = CANPUSH - icon_state = "swarmer" - icon_living = "swarmer" - icon_dead = "swarmer_unactivated" - icon_gib = null - wander = 0 - harm_intent_damage = 5 - minbodytemp = 0 - maxbodytemp = 500 - 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) - unsuitable_atmos_damage = 0 - melee_damage_lower = 15 - melee_damage_upper = 15 - melee_damage_type = STAMINA - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) - hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD) - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - attack_verb_continuous = "shocks" - attack_verb_simple = "shock" - attack_sound = 'sound/effects/empulse.ogg' - friendly_verb_continuous = "pinches" - friendly_verb_simple = "pinch" - speed = 0 - faction = list("swarmer") - AIStatus = AI_OFF - pass_flags = PASSTABLE - mob_size = MOB_SIZE_TINY - ventcrawler = VENTCRAWLER_ALWAYS - ranged = 1 - projectiletype = /obj/projectile/beam/disabler - ranged_cooldown_time = 20 - projectilesound = 'sound/weapons/taser2.ogg' - loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/stack/ore/bluespace_crystal) - del_on_death = 1 - deathmessage = "explodes with a sharp pop!" - light_color = LIGHT_COLOR_CYAN - hud_type = /datum/hud/swarmer - speech_span = SPAN_ROBOT - var/resources = 0 //Resource points, generated by consuming metal/glass - var/max_resources = 100 + job_rank = ROLE_ALIEN + show_in_antagpanel = FALSE + prevent_roundtype_conversion = FALSE + var/datum/team/swarmer/swarmer_team -/mob/living/simple_animal/hostile/swarmer/Initialize() - . = ..() - verbs -= /mob/living/verb/pulled - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_to_hud(src) +/datum/antagonist/swarmer/create_team(datum/team/swarmer/new_team) + if(!new_team) + for(var/datum/antagonist/swarmer/swarmerantag in GLOB.antagonists) + if(!swarmerantag.owner || !swarmerantag.swarmer_team) + continue + swarmer_team = swarmerantag.swarmer_team + return + swarmer_team = new + else + if(!istype(new_team)) + CRASH("Wrong swarmer team type provided to create_team") + swarmer_team = new_team -/mob/living/simple_animal/hostile/swarmer/med_hud_set_health() - var/image/holder = hud_list[DIAG_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]" +/datum/antagonist/swarmer/get_team() + return swarmer_team -/mob/living/simple_animal/hostile/swarmer/med_hud_set_status() - var/image/holder = hud_list[DIAG_STAT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = "hudstat" - -/mob/living/simple_animal/hostile/swarmer/Stat() +//SWARMER +/mob/living/simple_animal/hostile/swarmer/mind_initialize() ..() - if(statpanel("Status")) - stat("Resources:",resources) - -/mob/living/simple_animal/hostile/swarmer/emp_act() - . = ..() - if(. & EMP_PROTECT_SELF) - return - if(health > 1) - adjustHealth(health-1) - else - death() - -/mob/living/simple_animal/hostile/swarmer/CanAllowThrough(atom/movable/O) - . = ..() - if(istype(O, /obj/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other - return TRUE - if(isswarmer(O)) - return TRUE - -////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S//// -/mob/living/simple_animal/hostile/swarmer/AttackingTarget() - if(!isliving(target)) - return target.swarmer_act(src) - else - return ..() - -/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A) - face_atom(A) - if(!isturf(loc)) - return - if(next_move > world.time) - return - if(!A.Adjacent(src)) - return - A.swarmer_act(src) - -/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE //return TRUE/FALSE whether or not an AI swarmer should try this swarmer_act() again, NOT whether it succeeded. - -/obj/effect/mob_spawn/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.Integrate(src) - return FALSE //would logically be TRUE, but we don't want AI swarmers eating player spawn chances. - -/obj/effect/mob_spawn/swarmer/IntegrateAmount() - return 50 - -/turf/closed/indestructible/swarmer_act() - return FALSE - -/obj/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(resistance_flags & INDESTRUCTIBLE) - return FALSE - for(var/mob/living/L in contents) - if(!issilicon(L) && !isbrain(L)) - to_chat(S, "An organism has been detected inside this object. Aborting.") - return FALSE - return ..() - -/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - return S.Integrate(src) - -/atom/movable/proc/IntegrateAmount() - return 0 - -/obj/item/IntegrateAmount() //returns the amount of resources gained when eating this item - if(custom_materials) - if(custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)] || custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)]) - return 1 - return ..() - -/obj/item/gun/swarmer_act()//Stops you from eating the entire armory - return FALSE - -/turf/open/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor - return FALSE - -/obj/structure/lattice/catwalk/swarmer_catwalk/swarmer_act() - return FALSE - -/obj/structure/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(S.AIStatus == AI_ON) - return FALSE - else - return ..() - -/obj/effect/swarmer_act() - return FALSE - -/obj/effect/decal/cleanable/robot_debris/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - qdel(src) - return TRUE - -/obj/structure/flora/swarmer_act() - return FALSE - -/turf/open/lava/swarmer_act() - if(!is_safe()) - new /obj/structure/lattice/catwalk/swarmer_catwalk(src) - return FALSE - -/obj/machinery/atmospherics/swarmer_act() - return FALSE - -/obj/structure/disposalpipe/swarmer_act() - return FALSE - -/obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DismantleMachine(src) - return TRUE - -/obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - var/isonshuttle = istype(get_area(src), /area/shuttle) - for(var/turf/T in range(1, src)) - var/area/A = get_area(T) - if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) - to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") - S.target = null - return FALSE - else if(istype(A, /area/engine/supermatter)) - to_chat(S, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.") - S.target = null - return FALSE - S.DisIntegrate(src) - return TRUE - -/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - if(!QDELETED(S)) //If it got blown up no need to turn it off. - toggle_cam(S, 0) - return TRUE - -/obj/machinery/particle_accelerator/control_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//It's more visually interesting than dismantling the machine - S.DisIntegrate(src) - return TRUE - -/obj/machinery/turretid/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "The volatile chemicals in this machine would destroy us. Aborting.") - return FALSE - -/obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This device's destruction would result in the extermination of everything in the area. Aborting.") - return FALSE - -/obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "Searching... sensor malfunction! Target lost. Aborting.") - return FALSE - -/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "Destroying this object would cause a chain reaction. Aborting.") - return FALSE - -/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - return FALSE - -/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.") - return FALSE - -/obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.") - return FALSE - -/obj/machinery/deepfryer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This kitchen appliance should be preserved, it will make delicious unhealthy snacks for our masters in the future. Aborting.") - return FALSE - -/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - return FALSE - -/obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This bluespace source will be important to us later. Aborting.") - return FALSE - -/turf/closed/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - var/isonshuttle = istype(loc, /area/shuttle) - for(var/turf/T in range(1, src)) - var/area/A = get_area(T) - if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) - to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") - S.target = null - return TRUE - else if(istype(A, /area/engine/supermatter)) - to_chat(S, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.") - S.target = null - return TRUE - return ..() - -/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - var/isonshuttle = istype(get_area(src), /area/shuttle) - for(var/turf/T in range(1, src)) - var/area/A = get_area(T) - if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) - to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") - S.target = null - return TRUE - else if(istype(A, /area/engine/supermatter)) - to_chat(S, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.") - S.target = null - return TRUE - return ..() - -/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource - to_chat(S, "This object does not contain enough materials to work with.") - return FALSE - -/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "Attempting to dismantle this machine would result in an immediate counterattack. Aborting.") - return FALSE - -/obj/machinery/porta_turret_cover/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "Attempting to dismantle this machine would result in an immediate counterattack. Aborting.") - return FALSE - -/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisperseTarget(src) - return TRUE - -/mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This biological resource is somehow resisting our bluespace transceiver. Aborting.") - return FALSE - -/obj/machinery/drone_dispenser/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This object is receiving unactivated swarmer shells to help us. Aborting.") - return FALSE - -/obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - var/turf/here = get_turf(src) - for(var/A in here.contents) - var/obj/structure/cable/C = A - if(istype(C)) - to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - return FALSE - return ..() - -/obj/item/deactivated_swarmer/IntegrateAmount() - return 50 - -/obj/machinery/hydroponics/soil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This object does not contain enough materials to work with.") - return FALSE - -/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "Destroying this object would cause a catastrophic chain reaction. Aborting.") - return FALSE - -/obj/machinery/field/containment/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This object does not contain solid matter. Aborting.") - return FALSE - -/obj/machinery/power/shieldwallgen/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "Destroying this object would have an unpredictable effect on structure integrity. Aborting.") - return FALSE - -/obj/machinery/shieldwall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This object does not contain solid matter. Aborting.") - return FALSE - -////END CTRL CLICK FOR SWARMERS//// - -/mob/living/simple_animal/hostile/swarmer/proc/Fabricate(atom/fabrication_object,fabrication_cost = 0) - if(!isturf(loc)) - to_chat(src, "This is not a suitable location for fabrication. We need more space.") - if(resources >= fabrication_cost) - resources -= fabrication_cost - else - to_chat(src, "You do not have the necessary resources to fabricate this object.") - return - return new fabrication_object(loc) - -/mob/living/simple_animal/hostile/swarmer/proc/Integrate(atom/movable/target) - var/resource_gain = target.IntegrateAmount() - if(resources + resource_gain > max_resources) - to_chat(src, "We cannot hold more materials!") - return TRUE - if(resource_gain) - resources += resource_gain - do_attack_animation(target) - changeNext_move(CLICK_CD_MELEE) - var/obj/effect/temp_visual/swarmer/integrate/I = new /obj/effect/temp_visual/swarmer/integrate(get_turf(target)) - I.pixel_x = target.pixel_x - I.pixel_y = target.pixel_y - I.pixel_z = target.pixel_z - if(istype(target, /obj/item/stack)) - var/obj/item/stack/S = target - S.use(1) - if(S.amount) - return TRUE - qdel(target) - return TRUE - else - to_chat(src, "[target] is incompatible with our internal matter recycler.") - return FALSE - - -/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(atom/movable/target) - new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target)) - do_attack_animation(target) - changeNext_move(CLICK_CD_MELEE) - SSexplosions.lowobj += target - -/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(mob/living/target) - if(target == src) - return - - if(!is_station_level(z) && !is_mining_level(z)) - to_chat(src, "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.") - return - - to_chat(src, "Attempting to remove this being from our presence.") - - if(!do_mob(src, target, 30)) - return - - var/turf/open/floor/F - F = find_safe_turf(zlevels = z, extended_safety_checks = TRUE) - - if(!F) - return - // If we're getting rid of a human, slap some energy cuffs on - // them to keep them away from us a little longer - - var/mob/living/carbon/human/H = target - if(ishuman(target) && (!H.handcuffed)) - H.handcuffed = new /obj/item/restraints/handcuffs/energy/used(H) - H.update_handcuffed() - log_combat(src, H, "handcuffed") - - var/datum/effect_system/spark_spread/S = new - S.set_up(4,0,get_turf(target)) - S.start() - playsound(src,'sound/effects/sparks4.ogg',50,TRUE) - do_teleport(target, F, 0, channel = TELEPORT_CHANNEL_BLUESPACE) - -/mob/living/simple_animal/hostile/swarmer/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) - if(!(flags & SHOCK_TESLA)) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(obj/machinery/target) - do_attack_animation(target) - to_chat(src, "We begin to dismantle this machine. We will need to be uninterrupted.") - var/obj/effect/temp_visual/swarmer/dismantle/D = new /obj/effect/temp_visual/swarmer/dismantle(get_turf(target)) - D.pixel_x = target.pixel_x - D.pixel_y = target.pixel_y - D.pixel_z = target.pixel_z - if(do_mob(src, target, 100)) - to_chat(src, "Dismantling complete.") - var/atom/Tsec = target.drop_location() - new /obj/item/stack/sheet/metal(Tsec, 5) - for(var/obj/item/I in target.component_parts) - I.forceMove(Tsec) - var/obj/effect/temp_visual/swarmer/disintegration/N = new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target)) - N.pixel_x = target.pixel_x - N.pixel_y = target.pixel_y - N.pixel_z = target.pixel_z - target.dropContents() - if(istype(target, /obj/machinery/computer)) - var/obj/machinery/computer/C = target - if(C.circuit) - C.circuit.forceMove(Tsec) - qdel(target) - - -/obj/effect/temp_visual/swarmer //temporary swarmer visual feedback objects - icon = 'icons/mob/swarmer.dmi' - layer = BELOW_MOB_LAYER - -/obj/effect/temp_visual/swarmer/disintegration - icon_state = "disintegrate" - duration = 10 - -/obj/effect/temp_visual/swarmer/disintegration/Initialize() - . = ..() - playsound(loc, "sparks", 100, TRUE) - -/obj/effect/temp_visual/swarmer/dismantle - icon_state = "dismantle" - duration = 25 - -/obj/effect/temp_visual/swarmer/integrate - icon_state = "integrate" - duration = 5 - -/obj/structure/swarmer //Default swarmer effect object visual feedback - name = "swarmer ui" - desc = null - gender = NEUTER - icon = 'icons/mob/swarmer.dmi' - icon_state = "ui_light" - layer = MOB_LAYER - resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF - light_color = LIGHT_COLOR_CYAN - max_integrity = 30 - anchored = TRUE - var/lon_range = 1 - -/obj/structure/swarmer/Initialize(mapload) - . = ..() - set_light(lon_range) - -/obj/structure/swarmer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - playsound(src, 'sound/weapons/egloves.ogg', 80, TRUE) - if(BURN) - playsound(src, 'sound/items/welder.ogg', 100, TRUE) - -/obj/structure/swarmer/emp_act() - . = ..() - if(. & EMP_PROTECT_SELF) - return - qdel(src) - -/obj/structure/swarmer/trap - name = "swarmer trap" - desc = "A quickly assembled trap that electrifies living beings and overwhelms machine sensors. Will not retain its form if damaged enough." - icon_state = "trap" - max_integrity = 10 - density = FALSE - -/obj/structure/swarmer/trap/Crossed(atom/movable/AM) - if(isliving(AM)) - var/mob/living/L = AM - if(!istype(L, /mob/living/simple_animal/hostile/swarmer)) - playsound(loc,'sound/effects/snap.ogg',50, TRUE, -1) - L.electrocute_act(10, src, 1, flags = SHOCK_NOGLOVES|SHOCK_ILLUSION) - if(iscyborg(L)) - L.Paralyze(100) - qdel(src) - ..() - -/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap() - set name = "Create trap" - set category = "Swarmer" - set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources." - if(locate(/obj/structure/swarmer/trap) in loc) - to_chat(src, "There is already a trap here. Aborting.") - return - Fabricate(/obj/structure/swarmer/trap, 5) - - -/mob/living/simple_animal/hostile/swarmer/proc/CreateBarricade() - set name = "Create barricade" - set category = "Swarmer" - set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through." - if(locate(/obj/structure/swarmer/blockade) in loc) - to_chat(src, "There is already a blockade here. Aborting.") - return - if(resources < 5) - to_chat(src, "We do not have the resources for this!") - return - if(do_mob(src, src, 10)) - Fabricate(/obj/structure/swarmer/blockade, 5) - - -/obj/structure/swarmer/blockade - name = "swarmer blockade" - desc = "A quickly assembled energy blockade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through." - icon_state = "barricade" - light_range = MINIMUM_USEFUL_LIGHT_RANGE - max_integrity = 50 - density = TRUE - -/obj/structure/swarmer/blockade/CanAllowThrough(atom/movable/O) - . = ..() - if(isswarmer(O)) - return TRUE - if(istype(O, /obj/projectile/beam/disabler)) - return TRUE - -/mob/living/simple_animal/hostile/swarmer/proc/CreateSwarmer() - set name = "Replicate" - set category = "Swarmer" - set desc = "Creates a shell for a new swarmer. Swarmers will self activate." - to_chat(src, "We are attempting to replicate ourselves. We will need to stand still until the process is complete.") - if(resources < 50) - to_chat(src, "We do not have the resources for this!") - return - if(!isturf(loc)) - to_chat(src, "This is not a suitable location for replicating ourselves. We need more room.") - return - if(do_mob(src, src, 100)) - var/createtype = SwarmerTypeToCreate() - if(createtype && Fabricate(createtype, 50)) - playsound(loc,'sound/items/poster_being_created.ogg',50, TRUE, -1) - - -/mob/living/simple_animal/hostile/swarmer/proc/SwarmerTypeToCreate() - return /obj/effect/mob_spawn/swarmer - - -/mob/living/simple_animal/hostile/swarmer/proc/RepairSelf() - set name = "Self Repair" - set category = "Swarmer" - set desc = "Attempts to repair damage to our body. You will have to remain motionless until repairs are complete." - if(!isturf(loc)) - return - to_chat(src, "Attempting to repair damage to our body, stand by...") - if(do_mob(src, src, 100)) - adjustHealth(-100) - to_chat(src, "We successfully repaired ourselves.") - -/mob/living/simple_animal/hostile/swarmer/proc/ToggleLight() - if(!light_range) - set_light(3) - else - set_light(0) - -/mob/living/simple_animal/hostile/swarmer/proc/swarmer_chat(msg) - var/rendered = "Swarm communication - [src] [say_quote(msg)]" - for(var/i in GLOB.mob_list) - var/mob/M = i - if(isswarmer(M)) - to_chat(M, rendered) - if(isobserver(M)) - var/link = FOLLOW_LINK(M, src) - to_chat(M, "[link] [rendered]") - -/mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers() - var/message = stripped_input(src, "Announce to other swarmers", "Swarmer contact") - // TODO get swarmers their own colour rather than just boldtext - if(message) - swarmer_chat(message) + if(!mind.has_antag_datum(/datum/antagonist/swarmer)) + mind.add_antag_datum(/datum/antagonist/swarmer) diff --git a/code/modules/antagonists/swarmer/swarmer_event.dm b/code/modules/antagonists/swarmer/swarmer_event.dm deleted file mode 100644 index e086485a49c..00000000000 --- a/code/modules/antagonists/swarmer/swarmer_event.dm +++ /dev/null @@ -1,28 +0,0 @@ -/datum/round_event_control/spawn_swarmer - name = "Spawn Swarmer Shell" - typepath = /datum/round_event/spawn_swarmer - weight = 7 - max_occurrences = 1 //Only once okay fam - earliest_start = 30 MINUTES - min_players = 15 - - -/datum/round_event/spawn_swarmer - -/datum/round_event/spawn_swarmer/start() - if(find_swarmer()) - return 0 - if(!GLOB.the_gateway) - return 0 - new /obj/effect/mob_spawn/swarmer(get_turf(GLOB.the_gateway)) - if(prob(25)) //25% chance to announce it to the crew - var/swarmer_report = "[command_name()] High-Priority Update" - swarmer_report += "

Our long-range sensors have detected an odd signal emanating from your station's gateway. We recommend immediate investigation of your gateway, as something may have come through." - print_command_report(swarmer_report, announce=TRUE) - -/datum/round_event/spawn_swarmer/proc/find_swarmer() - for(var/i in GLOB.mob_living_list) - var/mob/living/L = i - if(istype(L, /mob/living/simple_animal/hostile/swarmer) && L.client) //If there is a swarmer with an active client, we've found our swarmer - return 1 - return 0 diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 585ec34c4a9..d2979a59c91 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -293,7 +293,7 @@ to_chat(target, "You suddenly feel very hot!") target.adjust_bodytemperature(50) GiveHint(target) - else if(is_pointed(I)) + else if(I.get_sharpness() == SHARP_POINTY) to_chat(target, "You feel a stabbing pain in [parse_zone(user.zone_selected)]!") target.Paralyze(40) GiveHint(target) diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index b3e9714f5cb..49a422ca24d 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -533,7 +533,7 @@ /datum/spellbook_entry/summon/events name = "Summon Events" desc = "Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events." - cost = 2 + cost = 2 limit = 1 var/times = 0 @@ -579,6 +579,7 @@ desc = "An unearthly tome that glows with power." icon = 'icons/obj/library.dmi' icon_state ="book" + worn_icon_state = "book" throw_speed = 2 throw_range = 5 w_class = WEIGHT_CLASS_TINY diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 70af1573f3e..6aa7110cb60 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -32,6 +32,10 @@ if(speaker == src) return + // raw_message can contain multiple spaces between words etc which are not seen in chat due to HTML rendering + // this means if the teller records a message with e.g. double spaces or tabs, other people will not be able to trigger the sensor since they don't know how to perform the same combination + raw_message = htmlrendertext(raw_message) + if(listening && !radio_freq) record_speech(speaker, raw_message, message_language) else diff --git a/code/modules/asset_cache/asset_list.dm b/code/modules/asset_cache/asset_list.dm index 337ed1db05f..4ce9dcf6fc0 100644 --- a/code/modules/asset_cache/asset_list.dm +++ b/code/modules/asset_cache/asset_list.dm @@ -45,7 +45,7 @@ GLOBAL_LIST_EMPTY(asset_datums) if (!ACI) continue .[asset_name] = ACI.url - + // For registering or sending multiple others at once /datum/asset/group @@ -86,7 +86,9 @@ GLOBAL_LIST_EMPTY(asset_datums) if (!name) CRASH("spritesheet [type] cannot register without a name") ensure_stripped() - + for(var/size_id in sizes) + var/size = sizes[size_id] + register_asset("[name]_[size_id].png", size[SPRSZ_STRIPPED]) var/res_name = "spritesheet_[name].css" var/fname = "data/spritesheets/[res_name]" fdel(fname) @@ -94,10 +96,6 @@ GLOBAL_LIST_EMPTY(asset_datums) register_asset(res_name, fcopy_rsc(fname)) fdel(fname) - for(var/size_id in sizes) - var/size = sizes[size_id] - register_asset("[name]_[size_id].png", size[SPRSZ_STRIPPED]) - /datum/asset/spritesheet/send(client/C) if (!name) return diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 0462375f3dd..704977a4a17 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -6,12 +6,6 @@ "tgui.bundle.css" = 'tgui/packages/tgui/public/tgui.bundle.css', ) -/datum/asset/group/tgui - children = list( - /datum/asset/simple/tgui, - /datum/asset/simple/fontawesome - ) - /datum/asset/simple/headers assets = list( "alarm_green.gif" = 'icons/program_icons/alarm_green.gif', diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index cc3b6510841..5fc436c7ca3 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -260,18 +260,18 @@ nobiliumsuppression = INFINITY return cached_results["fire"] ? REACTING : NO_REACTION //freon reaction (is not a fire yet) -datum/gas_reaction/freonfire +/datum/gas_reaction/freonfire priority = -4 name = "Freon combustion" id = "freonfire" -datum/gas_reaction/freonfire/init_reqs() +/datum/gas_reaction/freonfire/init_reqs() min_requirements = list( /datum/gas/oxygen = MINIMUM_MOLE_COUNT, /datum/gas/freon = MINIMUM_MOLE_COUNT ) -datum/gas_reaction/freonfire/react(datum/gas_mixture/air, datum/holder) +/datum/gas_reaction/freonfire/react(datum/gas_mixture/air, datum/holder) var/energy_released = 0 var/old_heat_capacity = air.heat_capacity() var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index c164dc5ae30..2fbfea08574 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -86,7 +86,7 @@ /obj/machinery/atmospherics/components/binary/circulator/wrench_act(mob/living/user, obj/item/I) if(!panel_open) return - anchored = !anchored + set_anchored(!anchored) I.play_tool_sound(src) if(generator) disconnectFromGenerator() diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index 50d3cdb600c..264caed3fa5 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -157,8 +157,8 @@ if(!parent) WARNING("Component is missing a pipenet! Rebuilding...") SSair.add_to_rebuild_queue(src) - parent = parents[i] - parent.update = 1 + else + parent.update = 1 /obj/machinery/atmospherics/components/returnPipenets() . = list() diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index e9aad6d08ce..5cafed8516c 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -71,7 +71,7 @@ if(!user.put_in_active_hand(src)) dropped(user) return - user.anchored = TRUE + user.set_anchored(TRUE) user.status_flags &= ~CANPUSH for(var/mob/M in GLOB.player_list) var/area/mob_area = get_area(M) @@ -82,7 +82,7 @@ /obj/item/ctf/dropped(mob/user) ..() - user.anchored = FALSE + user.set_anchored(FALSE) user.status_flags |= CANPUSH reset_cooldown = world.time + 200 //20 seconds START_PROCESSING(SSobj, src) diff --git a/code/modules/buildmode/buildmode.dm b/code/modules/buildmode/buildmode.dm index 4a56257882a..735c2a4c045 100644 --- a/code/modules/buildmode/buildmode.dm +++ b/code/modules/buildmode/buildmode.dm @@ -34,7 +34,7 @@ holder.screen += buttons holder.click_intercept = src mode.enter_mode(src) - + /datum/buildmode/proc/quit() mode.exit_mode(src) holder.screen -= buttons @@ -100,7 +100,7 @@ else close_switchstates() open_modeswitch() - + /datum/buildmode/proc/open_modeswitch() switch_state = BM_SWITCHSTATE_MODE holder.screen += modeswitch_buttons @@ -115,7 +115,7 @@ else close_switchstates() open_dirswitch() - + /datum/buildmode/proc/open_dirswitch() switch_state = BM_SWITCHSTATE_DIR holder.screen += dirswitch_buttons @@ -155,7 +155,7 @@ new /datum/buildmode(M.client) message_admins("[key_name_admin(usr)] has entered build mode.") log_admin("[key_name(usr)] has entered build mode.") - + #undef BM_SWITCHSTATE_NONE #undef BM_SWITCHSTATE_MODE #undef BM_SWITCHSTATE_DIR diff --git a/code/modules/buildmode/submodes/delete.dm b/code/modules/buildmode/submodes/delete.dm new file mode 100644 index 00000000000..ea2145a8dbd --- /dev/null +++ b/code/modules/buildmode/submodes/delete.dm @@ -0,0 +1,62 @@ +/datum/buildmode_mode/delete + key = "delete" + +/datum/buildmode_mode/delete/show_help(client/c) + to_chat(c, "***********************************************************\n\ + Left Mouse Button on anything to delete it. If you break it, you buy it.\n\ + Right Mouse Button on anything to delete everything of the type. Probably don\'t do this unless you know what you are doing.\n\ + ***********************************************************") + +/datum/buildmode_mode/delete/handle_click(client/c, params, object) + var/list/pa = params2list(params) + var/left_click = pa.Find("left") + var/right_click = pa.Find("right") + + if(left_click) + if(isturf(object)) + var/turf/T = object + T.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + else if(isatom(object)) + qdel(object) + + if(right_click) + if(check_rights(R_DEBUG|R_SERVER)) //Prevents buildmoded non-admins from breaking everything. + if(isturf(object)) + return + var/atom/deleting = object + var/action_type = alert("Strict type ([deleting.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel") + if(action_type == "Cancel" || !action_type) + return + + if(alert("Are you really sure you want to delete all instances of type [deleting.type]?",,"Yes","No") != "Yes") + return + + if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes") + return + + var/O_type = deleting.type + switch(action_type) + if("Strict type") + var/i = 0 + for(var/atom/Obj in world) + if(Obj.type == O_type) + i++ + qdel(Obj) + CHECK_TICK + if(!i) + to_chat(usr, "No instances of this type exist") + return + log_admin("[key_name(usr)] deleted all instances of type [O_type] ([i] instances deleted) ") + message_admins("[key_name(usr)] deleted all instances of type [O_type] ([i] instances deleted) ") + if("Type and subtypes") + var/i = 0 + for(var/Obj in world) + if(istype(Obj,O_type)) + i++ + qdel(Obj) + CHECK_TICK + if(!i) + to_chat(usr, "No instances of this type exist") + return + log_admin("[key_name(usr)] deleted all instances of type or subtype of [O_type] ([i] instances deleted) ") + message_admins("[key_name(usr)] deleted all instances of type or subtype of [O_type] ([i] instances deleted) ") diff --git a/code/modules/buildmode/submodes/outfit.dm b/code/modules/buildmode/submodes/outfit.dm new file mode 100644 index 00000000000..55ca0f4464d --- /dev/null +++ b/code/modules/buildmode/submodes/outfit.dm @@ -0,0 +1,44 @@ +/datum/buildmode_mode/outfit + key = "outfit" + var/datum/outfit/dressuptime + +/datum/buildmode_mode/outfit/Destroy() + dressuptime = null + return ..() + +/datum/buildmode_mode/outfit/show_help(client/c) + to_chat(c, "***********************************************************\n\ + Right Mouse Button on buildmode button = Select outfit to equip.\n\ + Left Mouse Button on mob/living/carbon/human = Equip the selected outfit.\n\ + Right Mouse Button on mob/living/carbon/human = Strip and delete current outfit.\n\ + ***********************************************************") + +/datum/buildmode_mode/outfit/Reset() + . = ..() + dressuptime = null + +/datum/buildmode_mode/outfit/change_settings(client/c) + dressuptime = c.robust_dress_shop() + +/datum/buildmode_mode/outfit/handle_click(client/c, params, object) + var/list/pa = params2list(params) + var/left_click = pa.Find("left") + var/right_click = pa.Find("right") + + if(!ishuman(object)) + return + var/mob/living/carbon/human/dollie = object + + if(left_click) + if(isnull(dressuptime)) + to_chat(c, "Pick an outfit first.") + return + + for (var/item in dollie.get_equipped_items(TRUE)) + qdel(item) + if(dressuptime != "Naked") + dollie.equipOutfit(dressuptime) + + if(right_click) + for (var/item in dollie.get_equipped_items(TRUE)) + qdel(item) diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index e7b13006a7a..354f9d18954 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -130,6 +130,7 @@ reward = 4000 required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium) + include_subtypes = FALSE /datum/bounty/item/assistant/poppy name = "Poppies" @@ -152,19 +153,6 @@ required_count = 8 wanted_types = list(/obj/item/kirbyplants) -/datum/bounty/item/assistant/earmuffs - name = "Earmuffs" - description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance." - reward = 1000 - wanted_types = list(/obj/item/clothing/ears/earmuffs) - -/datum/bounty/item/assistant/handcuffs - name = "Handcuffs" - description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)." - reward = 1000 - required_count = 5 - wanted_types = list(/obj/item/restraints/handcuffs) - /datum/bounty/item/assistant/monkey_cubes name = "Monkey Cubes" description = "Due to a recent genetics accident, Central Command is in serious need of monkeys. Your mission is to ship monkey cubes." @@ -172,12 +160,6 @@ required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/monkeycube) -/datum/bounty/item/assistant/chainsaw - name = "Chainsaw" - description = "The chef at CentCom is having trouble butchering her animals. She requests one chainsaw, please." - reward = 2500 - wanted_types = list(/obj/item/chainsaw) - /datum/bounty/item/assistant/ied name = "IED" description = "Nanotrasen's maximum security prison at CentCom is undergoing personnel training. Ship a handful of IEDs to serve as a training tools." @@ -185,31 +167,12 @@ required_count = 3 wanted_types = list(/obj/item/grenade/iedcasing) -/datum/bounty/item/assistant/bonfire - name = "Lit Bonfire" - description = "Space heaters are malfunctioning and the cargo crew of Central Command is starting to feel cold. Ship a lit bonfire to warm them up." - reward = 5000 - wanted_types = list(/obj/structure/bonfire) - -/datum/bounty/item/assistant/bonfire/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/structure/bonfire/B = O - return !!B.burning - /datum/bounty/item/assistant/corgimeat name = "Raw Corgi Meat" description = "The Syndicate recently stole all of CentCom's Corgi meat. Ship out a replacement immediately." reward = 3000 wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi) -/datum/bounty/item/assistant/corgifarming - name = "Corgi Hides" - description = "Admiral Weinstein's space yacht needs new upholstery. A dozen Corgi furs should do just fine." - reward = 30000 //that's a lot of dead dogs - required_count = 12 - wanted_types = list(/obj/item/stack/sheet/animalhide/corgi) - /datum/bounty/item/assistant/action_figures name = "Action Figures" description = "The vice president's son saw an ad for action figures on the telescreen and now he won't shut up about them. Ship some to ease his complaints." @@ -217,12 +180,6 @@ required_count = 5 wanted_types = list(/obj/item/toy/figure) -/datum/bounty/item/assistant/tail_whip - name = "Nine Tails whip" - description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails." - reward = 4000 - wanted_types = list(/obj/item/melee/chainofcommand/tailwhip) - /datum/bounty/item/assistant/dead_mice name = "Dead Mice" description = "Station 14 ran out of freeze-dried mice. Ship some fresh ones so their janitor doesn't go on strike." diff --git a/code/modules/cargo/bounties/botany.dm b/code/modules/cargo/bounties/botany.dm index 0a162f3fa72..e924aa42931 100644 --- a/code/modules/cargo/bounties/botany.dm +++ b/code/modules/cargo/bounties/botany.dm @@ -64,7 +64,7 @@ multiplier = 4 //hush money bonus_desc = "Do not mention this shipment to security." foodtype = "batch of \"muffins\"" - + /datum/bounty/item/botany/cannabis_white name = "Lifeweed Leaves" wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/cannabis/white) @@ -199,3 +199,14 @@ multiplier = 2 foodtype = "batch of oatmeal" bonus_desc = "Squats and oats. We're all out of oats." + +/datum/bounty/item/botany/bonfire + name = "Lit Bonfire" + description = "Space heaters are malfunctioning and the cargo crew of Central Command is starting to feel cold. Grow some logs and Ship a lit bonfire to warm them up." + wanted_types = list(/obj/structure/bonfire) + +/datum/bounty/item/botany/bonfire/applies_to(obj/O) + if(!..()) + return FALSE + var/obj/structure/bonfire/B = O + return !!B.burning diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm index d0e946ba2a6..ce51de70f26 100644 --- a/code/modules/cargo/bounties/chef.dm +++ b/code/modules/cargo/bounties/chef.dm @@ -136,3 +136,9 @@ required_count = 6 wanted_types = list(/obj/item/reagent_containers/food/snacks/nugget) +/datum/bounty/item/chef/corgifarming //Butchering is a chef's job. + name = "Corgi Hides" + description = "Admiral Weinstein's space yacht needs new upholstery. A dozen Corgi furs should do just fine." + reward = 30000 //that's a lot of dead dogs + required_count = 12 + wanted_types = list(/obj/item/stack/sheet/animalhide/corgi) diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm index 750889c4cee..63e0b56d2ef 100644 --- a/code/modules/cargo/bounties/engineering.dm +++ b/code/modules/cargo/bounties/engineering.dm @@ -16,22 +16,22 @@ /datum/bounty/item/engineering/gas/nitryl_tank name = "Full Tank of Nitryl" - description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started." + description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started. (20 Moles)" gas_type = /datum/gas/nitryl /datum/bounty/item/engineering/gas/freon_tank name = "Full Tank of Freon" - description = "The Supermatter of station 33 has started the delamination process. Deliver a tank of Freon gas to help them stop it!" + description = "The Supermatter of station 33 has started the delamination process. Deliver a tank of Freon gas to help them stop it! (20 Moles)" gas_type = /datum/gas/freon /datum/bounty/item/engineering/gas/tritium_tank name = "Full Tank of Tritium" - description = "Station 49 is looking to kickstart their research program. Ship them a tank full of Tritium." + description = "Station 49 is looking to kickstart their research program. Ship them a tank full of Tritium. (20 Moles)" gas_type = /datum/gas/tritium /datum/bounty/item/engineering/gas/hydrogen_tank name = "Full Tank of Hydrogen" - description = "Our R&D department is working on the development of more efficient electrical batteries using hydrogen as a catalyst. Ship us a tank full of it." + description = "Our R&D department is working on the development of more efficient electrical batteries using hydrogen as a catalyst. Ship us a tank full of it. (20 Moles)" gas_type = /datum/gas/hydrogen /datum/bounty/item/engineering/energy_ball @@ -45,3 +45,15 @@ return FALSE var/obj/singularity/energy_ball/T = O return !T.miniball + +/datum/bounty/item/engineering/emitter + name = "Emitter" + description = "We think there may be a defect in your station's emitter designs, based on the sheer number of delaminations your sector seems to see. Ship us one of yours." + reward = 2500 + wanted_types = list(/obj/machinery/power/emitter) + +/datum/bounty/item/engineering/hydro_tray + name = "Hydroponics Tray" + description = "The lab technicians are trying to figure out how to lower the power drain of hydroponics trays, but we fried our last one. Mind building one for us?" + reward = 2000 + wanted_types = list(/obj/machinery/hydroponics/constructable) diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm index d1397759695..3f737448a5b 100644 --- a/code/modules/cargo/bounties/medical.dm +++ b/code/modules/cargo/bounties/medical.dm @@ -57,3 +57,15 @@ description = "Central Command has run out of heavy duty pipe cleaners. Can you ship over a cat tail to help us out?" reward = 3000 wanted_types = list(/obj/item/organ/tail/cat) + +/datum/bounty/item/medical/chainsaw + name = "Chainsaw" + description = "A CMO at CentCom is having trouble operating on golems. She requests one chainsaw, please." + reward = 2500 + wanted_types = list(/obj/item/chainsaw) + +/datum/bounty/item/medical/tail_whip //Like the cat tail bounties, with more processing. + name = "Nine Tails whip" + description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails." + reward = 4000 + wanted_types = list(/obj/item/melee/chainofcommand/tailwhip) diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm index 6e38a0c2be1..62aefe87634 100644 --- a/code/modules/cargo/bounties/reagent.dm +++ b/code/modules/cargo/bounties/reagent.dm @@ -233,7 +233,7 @@ //reagent that are possible to be chem factory'd var/static/list/possible_reagents = list(\ /datum/reagent/medicine/spaceacillin,\ - /datum/reagent/medicine/c2/instabitaluri,\ + /datum/reagent/medicine/c2/synthflesh,\ /datum/reagent/medicine/pen_acid,\ /datum/reagent/medicine/atropine,\ /datum/reagent/medicine/cryoxadone,\ diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm index dbe64e61e48..c503ee2b100 100644 --- a/code/modules/cargo/bounties/science.dm +++ b/code/modules/cargo/bounties/science.dm @@ -64,3 +64,9 @@ description = "With the price of rechargers on the rise, upper management is interested in purchasing guns that are self-powered. If you ship one, they'll pay." reward = 10000 wanted_types = list(/obj/item/gun/energy/e_gun/nuclear) + +/datum/bounty/item/science/bepis_disc + name = "Reformatted Tech Disk" + description = "It turns out the diskettes the BEPIS prints experimental nodes on are extremely space-efficient. Send us one of your spares when you're done with it." + reward = 4000 + wanted_types = list(/obj/item/disk/tech_disk/major) diff --git a/code/modules/cargo/bounties/security.dm b/code/modules/cargo/bounties/security.dm index bcf7b89f3af..28b62be1f4e 100644 --- a/code/modules/cargo/bounties/security.dm +++ b/code/modules/cargo/bounties/security.dm @@ -11,3 +11,37 @@ reward = 2000 required_count = 3 wanted_types = list(/obj/machinery/recharger) + +/datum/bounty/item/security/pepperspray + name = "Pepperspray" + description = "We've been having a bad run of riots on Space Station 76. We could use some new pepperspray cans." + reward = 3000 + required_count = 4 + wanted_types = list(/obj/item/reagent_containers/spray/pepper) + +/datum/bounty/item/security/prison_clothes + name = "Prison Uniforms" + description = "Terragov has been unable to source any new prisoner uniforms, so if you have any spares, we'll take them off your hands." + reward = 2000 + required_count = 4 + wanted_types = list(/obj/item/clothing/under/rank/prisoner) + +/datum/bounty/item/security/plates + name = "License Plates" + description = "As a result of a bad clown car crash, we could use an advance on some of your prisoner's license plates." + reward = 1000 + required_count = 10 + wanted_types = list(/obj/item/stack/license_plates/filled) + +/datum/bounty/item/security/earmuffs + name = "Earmuffs" + description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance." + reward = 1000 + wanted_types = list(/obj/item/clothing/ears/earmuffs) + +/datum/bounty/item/security/handcuffs + name = "Handcuffs" + description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)." + reward = 1000 + required_count = 5 + wanted_types = list(/obj/item/restraints/handcuffs) diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm index 447a573a5a9..ce281bdfcee 100644 --- a/code/modules/cargo/bounty.dm +++ b/code/modules/cargo/bounty.dm @@ -7,18 +7,18 @@ GLOBAL_LIST_EMPTY(bounties_list) var/claimed = FALSE var/high_priority = FALSE -// Displayed on bounty UI screen. +/// Displayed on bounty UI screen. /datum/bounty/proc/completion_string() return "" -// Displayed on bounty UI screen. +/// Displayed on bounty UI screen. /datum/bounty/proc/reward_string() return "[reward] Credits" /datum/bounty/proc/can_claim() return !claimed -// Called when the claim button is clicked. Override to provide fancy rewards. +/// Called when the claim button is clicked. Override to provide fancy rewards. /datum/bounty/proc/claim() if(can_claim()) var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) @@ -26,16 +26,17 @@ GLOBAL_LIST_EMPTY(bounties_list) D.adjust_money(reward) claimed = TRUE -// If an item sent in the cargo shuttle can satisfy the bounty. +/// If an item sent in the cargo shuttle can satisfy the bounty. /datum/bounty/proc/applies_to(obj/O) return FALSE -// Called when an object is shipped on the cargo shuttle. +/// Called when an object is shipped on the cargo shuttle. /datum/bounty/proc/ship(obj/O) return -// When randomly generating the bounty list, duplicate bounties must be avoided. -// This proc is used to determine if two bounties are duplicates, or incompatible in general. +/** When randomly generating the bounty list, duplicate bounties must be avoided. + * This proc is used to determine if two bounties are duplicates, or incompatible in general. + */ /datum/bounty/proc/compatible_with(other_bounty) return TRUE @@ -45,8 +46,9 @@ GLOBAL_LIST_EMPTY(bounties_list) high_priority = TRUE reward = round(reward * scale_reward) -// This proc is called when the shuttle docks at CentCom. -// It handles items shipped for bounties. +/** This proc is called when the shuttle docks at CentCom. + * It handles items shipped for bounties. + */ /proc/bounty_ship_item_and_contents(atom/movable/AM, dry_run=FALSE) if(!GLOB.bounties_list.len) setup_bounties() @@ -64,7 +66,7 @@ GLOBAL_LIST_EMPTY(bounties_list) qdel(thing) return matched_one -// Returns FALSE if the bounty is incompatible with the current bounties. +/// Returns FALSE if the bounty is incompatible with the current bounties. /proc/try_add_bounty(datum/bounty/new_bounty) if(!new_bounty || !new_bounty.name || !new_bounty.description) return FALSE @@ -75,9 +77,17 @@ GLOBAL_LIST_EMPTY(bounties_list) GLOB.bounties_list += new_bounty return TRUE -// Returns a new bounty of random type, but does not add it to GLOB.bounties_list. -/proc/random_bounty() - switch(rand(1, 13)) +/** Returns a new bounty of random type, but does not add it to GLOB.bounties_list. + * + * *Guided determines what specific catagory of bounty should be chosen. + */ +/proc/random_bounty(var/guided = 0) + var/bounty_num + if(guided) + bounty_num = guided + else + bounty_num = rand(1,13) + switch(bounty_num) if(1) var/subtype = pick(subtypesof(/datum/bounty/item/assistant)) return new subtype @@ -102,21 +112,21 @@ GLOBAL_LIST_EMPTY(bounties_list) var/subtype = pick(subtypesof(/datum/bounty/virus)) return new subtype if(8) - var/subtype = pick(subtypesof(/datum/bounty/item/science)) - return new subtype - if(9) + if(rand(2) == 1) + var/subtype = pick(subtypesof(/datum/bounty/item/science)) + return new subtype var/subtype = pick(subtypesof(/datum/bounty/item/slime)) return new subtype - if(10) + if(9) var/subtype = pick(subtypesof(/datum/bounty/item/engineering)) return new subtype - if(11) + if(10) var/subtype = pick(subtypesof(/datum/bounty/item/mining)) return new subtype - if(12) + if(11) var/subtype = pick(subtypesof(/datum/bounty/item/medical)) return new subtype - if(13) + if(12) var/subtype = pick(subtypesof(/datum/bounty/item/botany)) return new subtype diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index 075194e2fff..fed098b4f30 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -608,7 +608,7 @@ else toLaunch.reverse_dropoff_turf = bay //Bay is currently a nonstatic expression, so it cant go into toLaunch using DuplicateObject toLaunch.update_icon()//we update_icon() here so that the door doesnt "flicker on" right after it lands - var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/fly_me_to_the_moon] + var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/supplypod_temp_holding] toLaunch.forceMove(shippingLane) if (launchClone) //We arent launching the actual items from the bay, rather we are creating clones and launching those if(launchRandomItem) diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm index 80df3684ef4..ac77a994a03 100644 --- a/code/modules/cargo/coupon.dm +++ b/code/modules/cargo/coupon.dm @@ -1,6 +1,6 @@ #define COUPON_OMEN "omen" -obj/item/coupon +/obj/item/coupon name = "coupon" desc = "It doesn't matter if you didn't want it before, what matters now is that you've got a coupon for it!" icon_state = "data_1" diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index 161b98362ed..1afbc87285e 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -126,18 +126,19 @@ cost = 10 //Base cost of canister. You get more for nice gases inside. unit_name = "Gas Canister" export_types = list(/obj/machinery/portable_atmospherics/canister) + /datum/export/large/gas_canister/get_cost(obj/O) var/obj/machinery/portable_atmospherics/canister/C = O var/worth = 10 var/gases = C.air_contents.gases C.air_contents.assert_gases(/datum/gas/bz,/datum/gas/stimulum,/datum/gas/hypernoblium,/datum/gas/miasma,/datum/gas/tritium,/datum/gas/pluoxium,/datum/gas/freon,/datum/gas/hydrogen) - worth += gases[/datum/gas/bz][MOLES]*4 - worth += gases[/datum/gas/stimulum][MOLES]*100 worth += gases[/datum/gas/hypernoblium][MOLES]*1000 - worth += gases[/datum/gas/miasma][MOLES]*10 + worth += gases[/datum/gas/stimulum][MOLES]*100 + worth += gases[/datum/gas/freon][MOLES]*15 worth += gases[/datum/gas/tritium][MOLES]*5 worth += gases[/datum/gas/pluoxium][MOLES]*5 - worth += gases[/datum/gas/freon][MOLES]*15 + worth += gases[/datum/gas/bz][MOLES]*4 + worth += gases[/datum/gas/miasma][MOLES]*2 worth += gases[/datum/gas/hydrogen][MOLES]*1 return worth diff --git a/code/modules/cargo/exports/parts.dm b/code/modules/cargo/exports/parts.dm index 0df08954398..115dfdf3ff6 100644 --- a/code/modules/cargo/exports/parts.dm +++ b/code/modules/cargo/exports/parts.dm @@ -15,11 +15,6 @@ unit_name = "solar panel control board" export_types = list(/obj/item/circuitboard/computer/solar_control) -/datum/export/swarmer - cost = 2000 - unit_name = "deactivated alien deconstruction drone" - export_types = list(/obj/item/deactivated_swarmer) - //Computer Tablets and Parts /datum/export/modular_part cost = 15 diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index 866f270c259..5e71e7f7972 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -1,4 +1,4 @@ -#define MAX_EMAG_ROCKETS 8 +#define MAX_EMAG_ROCKETS 5 #define BEACON_COST 500 #define SP_LINKED 1 #define SP_READY 2 @@ -149,6 +149,9 @@ if("add")//Generate Supply Order first + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_EXPRESSPOD_CONSOLE)) + say("Railgun recalibrating. Stand by.") + return var/id = text2path(params["id"]) var/datum/supply_pack/pack = SSshuttle.supply_packs[id] if(!istype(pack)) @@ -189,6 +192,7 @@ if(empty_turfs && empty_turfs.len) LZ = pick(empty_turfs) if (SO.pack.cost <= points_to_check && LZ)//we need to call the cost check again because of the CHECK_TICK call + TIMER_COOLDOWN_START(src, COOLDOWN_EXPRESSPOD_CONSOLE, 5 SECONDS) D.adjust_money(-SO.pack.cost) new /obj/effect/pod_landingzone(LZ, podType, SO) . = TRUE @@ -202,6 +206,7 @@ LAZYADD(empty_turfs, T) CHECK_TICK if(empty_turfs && empty_turfs.len) + TIMER_COOLDOWN_START(src, COOLDOWN_EXPRESSPOD_CONSOLE, 10 SECONDS) D.adjust_money(-(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS))) SO.generateRequisition(get_turf(src)) diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index a942d20db69..c071cbb4753 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -129,3 +129,9 @@ desc = "The simple beach ball is one of Nanotrasen's most popular products. 'Why do we make beach balls? Because we can! (TM)' - Nanotrasen" cost = 200 contains = list(/obj/item/toy/beach_ball) + +/datum/supply_pack/goody/medipen_twopak + name = "Medipen Two-Pak" + desc = "Contains one standard epinephrine medipen and one standard emergency first-aid kit medipen. For when you want to prepare for the worst." + cost = 500 + contains = list(/obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/hypospray/medipen/ekit) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 8833d3b9c9f..37a42049891 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1160,6 +1160,21 @@ crate_name = "blood freezer" crate_type = /obj/structure/closet/crate/freezer +/datum/supply_pack/medical/medipen_variety + name = "Medipen Variety-Pak" + desc = "Contains eight different medipens in three different varieties, to assist in quickly treating seriously injured patients." + cost = 2000 + contains = list(/obj/item/reagent_containers/hypospray/medipen/, + /obj/item/reagent_containers/hypospray/medipen/, + /obj/item/reagent_containers/hypospray/medipen/ekit, + /obj/item/reagent_containers/hypospray/medipen/ekit, + /obj/item/reagent_containers/hypospray/medipen/ekit, + /obj/item/reagent_containers/hypospray/medipen/blood_loss, + /obj/item/reagent_containers/hypospray/medipen/blood_loss, + /obj/item/reagent_containers/hypospray/medipen/blood_loss +) + crate_name = "medipen crate" + /datum/supply_pack/medical/chemical name = "Chemical Starter Kit Crate" desc = "Contains thirteen different chemicals, for all the fun experiments you can make." @@ -2267,15 +2282,14 @@ crate_name = "toy crate" crate_type = /obj/structure/closet/crate/wooden -/datum/supply_pack/costumes_toys/randomised/toys/generate() - . = ..() +/datum/supply_pack/costumes_toys/randomised/toys/fill(obj/structure/closet/crate/C) var/the_toy for(var/i in 1 to num_contained) if(prob(50)) the_toy = pickweight(GLOB.arcade_prize_pool) else the_toy = pick(subtypesof(/obj/item/toy/plush)) - new the_toy(.) + new the_toy(C) /datum/supply_pack/costumes_toys/wizard name = "Wizard Costume Crate" @@ -2383,12 +2397,11 @@ contains = list() crate_name = "booster pack pack" -/datum/supply_pack/costumes_toys/randomised/tcg/generate() - . = ..() +/datum/supply_pack/costumes_toys/randomised/tcg/fill(obj/structure/closet/crate/C) var/cardpacktype for(var/i in 1 to 10) cardpacktype = pick(subtypesof(/obj/item/cardpack)) - new cardpacktype(.) + new cardpacktype(C) ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Miscellaneous /////////////////////////////////// diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index d36ebc94988..10b000af4d2 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -80,8 +80,11 @@ landingDelay = 20 //Very speedy! resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF -/obj/structure/closet/supplypod/Initialize() +/obj/structure/closet/supplypod/Initialize(var/turf/spawn_location) . = ..() + if (!spawn_location) + var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/supplypod_temp_holding] //temporary holder for supplypods mid-transit + forceMove(shippingLane) setStyle(style, TRUE) //Upon initialization, give the supplypod an iconstate, name, and description based on the "style" variable. This system is important for the centcom_podlauncher to function correctly /obj/structure/closet/supplypod/extractionpod/Initialize() @@ -184,7 +187,7 @@ stay_after_drop = FALSE holder.pixel_z = initial(holder.pixel_z) holder.alpha = initial(holder.alpha) - var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/fly_me_to_the_moon] + var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/supplypod_temp_holding] forceMove(shippingLane) //Move to the centcom-z-level until the pod_landingzone says we can drop back down again if (!reverse_dropoff_turf) //If we're centcom-launched, the reverse dropoff turf will be a centcom loading bay. If we're an extraction pod, it should be the ninja jail. reverse_dropoff_turf = locate(/area/centcom/supplypod/loading/one) in GLOB.sortedAreas diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 17216de90de..6e71c8a2ec6 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -28,9 +28,15 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/UI_style = null var/buttons_locked = FALSE var/hotkeys = TRUE + + ///Runechat preference. If true, certain messages will be displayed on the map, not ust on the chat area. Boolean. var/chat_on_map = TRUE + ///Limit preference on the size of the message. Requires chat_on_map to have effect. var/max_chat_length = CHAT_MESSAGE_MAX_LENGTH + ///Whether non-mob messages will be displayed, such as machine vendor announcements. Requires chat_on_map to have effect. Boolean. var/see_chat_non_mob = TRUE + ///Whether emotes will be displayed on runechat. Requires chat_on_map to have effect. Boolean. + var/see_rc_emotes = TRUE // Custom Keybindings var/list/key_bindings = list() @@ -295,7 +301,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
Backpack:
[backpack]" dat += "[(randomise[RANDOM_BACKPACK]) ? "Lock" : "Unlock"]" - if(CAN_SCAR in pref_species.species_traits) + if((HAS_FLESH in pref_species.species_traits) || (HAS_BONE in pref_species.species_traits)) dat += "
Temporal Scarring:
[(persistent_scars) ? "Enabled" : "Disabled"]" dat += "Clear scar slots" @@ -553,6 +559,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Show Runechat Chat Bubbles: [chat_on_map ? "Enabled" : "Disabled"]
" dat += "Runechat message char limit: [max_chat_length]
" dat += "See Runechat for non-mobs: [see_chat_non_mob ? "Enabled" : "Disabled"]
" + dat += "See Runechat emotes: [see_rc_emotes ? "Enabled" : "Disabled"]
" dat += "
" dat += "Action Buttons: [(buttons_locked) ? "Locked In Place" : "Unlocked"]
" dat += "Hotkey mode: [(hotkeys) ? "Hotkeys" : "Default"]
" @@ -1655,6 +1662,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) chat_on_map = !chat_on_map if("see_chat_non_mob") see_chat_non_mob = !see_chat_non_mob + if("see_rc_emotes") + see_rc_emotes = !see_rc_emotes if("action_buttons") buttons_locked = !buttons_locked @@ -1959,15 +1968,3 @@ GLOBAL_LIST_EMPTY(preferences_datums) return else custom_names[name_id] = sanitized_name - -//Used in savefile update 32, can be removed once that is no longer relevant. -/datum/preferences/proc/force_reset_keybindings() - var/choice = tgalert(parent.mob, "Your basic keybindings need to be reset, emotes will remain as before. Would you prefer 'hotkey' or 'classic' mode?", "Reset keybindings", "Hotkey", "Classic") - hotkeys = (choice != "Classic") - var/list/oldkeys = key_bindings - key_bindings = (hotkeys) ? deepCopyList(GLOB.hotkey_keybinding_list_by_key) : deepCopyList(GLOB.classic_keybinding_list_by_key) - - for(var/key in oldkeys) - if(!key_bindings[key]) - key_bindings[key] = oldkeys[key] - parent.update_movement_keys() diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 9c0ee2584fc..9984fd0b366 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -1,11 +1,11 @@ //This is the lowest supported version, anything below this is completely obsolete and the entire savefile will be wiped. -#define SAVEFILE_VERSION_MIN 18 +#define SAVEFILE_VERSION_MIN 32 //This is the current version, anything below this will attempt to update (if it's not obsolete) // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 34 +#define SAVEFILE_VERSION_MAX 36 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -25,7 +25,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car */ /datum/preferences/proc/savefile_needs_update(savefile/S) var/savefile_version - S["version"] >> savefile_version + READ_FILE(S["version"], savefile_version) if(savefile_version < SAVEFILE_VERSION_MIN) S.dir.Cut() @@ -42,105 +42,36 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //if your savefile is 3 months out of date, then 'tough shit'. /datum/preferences/proc/update_preferences(current_version, savefile/S) - if(current_version < 30) - if(clientfps == 0) - clientfps = 60 - - if(current_version < 31) - if(clientfps == 60) - clientfps = 0 - - if(current_version < 32) //If you remove this, remove force_reset_keybindings() too. - addtimer(CALLBACK(src, .proc/force_reset_keybindings), 30) //No mob available when this is run, timer allows user choice. - if(current_version < 33) toggles |= SOUND_ENDOFROUND if(current_version < 34) auto_fit_viewport = TRUE + if(current_version < 35) //makes old keybinds compatible with #52040, sets the new default + var/newkey = FALSE + for(var/list/key in key_bindings) + for(var/bind in key) + if(bind == "quick_equipbelt") + key -= "quick_equipbelt" + key |= "quick_equip_belt" + + if(bind == "bag_equip") + key -= "bag_equip" + key |= "quick_equip_bag" + + if(bind == "quick_equip_suit_storage") + newkey = TRUE + if(!newkey && !key_bindings["ShiftQ"]) + key_bindings["ShiftQ"] = list("quick_equip_suit_storage") + + if(current_version < 36) + if(key_bindings["ShiftQ"] == "quick_equip_suit_storage") + key_bindings["ShiftQ"] = list("quick_equip_suit_storage") + + /datum/preferences/proc/update_character(current_version, savefile/S) - if(current_version < 19) - pda_style = "mono" - if(current_version < 20) - pda_color = "#808000" - if((current_version < 21) && features["ethcolor"] && (features["ethcolor"] == "#9c3030")) - features["ethcolor"] = "9c3030" - if(current_version < 22) - job_preferences = list() //It loaded null from nonexistent savefile field. - var/job_civilian_high = 0 - var/job_civilian_med = 0 - var/job_civilian_low = 0 - - var/job_medsci_high = 0 - var/job_medsci_med = 0 - var/job_medsci_low = 0 - - var/job_engsec_high = 0 - var/job_engsec_med = 0 - var/job_engsec_low = 0 - - S["job_civilian_high"] >> job_civilian_high - S["job_civilian_med"] >> job_civilian_med - S["job_civilian_low"] >> job_civilian_low - S["job_medsci_high"] >> job_medsci_high - S["job_medsci_med"] >> job_medsci_med - S["job_medsci_low"] >> job_medsci_low - S["job_engsec_high"] >> job_engsec_high - S["job_engsec_med"] >> job_engsec_med - S["job_engsec_low"] >> job_engsec_low - - //Can't use SSjob here since this happens right away on login - for(var/job in subtypesof(/datum/job)) - var/datum/job/J = job - var/new_value - var/fval = initial(J.flag) - switch(initial(J.department_flag)) - if(CIVILIAN) - if(job_civilian_high & fval) - new_value = JP_HIGH - else if(job_civilian_med & fval) - new_value = JP_MEDIUM - else if(job_civilian_low & fval) - new_value = JP_LOW - if(MEDSCI) - if(job_medsci_high & fval) - new_value = JP_HIGH - else if(job_medsci_med & fval) - new_value = JP_MEDIUM - else if(job_medsci_low & fval) - new_value = JP_LOW - if(ENGSEC) - if(job_engsec_high & fval) - new_value = JP_HIGH - else if(job_engsec_med & fval) - new_value = JP_MEDIUM - else if(job_engsec_low & fval) - new_value = JP_LOW - if(new_value) - job_preferences[initial(J.title)] = new_value - if(current_version < 23) - if(all_quirks) - all_quirks -= "Physically Obstructive" - all_quirks -= "Neat" - all_quirks -= "NEET" - if(current_version < 24) - if (!(underwear in GLOB.underwear_list)) - underwear = "Nude" - if(current_version < 25) - randomise = list(RANDOM_UNDERWEAR = TRUE, RANDOM_UNDERWEAR_COLOR = TRUE, RANDOM_UNDERSHIRT = TRUE, RANDOM_SOCKS = TRUE, RANDOM_BACKPACK = TRUE, RANDOM_JUMPSUIT_STYLE = TRUE, RANDOM_HAIRSTYLE = TRUE, RANDOM_HAIR_COLOR = TRUE, RANDOM_FACIAL_HAIRSTYLE = TRUE, RANDOM_FACIAL_HAIR_COLOR = TRUE, RANDOM_SKIN_TONE = TRUE, RANDOM_EYE_COLOR = TRUE) - if(S["name_is_always_random"] == 1) - randomise[RANDOM_NAME] = TRUE - if(S["body_is_always_random"] == 1) - randomise[RANDOM_BODY] = TRUE - if(S["species_is_always_random"] == 1) - randomise[RANDOM_SPECIES] = TRUE - if(S["backbag"]) - S["backbag"] >> backpack - if(S["hair_style_name"]) - S["hair_style_name"] >> hairstyle - if(S["facial_style_name"]) - S["facial_style_name"] >> facial_hairstyle + return /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) @@ -163,50 +94,51 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car return FALSE //general preferences - S["asaycolor"] >> asaycolor - S["ooccolor"] >> ooccolor - S["lastchangelog"] >> lastchangelog - S["UI_style"] >> UI_style - S["hotkeys"] >> hotkeys - S["chat_on_map"] >> chat_on_map - S["max_chat_length"] >> max_chat_length - S["see_chat_non_mob"] >> see_chat_non_mob - S["tgui_fancy"] >> tgui_fancy - S["tgui_lock"] >> tgui_lock - S["buttons_locked"] >> buttons_locked - S["windowflash"] >> windowflashing - S["be_special"] >> be_special + READ_FILE(S["asaycolor"], asaycolor) + READ_FILE(S["ooccolor"], ooccolor) + READ_FILE(S["lastchangelog"], lastchangelog) + READ_FILE(S["UI_style"], UI_style) + READ_FILE(S["hotkeys"], hotkeys) + READ_FILE(S["chat_on_map"], chat_on_map) + READ_FILE(S["max_chat_length"], max_chat_length) + READ_FILE(S["see_chat_non_mob"] , see_chat_non_mob) + READ_FILE(S["see_rc_emotes"] , see_rc_emotes) + READ_FILE(S["tgui_fancy"], tgui_fancy) + READ_FILE(S["tgui_lock"], tgui_lock) + READ_FILE(S["buttons_locked"], buttons_locked) + READ_FILE(S["windowflash"], windowflashing) + READ_FILE(S["be_special"] , be_special) - S["default_slot"] >> default_slot - S["chat_toggles"] >> chat_toggles - S["toggles"] >> toggles - S["ghost_form"] >> ghost_form - S["ghost_orbit"] >> ghost_orbit - S["ghost_accs"] >> ghost_accs - S["ghost_others"] >> ghost_others - S["preferred_map"] >> preferred_map - S["ignoring"] >> ignoring - S["ghost_hud"] >> ghost_hud - S["inquisitive_ghost"] >> inquisitive_ghost - S["uses_glasses_colour"]>> uses_glasses_colour - S["clientfps"] >> clientfps - S["parallax"] >> parallax - S["ambientocclusion"] >> ambientocclusion - S["auto_fit_viewport"] >> auto_fit_viewport - S["widescreenpref"] >> widescreenpref - S["pixel_size"] >> pixel_size - S["scaling_method"] >> scaling_method - S["menuoptions"] >> menuoptions - S["enable_tips"] >> enable_tips - S["tip_delay"] >> tip_delay - S["pda_style"] >> pda_style - S["pda_color"] >> pda_color + READ_FILE(S["default_slot"], default_slot) + READ_FILE(S["chat_toggles"], chat_toggles) + READ_FILE(S["toggles"], toggles) + READ_FILE(S["ghost_form"], ghost_form) + READ_FILE(S["ghost_orbit"], ghost_orbit) + READ_FILE(S["ghost_accs"], ghost_accs) + READ_FILE(S["ghost_others"], ghost_others) + READ_FILE(S["preferred_map"], preferred_map) + READ_FILE(S["ignoring"], ignoring) + READ_FILE(S["ghost_hud"], ghost_hud) + READ_FILE(S["inquisitive_ghost"], inquisitive_ghost) + READ_FILE(S["uses_glasses_colour"], uses_glasses_colour) + READ_FILE(S["clientfps"], clientfps) + READ_FILE(S["parallax"], parallax) + READ_FILE(S["ambientocclusion"], ambientocclusion) + READ_FILE(S["auto_fit_viewport"], auto_fit_viewport) + READ_FILE(S["widescreenpref"], widescreenpref) + READ_FILE(S["pixel_size"], pixel_size) + READ_FILE(S["scaling_method"], scaling_method) + READ_FILE(S["menuoptions"], menuoptions) + READ_FILE(S["enable_tips"], enable_tips) + READ_FILE(S["tip_delay"], tip_delay) + READ_FILE(S["pda_style"], pda_style) + READ_FILE(S["pda_color"], pda_color) // Custom hotkeys - S["key_bindings"] >> key_bindings + READ_FILE(S["key_bindings"], key_bindings) // hearted - S["hearted_until"] >> hearted_until + READ_FILE(S["hearted_until"], hearted_until) if(hearted_until > world.realtime) hearted = TRUE @@ -219,21 +151,22 @@ 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, GLOB.available_ui_styles, GLOB.available_ui_styles[1]) - hotkeys = sanitize_integer(hotkeys, 0, 1, initial(hotkeys)) - chat_on_map = sanitize_integer(chat_on_map, 0, 1, initial(chat_on_map)) + hotkeys = sanitize_integer(hotkeys, FALSE, TRUE, initial(hotkeys)) + chat_on_map = sanitize_integer(chat_on_map, FALSE, TRUE, initial(chat_on_map)) max_chat_length = sanitize_integer(max_chat_length, 1, CHAT_MESSAGE_MAX_LENGTH, initial(max_chat_length)) - see_chat_non_mob = sanitize_integer(see_chat_non_mob, 0, 1, initial(see_chat_non_mob)) - tgui_fancy = sanitize_integer(tgui_fancy, 0, 1, initial(tgui_fancy)) - tgui_lock = sanitize_integer(tgui_lock, 0, 1, initial(tgui_lock)) - buttons_locked = sanitize_integer(buttons_locked, 0, 1, initial(buttons_locked)) - windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing)) + see_chat_non_mob = sanitize_integer(see_chat_non_mob, FALSE, TRUE, initial(see_chat_non_mob)) + see_rc_emotes = sanitize_integer(see_rc_emotes, FALSE, TRUE, initial(see_rc_emotes)) + tgui_fancy = sanitize_integer(tgui_fancy, FALSE, TRUE, initial(tgui_fancy)) + tgui_lock = sanitize_integer(tgui_lock, FALSE, TRUE, initial(tgui_lock)) + buttons_locked = sanitize_integer(buttons_locked, FALSE, TRUE, initial(buttons_locked)) + windowflashing = sanitize_integer(windowflashing, FALSE, TRUE, initial(windowflashing)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) toggles = sanitize_integer(toggles, 0, (2**24)-1, initial(toggles)) clientfps = sanitize_integer(clientfps, 0, 1000, 0) parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null) - ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion)) - auto_fit_viewport = sanitize_integer(auto_fit_viewport, 0, 1, initial(auto_fit_viewport)) - widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref)) + ambientocclusion = sanitize_integer(ambientocclusion, FALSE, TRUE, initial(ambientocclusion)) + auto_fit_viewport = sanitize_integer(auto_fit_viewport, FALSE, TRUE, initial(auto_fit_viewport)) + widescreenpref = sanitize_integer(widescreenpref, FALSE, TRUE, initial(widescreenpref)) pixel_size = sanitize_integer(pixel_size, PIXEL_SCALING_AUTO, PIXEL_SCALING_3X, initial(pixel_size)) scaling_method = sanitize_text(scaling_method, initial(scaling_method)) ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form)) @@ -268,6 +201,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["chat_on_map"], chat_on_map) WRITE_FILE(S["max_chat_length"], max_chat_length) WRITE_FILE(S["see_chat_non_mob"], see_chat_non_mob) + WRITE_FILE(S["see_rc_emotes"], see_rc_emotes) WRITE_FILE(S["tgui_fancy"], tgui_fancy) WRITE_FILE(S["tgui_lock"], tgui_lock) WRITE_FILE(S["buttons_locked"], buttons_locked) @@ -324,7 +258,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Species var/species_id - S["species"] >> species_id + READ_FILE(S["species"], species_id) if(species_id) var/newtype = GLOB.species_list[species_id] if(newtype) @@ -339,65 +273,65 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_ethcolor"] , "9c3030") //Character - S["real_name"] >> real_name - S["gender"] >> gender - S["body_type"] >> body_type - S["age"] >> age - S["hair_color"] >> hair_color - S["facial_hair_color"] >> facial_hair_color - S["eye_color"] >> eye_color - S["skin_tone"] >> skin_tone - S["hairstyle_name"] >> hairstyle - S["facial_style_name"] >> facial_hairstyle - S["underwear"] >> underwear - S["underwear_color"] >> underwear_color - S["undershirt"] >> undershirt - S["socks"] >> socks - S["backpack"] >> backpack - S["jumpsuit_style"] >> jumpsuit_style - S["uplink_loc"] >> uplink_spawn_loc - S["playtime_reward_cloak"] >> playtime_reward_cloak - S["phobia"] >> phobia - S["randomise"] >> randomise - S["feature_mcolor"] >> features["mcolor"] - S["feature_ethcolor"] >> features["ethcolor"] - S["feature_lizard_tail"] >> features["tail_lizard"] - S["feature_lizard_snout"] >> features["snout"] - S["feature_lizard_horns"] >> features["horns"] - S["feature_lizard_frills"] >> features["frills"] - S["feature_lizard_spines"] >> features["spines"] - S["feature_lizard_body_markings"] >> features["body_markings"] - S["feature_lizard_legs"] >> features["legs"] - S["feature_moth_wings"] >> features["moth_wings"] - S["feature_moth_markings"] >> features["moth_markings"] - S["persistent_scars"] >> persistent_scars - S["scars1"] >> scars_list["1"] - S["scars2"] >> scars_list["2"] - S["scars3"] >> scars_list["3"] - S["scars4"] >> scars_list["4"] - S["scars5"] >> scars_list["5"] + READ_FILE(S["real_name"], real_name) + READ_FILE(S["gender"], gender) + READ_FILE(S["body_type"], body_type) + READ_FILE(S["age"], age) + READ_FILE(S["hair_color"], hair_color) + READ_FILE(S["facial_hair_color"], facial_hair_color) + READ_FILE(S["eye_color"], eye_color) + READ_FILE(S["skin_tone"], skin_tone) + READ_FILE(S["hairstyle_name"], hairstyle) + READ_FILE(S["facial_style_name"], facial_hairstyle) + READ_FILE(S["underwear"], underwear) + READ_FILE(S["underwear_color"], underwear_color) + READ_FILE(S["undershirt"], undershirt) + READ_FILE(S["socks"], socks) + READ_FILE(S["backpack"], backpack) + READ_FILE(S["jumpsuit_style"], jumpsuit_style) + READ_FILE(S["uplink_loc"], uplink_spawn_loc) + READ_FILE(S["playtime_reward_cloak"], playtime_reward_cloak) + READ_FILE(S["phobia"], phobia) + READ_FILE(S["randomise"], randomise) + READ_FILE(S["feature_mcolor"], features["mcolor"]) + READ_FILE(S["feature_ethcolor"], features["ethcolor"]) + READ_FILE(S["feature_lizard_tail"], features["tail_lizard"]) + READ_FILE(S["feature_lizard_snout"], features["snout"]) + READ_FILE(S["feature_lizard_horns"], features["horns"]) + READ_FILE(S["feature_lizard_frills"], features["frills"]) + READ_FILE(S["feature_lizard_spines"], features["spines"]) + READ_FILE(S["feature_lizard_body_markings"], features["body_markings"]) + READ_FILE(S["feature_lizard_legs"], features["legs"]) + READ_FILE(S["feature_moth_wings"], features["moth_wings"]) + READ_FILE(S["feature_moth_markings"], features["moth_markings"]) + READ_FILE(S["persistent_scars"] , persistent_scars) + READ_FILE(S["scars1"], scars_list["1"]) + READ_FILE(S["scars2"], scars_list["2"]) + READ_FILE(S["scars3"], scars_list["3"]) + READ_FILE(S["scars4"], scars_list["4"]) + READ_FILE(S["scars5"], scars_list["5"]) if(!CONFIG_GET(flag/join_with_mutant_humans)) features["tail_human"] = "none" features["ears"] = "none" else - S["feature_human_tail"] >> features["tail_human"] - S["feature_human_ears"] >> features["ears"] + READ_FILE(S["feature_human_tail"], features["tail_human"]) + READ_FILE(S["feature_human_ears"], features["ears"]) //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) var/savefile_slot_name = custom_name_id + "_name" //TODO remove this - S[savefile_slot_name] >> custom_names[custom_name_id] + READ_FILE(S[savefile_slot_name], custom_names[custom_name_id]) - S["preferred_ai_core_display"] >> preferred_ai_core_display - S["prefered_security_department"] >> prefered_security_department + READ_FILE(S["preferred_ai_core_display"], preferred_ai_core_display) + READ_FILE(S["prefered_security_department"], prefered_security_department) //Jobs - S["joblessrole"] >> joblessrole + READ_FILE(S["joblessrole"], joblessrole) //Load prefs - S["job_preferences"] >> job_preferences + READ_FILE(S["job_preferences"], job_preferences) //Quirks - S["all_quirks"] >> all_quirks + READ_FILE(S["all_quirks"], all_quirks) //try to fix any outdated data if necessary if(needs_update >= 0) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 6b8f78f823c..bcab6bc3bb5 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -93,21 +93,28 @@ return ..() /obj/item/clothing/attackby(obj/item/W, mob/user, params) - if(damaged_clothes && istype(W, repairable_by)) - var/obj/item/stack/S = W - switch(damaged_clothes) - if(CLOTHING_DAMAGED) - S.use(1) - repair(user, params) - if(CLOTHING_SHREDDED) - if(S.amount < 3) - to_chat(user, "You require 3 [S.name] to repair [src].") - return - to_chat(user, "You begin fixing the damage to [src] with [S]...") - if(do_after(user, 6 SECONDS, TRUE, src)) - if(S.use(3)) - repair(user, params) - return 1 + if(!istype(W, repairable_by)) + return ..() + + switch(damaged_clothes) + if(CLOTHING_PRISTINE) + return..() + if(CLOTHING_DAMAGED) + var/obj/item/stack/cloth_repair = W + cloth_repair.use(1) + repair(user, params) + return TRUE + if(CLOTHING_SHREDDED) + var/obj/item/stack/cloth_repair = W + if(cloth_repair.amount < 3) + to_chat(user, "You require 3 [cloth_repair.name] to repair [src].") + return TRUE + to_chat(user, "You begin fixing the damage to [src] with [cloth_repair]...") + if(!do_after(user, 6 SECONDS, TRUE, src) || !cloth_repair.use(3)) + return TRUE + repair(user, params) + return TRUE + return ..() /// Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up @@ -354,8 +361,8 @@ to_chat(M, "[src] start[p_s()] to fall apart!") //This mostly exists so subtypes can call appriopriate update icon calls on the wearer. -/obj/item/clothing/proc/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED) - damaged_clothes = damaged_state +/obj/item/clothing/proc/update_clothes_damaged_state() + return /obj/item/clothing/update_overlays() . = ..() diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 32a8d00c748..912a8b6f331 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -88,7 +88,7 @@ throw_speed = 4 attack_verb = list("sliced") hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = IS_SHARP + sharpness = SHARP_EDGED /obj/item/clothing/glasses/science name = "science goggles" @@ -156,7 +156,7 @@ throw_speed = 4 attack_verb = list("sliced") hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = IS_SHARP + sharpness = SHARP_EDGED glass_colour_type = /datum/client_colour/glass_colour/lightgreen /obj/item/clothing/glasses/regular @@ -228,7 +228,7 @@ throw_speed = 4 attack_verb = list("sliced") hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = IS_SHARP + sharpness = SHARP_EDGED /obj/item/clothing/glasses/sunglasses/garb/supergarb name = "black giga gar glasses" @@ -248,7 +248,7 @@ throw_speed = 4 attack_verb = list("sliced") hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = IS_SHARP + sharpness = SHARP_EDGED glass_colour_type = /datum/client_colour/glass_colour/orange /obj/item/clothing/glasses/sunglasses/gar/supergar diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 6a86dd4aafe..316d29cdc02 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -159,7 +159,7 @@ throw_speed = 4 attack_verb = list("sliced") hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = IS_SHARP + sharpness = SHARP_EDGED /obj/item/clothing/glasses/hud/security/sunglasses/gars/supergars name = "giga HUD gar glasses" diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 104a0172d1a..efb090c1490 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -11,14 +11,11 @@ strip_delay = 20 equip_delay_other = 40 -/obj/item/clothing/gloves/ComponentInitialize() +/obj/item/clothing/gloves/wash(clean_types) . = ..() - RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_blood) - -/obj/item/clothing/gloves/proc/clean_blood(datum/source, strength) - if(strength < CLEAN_STRENGTH_BLOOD) - return - transfer_blood = 0 + if((clean_types & CLEAN_TYPE_BLOOD) && transfer_blood > 0) + transfer_blood = 0 + return TRUE /obj/item/clothing/gloves/suicide_act(mob/living/carbon/user) user.visible_message("\the [src] are forcing [user]'s hands around [user.p_their()] neck! It looks like the gloves are possessed!") diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 6ae00237f20..ef71a981b65 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -25,10 +25,6 @@ ///any alerts we have active var/obj/screen/alert/our_alert -/obj/item/clothing/shoes/ComponentInitialize() - . = ..() - RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_blood) - /obj/item/clothing/shoes/suicide_act(mob/living/carbon/user) if(rand(2)>1) user.visible_message("[user] begins tying \the [src] up waaay too tightly! It looks like [user.p_theyre()] trying to commit suicide!") @@ -100,14 +96,16 @@ var/mob/M = loc M.update_inv_shoes() -/obj/item/clothing/shoes/proc/clean_blood(datum/source, strength) - if(strength < CLEAN_STRENGTH_BLOOD) +/obj/item/clothing/shoes/wash(clean_types) + . = ..() + if(!(clean_types & CLEAN_TYPE_BLOOD) || blood_state == BLOOD_STATE_NOT_BLOODY) return bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) blood_state = BLOOD_STATE_NOT_BLOODY if(ismob(loc)) var/mob/M = loc M.update_inv_shoes() + return TRUE /obj/item/proc/negates_gravity() return FALSE diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index c9e7e0f5a09..9dfb52c557b 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -95,7 +95,7 @@ user.update_atom_colour() user.animate_movement = FORWARD_STEPS user.notransform = 0 - user.anchored = FALSE + user.set_anchored(FALSE) teleporting = 0 for(var/obj/item/I in user.held_items) REMOVE_TRAIT(I, TRAIT_NODROP, CHRONOSUIT_TRAIT) @@ -137,7 +137,7 @@ user.animate_movement = NO_STEPS user.changeNext_move(8 + phase_in_ds) user.notransform = 1 - user.anchored = TRUE + user.set_anchored(TRUE) user.Stun(INFINITY) animate(user, color = "#00ccee", time = 3) diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 29f64924c0e..0a08186cc83 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -77,13 +77,6 @@ playsound(src, 'sound/mecha/mechmove03.ogg', 50, TRUE) //Visors don't just come from nothing update_icon() -/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands) - . = ..() - if(!isinhands && !up) - . += mutable_appearance('icons/mob/clothing/head.dmi', visor_icon) - else - cut_overlays() - /obj/item/clothing/head/helmet/space/plasmaman/update_overlays() . = ..() . += visor_icon @@ -99,8 +92,7 @@ smile_color = CR.paint_color to_chat(user, "You draw a smiley on the helmet visor.") update_icon() - return - if(smile == TRUE) + else to_chat(user, "Seems like someone already drew something on this helmet's visor!") /obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands) @@ -114,15 +106,12 @@ else cut_overlays() -/obj/item/clothing/head/helmet/space/plasmaman/ComponentInitialize() +/obj/item/clothing/head/helmet/space/plasmaman/wash(clean_types) . = ..() - RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, .proc/wipe_that_smile_off_your_face) - -///gets called when receiving the CLEAN_ACT signal from something, i.e soap or a shower. exists to remove any smiley faces drawn on the helmet. -/obj/item/clothing/head/helmet/space/plasmaman/proc/wipe_that_smile_off_your_face() - if(smile) + if(smile && (clean_types & CLEAN_TYPE_PAINT)) smile = FALSE - cut_overlays() + update_icon() + return TRUE /obj/item/clothing/head/helmet/space/plasmaman/attack_self(mob/user) on = !on diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 78514228098..35fb84a5745 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -9,7 +9,7 @@ equip_delay_other = 40 max_integrity = 250 resistance_flags = NONE - armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 15) + armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 10) /obj/item/clothing/suit/armor/Initialize() . = ..() @@ -49,7 +49,7 @@ icon_state = "hos" inhand_icon_state = "greatcoat" body_parts_covered = CHEST|GROIN|ARMS|LEGS - armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90, "wound" = 20) + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90, "wound" = 10) cold_protection = CHEST|GROIN|LEGS|ARMS heat_protection = CHEST|GROIN|LEGS|ARMS strip_delay = 80 @@ -118,7 +118,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "wound" = 30) + armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "wound" = 20) clothing_flags = BLOCKS_SHOVE_KNOCKDOWN strip_delay = 80 equip_delay_other = 60 diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index b47b6ee0c59..87b1b2b9866 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -14,7 +14,7 @@ /obj/item/clothing/under/color/random/Initialize() ..() - var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - typesof(/obj/item/clothing/under/color/jumpskirt) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/glorf - /obj/item/clothing/under/color/black/ghost) + var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - typesof(/obj/item/clothing/under/color/jumpskirt) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/ancient - /obj/item/clothing/under/color/black/ghost) if(ishuman(loc)) var/mob/living/carbon/human/H = loc H.equip_to_slot_or_del(new C(H), ITEM_SLOT_ICLOTHING) //or else you end up with naked assistants running around everywhere... @@ -65,14 +65,10 @@ icon_state = "grey_skirt" inhand_icon_state = "gy_suit" -/obj/item/clothing/under/color/grey/glorf +/obj/item/clothing/under/color/grey/ancient name = "ancient jumpsuit" desc = "A terribly ragged and frayed grey jumpsuit. It looks like it hasn't been washed in over a decade." -/obj/item/clothing/under/color/grey/glorf/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - owner.forcesay(GLOB.hit_appends) - return 0 - /obj/item/clothing/under/color/blue name = "blue jumpsuit" icon_state = "blue" diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm index fe519703671..98df8ad72d9 100644 --- a/code/modules/detectivework/detective_work.dm +++ b/code/modules/detectivework/detective_work.dm @@ -46,10 +46,10 @@ if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects if(add_blood_DNA(G.return_blood_DNA()) && length(G.return_blood_DNA()) > old) //only reduces the bloodiness of our gloves if the item wasn't already bloody G.transfer_blood-- - else if(M.bloody_hands > 1) + else if(M.blood_in_hands > 1) old = length(M.return_blood_DNA()) if(add_blood_DNA(M.return_blood_DNA()) && length(M.return_blood_DNA()) > old) - M.bloody_hands-- + M.blood_in_hands-- var/datum/component/forensics/D = AddComponent(/datum/component/forensics) . = D.add_fibers(M) @@ -92,7 +92,7 @@ G.add_blood_DNA(blood_dna) else if(length(blood_dna)) AddComponent(/datum/component/forensics, null, null, blood_dna) - bloody_hands = rand(2, 4) + blood_in_hands = rand(2, 4) update_inv_gloves() //handles bloody hands overlays and updating return TRUE diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index ead5bd6309a..1e0c5df0c3d 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -25,7 +25,7 @@ desc = initial(desc) /obj/item/evidencebag/proc/evidencebagEquip(obj/item/I, mob/user) - if(!istype(I) || I.anchored == 1) + if(!istype(I) || I.anchored) return if(SEND_SIGNAL(loc, COMSIG_CONTAINS_STORAGE) && SEND_SIGNAL(I, COMSIG_CONTAINS_STORAGE)) diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm index e7e61f3e39b..aaaa1ad1bff 100644 --- a/code/modules/detectivework/footprints_and_rag.dm +++ b/code/modules/detectivework/footprints_and_rag.dm @@ -42,4 +42,4 @@ user.visible_message("[user] starts to wipe down [A] with [src]!", "You start to wipe down [A] with [src]...") if(do_after(user,30, target = A)) user.visible_message("[user] finishes wiping off [A]!", "You finish wiping off [A].") - SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) + A.wash(CLEAN_SCRUB) diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index a16c12eec25..3fc9115f403 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -9,6 +9,8 @@ var/add_to_accounts = TRUE var/account_id var/being_dumped = FALSE //pink levels are rising + var/datum/bounty/civilian_bounty + var/bounty_timer = 0 /datum/bank_account/New(newname, job, modifier = 1) if(add_to_accounts) @@ -54,6 +56,7 @@ if(free) adjust_money(money_to_transfer) SSblackbox.record_feedback("amount", "free_income", money_to_transfer) + SSeconomy.station_target += money_to_transfer log_econ("[money_to_transfer] credits were given to [src.account_holder]'s account from income.") else var/datum/bank_account/D = SSeconomy.get_dep_account(account_job.paycheck_department) @@ -103,6 +106,47 @@ M.playsound_local(get_turf(sound_atom), 'sound/machines/twobeep_high.ogg', 50, TRUE) to_chat(M, "[icon2html(icon_source, M)] [message]") +/** + * Returns a string with the civilian bounty's description on it. + */ +/datum/bank_account/proc/bounty_text() + if(!civilian_bounty) + return FALSE + if(istype(civilian_bounty, /datum/bounty/item)) + var/datum/bounty/item/item = civilian_bounty + return item.description + if(istype(civilian_bounty, /datum/bounty/reagent)) + var/datum/bounty/reagent/chemical = civilian_bounty + return chemical.description + +/** + * Returns the required item count, or required chemical units required to submit a bounty. + */ +/datum/bank_account/proc/bounty_num() + if(!civilian_bounty) + return FALSE + if(istype(civilian_bounty, /datum/bounty/item)) + var/datum/bounty/item/item = civilian_bounty + return "[item.shipped_count]/[item.required_count]" + if(istype(civilian_bounty, /datum/bounty/reagent)) + var/datum/bounty/reagent/chemical = civilian_bounty + return "[chemical.shipped_volume]/[chemical.required_volume] u" + +/** + * Produces the value of the account's civilian bounty reward, if able. + */ +/datum/bank_account/proc/bounty_value() + if(!civilian_bounty) + return FALSE + return civilian_bounty.reward + +/** + * Performs house-cleaning on variables when a civilian bounty is replaced, or, when a bounty is claimed. + */ +/datum/bank_account/proc/reset_bounty() + civilian_bounty = null + bounty_timer = 0 + /datum/bank_account/department account_holder = "Guild Credit Agency" var/department_id = "REPLACE_ME" diff --git a/code/modules/events/market_crash.dm b/code/modules/events/market_crash.dm new file mode 100644 index 00000000000..18548e27504 --- /dev/null +++ b/code/modules/events/market_crash.dm @@ -0,0 +1,43 @@ +/** + * An event which decreases the station target temporarily, causing the inflation var to increase heavily. + * + * Done by decreasing the station_target by a high value per crew member, resulting in the station total being much higher than the target, and causing artificial inflation. + */ +/datum/round_event_control/market_crash + name = "Market Crash" + typepath = /datum/round_event/market_crash + weight = 10 + +/datum/round_event/market_crash + var/market_dip = 0 + +/datum/round_event/market_crash/setup() + startWhen = 1 + endWhen = rand(25, 50) + announceWhen = 2 + +/datum/round_event/market_crash/announce(fake) + var/list/poss_reasons = list("the alignment of the moon and the sun",\ + "some risky housing market outcomes",\ + "The B.E.P.I.S. team's untimely downfall",\ + "speculative Terragov grants backfiring",\ + "greatly exaggerated reports of Nanotrasen accountancy personnel committing mass suicide") + var/reason = pick(poss_reasons) + priority_announce("Due to [reason], prices for on-station vendors will be increased for a short period.", "Nanotrasen Accounting Division") + +///This does not work and I could use some help morking this one out further. +/datum/round_event/market_crash/start() + . = ..() + var/num_accounts = 0 + for(var/A in SSeconomy.bank_accounts) + num_accounts += 1 + market_dip = rand(1000,10000) * num_accounts + SSeconomy.station_target -= market_dip + SSeconomy.station_target = max(SSeconomy.station_target, 1) + SSeconomy.price_update() + +/datum/round_event/market_crash/end() + . = ..() + SSeconomy.station_target += market_dip + SSeconomy.price_update() + priority_announce("Prices for on-station vendors have now stabilized.", "Nanotrasen Accounting Division") diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index f66f33a121c..eaf85ac8db5 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -365,6 +365,7 @@ for(var/datum/export/E in ex.total_amount) total_report.total_amount[E] += ex.total_amount[E] total_report.total_value[E] += ex.total_value[E] + playsound(loc, 'sound/machines/wewewew.ogg', 70, TRUE) points += value @@ -380,16 +381,18 @@ if(sending) return sending = TRUE - status_report = "Sending..." + status_report = "Sending... " pad.visible_message("[pad] starts charging up.") pad.icon_state = pad.warmup_state sending_timer = addtimer(CALLBACK(src,.proc/send),warmup_time, TIMER_STOPPABLE) -/obj/machinery/computer/piratepad_control/proc/stop_sending() +/obj/machinery/computer/piratepad_control/proc/stop_sending(custom_report) if(!sending) return sending = FALSE status_report = "Ready for delivery." + if(custom_report) + status_report = custom_report pad.icon_state = pad.idle_state deltimer(sending_timer) diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index e24eac6d922..bf68ea98ce0 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -260,7 +260,7 @@ /obj/machinery/syndicatebomb/shuttle_loan/Initialize() . = ..() - setAnchored(TRUE) + set_anchored(TRUE) timer_set = rand(480, 600) //once the supply shuttle docks (after 5 minutes travel time), players have between 3-5 minutes to defuse the bomb activate() update_icon() diff --git a/code/modules/events/swarmer.dm b/code/modules/events/swarmer.dm new file mode 100644 index 00000000000..ffb79a43e72 --- /dev/null +++ b/code/modules/events/swarmer.dm @@ -0,0 +1,27 @@ +/datum/round_event_control/spawn_swarmer + name = "Spawn Swarmer Beacon" + typepath = /datum/round_event/spawn_swarmer + weight = 8 + max_occurrences = 1 //Only once okay fam + earliest_start = 30 MINUTES + min_players = 15 + +/datum/round_event/spawn_swarmer/announce(fake) + priority_announce("Our long-range sensors have detected that your station's defenses have been breached by some sort of alien device. We suggest searching for and destroying it as soon as possible.", "[command_name()] High-Priority Update") + +/datum/round_event/spawn_swarmer + announceWhen = 70 + +/datum/round_event/spawn_swarmer/start() + var/list/spawn_locs = list() + for(var/x in GLOB.xeno_spawn) + var/turf/spawn_turf = x + var/light_amount = spawn_turf.get_lumcount() + if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) + spawn_locs += spawn_turf + if(!spawn_locs.len) + message_admins("No valid spawn locations found in GLOB.xeno_spawn, aborting swarmer spawning...") + return MAP_ERROR + var/obj/structure/swarmer_beacon/new_beacon = new /obj/structure/swarmer_beacon(pick(spawn_locs)) + log_game("A Swarmer Beacon was spawned via an event.") + notify_ghosts("\A Swarmer Beacon has spawned!", source = new_beacon, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Swarmer Beacon Spawned") diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index b2719c03a78..45b8e7fc94b 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -34,6 +34,7 @@ desc = "Somehow, this piece of paper can be applied to items to make them \"better\". Apparently there's a risk of losing the item if it's already \"too good\". This all feels so arbitrary..." icon = 'icons/obj/wizard.dmi' icon_state = "scroll" + worn_icon_state = "scroll" w_class = WEIGHT_CLASS_TINY var/upgrade_amount = 1 diff --git a/code/modules/fields/fields.dm b/code/modules/fields/fields.dm index 3e401051499..e8e677e4d68 100644 --- a/code/modules/fields/fields.dm +++ b/code/modules/fields/fields.dm @@ -78,7 +78,7 @@ /datum/proximity_monitor/advanced/proc/process_edge_turf(turf/T) -/datum/proximity_monitor/advanced/New() +/datum/proximity_monitor/advanced/New(atom/_host, range, _ignore_if_not_on_turf = TRUE) if(requires_processing) START_PROCESSING(SSfields, src) diff --git a/code/modules/fields/peaceborg_dampener.dm b/code/modules/fields/peaceborg_dampener.dm index 5a1f1491648..c743270d2f1 100644 --- a/code/modules/fields/peaceborg_dampener.dm +++ b/code/modules/fields/peaceborg_dampener.dm @@ -21,10 +21,10 @@ var/list/obj/projectile/staging use_host_turf = TRUE -/datum/proximity_monitor/advanced/peaceborg_dampener/New() +/datum/proximity_monitor/advanced/peaceborg_dampener/New(atom/_host, range, _ignore_if_not_on_turf = TRUE) tracked = list() staging = list() - ..() + return ..() /datum/proximity_monitor/advanced/peaceborg_dampener/Destroy() return ..() diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 0adef27f864..89611b8dd57 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -723,7 +723,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( var/image/speech_overlay = image('icons/mob/talk.dmi', person, "default0", layer = ABOVE_MOB_LAYER) INVOKE_ASYNC(GLOBAL_PROC, /proc/flick_overlay, speech_overlay, list(target.client), 30) if (target.client?.prefs.chat_on_map) - target.create_chat_message(person, understood_language, chosen, spans, 0) + target.create_chat_message(person, understood_language, chosen, spans) to_chat(target, message) qdel(src) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 8bbd468a7f5..8b389098f17 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -44,14 +44,33 @@ M.visible_message("[user] fed [M] the contents of [src].", \ "[user] fed you the contents of [src].") log_combat(user, M, "fed", reagents.log_list()) - + SEND_SIGNAL(src, COMSIG_DRINK_DRANK, M, user) var/fraction = min(gulp_size/reagents.total_volume, 1) checkLiked(fraction, M) reagents.expose(M, INGEST, fraction) reagents.trans_to(M, gulp_size, transfered_by = user) playsound(M.loc,'sound/items/drink.ogg', rand(10,50), TRUE) + if(iscarbon(M)) + var/mob/living/carbon/carbon_drinker = M + var/list/diseases = carbon_drinker.get_static_viruses() + if(LAZYLEN(diseases)) + var/list/datum/disease/diseases_to_add = list() + for(var/d in diseases) + var/datum/disease/malady = d + if(malady.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS) + diseases_to_add += malady + if(LAZYLEN(diseases_to_add)) + AddComponent(/datum/component/infective, diseases_to_add) return TRUE +/* + * On accidental consumption, make sure the container is partially glass, and continue to the reagent_container proc + */ +/obj/item/reagent_containers/food/drinks/on_accidental_consumption(mob/living/carbon/M, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE) + if(isGlass && !custom_materials) + custom_materials = list(SSmaterials.GetMaterialRef(/datum/material/glass) = 5) //sets it to glass so, later on, it gets picked up by the glass catch + return ..() + /obj/item/reagent_containers/food/drinks/afterattack(obj/target, mob/user , proximity) . = ..() if(!proximity) @@ -377,7 +396,8 @@ custom_materials = list(/datum/material/plastic=3000) list_reagents = list(/datum/reagent/water = 100) volume = 100 - amount_per_transfer_from_this = 20 + amount_per_transfer_from_this = 10 + possible_transfer_amounts = list(5,10,15,20,25,30,50,100) cap_icon_state = "bottle_cap" /obj/item/reagent_containers/food/drinks/waterbottle/large/empty diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 8f2c39a4754..ee6bd312474 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -146,7 +146,7 @@ inhand_icon_state = "beer" hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("stabbed", "slashed", "attacked") - sharpness = IS_SHARP + sharpness = SHARP_EDGED var/static/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") /obj/item/broken_bottle/Initialize() @@ -262,6 +262,27 @@ list_reagents = list(/datum/reagent/consumable/ethanol/wine = 100) foodtype = FRUIT | ALCOHOL +/obj/item/reagent_containers/food/drinks/bottle/wine/add_initial_reagents() + . = ..() + var/wine_info = generate_vintage() + var/datum/reagent/consumable/ethanol/wine/W = locate() in reagents.reagent_list + if(W) + LAZYSET(W.data,"vintage",wine_info) + +/obj/item/reagent_containers/food/drinks/bottle/wine/proc/generate_vintage() + return "[GLOB.year_integer + 540] Nanotrasen Light Red" + +/obj/item/reagent_containers/food/drinks/bottle/wine/unlabeled + name = "unlabeled wine bottle" + desc = "There's no label on this wine bottle." + +/obj/item/reagent_containers/food/drinks/bottle/wine/unlabeled/generate_vintage() + var/current_year = GLOB.year_integer + 540 + var/year = rand(current_year-50,current_year) + var/type = pick("Sparkling","Dry White","Sweet White","Rich White","Rose","Light Red","Medium Red","Bold Red","Dessert") + var/origin = pick("Nanotrasen","Syndicate","Local") + return "[year] [origin] [type]" + /obj/item/reagent_containers/food/drinks/bottle/absinthe name = "extra-strong absinthe" desc = "A strong alcoholic drink brewed and distributed by" diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 023adeb3932..f5fc99fbc52 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -80,10 +80,13 @@ All foods are distributed among various categories. Use common sense. if(istype(location)) location.put_in_hands(trash_item) +//it's never an accident when you eat food! right? +/obj/item/reagent_containers/food/snacks/on_accidental_consumption(mob/living/carbon/M, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE) + return TRUE + /obj/item/reagent_containers/food/snacks/attack_self(mob/user) return - /obj/item/reagent_containers/food/snacks/attack(mob/living/M, mob/living/user, def_zone) if(user.a_intent == INTENT_HARM) return ..() @@ -185,10 +188,9 @@ All foods are distributed among various categories. Use common sense. var/obj/item/reagent_containers/food/snacks/customizable/C = new custom_food_type(get_turf(src)) C.initialize_custom_food(src, S, user) return 0 - var/sharp = W.get_sharpness() - if(sharp) - if(slice(sharp, W, user)) - return 1 + if(user.a_intent != INTENT_DISARM) + var/sharp = W.get_sharpness() + return sharp && slice(sharp, W, user) else ..() @@ -228,21 +230,10 @@ All foods are distributed among various categories. Use common sense. to_chat(user, "You cannot slice [src] here! You need a table or at least a tray.") return FALSE - var/slices_lost = 0 - if (accuracy >= IS_SHARP_ACCURATE) - user.visible_message( \ - "[user] slices [src].", \ - "You slice [src]." \ - ) - else - user.visible_message( \ - "[user] inaccurately slices [src] with [W]!", \ - "You inaccurately slice [src] with your [W]!" \ - ) - slices_lost = rand(1,min(1,round(slices_num/2))) + user.visible_message("[user] slices [src].", "You slice [src].") var/reagents_per_slice = reagents.total_volume/slices_num - for(var/i=1 to (slices_num-slices_lost)) + for(var/i in 1 to slices_num) var/obj/item/reagent_containers/food/snacks/slice = new slice_path (loc) initialize_slice(slice, reagents_per_slice) qdel(src) @@ -259,17 +250,19 @@ All foods are distributed among various categories. Use common sense. slice.foodtype = foodtype //if something happens that overrode our food type, make sure the slice carries that over /obj/item/reagent_containers/food/snacks/proc/generate_trash(atom/location) - if(trash) - if(ispath(trash, /obj/item)) - . = new trash(location) - trash = null - return - else if(isitem(trash)) - var/obj/item/trash_item = trash - trash_item.forceMove(location) - . = trash - trash = null - return + if(!trash) + return + + if(ispath(trash, /obj/item)) + . = new trash(location) + trash = null + return + else if(isitem(trash)) + var/obj/item/trash_item = trash + trash_item.forceMove(location) + . = trash + trash = null + return /obj/item/reagent_containers/food/snacks/proc/update_snack_overlays(obj/item/reagent_containers/food/snacks/S) cut_overlays() @@ -338,26 +331,78 @@ All foods are distributed among various categories. Use common sense. /// All the food items that can store an item inside itself, like bread or cake. /obj/item/reagent_containers/food/snacks/store w_class = WEIGHT_CLASS_NORMAL - var/stored_item = 0 + /// If an item has been stored in the food + var/stored_item = FALSE + /// The amount of volume the food has on creation + var/volume_on_creation = 0 + /// Allows someone to bypass the small weight class requirement, so they can put whatever they want into a slice of bread + var/bypass_weight_limit = FALSE + +/obj/item/reagent_containers/food/snacks/store/Initialize() + . = ..() + if(reagents?.total_volume) + volume_on_creation = reagents.total_volume /obj/item/reagent_containers/food/snacks/store/attackby(obj/item/W, mob/user, params) ..() - if(W.w_class <= WEIGHT_CLASS_SMALL & !istype(W, /obj/item/reagent_containers/food/snacks)) //can't slip snacks inside, they're used for custom foods. - if(W.get_sharpness()) - return 0 + if(istype(W, /obj/item/reagent_containers/food/snacks)) //can't slip snacks inside, they're used for custom foods. + return FALSE + + if((bypass_weight_limit || W.w_class <= WEIGHT_CLASS_SMALL)) + if(W.get_sharpness() && user.a_intent != INTENT_DISARM) + return FALSE + if(istype(W, /obj/item/storage)) + return FALSE if(stored_item) - return 0 + return FALSE if(!iscarbon(user)) - return 0 + return FALSE if(contents.len >= 20) to_chat(user, "[src] is full.") - return 0 + return FALSE + user.visible_message("[user.name] begins inserting [W] into [src].", \ + "You start to insert the [W] into \the [src].") + if(!do_after(user, 1.5 SECONDS, target = src)) + return FALSE to_chat(user, "You slip [W] inside [src].") user.transferItemToLoc(W, src) + log_message("[key_name(user)] inserted [W.name] into [src.name] at [AREACOORD(src)]", LOG_ATTACK) add_fingerprint(user) contents += W - stored_item = 1 - return 1 // no afterattack here + stored_item = TRUE + return TRUE // no afterattack here + +/obj/item/reagent_containers/food/snacks/store/attack(mob/living/carbon/M, mob/living/carbon/user, def_zone) + if(!..()) + return + /// What are the odds we eat glass? - [Bitecount / Max number of bites] * 100 + var/bad_chance_of_discovery = (bitecount / (volume_on_creation / bitesize))*100 //the closer you get to finishing it, the higher the chance you bite into it + /// What are the odds we see the glass but don't bite it? - ([Bitecount / Max number of bites] * 100) - 50 + var/good_chance_of_discovery = bad_chance_of_discovery - 50 //the closer you get to finishing it, the more likely you can see what is in it + /// We've found the item, and plan on remove it + var/discovered = FALSE + + if(stored_item) + for(var/obj/item/I in contents) + if(istype(I, /obj/item/reagent_containers/food/snacks)) + return FALSE + if(prob(good_chance_of_discovery)) + discovered = TRUE + to_chat(M, "It feels like there's something in this [src.name]...!") + + else if(prob(bad_chance_of_discovery)) + log_message("[key_name(user)] just fed [key_name(M)] a/an [I.name] which was hidden in [src.name] at [AREACOORD(src)]", LOG_ATTACK) + discovered = I.on_accidental_consumption(M, user, src) + + if(!QDELETED(I) && discovered) + contents -= I + stored_item = FALSE + if(M.put_in_hands(I)) //the moment when you slowly pull out whatever you just bit into in your food + to_chat(M, "You slowly pull [I] out of \the [src].") + else + to_chat(M, "[I] falls out of \the [src].") + + return FALSE /obj/item/reagent_containers/food/snacks/MouseDrop(atom/over) var/turf/T = get_turf(src) @@ -366,4 +411,3 @@ All foods are distributed among various categories. Use common sense. TB.MouseDrop(over) else return ..() - diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index 24904fdad77..06b6bc30e14 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -814,3 +814,17 @@ tastes = list("fried corn" = 1) foodtype = JUNKFOOD | FRIED value = FOOD_JUNK + +/obj/item/reagent_containers/food/snacks/cornchips/Crossed(atom/movable/AM, oldloc) + . = ..() + if(!isliving(AM) || bitecount) // can't pop opened chips + return + + var/mob/living/popper = AM + if(popper.mob_size < MOB_SIZE_HUMAN) + return + + playsound(src, 'sound/effects/chipbagpop.ogg', 100) + popper.visible_message("[popper] steps on \the [src], popping the bag!", "You step on \the [src], popping the bag!", "You hear a sharp crack!", COMBAT_MESSAGE_RANGE) + generate_trash(loc) + qdel(src) diff --git a/code/modules/food_and_drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm index 5d936ce6062..0a316c0fbe8 100644 --- a/code/modules/food_and_drinks/food/snacks_vend.dm +++ b/code/modules/food_and_drinks/food/snacks_vend.dm @@ -77,6 +77,20 @@ foodtype = JUNKFOOD | FRIED value = FOOD_JUNK +/obj/item/reagent_containers/food/snacks/chips/Crossed(atom/movable/AM, oldloc) + . = ..() + if(!isliving(AM) || bitecount) // can't pop opened chips + return + + var/mob/living/popper = AM + if(popper.mob_size < MOB_SIZE_HUMAN) + return + + playsound(src, 'sound/effects/chipbagpop.ogg', 100) + popper.visible_message("[popper] steps on \the [src], popping the bag!", "You step on \the [src], popping the bag!", "You hear a sharp crack!", COMBAT_MESSAGE_RANGE) + generate_trash(loc) + qdel(src) + /obj/item/reagent_containers/food/snacks/no_raisin name = "4no raisins" icon_state = "4no_raisins" diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index de26fc0e65c..71325e7395b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -13,6 +13,7 @@ active_power_usage = 100 circuit = /obj/item/circuitboard/machine/smartfridge + var/base_build_path = /obj/machinery/smartfridge ///What path boards used to construct it should build into when dropped. Needed so we don't accidentally have them build variants with items preloaded in them. var/max_n_of_items = 1500 var/allow_ai_retrieve = FALSE var/list/initial_contents @@ -242,6 +243,7 @@ idle_power_usage = 5 active_power_usage = 200 visible_contents = FALSE + base_build_path = /obj/machinery/smartfridge/drying_rack //should really be seeing this without admin fuckery. var/drying = FALSE /obj/machinery/smartfridge/drying_rack/Initialize() @@ -356,6 +358,7 @@ /obj/machinery/smartfridge/drinks name = "drink showcase" desc = "A refrigerated storage unit for tasty tasty alcohol." + base_build_path = /obj/machinery/smartfridge/drinks /obj/machinery/smartfridge/drinks/accept_check(obj/item/O) if(!istype(O, /obj/item/reagent_containers) || (O.item_flags & ABSTRACT) || !O.reagents || !O.reagents.reagent_list.len) @@ -368,6 +371,7 @@ // ---------------------------- /obj/machinery/smartfridge/food desc = "A refrigerated storage unit for food." + base_build_path = /obj/machinery/smartfridge/food /obj/machinery/smartfridge/food/accept_check(obj/item/O) if(istype(O, /obj/item/reagent_containers/food/snacks/)) @@ -380,6 +384,7 @@ /obj/machinery/smartfridge/extract name = "smart slime extract storage" desc = "A refrigerated storage unit for slime extracts." + base_build_path = /obj/machinery/smartfridge/extract /obj/machinery/smartfridge/extract/accept_check(obj/item/O) if(istype(O, /obj/item/slime_extract)) @@ -398,6 +403,7 @@ name = "smart organ storage" desc = "A refrigerated storage unit for organ storage." max_n_of_items = 20 //vastly lower to prevent processing too long + base_build_path = /obj/machinery/smartfridge/organ var/repair_rate = 0 /obj/machinery/smartfridge/organ/accept_check(obj/item/O) @@ -437,6 +443,7 @@ /obj/machinery/smartfridge/chemistry name = "smart chemical storage" desc = "A refrigerated storage unit for medicine storage." + base_build_path = /obj/machinery/smartfridge/chemistry /obj/machinery/smartfridge/chemistry/accept_check(obj/item/O) var/static/list/chemfridge_typecache = typecacheof(list( @@ -478,6 +485,7 @@ /obj/machinery/smartfridge/chemistry/virology name = "smart virus storage" desc = "A refrigerated storage unit for volatile sample storage." + base_build_path = /obj/machinery/smartfridge/chemistry/virology /obj/machinery/smartfridge/chemistry/virology/preloaded initial_contents = list( @@ -499,6 +507,7 @@ icon_state = "disktoaster" pass_flags = PASSTABLE visible_contents = FALSE + base_build_path = /obj/machinery/smartfridge/disks /obj/machinery/smartfridge/disks/accept_check(obj/item/O) if(istype(O, /obj/item/disk/)) diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index de005307139..effc060444e 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -323,14 +323,6 @@ results = list(/datum/reagent/consumable/ethanol/thirteenloko = 3) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/coffee = 1, /datum/reagent/consumable/limejuice = 1) -/datum/chemical_reaction/chocolatepudding - results = list(/datum/reagent/consumable/chocolatepudding = 20) - required_reagents = list(/datum/reagent/consumable/milk/chocolate_milk = 10, /datum/reagent/consumable/eggyolk = 5) - -/datum/chemical_reaction/vanillapudding - results = list(/datum/reagent/consumable/vanillapudding = 20) - required_reagents = list(/datum/reagent/consumable/vanilla = 5, /datum/reagent/consumable/milk = 5, /datum/reagent/consumable/eggyolk = 5) - /datum/chemical_reaction/cherryshake results = list(/datum/reagent/consumable/cherryshake = 3) required_reagents = list(/datum/reagent/consumable/cherryjelly = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/cream = 1) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index ceed56e01d9..694af29d5d8 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -19,6 +19,14 @@ new /obj/item/reagent_containers/food/snacks/tofu(location) return +/datum/chemical_reaction/chocolatepudding + results = list(/datum/reagent/consumable/chocolatepudding = 20) + required_reagents = list(/datum/reagent/consumable/milk/chocolate_milk = 10, /datum/reagent/consumable/eggyolk = 5) + +/datum/chemical_reaction/vanillapudding + results = list(/datum/reagent/consumable/vanillapudding = 20) + required_reagents = list(/datum/reagent/consumable/vanilla = 5, /datum/reagent/consumable/milk = 5, /datum/reagent/consumable/eggyolk = 5) + /datum/chemical_reaction/chocolate_bar required_reagents = list(/datum/reagent/consumable/soymilk = 2, /datum/reagent/consumable/coco = 2, /datum/reagent/consumable/sugar = 2) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm index 8dfcb5b9097..94419a58c28 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -23,7 +23,7 @@ ) result = /obj/item/reagent_containers/food/snacks/donut/chaos -datum/crafting_recipe/food/donut/meat +/datum/crafting_recipe/food/donut/meat time = 15 name = "Meat donut" reqs = list( diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index 1a990391dec..135ef6ea1e5 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -298,7 +298,10 @@ em {font-style: normal; font-weight: bold;} .emote { font-style: italic;} .userdanger {color: #c51e1e; font-weight: bold; font-size: 185%;} +.bolddanger {color: #c51e1e;font-weight: bold;} .danger {color: #c51e1e;} +.tinydanger {color: #c51e1e; font-size: 85%;} +.smalldanger {color: #c51e1e; font-size: 90%;} .warning {color: #c51e1e; font-style: italic;} .alertwarning {color: #FF0000; font-weight: bold} .boldwarning {color: #c51e1e; font-style: italic; font-weight: bold} @@ -308,8 +311,9 @@ em {font-style: normal; font-weight: bold;} .rose {color: #ff5050;} .info {color: #9ab0ff;} .notice {color: #6685f5;} -.tinynotice {color: #6685f5; font-style: italic; font-size: 85%;} -.smallnotice {color: #6685f5; font-style: italic; font-size: 90%;} +.tinynotice {color: #6685f5; font-style: italic; font-size: 85%;} +.smallnotice {color: #6685f5; font-size: 90%;} +.smallnoticeital {color: #6685f5; font-style: italic; font-size: 90%;} .boldnotice {color: #6685f5; font-weight: bold;} .hear {color: #6685f5; font-style: italic;} .adminnotice {color: #6685f5;} diff --git a/code/modules/goonchat/browserassets/css/browserOutput_white.css b/code/modules/goonchat/browserassets/css/browserOutput_white.css index 0bddfb761af..1c9d0cdfb29 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput_white.css +++ b/code/modules/goonchat/browserassets/css/browserOutput_white.css @@ -296,7 +296,10 @@ h1.alert, h2.alert {color: #000000;} .emote { font-style: italic;} .userdanger {color: #ff0000; font-weight: bold; font-size: 185%;} +.bolddanger {color: #ff0000; font-weight: bold;} .danger {color: #ff0000;} +.tinydanger {color: #ff0000; font-size: 85%;} +.smalldanger {color: #ff0000; font-size: 90%;} .warning {color: #ff0000; font-style: italic;} .alertwarning {color: #FF0000; font-weight: bold} .boldwarning {color: #ff0000; font-style: italic; font-weight: bold} @@ -307,7 +310,8 @@ h1.alert, h2.alert {color: #000000;} .info {color: #0000CC;} .notice {color: #000099;} .tinynotice {color: #000099; font-style: italic; font-size: 85%;} -.smallnotice {color: #000099; font-style: italic; font-size: 90%;} +.smallnotice {color: #000099; font-size: 90%;} +.smallnoticeital {color: #000099; font-style: italic; font-size: 90%;} .boldnotice {color: #000099; font-weight: bold;} .hear {color: #000099; font-style: italic;} .adminnotice {color: #0000ff;} diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index fce3f1160e9..3a72c46f181 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -61,26 +61,24 @@ unsuitable_atmos_damage = 0 //Easter Baskets -/obj/item/storage/bag/easterbasket +/obj/item/storage/basket/easter name = "Easter Basket" - icon = 'icons/mob/easter.dmi' - icon_state = "basket" -/obj/item/storage/bag/easterbasket/Initialize() +/obj/item/storage/basket/easter/Initialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.set_holdable(list(/obj/item/reagent_containers/food/snacks/egg, /obj/item/reagent_containers/food/snacks/chocolateegg, /obj/item/reagent_containers/food/snacks/boiledegg)) -/obj/item/storage/bag/easterbasket/proc/countEggs() +/obj/item/storage/basket/easter/proc/countEggs() cut_overlays() add_overlay("basket-grass") add_overlay("basket-egg[min(contents.len, 5)]") -/obj/item/storage/bag/easterbasket/Exited() +/obj/item/storage/basket/easter/Exited() . = ..() countEggs() -/obj/item/storage/bag/easterbasket/Entered() +/obj/item/storage/basket/easter/Entered() . = ..() countEggs() diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index fc3a3810053..5f431f4cc7d 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -456,8 +456,16 @@ /datum/holiday/moth name = "Moth Week" -/datum/holiday/moth/shouldCelebrate(dd, mm, yy, ww, ddd) //National Moth Week falls on the last full week of July - return mm == JULY && (ww == 4 || (ww == 5 && ddd == SUNDAY)) +/datum/holiday/moth/shouldCelebrate(dd, mm, yy, ww, ddd) //National Moth Week falls on the last full week of July, including the saturday and sunday before. See http://nationalmothweek.org/ for precise tracking. + if(mm == JULY) + var/week + if(first_day_of_month() >= 5) //Friday or later start of the month means week 5 is a full week. + week = 5 + else + week = 4 + + return (ww == week-1 && (ddd == SATURDAY || ddd == SUNDAY)) || ww == week + /datum/holiday/moth/getStationPrefix() return pick("Mothball","Lepidopteran","Lightbulb","Moth","Giant Atlas","Twin-spotted Sphynx","Madagascan Sunset","Luna","Death's Head","Emperor Gum","Polyphenus","Oleander Hawk","Io","Rosy Maple","Cecropia","Noctuidae","Giant Leopard","Dysphania Militaris","Garden Tiger") @@ -587,7 +595,7 @@ GLOB.maintenance_loot += list( list( /obj/item/reagent_containers/food/snacks/egg/loaded = 15, - /obj/item/storage/bag/easterbasket = 15 + /obj/item/storage/basket/easter = 15 ) = maint_holiday_weight, ) diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index 46a0fd38a6c..19a2615b731 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -1,7 +1,10 @@ //Vars that will not be copied when using /DuplicateObject GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( "tag", "datum_components", "area", "type", "loc", "locs", "vars", "parent", "parent_type", "verbs", "ckey", "key", - "power_supply", "contents", "reagents", "stat", "x", "y", "z", "group", "atmos_adjacent_turfs", "comp_lookup" + "power_supply", "contents", "reagents", "stat", "x", "y", "z", "group", "atmos_adjacent_turfs", "comp_lookup", + "client_mobs_in_contents", "bodyparts", "internal_organs", "hand_bodyparts", "overlays", "overlays_standing", "hud_list", + "actions", "AIStatus", "appearance", "managed_overlays", "managed_vis_overlays", "computer_id", "lastKnownIP", "implants", + "tgui_shared_states" )) /proc/DuplicateObject(atom/original, perfectcopy = TRUE, sameloc, atom/newloc = null, nerf, holoitem) @@ -20,7 +23,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( if(islist(original.vars[V])) var/list/L = original.vars[V] O.vars[V] = L.Copy() - else if(istype(original.vars[V], /datum)) + else if(istype(original.vars[V], /datum) || ismob(original.vars[V])) continue // this would reference the original's object, that will break when it is used or deleted. else O.vars[V] = original.vars[V] @@ -52,6 +55,11 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( contained_atom.flags_1 |= HOLOGRAM_1 if(M.circuit) M.circuit.flags_1 |= HOLOGRAM_1 + + if(ismob(O)) //Overlays are carried over despite disallowing them, if a fix is found remove this. + var/mob/M = O + M.cut_overlays() + M.regenerate_icons() return O diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 5aa0a15ba42..5305642e847 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -105,7 +105,7 @@ icon = 'icons/turf/floors/carpet.dmi' icon_state = "carpet" floor_tile = /obj/item/stack/tile/carpet - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE canSmoothWith = null bullet_bounce_sound = null tiled_dirt = FALSE @@ -117,7 +117,7 @@ /turf/open/floor/holofloor/carpet/update_icon() . = ..() if(intact) - queue_smooth(src) + QUEUE_SMOOTH(src) /turf/open/floor/holofloor/wood icon_state = "wood" diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index b0bb30efb46..b290f07b79b 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -265,4 +265,4 @@ qdel(src) /obj/structure/beebox/unwrenched - anchored = FALSE + anchored = FALSE diff --git a/code/modules/hydroponics/grafts.dm b/code/modules/hydroponics/grafts.dm index 9f7a395d9c3..3af91b5ad3d 100644 --- a/code/modules/hydroponics/grafts.dm +++ b/code/modules/hydroponics/grafts.dm @@ -7,6 +7,7 @@ w_class = WEIGHT_CLASS_TINY icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "graft_plant" + worn_icon_state = "graft" attack_verb = list("planted", "vegitized", "cropped", "reaped", "farmed") ///The stored trait taken from the parent plant. Defaults to perenial growth. var/datum/plant_gene/trait/stored_trait diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index 1837e37cb0e..c0998045425 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -29,6 +29,12 @@ juice_results = list(/datum/reagent/consumable/banana = 0) distill_reagent = /datum/reagent/consumable/ethanol/bananahonk +/obj/item/reagent_containers/food/snacks/grown/banana/generate_trash(atom/location) + . = ..() + var/obj/item/grown/bananapeel/peel = . + if(istype(peel)) + peel.grind_results = list(/datum/reagent/consumable/banana_peel = seed.potency * 0.2) + /obj/item/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user) user.visible_message("[user] is aiming [src] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!") playsound(loc, 'sound/items/bikehorn.ogg', 50, TRUE, -1) diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index d462e7f430c..6383c3eca77 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -77,6 +77,19 @@ qdel(src) new /obj/effect/decal/cleanable/ash(drop_location()) +/obj/item/reagent_containers/food/snacks/grown/holymelon/checkLiked(fraction, mob/M) //chaplains sure love holymelons + if(!ishuman(M)) + return + if(last_check_time + 5 SECONDS >= world.time) + return + var/mob/living/carbon/human/holy_person = M + if(!holy_person.mind?.holy_role || HAS_TRAIT(holy_person, TRAIT_AGEUSIA)) + return + to_chat(holy_person,"Truly, a piece of heaven!") + M.adjust_disgust(-5 + -2.5 * fraction) + SEND_SIGNAL(holy_person, COMSIG_ADD_MOOD_EVENT, "Divine_chew", /datum/mood_event/holy_consumption) + last_check_time = world.time + /// Barrel melon Seeds /obj/item/seeds/watermelon/barrel name = "pack of barrelmelon seeds" diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 73e6f6587f1..137a49b8ded 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/device.dmi' icon_state = "hydro" inhand_icon_state = "analyzer" - worn_icon_state = "analyzer" + worn_icon_state = "plantanalyzer" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' w_class = WEIGHT_CLASS_TINY @@ -42,6 +42,7 @@ name = "weed spray" icon_state = "weedspray" inhand_icon_state = "spraycan" + worn_icon_state = "spraycan" lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' volume = 100 @@ -57,6 +58,7 @@ name = "pest spray" icon_state = "pestspray" inhand_icon_state = "plantbgone" + worn_icon_state = "spraycan" lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' volume = 100 @@ -125,7 +127,7 @@ custom_materials = list(/datum/material/iron = 15000) attack_verb = list("chopped", "tore", "lacerated", "cut") hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = IS_SHARP + sharpness = SHARP_EDGED /obj/item/hatchet/Initialize() . = ..() diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 82d2d027f62..1c576e4f552 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -5,6 +5,7 @@ /obj/item/seeds icon = 'icons/obj/hydroponics/seeds.dmi' icon_state = "seed" // Unknown plant seed - these shouldn't exist in-game. + worn_icon_state = "seed" w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE /// Name of plant when planted. @@ -208,12 +209,17 @@ product_count = clamp(round(product_count/2),0,5) while(t_amount < product_count) var/obj/item/reagent_containers/food/snacks/grown/t_prod - if(instability >= 30 && prob(instability/3) && mutatelist.len) + if(instability >= 30 && prob(instability/3) && mutatelist) var/obj/item/seeds/new_prod = pick(mutatelist) t_prod = initial(new_prod.product) if(t_prod) t_prod = new t_prod(output_loc, src) - t_prod.seed.instability = instability/2 + if(t_prod.seed) + t_prod.seed = initial(t_prod.seed) + t_prod.seed = new t_prod.seed + t_prod.seed.instability = round(instability/2) + t_amount++ + continue else t_prod = new product(output_loc, src) if(parent.myseed.plantname != initial(parent.myseed.plantname)) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 851a132e3f0..3be5c79f232 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -65,6 +65,8 @@ var/display_order = JOB_DISPLAY_ORDER_DEFAULT + var/bounty_types = CIV_JOB_BASIC + //Only override this proc //H is usually a human unless an /equip override transformed it /datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE) @@ -148,7 +150,7 @@ /datum/job/proc/announce_head(mob/living/carbon/human/H, channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels. if(H && GLOB.announcement_systems.len) //timer because these should come after the captain announcement - SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/addtimer, CALLBACK(pick(GLOB.announcement_systems), /obj/machinery/announcement_system/proc/announce, "NEWHEAD", H.real_name, H.job, channels), 1)) + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/_addtimer, CALLBACK(pick(GLOB.announcement_systems), /obj/machinery/announcement_system/proc/announce, "NEWHEAD", H.real_name, H.job, channels), 1)) //If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1 /datum/job/proc/player_old_enough(client/C) diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm index f53166d9b04..a132c8045a1 100644 --- a/code/modules/jobs/job_types/ai.dm +++ b/code/modules/jobs/job_types/ai.dm @@ -1,8 +1,6 @@ /datum/job/ai title = "AI" - flag = AI_JF auto_deadmin_role_flags = DEADMIN_POSITION_SILICON - department_flag = ENGSEC faction = "Station" total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index a314e780aa5..c66c2617ad3 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -3,8 +3,6 @@ Assistant */ /datum/job/assistant title = "Assistant" - flag = ASSISTANT - department_flag = CIVILIAN faction = "Station" total_positions = 5 spawn_positions = 5 diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index dcfa77aa6b7..a11466aadb2 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -1,8 +1,6 @@ /datum/job/atmos title = "Atmospheric Technician" - flag = ATMOSTECH department_head = list("Chief Engineer") - department_flag = ENGSEC faction = "Station" total_positions = 3 spawn_positions = 2 @@ -19,6 +17,7 @@ paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_ENG display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN + bounty_types = CIV_JOB_ENG /datum/outfit/job/atmos name = "Atmospheric Technician" diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index 1a83ede2a97..e74f54ff8d3 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -1,8 +1,6 @@ /datum/job/bartender title = "Bartender" - flag = BARTENDER department_head = list("Head of Personnel") - department_flag = CIVILIAN faction = "Station" total_positions = 1 spawn_positions = 1 @@ -16,6 +14,7 @@ paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_BARTENDER + bounty_types = CIV_JOB_DRINK /datum/outfit/job/bartender name = "Bartender" diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index f2b9e51afcc..d2c4d5b58b5 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -1,8 +1,6 @@ /datum/job/hydro title = "Botanist" - flag = BOTANIST department_head = list("Head of Personnel") - department_flag = CIVILIAN faction = "Station" total_positions = 3 spawn_positions = 2 @@ -16,6 +14,7 @@ paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_BOTANIST + bounty_types = CIV_JOB_GROW /datum/outfit/job/botanist name = "Botanist" diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 24a11c31ce2..dbc0e888eaf 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -1,9 +1,7 @@ /datum/job/captain title = "Captain" - flag = CAPTAIN auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY department_head = list("CentCom") - department_flag = ENGSEC faction = "Station" total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index 01171f8b728..27dba53f473 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -1,8 +1,6 @@ /datum/job/cargo_tech title = "Cargo Technician" - flag = CARGOTECH department_head = list("Head of Personnel") - department_flag = CIVILIAN faction = "Station" total_positions = 3 spawn_positions = 2 diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index caa42d72f97..dfd9dcd3d09 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -1,8 +1,6 @@ /datum/job/chaplain title = "Chaplain" - flag = CHAPLAIN department_head = list("Head of Personnel") - department_flag = CIVILIAN faction = "Station" total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index ee1752aba2d..b051ecd0916 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -1,8 +1,6 @@ /datum/job/chemist title = "Chemist" - flag = CHEMIST department_head = list("Chief Medical Officer") - department_flag = MEDSCI faction = "Station" total_positions = 2 spawn_positions = 2 @@ -19,6 +17,7 @@ paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_CHEMIST + bounty_types = CIV_JOB_CHEM /datum/outfit/job/chemist name = "Chemist" diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index abf734d4585..21dde3fc0a9 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -1,9 +1,7 @@ /datum/job/chief_engineer title = "Chief Engineer" - flag = CHIEF auto_deadmin_role_flags = DEADMIN_POSITION_HEAD department_head = list("Captain") - department_flag = ENGSEC head_announce = list("Engineering") faction = "Station" total_positions = 1 @@ -30,6 +28,7 @@ paycheck_department = ACCOUNT_ENG display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER + bounty_types = CIV_JOB_ENG /datum/outfit/job/ce name = "Chief Engineer" diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 837424887b5..7f90ab2ec50 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -1,8 +1,6 @@ /datum/job/cmo title = "Chief Medical Officer" - flag = CMO_JF department_head = list("Captain") - department_flag = MEDSCI auto_deadmin_role_flags = DEADMIN_POSITION_HEAD head_announce = list(RADIO_CHANNEL_MEDICAL) faction = "Station" @@ -28,6 +26,7 @@ paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER + bounty_types = CIV_JOB_MED /datum/outfit/job/cmo name = "Chief Medical Officer" diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index 193d3e88293..c56f81df6c0 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -1,8 +1,6 @@ /datum/job/clown title = "Clown" - flag = CLOWN department_head = list("Head of Personnel") - department_flag = CIVILIAN faction = "Station" total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index a75a9bc0698..34d8ccfdd39 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -1,8 +1,6 @@ /datum/job/cook title = "Cook" - flag = COOK department_head = list("Head of Personnel") - department_flag = CIVILIAN faction = "Station" total_positions = 2 spawn_positions = 1 @@ -18,6 +16,7 @@ paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_COOK + bounty_types = CIV_JOB_CHEF /datum/outfit/job/cook name = "Cook" diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index 3a4d9f46e85..85a700f3bd2 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -1,8 +1,6 @@ /datum/job/curator title = "Curator" - flag = CURATOR department_head = list("Head of Personnel") - department_flag = CIVILIAN faction = "Station" total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm index 70d96cc0734..11d31268882 100644 --- a/code/modules/jobs/job_types/cyborg.dm +++ b/code/modules/jobs/job_types/cyborg.dm @@ -1,8 +1,6 @@ /datum/job/cyborg title = "Cyborg" - flag = CYBORG auto_deadmin_role_flags = DEADMIN_POSITION_SILICON - department_flag = ENGSEC faction = "Station" total_positions = 0 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index e1e55b225ce..0c14fe34287 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -1,9 +1,7 @@ /datum/job/detective title = "Detective" - flag = DETECTIVE auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY department_head = list("Head of Security") - department_flag = ENGSEC faction = "Station" total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index d3438ec405d..0817285697d 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -1,8 +1,6 @@ /datum/job/geneticist title = "Geneticist" - flag = GENETICIST department_head = list("Research Director") - department_flag = MEDSCI faction = "Station" total_positions = 2 spawn_positions = 2 @@ -19,6 +17,7 @@ paycheck_department = ACCOUNT_SCI display_order = JOB_DISPLAY_ORDER_GENETICIST + bounty_types = CIV_JOB_SCI /datum/outfit/job/geneticist name = "Geneticist" diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 047f8bfe794..ecd73da6d03 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -1,9 +1,7 @@ /datum/job/hop title = "Head of Personnel" - flag = HOP auto_deadmin_role_flags = DEADMIN_POSITION_HEAD department_head = list("Captain") - department_flag = CIVILIAN head_announce = list(RADIO_CHANNEL_SUPPLY, RADIO_CHANNEL_SERVICE) faction = "Station" total_positions = 1 diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 2105e65bd2e..cfcef505d84 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -1,9 +1,7 @@ /datum/job/hos title = "Head of Security" - flag = HOS auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY department_head = list("Captain") - department_flag = ENGSEC head_announce = list(RADIO_CHANNEL_SECURITY) faction = "Station" total_positions = 1 @@ -31,6 +29,7 @@ paycheck_department = ACCOUNT_SEC display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY + bounty_types = CIV_JOB_SEC /datum/outfit/job/hos name = "Head of Security" diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index 8f13617155d..8b0fc510f87 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -1,8 +1,6 @@ /datum/job/janitor title = "Janitor" - flag = JANITOR department_head = list("Head of Personnel") - department_flag = CIVILIAN faction = "Station" total_positions = 2 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index 1def5ee2099..9ad2d12e1dc 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -1,8 +1,6 @@ /datum/job/lawyer title = "Lawyer" - flag = LAWYER department_head = list("Head of Personnel") - department_flag = CIVILIAN faction = "Station" total_positions = 2 spawn_positions = 2 diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index f47e00a2f07..27000068f62 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -1,8 +1,6 @@ /datum/job/doctor title = "Medical Doctor" - flag = DOCTOR department_head = list("Chief Medical Officer") - department_flag = MEDSCI faction = "Station" total_positions = 5 spawn_positions = 3 @@ -17,6 +15,7 @@ paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_MEDICAL_DOCTOR + bounty_types = CIV_JOB_MED /datum/outfit/job/doctor name = "Medical Doctor" diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index bbd59f75f8e..f8a81859c2b 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -1,8 +1,6 @@ /datum/job/mime title = "Mime" - flag = MIME department_head = list("Head of Personnel") - department_flag = CIVILIAN faction = "Station" total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index 57ea23f7ed5..3376ae3bb8b 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -1,8 +1,6 @@ /datum/job/paramedic title = "Paramedic" - flag = PARAMEDIC department_head = list("Chief Medical Officer") - department_flag = MEDSCI faction = "Station" total_positions = 2 spawn_positions = 2 @@ -17,6 +15,7 @@ paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_PARAMEDIC + bounty_types = CIV_JOB_MED /datum/outfit/job/paramedic name = "Paramedic" diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index d0ab7a5c00e..0b79464487f 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -1,14 +1,12 @@ /datum/job/prisoner title = "Prisoner" - flag = PRISONER department_head = list("The Security Team") - department_flag = CIVILIAN faction = "Station" total_positions = 0 spawn_positions = 2 supervisors = "the security team" selection_color = "#ffe1c3" - + paycheck = PAYCHECK_PRISONER outfit = /datum/outfit/job/prisoner display_order = JOB_DISPLAY_ORDER_PRISONER diff --git a/code/modules/jobs/job_types/psychologist.dm b/code/modules/jobs/job_types/psychologist.dm index 73ceaaacdd2..5d3411b3611 100644 --- a/code/modules/jobs/job_types/psychologist.dm +++ b/code/modules/jobs/job_types/psychologist.dm @@ -1,8 +1,6 @@ /datum/job/psychologist title = "Psychologist" - flag = PSYCHOLOGIST department_head = list("Head of Personnel","Chief Medical Officer") - department_flag = CIVILIAN faction = "Station" total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 90158995a98..76ff70d5f83 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -1,8 +1,6 @@ /datum/job/qm title = "Quartermaster" - flag = QUARTERMASTER department_head = list("Head of Personnel") - department_flag = CIVILIAN faction = "Station" total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 12dbb24db97..bf355a30d40 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -1,9 +1,7 @@ /datum/job/rd title = "Research Director" - flag = RD_JF auto_deadmin_role_flags = DEADMIN_POSITION_HEAD department_head = list("Captain") - department_flag = MEDSCI head_announce = list("Science") faction = "Station" total_positions = 1 @@ -34,6 +32,7 @@ paycheck_department = ACCOUNT_SCI display_order = JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR + bounty_types = CIV_JOB_SCI /datum/outfit/job/rd name = "Research Director" diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index 1b1b4425a98..0ff5a1a6c84 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -1,8 +1,6 @@ /datum/job/roboticist title = "Roboticist" - flag = ROBOTICIST department_head = list("Research Director") - department_flag = MEDSCI faction = "Station" total_positions = 2 spawn_positions = 2 @@ -10,6 +8,7 @@ selection_color = "#ffeeff" exp_requirements = 60 exp_type = EXP_TYPE_CREW + bounty_types = CIV_JOB_ROBO outfit = /datum/outfit/job/roboticist diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index a0038e7c097..9be376552ee 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -1,8 +1,6 @@ /datum/job/scientist title = "Scientist" - flag = SCIENTIST department_head = list("Research Director") - department_flag = MEDSCI faction = "Station" total_positions = 5 spawn_positions = 3 @@ -20,6 +18,7 @@ paycheck_department = ACCOUNT_SCI display_order = JOB_DISPLAY_ORDER_SCIENTIST + bounty_types = CIV_JOB_SCI /datum/outfit/job/scientist name = "Scientist" diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index dd005b89f69..4ae1cb15efa 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -1,9 +1,7 @@ /datum/job/officer title = "Security Officer" - flag = OFFICER auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY department_head = list("Head of Security") - department_flag = ENGSEC faction = "Station" total_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() @@ -22,6 +20,7 @@ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_SECURITY_OFFICER + bounty_types = CIV_JOB_SEC /datum/job/officer/get_access() var/list/L = list() diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index e00e6c821d7..50e3d8abdb6 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -1,8 +1,6 @@ /datum/job/mining title = "Shaft Miner" - flag = MINER department_head = list("Head of Personnel") - department_flag = CIVILIAN faction = "Station" total_positions = 3 spawn_positions = 3 @@ -13,10 +11,11 @@ access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM) - paycheck = PAYCHECK_HARD + paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_CAR display_order = JOB_DISPLAY_ORDER_SHAFT_MINER + bounty_types = CIV_JOB_MINE /datum/outfit/job/miner name = "Shaft Miner" diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index aad31434142..9eec843b1d5 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -1,8 +1,6 @@ /datum/job/engineer title = "Station Engineer" - flag = ENGINEER department_head = list("Chief Engineer") - department_flag = ENGSEC faction = "Station" total_positions = 5 spawn_positions = 5 @@ -21,6 +19,7 @@ paycheck_department = ACCOUNT_ENG display_order = JOB_DISPLAY_ORDER_STATION_ENGINEER + bounty_types = CIV_JOB_ENG /datum/outfit/job/engineer name = "Station Engineer" diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index 85eaab2e46c..28bf1319ba9 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -1,8 +1,6 @@ /datum/job/virologist title = "Virologist" - flag = VIROLOGIST department_head = list("Chief Medical Officer") - department_flag = MEDSCI faction = "Station" total_positions = 1 spawn_positions = 1 @@ -19,6 +17,7 @@ paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_VIROLOGIST + bounty_types = CIV_JOB_VIRO /datum/outfit/job/virologist name = "Virologist" diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 679f24752fe..9eb1bc03936 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -1,9 +1,7 @@ /datum/job/warden title = "Warden" - flag = WARDEN auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY department_head = list("Head of Security") - department_flag = ENGSEC faction = "Station" total_positions = 1 spawn_positions = 1 @@ -22,6 +20,7 @@ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_WARDEN + bounty_types = CIV_JOB_SEC /datum/job/warden/get_access() var/list/L = list() diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index c44cead1cfe..520d6d91b91 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -88,7 +88,7 @@ // can hold different keys and releasing any should be handled by the key binding specifically for (var/kb_name in prefs.key_bindings[_key]) var/datum/keybinding/kb = GLOB.keybindings_by_name[kb_name] - if(kb.up(src)) + if(kb.can_use(src) && kb.up(src)) break holder?.key_up(_key, src) mob.focus?.key_up(_key, src) diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm index be017a07ef6..13047c54521 100644 --- a/code/modules/library/lib_codex_gigas.dm +++ b/code/modules/library/lib_codex_gigas.dm @@ -71,7 +71,7 @@ return FALSE if(action == "search") SStgui.close_uis(src) - addtimer(CALLBACK(src, .proc/perform_research, usr, currentName), 0) + INVOKE_ASYNC(src, .proc/perform_research, usr, currentName) currentName = "" currentSection = PRE_TITLE return FALSE diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 13d9aa4a19b..c1415b1e254 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -1,3 +1,7 @@ +#define BOOKCASE_UNANCHORED 0 +#define BOOKCASE_ANCHORED 1 +#define BOOKCASE_FINISHED 2 + /* Library Items * * Contains: @@ -21,8 +25,7 @@ resistance_flags = FLAMMABLE max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) - var/state = 0 - var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/book) //Things allowed in the bookcase + var/state = BOOKCASE_UNANCHORED /// When enabled, books_to_load number of random books will be generated for this bookcase when first interacted with. var/load_random_books = FALSE /// The category of books to pick from when populating random books. @@ -37,55 +40,66 @@ else . += "It's secured in place with bolts." switch(state) - if(0) + if(BOOKCASE_UNANCHORED) . += "There's a small crack visible on the back panel." - if(1) + if(BOOKCASE_ANCHORED) . += "There's space inside for a wooden shelf." - if(2) + if(BOOKCASE_FINISHED) . += "There's a small crack visible on the shelf." /obj/structure/bookcase/Initialize(mapload) . = ..() if(!mapload) return - state = 2 - icon_state = "book-0" - anchored = TRUE + set_anchored(TRUE) + state = BOOKCASE_FINISHED for(var/obj/item/I in loc) - if(istype(I, /obj/item/book)) - I.forceMove(src) + if(!isbook(I)) + continue + I.forceMove(src) + update_icon() + +/obj/structure/bookcase/set_anchored(anchorvalue) + . = ..() + if(isnull(.)) + return + state = anchorvalue + if(!anchorvalue) //in case we were vareditted or uprooted by a hostile mob, ensure we drop all our books instead of having them disappear till we're rebuild. + var/atom/Tsec = drop_location() + for(var/obj/I in contents) + if(!isbook(I)) + continue + I.forceMove(Tsec) update_icon() /obj/structure/bookcase/attackby(obj/item/I, mob/user, params) switch(state) - if(0) + if(BOOKCASE_UNANCHORED) if(I.tool_behaviour == TOOL_WRENCH) if(I.use_tool(src, user, 20, volume=50)) to_chat(user, "You wrench the frame into place.") - anchored = TRUE - state = 1 - if(I.tool_behaviour == TOOL_CROWBAR) + set_anchored(TRUE) + else if(I.tool_behaviour == TOOL_CROWBAR) if(I.use_tool(src, user, 20, volume=50)) to_chat(user, "You pry the frame apart.") deconstruct(TRUE) - if(1) + if(BOOKCASE_ANCHORED) if(istype(I, /obj/item/stack/sheet/mineral/wood)) var/obj/item/stack/sheet/mineral/wood/W = I if(W.get_amount() >= 2) W.use(2) to_chat(user, "You add a shelf.") - state = 2 - icon_state = "book-0" - if(I.tool_behaviour == TOOL_WRENCH) + state = BOOKCASE_FINISHED + update_icon() + else if(I.tool_behaviour == TOOL_WRENCH) I.play_tool_sound(src, 100) to_chat(user, "You unwrench the frame.") - anchored = FALSE - state = 0 + set_anchored(FALSE) - if(2) + if(BOOKCASE_FINISHED) var/datum/component/storage/STR = I.GetComponent(/datum/component/storage) - if(is_type_in_list(I, allowed_books)) + if(isbook(I)) if(!user.transferItemToLoc(I, src)) return update_icon() @@ -113,8 +127,8 @@ I.play_tool_sound(src, 100) to_chat(user, "You pry the shelf out.") new /obj/item/stack/sheet/mineral/wood(drop_location(), 2) - state = 1 - icon_state = "bookempty" + state = BOOKCASE_ANCHORED + update_icon() else return ..() @@ -142,17 +156,24 @@ /obj/structure/bookcase/deconstruct(disassembled = TRUE) - new /obj/item/stack/sheet/mineral/wood(loc, 4) - for(var/obj/item/book/B in contents) - B.forceMove(get_turf(src)) - qdel(src) + var/atom/Tsec = drop_location() + new /obj/item/stack/sheet/mineral/wood(Tsec, 4) + for(var/obj/item/I in contents) + if(!isbook(I)) + continue + I.forceMove(Tsec) + return ..() /obj/structure/bookcase/update_icon_state() + if(state == BOOKCASE_UNANCHORED) + icon_state = "bookempty" + return + var/amount = contents.len if(load_random_books) amount += books_to_load - icon_state = "book-[amount < 5 ? amount : 5]" + icon_state = "book-[clamp(amount, 0, 5)]" /obj/structure/bookcase/manuals/engineering @@ -184,6 +205,7 @@ name = "book" icon = 'icons/obj/library.dmi' icon_state ="book" + worn_icon_state = "book" desc = "Crack it open, inhale the musk of its pages, and learn something new." throw_speed = 1 throw_range = 5 @@ -351,3 +373,8 @@ else to_chat(user, "No associated computer found. Only local scans will function properly.") to_chat(user, "\n") + + +#undef BOOKCASE_UNANCHORED +#undef BOOKCASE_ANCHORED +#undef BOOKCASE_FINISHED diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 0b164f5f66d..81f6d99e750 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -392,7 +392,7 @@ if(checkoutperiod < 1) checkoutperiod = 1 if(href_list["editbook"]) - buffer_book = stripped_input(usr, "Enter the book's title:") + buffer_book = stripped_input(usr, "Enter the book's title:", max_length = 45) if(href_list["editmob"]) buffer_mob = stripped_input(usr, "Enter the recipient's name:", max_length = MAX_NAME_LEN) if(href_list["checkout"]) @@ -411,7 +411,7 @@ if(b && istype(b)) inventory.Remove(b) if(href_list["setauthor"]) - var/newauthor = stripped_input(usr, "Enter the author's name: ") + var/newauthor = stripped_input(usr, "Enter the author's name: ", max_length = 45) if(newauthor) scanner.cache.author = newauthor if(href_list["setcategory"]) diff --git a/code/modules/library/skill_learning/skill_station.dm b/code/modules/library/skill_learning/skill_station.dm new file mode 100644 index 00000000000..0efc7b69486 --- /dev/null +++ b/code/modules/library/skill_learning/skill_station.dm @@ -0,0 +1,208 @@ +#define SKILLCHIP_IMPLANT_TIME 1 MINUTES +#define SKILLCHIP_REMOVAL_TIME 30 SECONDS + +/obj/machinery/skill_station + name = "Skillsoft Station" + desc = "learn skills with only minimal chance for brain damage." + + icon = 'icons/obj/machines/implantchair.dmi' + icon_state = "implantchair" + occupant_typecache = list(/mob/living/carbon) //todo make occupant_typecache per type + state_open = TRUE + interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND //Don't call ui_interac by default - we only want that when inside + circuit = /obj/item/circuitboard/machine/skill_station + /// Currently implanting/removing + var/working = FALSE + /// Timer until implanting/removing finishes. + var/work_timer + /// What we're implanting + var/obj/item/skillchip/inserted_skillchip + +/obj/machinery/skill_station/Initialize() + . = ..() + update_icon() + +//Only usable by the person inside +/obj/machinery/skill_station/ui_state(mob/user) + return GLOB.contained_state + +/obj/machinery/skill_station/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "SkillStation", name) + ui.set_autoupdate(FALSE) + ui.open() + +/obj/machinery/skill_station/update_icon_state() + icon_state = initial(icon_state) + if(state_open) + icon_state += "_open" + if(occupant) + icon_state += "_occupied" + +/obj/machinery/skill_station/update_overlays() + . = ..() + if(working) + . += "working" + +/obj/machinery/skill_station/relaymove(mob/user) + open_machine() + +/obj/machinery/skill_station/open_machine() + . = ..() + interrupt_operation() + +/obj/machinery/skill_station/Exited(atom/movable/AM, atom/newloc) + . = ..() + if(AM == inserted_skillchip) + inserted_skillchip = null + interrupt_operation() + +/obj/machinery/skill_station/power_change() + . = ..() + if(working) + interrupt_operation() + +/obj/machinery/skill_station/close_machine(atom/movable/target) + . = ..() + if(occupant) + ui_interact(occupant) + +/obj/machinery/skill_station/proc/interrupt_operation() + working = FALSE + if(work_timer) + deltimer(work_timer) + work_timer = null + update_icon() + +/obj/machinery/skill_station/interact(mob/user) + . = ..() + if(user == occupant) + ui_interact(user) + else + toggle_open() + +/obj/machinery/skill_station/attackby(obj/item/I, mob/living/user, params) + if(istype(I,/obj/item/skillchip)) + if(inserted_skillchip) + to_chat(user,"There's already a skillchip inside.") + return + if(!user.transferItemToLoc(I, src)) + return + inserted_skillchip = I + SStgui.update_uis(src) + return + return ..() + +/obj/machinery/skill_station/dropContents(list/subset) + subset = contents - inserted_skillchip + return ..() //This is kinda annoying + +/obj/machinery/skill_station/proc/toggle_open(mob/user) + state_open ? close_machine() : open_machine() + +// Functions below do not validate occupant exists - should be handled outer wrappers. +/// Start implanting. +/obj/machinery/skill_station/proc/start_implanting() + if(!inserted_skillchip?.can_be_implanted(occupant)) + return + working = TRUE + work_timer = addtimer(CALLBACK(src,.proc/implant),SKILLCHIP_IMPLANT_TIME,TIMER_STOPPABLE) + update_icon() + +/// Finish implanting. +/obj/machinery/skill_station/proc/implant() + working = FALSE + work_timer = null + if(inserted_skillchip?.can_be_implanted(occupant)) + implant_skillchip(occupant,inserted_skillchip) + update_icon() + SStgui.update_uis(src) + to_chat(occupant,"Operation complete!") + +/// Start removal. +/obj/machinery/skill_station/proc/start_removal(obj/item/skillchip/to_be_removed) + if(!to_be_removed) + return + working = TRUE + work_timer = addtimer(CALLBACK(src,.proc/remove_skillchip,to_be_removed),SKILLCHIP_REMOVAL_TIME,TIMER_STOPPABLE) + update_icon() + +/// Finish removal. +/obj/machinery/skill_station/proc/remove_skillchip(obj/item/skillchip/to_be_removed) + working = FALSE + work_timer = null + var/mob/living/carbon/carbon_occupant = occupant + var/obj/item/organ/brain/occupant_brain = carbon_occupant.getorganslot(ORGAN_SLOT_BRAIN) + if(QDELETED(carbon_occupant) || QDELETED(occupant_brain) || !(to_be_removed in occupant_brain.skillchips)) + return + to_be_removed.on_removal(carbon_occupant, silent=FALSE) + LAZYREMOVE(occupant_brain.skillchips, to_be_removed) + if(to_be_removed.removable) + carbon_occupant.put_in_hands(to_be_removed) + else + qdel(to_be_removed) + update_icon() + SStgui.update_uis(src) + to_chat(carbon_occupant,"Operation complete!") + +/obj/machinery/skill_station/proc/implant_skillchip(mob/living/carbon/target,obj/item/skillchip/chip) + var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) + chip.on_apply(target, silent = FALSE) + chip.forceMove(target_brain) + LAZYADD(target_brain.skillchips, chip) + +/obj/machinery/skill_station/ui_data(mob/user) + . = ..() + .["working"] = working + .["timeleft"] = work_timer ? timeleft(work_timer) : null + var/mob/living/carbon/carbon_occupant = occupant + var/obj/item/organ/brain/occupant_brain = carbon_occupant.getorganslot(ORGAN_SLOT_BRAIN) + if(QDELETED(carbon_occupant) || QDELETED(occupant_brain)) + .["error"] = "Brain not detected. Please consult nearest medical practitioner." + else + var/list/current_skills = list() + for(var/obj/item/skillchip/skill_chip in occupant_brain) + current_skills += list(list("name"=skill_chip.skill_name,"icon"=skill_chip.skill_icon,"cost"=skill_chip.slot_cost,"ref"=REF(skill_chip),"active"=(skill_chip in occupant_brain.skillchips))) + .["current"] = current_skills + .["slots_used"] = carbon_occupant.used_skillchip_slots + .["slots_max"] = carbon_occupant.max_skillchip_slots + + .["skillchip_ready"] = inserted_skillchip ? TRUE : FALSE + if(inserted_skillchip) + .["implantable"] = inserted_skillchip.can_be_implanted(occupant) + .["implantable_reason"] = inserted_skillchip.can_be_implanted_message(occupant) + .["skill_name"] = inserted_skillchip.skill_name + .["skill_desc"] = inserted_skillchip.skill_description + .["skill_icon"] = inserted_skillchip.skill_icon + .["skill_cost"] = inserted_skillchip.slot_cost + +/obj/machinery/skill_station/ui_act(action, list/params) + . = ..() + if(.) + return + if(usr != occupant) + return + switch(action) + if("implant") + if(occupant && inserted_skillchip) + start_implanting() + return TRUE + if("remove") + var/chipref = params["ref"] + var/mob/living/carbon/carbon_occupant = occupant + var/obj/item/organ/brain/occupant_brain = carbon_occupant.getorganslot(ORGAN_SLOT_BRAIN) + if(QDELETED(carbon_occupant) || QDELETED(occupant_brain)) + return TRUE + var/obj/item/skillchip/to_be_removed = locate(chipref) in occupant_brain + if(!to_be_removed) + return TRUE + start_removal(to_be_removed) + return TRUE + if("eject") + if(inserted_skillchip) + to_chat(occupant,"You eject the skillchip.") + var/mob/living/carbon/human/H = occupant + H.put_in_hands(inserted_skillchip) + inserted_skillchip = null + return TRUE diff --git a/code/modules/library/skill_learning/skillchip.dm b/code/modules/library/skill_learning/skillchip.dm new file mode 100644 index 00000000000..1f350c674ca --- /dev/null +++ b/code/modules/library/skill_learning/skillchip.dm @@ -0,0 +1,98 @@ +/obj/item/skillchip + name = "skillchip" + desc = "This biochip integrates with user's brain to enable mastery of specific skill. Consult certified Nanotrasen neurosurgeon before use." + + icon = 'icons/obj/card.dmi' + icon_state = "data_3" + custom_price = 500 + w_class = WEIGHT_CLASS_SMALL + + /// Trait automatically granted by this chip, optional + var/auto_trait + /// Skill name shown on UI + var/skill_name + /// Skill description shown on UI + var/skill_description + /// FS icon show on UI + var/skill_icon = "brain" + /// Message shown when implanting the chip + var/implanting_message + /// Message shown when extracting the chip + var/removal_message + //If set to TRUE, trying to extract the chip will destroy it instead + var/removable = TRUE + /// How many skillslots this one takes + var/slot_cost = 1 + +/// Called after implantation and/or brain entering new body +/obj/item/skillchip/proc/on_apply(mob/living/carbon/user,silent=TRUE) + if(!silent && implanting_message) + to_chat(user,implanting_message) + if(auto_trait) + ADD_TRAIT(user,auto_trait,SKILLCHIP_TRAIT) + user.used_skillchip_slots += slot_cost + +/// Called after removal and/or brain exiting the body +/obj/item/skillchip/proc/on_removal(mob/living/carbon/user,silent=TRUE) + if(!silent && removal_message) + to_chat(user,removal_message) + if(auto_trait) + REMOVE_TRAIT(user,auto_trait,SKILLCHIP_TRAIT) + user.used_skillchip_slots -= slot_cost + +/// Checks if this implant is valid to implant in a given mob. +/obj/item/skillchip/proc/can_be_implanted(mob/living/carbon/target) + //No brain + var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) + if(QDELETED(target_brain)) + return FALSE + //No skill slots left + if(target.used_skillchip_slots + slot_cost > target.max_skillchip_slots) + return FALSE + //Only one copy of each for now. + if(locate(type) in target_brain.skillchips) + return FALSE + return TRUE + +/// Returns readable reason why implanting cannot succeed --todo switch to flag retval in can_be_implanted to cut down copypaste +/obj/item/skillchip/proc/can_be_implanted_message(mob/living/carbon/target) + //No brain + var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) + if(QDELETED(target_brain)) + return "No brain detected." + //No skill slots left + if(target.used_skillchip_slots + slot_cost > target.max_skillchip_slots) + return "Complexity limit exceeded." + //Only one copy of each for now. + if(locate(type) in target_brain.skillchips) + return "Duplicate chip detected." + return "Chip ready for implantation." + +/obj/item/skillchip/basketweaving + name = "Basketsoft 3000 skillchip" + desc = "Underwater edition." + auto_trait = TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE + skill_name = "Underwater Basketweaving" + skill_description = "Master intricate art of using twine to create perfect baskets while submerged." + skill_icon = "shopping-basket" + implanting_message = "You're one with the twine and the sea." + removal_message = "Higher mysteries of underwater basketweaving leave your mind." + +/obj/item/skillchip/wine_taster + name = "WINE skillchip" + desc = "Wine.Is.Not.Equal version 5." + auto_trait = TRAIT_WINE_TASTER + skill_name = "Wine Tasting" + skill_description = "Recognize wine vintage from taste alone. Never again lack an opinion when presented with an unknown drink." + skill_icon = "wine-bottle" + implanting_message = "You recall wine taste." + removal_message = "Your memories of wine evaporate." + +/obj/item/skillchip/bonsai + name = "Hedge 3 skillchip" + auto_trait = TRAIT_BONSAI + skill_name = "Hedgetrimming" + skill_description = "Trim hedges and potted plants into marvelous new shapes with any old knife. Not applicable to plastic plants." + skill_icon = "spa" + implanting_message = "Your mind is filled with plant arrangments." + removal_message = "Your can't remember how a hedge looks like anymore." diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 05719b4d248..8e6617ab490 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -48,15 +48,6 @@ else light = new/datum/light_source(src, .) -// If we have opacity, make sure to tell (potentially) affected light sources. -/atom/movable/Destroy() - var/turf/T = loc - . = ..() - if (opacity && istype(T)) - var/old_has_opaque_atom = T.has_opaque_atom - T.recalc_atom_opacity() - if (old_has_opaque_atom != T.has_opaque_atom) - T.reconsider_lights() // Should always be used to change the opacity of an atom. // It notifies (potentially) affected light sources so they can update (if needed). diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm index e219f08e159..46688b5e97a 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -144,7 +144,7 @@ /atom/movable/lighting_object/onTransitZ() return -/atom/movable/lighting_object/washed(var/washer) +/atom/movable/lighting_object/wash(clean_types) return // Override here to prevent things accidentally moving around overlays. diff --git a/code/modules/mafia/_defines.dm b/code/modules/mafia/_defines.dm index b862ce63c5c..e38757f578c 100644 --- a/code/modules/mafia/_defines.dm +++ b/code/modules/mafia/_defines.dm @@ -1,7 +1,30 @@ +///how many people can play mafia without issues (running out of spawns, procs not expecting more than this amount of people, etc) +#define MAFIA_MAX_PLAYER_COUNT 12 + #define MAFIA_TEAM_TOWN "town" #define MAFIA_TEAM_MAFIA "mafia" #define MAFIA_TEAM_SOLO "solo" +//types of town roles for random setup gen +/// assistants it's just assistants filling up the rest of the roles +#define TOWN_OVERFLOW "overflow" +/// roles that learn info about others in the game (chaplain, detective, psych) +#define TOWN_INVEST "invest" +/// roles that keep other roles safe (doctor, and weirdly enough lawyer counts) +#define TOWN_PROTECT "protect" +/// roles that don't fit into anything else (hop) +#define TOWN_MISC "misc" + +//other types (mafia team, neutrals) +/// normal vote kill changelings +#define MAFIA_REGULAR "regular" +/// every other changeling role that has extra abilities +#define MAFIA_SPECIAL "special" +/// role that wins solo that nobody likes +#define NEUTRAL_KILL "kill" +/// role that upsets the game aka obsessed, usually worse for town than mafia but they can vote against mafia +#define NEUTRAL_DISRUPT "disrupt" + #define MAFIA_PHASE_SETUP 1 #define MAFIA_PHASE_DAY 2 #define MAFIA_PHASE_VOTING 3 @@ -20,130 +43,21 @@ //in order of events + game end -#define COMSIG_MAFIA_SUNDOWN "sundown" //the rest of these phases are at the end of the night when shutters raise, in a different order of resolution +/// when the shutters fall, before the 45 second wait and night event resolution +#define COMSIG_MAFIA_SUNDOWN "sundown" +/// after the 45 second wait, for actions that must go first #define COMSIG_MAFIA_NIGHT_START "night_start" +/// most night actions now resolve #define COMSIG_MAFIA_NIGHT_ACTION_PHASE "night_actions" +/// now killing happens from the roles that do that. the reason this is post action phase is to ensure doctors can protect and lawyers can block #define COMSIG_MAFIA_NIGHT_KILL_PHASE "night_kill" +/// now undoing states like protection, actions that must happen last, etc. right before shutters raise and the day begins #define COMSIG_MAFIA_NIGHT_END "night_end" +/// signal sent to roles when the game is confirmed ending #define COMSIG_MAFIA_GAME_END "game_end" -//list of ghosts who want to play mafia, every time someone enters the list it checks to see if enough are in +/// list of ghosts who want to play mafia, every time someone enters the list it checks to see if enough are in GLOBAL_LIST_EMPTY(mafia_signup) -//the current global mafia game running. +/// the current global mafia game running. GLOBAL_VAR(mafia_game) - -GLOBAL_LIST_INIT(mafia_setups,generate_mafia_setups()) - -/proc/generate_mafia_setups() - . = list() - for(var/T in subtypesof(/datum/mafia_setup)) - var/datum/mafia_setup/N = new T - . += list(N.roles) - -/datum/mafia_setup - var/name = "Make subtypes with the list and a name, more readable than list(list(),list()) etc" - var/list/roles - -// 12 Player - -/datum/mafia_setup/twelve_basic - name = "12 Player Setup Basic" - roles = list( - /datum/mafia_role=6, - /datum/mafia_role/md=1, - /datum/mafia_role/detective=1, - /datum/mafia_role/clown=1, - /datum/mafia_role/mafia=3 - ) - -/datum/mafia_setup/twelve_md - name = "12 Player Setup MD" - roles = list( - /datum/mafia_role=6, - /datum/mafia_role/md=3, - /datum/mafia_role/mafia=3 - ) - -/datum/mafia_setup/twelve_all - name = "12 Player Setup All" - roles = list( - /datum/mafia_role=1, - /datum/mafia_role/psychologist=1, - /datum/mafia_role/md=1, - /datum/mafia_role/detective=1, - /datum/mafia_role/clown=1, - /datum/mafia_role/chaplain=1, - /datum/mafia_role/lawyer=1, - /datum/mafia_role/traitor=1, - /datum/mafia_role/mafia=3, - /datum/mafia_role/fugitive=1, - /datum/mafia_role/obsessed=1 - ) - -/datum/mafia_setup/twelve_joke - name = "12 Player Setup Funny" - roles = list( - /datum/mafia_role=5, - /datum/mafia_role/detective=2, - /datum/mafia_role/clown=2, - /datum/mafia_role/mafia=3 - ) - -/datum/mafia_setup/twelve_lockdown - name = "12 Player Setup Lockdown" - roles = list( - /datum/mafia_role=5, - /datum/mafia_role/md=1, - /datum/mafia_role/detective=1, - /datum/mafia_role/lawyer=2, - /datum/mafia_role/mafia=3 - ) - -/datum/mafia_setup/twelve_rip - name = "12 Player Setup RIP" - roles = list( - /datum/mafia_role=6, - /datum/mafia_role/md=1, - /datum/mafia_role/detective=1, - /datum/mafia_role/mafia=3, - /datum/mafia_role/traitor=1 - ) - -/datum/mafia_setup/twelve_double_treason - name = "12 Player Setup Double Treason" - roles = list( - /datum/mafia_role=8, - /datum/mafia_role/detective=1, - /datum/mafia_role/traitor=1, - /datum/mafia_role/obsessed=2 - ) - -/datum/mafia_setup/twelve_fugitives - name = "12 Player Fugitives" - roles = list( - /datum/mafia_role=6, - /datum/mafia_role/psychologist=1, - /datum/mafia_role/mafia=3, - /datum/mafia_role/fugitive=2 - ) - -/datum/mafia_setup/twelve_traitor_mafia - name = "12 Player Traitor Mafia" - roles = list( - /datum/mafia_role=3, - /datum/mafia_role/psychologist=2, - /datum/mafia_role/md=2, - /datum/mafia_role/detective=2, - /datum/mafia_role/traitor=3 - ) - -/* -/datum/mafia_setup/three_test - name = "3 Player Test" - roles = list( - /datum/mafia_role/chaplain=1, - /datum/mafia_role/psychologist=1, - /datum/mafia_role/mafia=1 - ) -*/ diff --git a/code/modules/mafia/controller.dm b/code/modules/mafia/controller.dm index 1e6ad963d35..793716848f5 100644 --- a/code/modules/mafia/controller.dm +++ b/code/modules/mafia/controller.dm @@ -13,7 +13,8 @@ var/phase = MAFIA_PHASE_SETUP ///how long the game has gone on for, changes with every sunrise. day one, night one, day two, etc. var/turn = 0 - + ///for debugging and testing a full game, or adminbuse. If this is not null, it will use this as a setup. clears when game is over + var/list/custom_setup = list() ///first day has no voting, and thus is shorter var/first_day_phase_period = 20 SECONDS ///talk with others about the last night @@ -211,6 +212,7 @@ * * If the accused is killed, their true role is revealed to the rest of the players. */ /datum/mafia_controller/proc/lynch() + for(var/i in judgement_innocent_votes) var/datum/mafia_role/role = i send_message("[role.body.real_name] voted innocent.") @@ -264,12 +266,12 @@ if(R.game_status == MAFIA_ALIVE) switch(R.team) if(MAFIA_TEAM_MAFIA) - alive_mafia++ + alive_mafia += R.vote_power if(MAFIA_TEAM_TOWN) - alive_town++ + alive_town += R.vote_power if(MAFIA_TEAM_SOLO) if(R.solo_counts_as_town) - alive_town++ + alive_town += R.vote_power solos_to_ask += R ///PHASE TWO: SEND STATS TO SOLO ANTAGS, SEE IF THEY WON OR TEAMS CANNOT WIN @@ -324,8 +326,13 @@ map_deleter.generate() //remove the map, it will be loaded at the start of the next one QDEL_LIST(all_roles) + current_setup_text = null + custom_setup = list() turn = 0 votes = list() + //map gen does not deal with landmarks + QDEL_LIST(landmarks) + QDEL_NULL(town_center_landmark) phase = MAFIA_PHASE_SETUP /** @@ -400,17 +407,17 @@ * Arguments: * * voter: the mafia role that is trying to vote for... * * target: the mafia role that is getting voted for - * * vt: type of vote submitted (is this the day vote? is this the mafia night vote?) + * * vote_type: type of vote submitted (is this the day vote? is this the mafia night vote?) * * teams: see mafia team defines for what to put in, makes the messages only send to a specific team (so mafia night votes only sending messages to mafia at night) */ -/datum/mafia_controller/proc/vote_for(datum/mafia_role/voter,datum/mafia_role/target,vt, teams) - if(!votes[vt]) - votes[vt] = list() - var/old_vote = votes[vt][voter] +/datum/mafia_controller/proc/vote_for(datum/mafia_role/voter,datum/mafia_role/target,vote_type, teams) + if(!votes[vote_type]) + votes[vote_type] = list() + var/old_vote = votes[vote_type][voter] if(old_vote && old_vote == target) - votes[vt] -= voter + votes[vote_type] -= voter else - votes[vt][voter] = target + votes[vote_type][voter] = target if(old_vote && old_vote == target) send_message("[voter.body.real_name] retracts their vote for [target.body.real_name]!", team = teams) else @@ -424,12 +431,12 @@ /** * Clears out the votes of a certain type (day votes, mafia kill votes) while leaving others untouched */ -/datum/mafia_controller/proc/reset_votes(vt) +/datum/mafia_controller/proc/reset_votes(vote_type) var/list/bodies_to_update = list() - for(var/vote in votes[vt]) - var/datum/mafia_role/R = votes[vt][vote] + for(var/vote in votes[vote_type]) + var/datum/mafia_role/R = votes[vote_type][vote] bodies_to_update += R.body - votes[vt] = list() + votes[vote_type] = list() for(var/mob/M in bodies_to_update) M.update_icon() @@ -437,38 +444,39 @@ * Returns how many people voted for the role, in whatever vote (day vote, night kill vote) * Arguments: * * role: the mafia role the proc tries to get the amount of votes for - * * vt: the vote type (getting how many day votes were for the role, or mafia night votes for the role) + * * vote_type: the vote type (getting how many day votes were for the role, or mafia night votes for the role) */ -/datum/mafia_controller/proc/get_vote_count(role,vt) +/datum/mafia_controller/proc/get_vote_count(role,vote_type) . = 0 - for(var/votee in votes[vt]) - if(votes[vt][votee] == role) - . += 1 + for(var/v in votes[vote_type]) + var/datum/mafia_role/votee = v + if(votes[vote_type][votee] == role) + . += votee.vote_power /** * Returns whichever role got the most votes, in whatever vote (day vote, night kill vote) * returns null if no votes * Arguments: - * * vt: the vote type (getting the role that got the most day votes, or the role that got the most mafia votes) + * * vote_type: the vote type (getting the role that got the most day votes, or the role that got the most mafia votes) */ -/datum/mafia_controller/proc/get_vote_winner(vt) +/datum/mafia_controller/proc/get_vote_winner(vote_type) var/list/tally = list() - for(var/votee in votes[vt]) - if(!tally[votes[vt][votee]]) - tally[votes[vt][votee]] = 1 + for(var/votee in votes[vote_type]) + if(!tally[votes[vote_type][votee]]) + tally[votes[vote_type][votee]] = 1 else - tally[votes[vt][votee]] += 1 + tally[votes[vote_type][votee]] += 1 sortTim(tally,/proc/cmp_numeric_dsc,associative=TRUE) return length(tally) ? tally[1] : null /** * Returns a random person who voted for whatever vote (day vote, night kill vote) * Arguments: - * * vt: vote type (getting a random day voter, or mafia night voter) + * * vote_type: vote type (getting a random day voter, or mafia night voter) */ -/datum/mafia_controller/proc/get_random_voter(vt) - if(length(votes[vt])) - return pick(votes[vt]) +/datum/mafia_controller/proc/get_random_voter(vote_type) + if(length(votes[vote_type])) + return pick(votes[vote_type]) /** * Adds mutable appearances to people who get publicly voted on (so not night votes) showing how many people are picking them @@ -573,9 +581,6 @@ basic_setup() if("nuke") end_game() - for(var/i in landmarks) - qdel(i) - qdel(town_center_landmark) qdel(src) if("next_phase") var/datum/timedevent/timer = SStimer.timer_id_dict[next_phase_timer] @@ -592,10 +597,32 @@ continue player.body.forceMove(get_turf(player.assigned_landmark)) if(failed.len) - to_chat(usr, "List of players who no longer had a body (if you see this, the game is runtiming anyway so just hit \"New Game\" to end it") + to_chat(usr, "List of players who no longer had a body (if you see this, the game is runtiming anyway so just hit \"New Game\" to end it)") for(var/i in failed) var/datum/mafia_role/fail = i to_chat(usr, fail.player_key) + if("debug_setup") + var/list/debug_setup = list() + var/list/rolelist_dict = list() + var/done = FALSE + for(var/p in typesof(/datum/mafia_role)) + var/datum/mafia_role/path = p + rolelist_dict[initial(path.name) + " ([uppertext(initial(path.team))])"] = path + rolelist_dict = list("CANCEL", "FINISH") + rolelist_dict + while(!done) + to_chat(usr, "You have a total player count of [assoc_value_sum(debug_setup)] in this setup.") + var/chosen_role_name = input(usr,"Select a role!","Custom Setup Creation",rolelist_dict[1]) as null|anything in rolelist_dict + if(chosen_role_name == "CANCEL") + return + if(chosen_role_name == "FINISH") + break + var/found_path = rolelist_dict[chosen_role_name] + var/role_count = input(usr,"How many? Zero to cancel.","Custom Setup Creation",0) as null|num + if(role_count > 0) + debug_setup[found_path] = role_count + custom_setup = debug_setup + if("cancel_setup") + custom_setup = list() switch(action) if("mf_lookup") var/role_lookup = params["atype"] @@ -623,7 +650,7 @@ if("Vote") if(phase != MAFIA_PHASE_VOTING) return - vote_for(user_role,target,vt="Day") + vote_for(user_role,target,vote_type="Day") if("Kill Vote") if(phase != MAFIA_PHASE_NIGHT || user_role.team != MAFIA_TEAM_MAFIA) return @@ -667,31 +694,87 @@ . += L[key] /** - * Returns all setups that the amount of players signed up could support (so fill each role) - * Arguments: - * * ready_count: the amount of players signed up (not sane, so some players may have disconnected or rejoined ss13). + * Returns a semirandom setup, with... + * Town, Two invest roles, one protect role, sometimes a misc role, and the rest assistants for town. + * Mafia, 2 normal mafia and one special. + * Neutral, two disruption roles, sometimes one is a killing. + * + * See _defines.dm in the mafia folder for a rundown on what these groups of roles include. */ -/datum/mafia_controller/proc/find_best_setup(ready_count) - var/list/all_setups = GLOB.mafia_setups - var/valid_setups = list() - for(var/S in all_setups) - var/req_players = assoc_value_sum(S) - if(req_players <= ready_count) - valid_setups += list(S) - return length(valid_setups) > 0 ? pick(valid_setups) : null +/datum/mafia_controller/proc/generate_random_setup() + var/invests_left = 2 + var/protects_left = 1 + var/miscs_left = prob(35) + var/mafiareg_left = 2 + var/mafiaspe_left = 1 + var/killing_role = prob(50) + var/disruptors = killing_role ? 1 : 2 //still required to calculate overflow + var/overflow_left = MAFIA_MAX_PLAYER_COUNT - (invests_left + protects_left + miscs_left + mafiareg_left + mafiaspe_left + killing_role + disruptors) + + var/list/random_setup = list() + for(var/i in 1 to MAFIA_MAX_PLAYER_COUNT) //should match the number of roles to add + if(overflow_left) + add_setup_role(random_setup, TOWN_OVERFLOW) + overflow_left-- + else if(invests_left) + add_setup_role(random_setup, TOWN_INVEST) + invests_left-- + else if(protects_left) + add_setup_role(random_setup, TOWN_PROTECT) + protects_left-- + else if(miscs_left) + add_setup_role(random_setup, TOWN_MISC) + miscs_left-- + else if(mafiareg_left) + add_setup_role(random_setup, MAFIA_REGULAR) + mafiareg_left-- + else if(mafiaspe_left) + add_setup_role(random_setup, MAFIA_SPECIAL) + mafiaspe_left-- + else if(killing_role) + add_setup_role(random_setup, NEUTRAL_KILL) + killing_role-- + else + add_setup_role(random_setup, NEUTRAL_DISRUPT) + return random_setup + +/** + * Helper proc that adds a random role of a type to a setup. if it doesn't exist in the setup, it adds the path to the list and otherwise bumps the path in the list up one + */ +/datum/mafia_controller/proc/add_setup_role(setup_list, wanted_role_type) + var/list/role_type_paths = list() + for(var/path in typesof(/datum/mafia_role)) + var/datum/mafia_role/instance = path + if(initial(instance.role_type) == wanted_role_type) + role_type_paths += instance + + var/mafia_path = pick(role_type_paths) + var/datum/mafia_role/mafia_path_type = mafia_path + var/found_role + for(var/searched_path in setup_list) + var/datum/mafia_role/searched_path_type = searched_path + if(initial(mafia_path_type.name) == initial(searched_path_type.name)) + found_role = searched_path + break + if(found_role) + setup_list[found_role] += 1 + return + setup_list[mafia_path] = 1 /** * Called when enough players have signed up to fill a setup. DOESN'T NECESSARILY MEAN THE GAME WILL START. * + * Checks for a custom setup, if so gets the required players from that and if not it sets the player requirement to MAFIA_MAX_PLAYER_COUNT and generates one IF basic setup starts a game. * Checks if everyone signed up is an observer, and is still connected. If people aren't, they're removed from the list. * If there aren't enough players post sanity, it aborts. otherwise, it selects enough people for the game and starts preparing the game for real. */ /datum/mafia_controller/proc/basic_setup() - var/ready_count = length(GLOB.mafia_signup) - var/list/setup = find_best_setup(ready_count) - if(!setup) - return - var/req_players = assoc_value_sum(setup) //12 + var/req_players + var/list/setup = custom_setup + if(!setup.len) + req_players = MAFIA_MAX_PLAYER_COUNT + else + req_players = assoc_value_sum(setup) //final list for all the players who will be in this game var/list/filtered_keys = list() @@ -719,8 +802,10 @@ for(var/unpicked in possible_keys) var/client/unpicked_client = GLOB.directory[unpicked] to_chat(unpicked_client, "Sorry, the starting mafia game has too many players and you were not picked.") - to_chat(unpicked_client, "You're still signed up, and have another chance to join when the one starting now finishes.") + to_chat(unpicked_client, "You're still signed up, getting messages from the current round, and have another chance to join when the one starting now finishes.") + if(!setup.len) //don't actually have one yet, so generate a max player random setup. it's good to do this here instead of above so it doesn't generate one every time a game could possibly start. + setup = generate_random_setup() prepare_game(setup,filtered_keys) start_game() @@ -732,10 +817,7 @@ /datum/mafia_controller/proc/try_autostart() if(phase != MAFIA_PHASE_SETUP) return - var/min_players = INFINITY // fairly sure mmo mafia is not a thing and i'm lazy - for(var/setup in GLOB.mafia_setups) - min_players = min(min_players,assoc_value_sum(setup)) - if(GLOB.mafia_signup.len >= min_players)//enough people to try and make something + if(GLOB.mafia_signup.len >= MAFIA_MAX_PLAYER_COUNT || custom_setup.len)//enough people to try and make something (or debug mode) basic_setup() /datum/action/innate/mafia_panel diff --git a/code/modules/mafia/map_pieces.dm b/code/modules/mafia/map_pieces.dm index f0472c7e9f0..028587ffdba 100644 --- a/code/modules/mafia/map_pieces.dm +++ b/code/modules/mafia/map_pieces.dm @@ -14,11 +14,14 @@ name = "Mafia Game Board" icon = 'icons/obj/mafia.dmi' icon_state = "board" + anchored = TRUE var/game_id = "mafia" + var/datum/mafia_controller/MF /obj/mafia_game_board/attack_ghost(mob/user) . = ..() - var/datum/mafia_controller/MF = GLOB.mafia_game + if(!MF) + MF = GLOB.mafia_game if(!MF) MF = create_mafia_game() MF.ui_interact(user) diff --git a/code/modules/mafia/outfits.dm b/code/modules/mafia/outfits.dm index 65c6b9e9803..3a566196460 100644 --- a/code/modules/mafia/outfits.dm +++ b/code/modules/mafia/outfits.dm @@ -42,13 +42,6 @@ uniform = /obj/item/clothing/under/rank/civilian/chaplain -/datum/outfit/mafia/clown - name = "Mafia Clown" - - uniform = /obj/item/clothing/under/rank/civilian/clown - shoes = /obj/item/clothing/shoes/clown_shoes - mask = /obj/item/clothing/mask/gas/clown_hat - /datum/outfit/mafia/lawyer name = "Mafia Lawyer" @@ -56,8 +49,14 @@ suit = /obj/item/clothing/suit/toggle/lawyer shoes = /obj/item/clothing/shoes/laceup +/datum/outfit/mafia/hop + name = "Mafia Head of Personnel" - + uniform = /obj/item/clothing/under/rank/civilian/head_of_personnel + suit = /obj/item/clothing/suit/armor/vest/alt + shoes = /obj/item/clothing/shoes/sneakers/brown + head = /obj/item/clothing/head/hopcap + glasses = /obj/item/clothing/glasses/sunglasses //mafia @@ -88,9 +87,22 @@ carried_item.add_mob_blood(H)//Oh yes, there will be blood... H.regenerate_icons() +/datum/outfit/mafia/clown + name = "Mafia Clown" + + uniform = /obj/item/clothing/under/rank/civilian/clown + shoes = /obj/item/clothing/shoes/clown_shoes + mask = /obj/item/clothing/mask/gas/clown_hat + /datum/outfit/mafia/traitor name = "Mafia Traitor" mask = /obj/item/clothing/mask/gas/syndicate uniform = /obj/item/clothing/under/syndicate/tacticool shoes = /obj/item/clothing/shoes/jackboots + +/datum/outfit/mafia/nightmare + name = "Mafia Nightmare" + + uniform = null + shoes = null diff --git a/code/modules/mafia/roles.dm b/code/modules/mafia/roles.dm index 394d121005d..e1f0c0143a7 100644 --- a/code/modules/mafia/roles.dm +++ b/code/modules/mafia/roles.dm @@ -3,11 +3,16 @@ var/desc = "You are a crewmember without any special abilities." var/win_condition = "kill all mafia and solo killing roles." var/team = MAFIA_TEAM_TOWN + ///how the random setup chooses which roles get put in + var/role_type = TOWN_OVERFLOW var/player_key var/mob/living/carbon/human/body var/obj/effect/landmark/mafia/assigned_landmark + ///how many votes submitted when you vote. + var/vote_power = 1 + var/detect_immune = FALSE var/revealed = FALSE var/datum/outfit/revealed_outfit = /datum/outfit/mafia/assistant //the assistants need a special path to call out they were in fact assistant, everything else can just use job equipment //action = uses @@ -53,7 +58,6 @@ to_chat(body,"You are not aligned to town or mafia. Accomplish your own objectives!") to_chat(body, "Be sure to read the wiki page to learn more, if you have no idea what's going on.") -//please take care with this, they can break shit with their equipment unless you specifically disallow them (aka stun at the end of the game) /datum/mafia_role/proc/reveal_role(datum/mafia_controller/game, verbose = FALSE) if(revealed) return @@ -62,9 +66,13 @@ var/list/oldoutfit = body.get_equipped_items() for(var/thing in oldoutfit) qdel(thing) + special_reveal_equip(game) body.equipOutfit(revealed_outfit) revealed = TRUE +/datum/mafia_role/proc/special_reveal_equip(datum/mafia_controller/game) + return + /datum/mafia_role/proc/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target) return @@ -107,6 +115,7 @@ name = "Detective" desc = "You can investigate a single person each night to learn their team." revealed_outfit = /datum/outfit/mafia/detective + role_type = TOWN_INVEST targeted_actions = list("Investigate") @@ -130,28 +139,97 @@ current_investigation = target /datum/mafia_role/detective/proc/investigate(datum/mafia_controller/game) - var/datum/mafia_role/R = current_investigation - if(R) - var/team_text - var/fluff - switch(R.team) - if(MAFIA_TEAM_TOWN) - team_text = "Town" - fluff = "a true member of the station." - if(MAFIA_TEAM_MAFIA) - team_text = "Mafia" - fluff = "an unfeeling, hideous changeling!" - if(MAFIA_TEAM_SOLO) - team_text = "Solo" - fluff = "a rogue, with their own objectives..." - to_chat(body,"Your investigations reveal that [R.body.real_name] is [fluff]") - add_note("N[game.turn] - [R.body.real_name] - [team_text]") + var/datum/mafia_role/target = current_investigation + if(target) + if(target.detect_immune) + to_chat(body,"Your investigations reveal that [target.body.real_name] is a true member of the station.") + add_note("N[game.turn] - [target.body.real_name] - Town") + else + var/team_text + var/fluff + switch(target.team) + if(MAFIA_TEAM_TOWN) + team_text = "Town" + fluff = "a true member of the station." + if(MAFIA_TEAM_MAFIA) + team_text = "Mafia" + fluff = "an unfeeling, hideous changeling!" + if(MAFIA_TEAM_SOLO) + team_text = "Solo" + fluff = "a rogue, with their own objectives..." + to_chat(body,"Your investigations reveal that [target.body.real_name] is [fluff]") + add_note("N[game.turn] - [target.body.real_name] - [team_text]") current_investigation = null +/datum/mafia_role/psychologist + name = "Psychologist" + desc = "You can visit someone ONCE PER GAME to reveal their true role in the morning!" + revealed_outfit = /datum/outfit/mafia/psychologist + role_type = TOWN_INVEST + + targeted_actions = list("Reveal") + var/datum/mafia_role/current_target + var/can_use = TRUE + +/datum/mafia_role/psychologist/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(game,COMSIG_MAFIA_NIGHT_END,.proc/therapy_reveal) + +/datum/mafia_role/psychologist/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target) + . = ..() + if(!. || !can_use || game.phase == MAFIA_PHASE_NIGHT || target.game_status != MAFIA_ALIVE || target.revealed || target == src) + return FALSE + +/datum/mafia_role/psychologist/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) + . = ..() + to_chat(body,"You will reveal [target.body.real_name] tonight.") + current_target = target + +/datum/mafia_role/psychologist/proc/therapy_reveal(datum/mafia_controller/game) + if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,game,"reveal",current_target) & MAFIA_PREVENT_ACTION || game_status != MAFIA_ALIVE) //Got lynched or roleblocked by a lawyer. + current_target = null + if(current_target) + add_note("N[game.turn] - [current_target.body.real_name] - Revealed true identity") + to_chat(body,"You have revealed the true nature of the [current_target]!") + current_target.reveal_role(game, verbose = TRUE) + current_target = null + can_use = FALSE + +/datum/mafia_role/chaplain + name = "Chaplain" + desc = "You can communicate with spirits of the dead each night to discover dead crewmember roles." + revealed_outfit = /datum/outfit/mafia/chaplain + role_type = TOWN_INVEST + + targeted_actions = list("Pray") + var/current_target + +/datum/mafia_role/chaplain/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(game,COMSIG_MAFIA_NIGHT_ACTION_PHASE,.proc/commune) + +/datum/mafia_role/chaplain/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target) + . = ..() + if(!.) + return + return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_DEAD && target != src && !target.revealed + +/datum/mafia_role/chaplain/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) + to_chat(body,"You will commune with the spirit of [target.body.real_name] tonight.") + current_target = target + +/datum/mafia_role/chaplain/proc/commune(datum/mafia_controller/game) + var/datum/mafia_role/target = current_target + if(target) + to_chat(body,"You invoke spirit of [target.body.real_name] and learn their role was [target.name].") + add_note("N[game.turn] - [target.body.real_name] - [target.name]") + current_target = null + /datum/mafia_role/md name = "Medical Doctor" desc = "You can protect a single person each night from killing." revealed_outfit = /datum/outfit/mafia/md // /mafia <- outfit must be readded (just make a new mafia outfits file for all of these) + role_type = TOWN_PROTECT targeted_actions = list("Protect") @@ -166,6 +244,8 @@ . = ..() if(!.) return + if(target.name == "Head of Personnel" && target.revealed) + return FALSE return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_ALIVE && target != src /datum/mafia_role/md/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target) @@ -190,40 +270,12 @@ UnregisterSignal(current_protected,COMSIG_MAFIA_ON_KILL) current_protected = null -/datum/mafia_role/chaplain - name = "Chaplain" - desc = "You can communicate with spirits of the dead each night to discover dead crewmember roles." - revealed_outfit = /datum/outfit/mafia/chaplain - - targeted_actions = list("Pray") - var/current_target - -/datum/mafia_role/chaplain/New(datum/mafia_controller/game) - . = ..() - RegisterSignal(game,COMSIG_MAFIA_NIGHT_ACTION_PHASE,.proc/commune) - -/datum/mafia_role/chaplain/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target) - . = ..() - if(!.) - return - return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_DEAD && target != src && !target.revealed - -/datum/mafia_role/chaplain/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) - to_chat(body,"You will commune with the spirit of [target.body.real_name] tonight.") - current_target = target - -/datum/mafia_role/chaplain/proc/commune(datum/mafia_controller/game) - var/datum/mafia_role/R = current_target - if(R) - to_chat(body,"You invoke spirit of [R.body.real_name] and learn their role was [R.name].") - add_note("N[game.turn] - [R.body.real_name] - [R.name]") - current_target = null - /datum/mafia_role/lawyer name = "Lawyer" desc = "You can choose a person during the day to provide extensive legal advice to during the night, preventing night actions." - revealed_outfit = /datum/outfit/mafia/lawyer + role_type = TOWN_PROTECT + targeted_actions = list("Advise") var/datum/mafia_role/current_target @@ -273,38 +325,23 @@ if(game_status == MAFIA_ALIVE) //in case we got killed while imprisoning sk - bad luck edge return MAFIA_PREVENT_ACTION -/datum/mafia_role/psychologist - name = "Psychologist" - desc = "You can visit someone ONCE PER GAME to reveal their true role in the morning!" - revealed_outfit = /datum/outfit/mafia/psychologist +/datum/mafia_role/hop + name = "Head of Personnel" + desc = "You can reveal yourself once per game, tripling your vote power but becoming unable to be protected!" + revealed_outfit = /datum/outfit/mafia/hop + role_type = TOWN_MISC targeted_actions = list("Reveal") - var/datum/mafia_role/current_target - var/can_use = TRUE -/datum/mafia_role/psychologist/New(datum/mafia_controller/game) +/datum/mafia_role/hop/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target) . = ..() - RegisterSignal(game,COMSIG_MAFIA_NIGHT_END,.proc/therapy_reveal) - -/datum/mafia_role/psychologist/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target) - . = ..() - if(!. || !can_use || game.phase == MAFIA_PHASE_NIGHT || target.game_status != MAFIA_ALIVE || target.revealed || target == src) + if(!. || game.phase == MAFIA_PHASE_NIGHT || game.turn == 1 || target.game_status != MAFIA_ALIVE || target != src || revealed) return FALSE -/datum/mafia_role/psychologist/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) +/datum/mafia_role/hop/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) . = ..() - to_chat(body,"You will reveal [target.body.real_name] tonight.") - current_target = target - -/datum/mafia_role/psychologist/proc/therapy_reveal(datum/mafia_controller/game) - if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,game,"reveal",current_target) & MAFIA_PREVENT_ACTION || game_status != MAFIA_ALIVE) //Got lynched or roleblocked by a lawyer. - current_target = null - if(current_target) - add_note("N[game.turn] - [current_target.body.real_name] - Revealed true identity") - to_chat(body,"You have revealed the true nature of the [current_target]!") - current_target.reveal_role(game, verbose = TRUE) - current_target = null - can_use = FALSE + reveal_role(game, TRUE) + vote_power = 2 ///MAFIA ROLES/// only one until i rework this to allow more, they're the "anti-town" working to kill off townies to win @@ -312,6 +349,7 @@ name = "Changeling" desc = "You're a member of the changeling hive. Use ':j' talk prefix to talk to your fellow lings." team = MAFIA_TEAM_MAFIA + role_type = MAFIA_REGULAR revealed_outfit = /datum/outfit/mafia/changeling special_theme = "syndicate" win_condition = "become majority over the town and no solo killing role can stop them." @@ -323,6 +361,45 @@ /datum/mafia_role/mafia/proc/mafia_text(datum/mafia_controller/source) to_chat(body,"Vote for who to kill tonight. The killer will be chosen randomly from voters.") +//better detective for mafia +/datum/mafia_role/mafia/thoughtfeeder + name = "Thoughtfeeder" + desc = "You're a changeling variant that feeds on the memories of others. Use ':j' talk prefix to talk to your fellow lings, and visit people at night to learn their role." + role_type = MAFIA_SPECIAL + targeted_actions = list("Learn Role") + + var/datum/mafia_role/current_investigation + +/datum/mafia_role/mafia/thoughtfeeder/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(game,COMSIG_MAFIA_NIGHT_ACTION_PHASE,.proc/investigate) + +/datum/mafia_role/mafia/thoughtfeeder/validate_action_target(datum/mafia_controller/game,action,datum/mafia_role/target) + . = ..() + if(!.) + return + return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_ALIVE && target != src + +/datum/mafia_role/mafia/thoughtfeeder/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target) + to_chat(body,"You will feast on the memories of [target.body.real_name] tonight.") + current_investigation = target + +/datum/mafia_role/mafia/thoughtfeeder/proc/investigate(datum/mafia_controller/game) + var/datum/mafia_role/target = current_investigation + current_investigation = null + if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,game,"thoughtfeed",target) & MAFIA_PREVENT_ACTION) + to_chat(body,"You were unable to investigate [target.body.real_name].") + add_note("N[game.turn] - [target.body.real_name] - Unable to investigate") + return + if(target) + if(target.detect_immune) + to_chat(body,"[target.body.real_name]'s memories reveal that they are the Assistant.") + add_note("N[game.turn] - [target.body.real_name] - Assistant") + else + to_chat(body,"[target.body.real_name]'s memories reveal that they are the [target.name].") + add_note("N[game.turn] - [target.body.real_name] - [target.name]") + + ///SOLO ROLES/// they range from anomalous factors to deranged killers that try to win alone. /datum/mafia_role/traitor @@ -330,6 +407,7 @@ desc = "You're a solo traitor. You are immune to night kills, can kill every night and you win by outnumbering everyone else." win_condition = "kill everyone." team = MAFIA_TEAM_SOLO + role_type = NEUTRAL_KILL targeted_actions = list("Night Kill") revealed_outfit = /datum/outfit/mafia/traitor special_theme = "syndicate" @@ -365,10 +443,80 @@ to_chat(body,"You will attempt to kill [target.body.real_name] tonight.") /datum/mafia_role/traitor/proc/try_to_kill(datum/mafia_controller/source) - if(game_status == MAFIA_ALIVE && current_victim && current_victim.game_status == MAFIA_ALIVE) - if(!current_victim.kill(source)) - to_chat(body,"Your attempt at killing [current_victim.body] was prevented!") + var/datum/mafia_role/target = current_victim current_victim = null + if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,source,"traitor kill",target) & MAFIA_PREVENT_ACTION) + return + if(game_status == MAFIA_ALIVE && target && target.game_status == MAFIA_ALIVE) + if(!target.kill(source)) + to_chat(body,"Your attempt at killing [target.body] was prevented!") + +/datum/mafia_role/nightmare + name = "Nightmare" + desc = "You're a solo monster that cannot be detected by detective roles. You can flicker lights of another room each night. You can instead decide to hunt, killing everyone in a flickering room. Kill everyone to win." + win_condition = "kill everyone." + revealed_outfit = /datum/outfit/mafia/nightmare + detect_immune = TRUE + team = MAFIA_TEAM_SOLO + role_type = NEUTRAL_KILL + targeted_actions = list("Flicker", "Hunt") + var/list/flickering = list() + var/datum/mafia_role/flicker_target + +/datum/mafia_role/nightmare/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(game,COMSIG_MAFIA_NIGHT_KILL_PHASE,.proc/flicker_or_hunt) + +/datum/mafia_role/nightmare/check_total_victory(alive_town, alive_mafia) //nightmares just want teams dead + return alive_town + alive_mafia <= 1 + +/datum/mafia_role/nightmare/block_team_victory(alive_town, alive_mafia) //no team can win until they're dead + return TRUE //while alive, town AND mafia cannot win (though since mafia know who is who it's pretty easy to win from that point) + +/datum/mafia_role/nightmare/special_reveal_equip() + body.underwear = "Nude" + body.undershirt = "Nude" + body.socks = "Nude" + body.set_species(/datum/species/shadow) + body.update_body() + +/datum/mafia_role/nightmare/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target) + . = ..() + if(!. || game.phase != MAFIA_PHASE_NIGHT || target.game_status != MAFIA_ALIVE) + return FALSE + if(action == "Flicker") + return target != src && !(target in flickering) + return target == src + +/datum/mafia_role/nightmare/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) + . = ..() + if(target == flicker_target) + to_chat(body,"You will do nothing tonight.") + flicker_target = null + flicker_target = target + if(action == "Flicker") + to_chat(body,"You will attempt to flicker [target.body.real_name]'s room tonight.") + else + to_chat(body,"You will hunt everyone in a flickering room down tonight.") + +/datum/mafia_role/nightmare/proc/flicker_or_hunt(datum/mafia_controller/source) + if(game_status != MAFIA_ALIVE || !flicker_target) + return + if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,source,"nightmare actions",flicker_target) & MAFIA_PREVENT_ACTION) + to_chat(flicker_target.body, "Your actions were prevented!") + return + var/datum/mafia_role/target = flicker_target + flicker_target = null + if(target != src) //flicker instead of hunt + to_chat(target.body, "The lights begin to flicker and dim. You're in danger.") + flickering += target + return + for(var/r in flickering) + var/datum/mafia_role/role = r + if(role && role.game_status == MAFIA_ALIVE) + to_chat(role.body, "A shadowy monster appears out of the darkness!") + role.kill(source) + flickering -= role //just helps read better #define FUGITIVE_NOT_PRESERVING 0//will not become night immune tonight @@ -379,6 +527,7 @@ desc = "You're on the run. You can become immune to night kills exactly twice, and you win by surviving to the end of the game with anyone." win_condition = "survive to the end of the game, with anyone" team = MAFIA_TEAM_SOLO + role_type = NEUTRAL_DISRUPT actions = list("Self Preservation") var/charges = 2 var/protection_status = FUGITIVE_NOT_PRESERVING @@ -433,6 +582,7 @@ desc = "You're completely lost in your own mind. You win by lynching your obsession before you get killed in this mess. Obsession assigned on the first night!" win_condition = "lynch their obsession." team = MAFIA_TEAM_SOLO + role_type = NEUTRAL_DISRUPT revealed_outfit = /datum/outfit/mafia/obsessed // /mafia <- outfit must be readded (just make a new mafia outfits file for all of these) solo_counts_as_town = TRUE //after winning or whatever, can side with whoever. they've already done their objective! @@ -474,6 +624,7 @@ win_condition = "get themselves lynched!" revealed_outfit = /datum/outfit/mafia/clown team = MAFIA_TEAM_SOLO + role_type = NEUTRAL_DISRUPT /datum/mafia_role/clown/New(datum/mafia_controller/game) . = ..() diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 7b17fa03820..17af647cc64 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -218,7 +218,7 @@ new /obj/item/banhammer(src) for(var/i in 1 to 3) var/obj/effect/mine/sound/bwoink/mine = new (src) - mine.anchored = FALSE + mine.set_anchored(FALSE) mine.move_resist = MOVE_RESIST_DEFAULT if(97) for(var/i in 1 to 4) diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm index 12d7ae32b29..b013bc42e62 100644 --- a/code/modules/mining/aux_base_camera.dm +++ b/code/modules/mining/aux_base_camera.dm @@ -202,27 +202,27 @@ name = "Select Airlock Type" button_icon_state = "airlock_select" -datum/action/innate/aux_base/airlock_type/Activate() +/datum/action/innate/aux_base/airlock_type/Activate() if(..()) return B.RCD.change_airlock_setting() -datum/action/innate/aux_base/window_type +/datum/action/innate/aux_base/window_type name = "Select Window Type" button_icon_state = "window_select" -datum/action/innate/aux_base/window_type/Activate() +/datum/action/innate/aux_base/window_type/Activate() if(..()) return B.RCD.toggle_window_type() -datum/action/innate/aux_base/place_fan +/datum/action/innate/aux_base/place_fan name = "Place Tiny Fan" button_icon_state = "build_fan" -datum/action/innate/aux_base/place_fan/Activate() +/datum/action/innate/aux_base/place_fan/Activate() if(..()) return @@ -244,11 +244,11 @@ datum/action/innate/aux_base/place_fan/Activate() to_chat(owner, "Tiny fan placed. [B.fans_remaining] remaining.") playsound(fan_turf, 'sound/machines/click.ogg', 50, TRUE) -datum/action/innate/aux_base/install_turret +/datum/action/innate/aux_base/install_turret name = "Install Plasma Anti-Wildlife Turret" button_icon_state = "build_turret" -datum/action/innate/aux_base/install_turret/Activate() +/datum/action/innate/aux_base/install_turret/Activate() if(..()) return diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 2553edeb394..d74088f09b0 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -17,7 +17,7 @@ custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075) hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped") - sharpness = IS_SHARP + sharpness = SHARP_EDGED actions_types = list(/datum/action/item_action/toggle_light) obj_flags = UNIQUE_RENAME var/list/trophies = list() diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index a2c004a09dc..2ceb85d7362 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -120,6 +120,7 @@ desc = "A large tool for digging and moving dirt." icon = 'icons/obj/mining.dmi' icon_state = "shovel" + worn_icon_state = "shovel" lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' flags_1 = CONDUCT_1 @@ -133,7 +134,7 @@ w_class = WEIGHT_CLASS_NORMAL custom_materials = list(/datum/material/iron=50) attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked") - sharpness = IS_SHARP + sharpness = SHARP_EDGED /obj/item/shovel/Initialize() . = ..() @@ -151,6 +152,7 @@ desc = "A small tool for digging and moving dirt." icon_state = "spade" inhand_icon_state = "spade" + worn_icon_state = "spade" lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' force = 5 @@ -162,6 +164,7 @@ desc = "A wicked tool that cleaves through dirt just as easily as it does flesh. The design was styled after ancient lavaland tribal designs." icon_state = "shovel_bone" inhand_icon_state = "shovel_bone" + worn_icon_state = "shovel_serr" lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' force = 15 @@ -169,4 +172,4 @@ w_class = WEIGHT_CLASS_NORMAL toolspeed = 0.7 attack_verb = list("slashed", "impaled", "stabbed", "sliced") - sharpness = IS_SHARP + sharpness = SHARP_EDGED diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index b1610cad833..15b24cc0f07 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -87,7 +87,7 @@ name = "pod window" icon = 'icons/obj/smooth_structures/pod_window.dmi' icon_state = "smooth" - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_MORE canSmoothWith = list(/turf/closed/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod) /obj/structure/window/shuttle/survival_pod/spawner/north @@ -133,7 +133,7 @@ /obj/structure/table/survival_pod icon = 'icons/obj/lavaland/survival_pod.dmi' icon_state = "table" - smooth = SMOOTH_FALSE + smoothing_flags = NONE //Sleeper /obj/machinery/sleeper/survival_pod @@ -197,22 +197,20 @@ desc = "A heated storage unit." icon_state = "donkvendor" icon = 'icons/obj/lavaland/donkvendor.dmi' + base_build_path = /obj/machinery/smartfridge/survival_pod light_range = 5 light_power = 1.2 light_color = "#DDFFD3" max_n_of_items = 10 pixel_y = -4 flags_1 = NODECONSTRUCT_1 - var/empty = FALSE /obj/machinery/smartfridge/survival_pod/ComponentInitialize() . = ..() AddElement(/datum/element/update_icon_blocker) -/obj/machinery/smartfridge/survival_pod/Initialize(mapload) +/obj/machinery/smartfridge/survival_pod/preloaded/Initialize(mapload) . = ..() - if(empty) - return for(var/i in 1 to 5) var/obj/item/reagent_containers/food/snacks/donkpocket/warm/W = new(src) load(W) @@ -226,11 +224,6 @@ /obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O) return isitem(O) -/obj/machinery/smartfridge/survival_pod/empty - name = "dusty survival pod storage" - desc = "A heated storage unit. This one's seen better days." - empty = TRUE - //Fans /obj/structure/fans icon = 'icons/obj/lavaland/survival_pod.dmi' diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index ed3dd4fa207..1f970b121a0 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -81,7 +81,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) M.Paralyze(320) // Keep them from moving during the duration of the extraction M.buckled = 0 // Unbuckle them to prevent anchoring problems else - A.anchored = TRUE + A.set_anchored(TRUE) A.density = FALSE var/obj/effect/extraction_holder/holder_obj = new(A.loc) holder_obj.appearance = A.appearance @@ -132,7 +132,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) holder_obj.add_overlay(balloon3) sleep(4) holder_obj.cut_overlay(balloon3) - A.anchored = FALSE // An item has to be unanchored to be extracted in the first place. + A.set_anchored(FALSE) // An item has to be unanchored to be extracted in the first place. A.density = initial(A.density) animate(holder_obj, pixel_z = 0, time = 5) sleep(5) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 809796c8e3c..e1d2c332730 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -711,7 +711,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' hitsound_on = 'sound/weapons/bladeslice.ogg' w_class = WEIGHT_CLASS_BULKY - sharpness = IS_SHARP + sharpness = SHARP_EDGED faction_bonus_force = 30 nemesis_factions = list("mining", "boss") var/transform_cooldown @@ -817,7 +817,7 @@ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' flags_1 = CONDUCT_1 - sharpness = IS_SHARP + sharpness = SHARP_EDGED w_class = WEIGHT_CLASS_BULKY force = 1 throwforce = 1 diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm deleted file mode 100644 index 82b2dbca6fb..00000000000 --- a/code/modules/mining/mint.dm +++ /dev/null @@ -1,145 +0,0 @@ -/**********************Mint**************************/ - - -/obj/machinery/mineral/mint - name = "coin press" - icon = 'icons/obj/economy.dmi' - icon_state = "coinpress0" - density = TRUE - input_dir = EAST - needs_item_input = TRUE - var/obj/item/storage/bag/money/bag_to_use - var/produced_coins = 0 // how many coins the machine has made in it's last cycle - var/processing = FALSE - var/chosen = /datum/material/iron //which material will be used to make coins - - -/obj/machinery/mineral/mint/Initialize() - . = ..() - AddComponent(/datum/component/material_container, list( - /datum/material/iron, - /datum/material/plasma, - /datum/material/silver, - /datum/material/gold, - /datum/material/uranium, - /datum/material/titanium, - /datum/material/diamond, - /datum/material/bananium, - /datum/material/adamantine, - /datum/material/mythril, - /datum/material/plastic, - /datum/material/runite - ), MINERAL_MATERIAL_AMOUNT * 75, FALSE, /obj/item/stack) - chosen = SSmaterials.GetMaterialRef(chosen) - - -/obj/machinery/mineral/mint/pickup_item(datum/source, atom/movable/target, atom/oldLoc) - if(QDELETED(target)) - return - if(!istype(target, /obj/item/stack)) - return - - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - var/obj/item/stack/S = target - - if(materials.insert_item(S)) - qdel(S) - -/obj/machinery/mineral/mint/process() - if(processing) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - var/datum/material/M = chosen - - if(!M) - processing = FALSE - icon_state = "coinpress0" - return - - icon_state = "coinpress1" - var/coin_mat = MINERAL_MATERIAL_AMOUNT - - for(var/sheets in 1 to 2) - if(materials.use_amount_mat(coin_mat, chosen)) - for(var/coin_to_make in 1 to 5) - create_coins() - produced_coins++ - CHECK_TICK - else - var/found_new = FALSE - for(var/datum/material/inserted_material in materials.materials) - var/amount = materials.get_material_amount(inserted_material) - - if(amount) - chosen = inserted_material - found_new = TRUE - - if(!found_new) - processing = FALSE - else - end_processing() - icon_state = "coinpress0" - -/obj/machinery/mineral/mint/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Mint", name) - ui.open() - -/obj/machinery/mineral/mint/ui_data() - var/list/data = list() - data["inserted_materials"] = list() - data["chosen_material"] = null - - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - for(var/datum/material/inserted_material in materials.materials) - var/amount = materials.get_material_amount(inserted_material) - if(!amount) - continue - data["inserted_materials"] += list(list( - "material" = inserted_material.name, - "amount" = amount, - )) - if(chosen == inserted_material) - data["chosen_material"] = inserted_material.name - - data["produced_coins"] = produced_coins - data["processing"] = processing - - return data; - -/obj/machinery/mineral/mint/ui_act(action, params, datum/tgui/ui) - . = ..() - if(.) - return - if(action == "startpress") - if (!processing) - if(produced_coins > 0) - log_econ("[produced_coins] coins were created by [src] in the last cycle.") - produced_coins = 0 - processing = TRUE - begin_processing() - return TRUE - if (action == "stoppress") - processing = FALSE - end_processing() - return TRUE - if (action == "changematerial") - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - for(var/datum/material/mat in materials.materials) - if (params["material_name"] == mat.name) - chosen = mat - return TRUE - -/obj/machinery/mineral/mint/proc/create_coins() - var/turf/T = get_step(src,output_dir) - var/temp_list = list() - temp_list[chosen] = 400 - if(T) - var/obj/item/O = new /obj/item/coin(src) - O.set_custom_materials(temp_list) - if(QDELETED(bag_to_use) || (bag_to_use.loc != T) || !SEND_SIGNAL(bag_to_use, COMSIG_TRY_STORAGE_INSERT, O, null, TRUE)) //important to send the signal so we don't overfill the bag. - bag_to_use = new(src) //make a new bag if we can't find or use the old one. - unload_mineral(bag_to_use) //just forcemove memes. - O.forceMove(bag_to_use) //don't bother sending the signal, the new bag is empty and all that. - - SSblackbox.record_feedback("amount", "coins_minted", 1) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index d92084c9d02..9b49de49120 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -482,4 +482,28 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/coin/iron +/obj/item/coin/gold/debug + custom_materials = list(/datum/material/gold = 400) + desc = "If you got this somehow, be aware that it will dust you. Almost certainly." + +/obj/item/coin/gold/debug/attack_self(mob/user) + if(cooldown < world.time) + if(string_attached) //does the coin have a wire attached + to_chat(user, "The coin won't flip very well with something attached!" ) + return FALSE//do not flip the coin + cooldown = world.time + 15 + flick("coin_[coinflip]_flip", src) + coinflip = pick(sideslist) + icon_state = "coin_[coinflip]" + playsound(user.loc, 'sound/items/coinflip.ogg', 50, TRUE) + var/oldloc = loc + sleep(15) + if(loc == oldloc && user && !user.incapacitated()) + user.visible_message("[user] flips [src]. It lands on [coinflip].", \ + "You flip [src]. It lands on [coinflip].", \ + "You hear the clattering of loose change.") + SSeconomy.fire() + to_chat(user,"[SSeconomy.inflation_value()] is the inflation value.") + return TRUE//did the coin flip? useful for suicide_act + #undef ORESTACK_OVERLAYS_MAX diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 0f61a9a8f54..656137e8949 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -887,6 +887,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/datum/mafia_controller/game = GLOB.mafia_game //this needs to change if you want multiple mafia games up at once. if(!game) game = create_mafia_game("mafia") + var/total_slots = game.custom_setup.len ? assoc_value_sum(game.custom_setup) : 12 if(GLOB.mafia_signup[client.ckey]) GLOB.mafia_signup -= ckey to_chat(usr, "You unregister from Mafia.") @@ -894,9 +895,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else GLOB.mafia_signup[ckey] = client to_chat(usr, "You sign up for Mafia.") - to_chat(usr, "The game currently has [GLOB.mafia_signup.len]/12 players signed up.") + to_chat(usr, "The game currently has [GLOB.mafia_signup.len]/[total_slots] players signed up.") if(game.phase != MAFIA_PHASE_SETUP) - to_chat(usr, "Mafia is currently in progress, you will be signed up for next round.") + to_chat(usr, "Mafia is currently in progress, you will be signed up for next round and get messages from the current one.") else game.try_autostart() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 84c5661a325..96b531ec15b 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -493,7 +493,7 @@ hand_bodyparts[i] = BP ..() //Don't redraw hands until we have organs for them -//GetAllContenst that is reasonable and not stupid +//GetAllContents that is reasonable and not stupid /mob/living/carbon/proc/get_all_gear() var/list/processing_list = get_equipped_items(include_pockets = TRUE) + held_items listclearnulls(processing_list) // handles empty hands diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 75ee9c53c25..ae9ad1a560b 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -74,7 +74,7 @@ if(victim.stat == CONSCIOUS) visible_message("[victim] kicks free of the blood pool just before entering it!", null, "You hear splashing and struggling.") - else if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/consumable/ethanol/demonsblood, needs_metabolizing = TRUE)) + else if(victim.reagents?.has_reagent(/datum/reagent/consumable/ethanol/demonsblood, needs_metabolizing = TRUE)) visible_message("Something prevents [victim] from entering the pool!", "A strange force is blocking [victim] from entering!", "You hear a splash and a thud.") else victim.forceMove(src) @@ -107,7 +107,7 @@ if(!victim) return FALSE - if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/consumable/ethanol/devilskiss, needs_metabolizing = TRUE)) + if(victim.reagents?.has_reagent(/datum/reagent/consumable/ethanol/devilskiss, needs_metabolizing = TRUE)) to_chat(src, "AAH! THEIR FLESH! IT BURNS!") adjustBruteLoss(25) //I can't use adjustHealth() here because bloodcrawl affects /mob/living and adjustHealth() only affects simple mobs var/found_bloodpool = FALSE diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 77f104f71c3..87c62f00e01 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -26,6 +26,9 @@ var/list/datum/brain_trauma/traumas = list() + /// List of skillchip items, their location should be this brain. + var/list/obj/item/skillchip/skillchips + /obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0,no_id_transfer = FALSE) ..() @@ -54,10 +57,15 @@ BT.owner = owner BT.on_gain() + for(var/obj/item/skillchip/skill_chip in skillchips) + skill_chip.on_apply(owner) + //Update the body's icon so it doesnt appear debrained anymore C.update_hair() /obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0, no_id_transfer = FALSE) + for(var/obj/item/skillchip/skill_chip in skillchips) + skill_chip.on_removal(owner) ..() for(var/X in traumas) var/datum/brain_trauma/BT = X @@ -117,6 +125,18 @@ O.reagents.clear_reagents() return + // Cutting out skill chips. + if(length(skillchips) && O.sharpness == SHARP_EDGED) + to_chat(user,"You begin to excise skillchips from [src].") + if(do_after(user, 15 SECONDS, target = src)) + for(var/obj/item/skillchip/skill_chip in skillchips) + if(skill_chip.removable) + skill_chip.forceMove(drop_location()) + else + qdel(skill_chip) + skillchips = null + return + if(brainmob) //if we aren't trying to heal the brain, pass the attack onto the brainmob. O.attack(brainmob, user) //Oh noooeeeee @@ -127,6 +147,8 @@ /obj/item/organ/brain/examine(mob/user) . = ..() + if(length(skillchips)) + . += "It has a skillchip embedded in it." if(suicided) . += "It's started turning slightly grey. They must not have been able to handle the stress of it all." return @@ -181,6 +203,7 @@ if(brainmob) QDEL_NULL(brainmob) QDEL_LIST(traumas) + QDEL_LIST(skillchips) return ..() /obj/item/organ/brain/on_life() @@ -221,6 +244,19 @@ else return brain_message +/obj/item/organ/brain/before_organ_replacement(obj/item/organ/replacement) + . = ..() + var/obj/item/organ/brain/replacement_brain = replacement + if(!istype(replacement_brain)) + return + for(var/obj/item/skillchip/skill_chip in src) + if(skill_chip in skillchips) + if(owner) + skill_chip.on_removal(owner) + LAZYREMOVE(skillchips, skill_chip) + LAZYADD(replacement_brain.skillchips, skill_chip) //No need to call on_apply here, since it will be inserted in organ replacement soon. + skill_chip.forceMove(replacement) + /obj/item/organ/brain/alien name = "alien brain" desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6b7c183c7af..83c370df242 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -65,17 +65,8 @@ if(!all_wounds || !(user.a_intent == INTENT_HELP || user == src)) return ..() - // The following priority/nonpriority searching is so that if we have two wounds on a limb that use the same item for treatment (gauze can bandage cuts AND splint broken bones), - // we prefer whichever wound is not already treated (ignore the splinted broken bone for the open cut). If there's no priority wounds that this can treat, go through the - // non-priority ones randomly. - var/list/nonpriority_wounds = list() - for(var/datum/wound/W in shuffle(all_wounds)) - if(!W.treat_priority) - nonpriority_wounds += W - else if(W.treat_priority && W.try_treating(I, user)) - return 1 - - for(var/datum/wound/W in shuffle(nonpriority_wounds)) + for(var/i in shuffle(all_wounds)) + var/datum/wound/W = i if(W.try_treating(I, user)) return 1 @@ -506,7 +497,7 @@ if(T) T.add_vomit_floor(src, VOMIT_TOXIC, purge)//toxic barf looks different || call purge when doing detoxicfication to pump more chems out of the stomach. T = get_step(T, dir) - if (is_blocked_turf(T)) + if (T != null && is_blocked_turf(T)) break return TRUE @@ -1115,35 +1106,50 @@ if(mood.sanity < SANITY_UNSTABLE) return TRUE -/mob/living/carbon/washed(var/atom/washer) +/mob/living/carbon/wash(clean_types) . = ..() - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "shower", /datum/mood_event/nice_shower) - for(var/obj/item/I in held_items) - I.washed(washer) + // Wash equipped stuff that cannot be covered + for(var/i in held_items) + var/obj/item/held_thing = i + if(held_thing.wash(clean_types)) + . = TRUE - if(back && back.washed(washer)) + if(back?.wash(clean_types)) update_inv_back(0) + . = TRUE + if(head?.wash(clean_types)) + update_inv_head() + . = TRUE + + // Check and wash stuff that can be covered var/list/obscured = check_obscured_slots() - if(head && head.washed(washer)) - update_inv_head() - - if(glasses && !(ITEM_SLOT_EYES in obscured) && glasses.washed(washer)) + // If the eyes are covered by anything but glasses, that thing will be covering any potential glasses as well. + if(glasses && is_eyes_covered(FALSE, TRUE, TRUE) && glasses.wash(clean_types)) update_inv_glasses() + . = TRUE - if(wear_mask && !(ITEM_SLOT_MASK in obscured && wear_mask.washed(washer))) + if(wear_mask && !(ITEM_SLOT_MASK in obscured) && wear_mask.wash(clean_types)) update_inv_wear_mask() + . = TRUE - if(ears && !(HIDEEARS in obscured) && ears.washed(washer)) + if(ears && !(ITEM_SLOT_EARS in obscured) && ears.wash(clean_types)) update_inv_ears() + . = TRUE - if(wear_neck && !(ITEM_SLOT_NECK in obscured) && wear_neck.washed(washer)) + if(wear_neck && !(ITEM_SLOT_NECK in obscured) && wear_neck.wash(clean_types)) update_inv_neck() + . = TRUE - if(shoes && !(HIDESHOES in obscured) && shoes.washed(washer)) + if(shoes && !(ITEM_SLOT_FEET in obscured) && shoes.wash(clean_types)) update_inv_shoes() + . = TRUE + + if(gloves && !(ITEM_SLOT_GLOVES in obscured) && gloves.wash(clean_types)) + update_inv_gloves() + . = TRUE /// if any of our bodyparts are bleeding /mob/living/carbon/proc/is_bleeding() @@ -1164,16 +1170,16 @@ /** * generate_fake_scars()- for when you want to scar someone, but you don't want to hurt them first. These scars don't count for temporal scarring (hence, fake) * - * If you want a specific wound scar, pass that wound type as the second arg, otherwise you can pass a list like WOUND_LIST_CUT to generate a random cut scar. + * If you want a specific wound scar, pass that wound type as the second arg, otherwise you can pass a list like WOUND_LIST_SLASH to generate a random cut scar. * * Arguments: * * num_scars- A number for how many scars you want to add - * * forced_type- Which wound or category of wounds you want to choose from, WOUND_LIST_BONE, WOUND_LIST_CUT, or WOUND_LIST_BURN (or some combination). If passed a list, picks randomly from the listed wounds. Defaults to all 3 types + * * forced_type- Which wound or category of wounds you want to choose from, WOUND_LIST_BLUNT, WOUND_LIST_SLASH, or WOUND_LIST_BURN (or some combination). If passed a list, picks randomly from the listed wounds. Defaults to all 3 types */ /mob/living/carbon/proc/generate_fake_scars(num_scars, forced_type) for(var/i in 1 to num_scars) - var/datum/scar/S = new - var/obj/item/bodypart/BP = pick(bodyparts) + var/datum/scar/scaries = new + var/obj/item/bodypart/scar_part = pick(bodyparts) var/wound_type if(forced_type) @@ -1182,12 +1188,54 @@ else wound_type = forced_type else - wound_type = pick(WOUND_LIST_BONE + WOUND_LIST_CUT + WOUND_LIST_BURN) + wound_type = pick(GLOB.global_all_wound_types) - var/datum/wound/W = new wound_type - S.generate(BP, W) - S.fake = TRUE - QDEL_NULL(W) + var/datum/wound/phantom_wound = new wound_type + scaries.generate(scar_part, phantom_wound) + scaries.fake = TRUE + QDEL_NULL(phantom_wound) /mob/living/carbon/is_face_visible() return !(wear_mask?.flags_inv & HIDEFACE) && !(head?.flags_inv & HIDEFACE) + +/** + * get_biological_state is a helper used to see what kind of wounds we roll for. By default we just assume carbons (read:monkeys) are flesh and bone, but humans rely on their species datums + * + * go look at the species def for more info [/datum/species/proc/get_biological_state] + */ +/mob/living/carbon/proc/get_biological_state() + return BIO_FLESH_BONE + +/// Modifies max_skillchip_count and updates active skillchips +/mob/living/carbon/proc/adjust_max_skillchip_count(delta) + max_skillchip_slots += delta + update_skillchips() + +/// Disables or re-enables any extra skillchips after skillchip limit changes. Inactive chips keep brain as loc but do not appear in skillchips list. +/mob/living/carbon/proc/update_skillchips() + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + if(!B) + return + var/limit = max_skillchip_slots + var/dt = limit - used_skillchip_slots + var/list/inactive_skillchips = list() + for(var/obj/item/skillchip/S in B) + inactive_skillchips += S + + // We have skillchips to deactivate + if(dt < 0) + //Might deactivate more than necessary but not worth sorting this + while(dt < 0) + var/obj/item/skillchip/chip = B.skillchips[length(B.skillchips)] + chip.on_removal(src) + B.skillchips -= chip + dt += chip.slot_cost + // We have skillchips to reactivate + else if (dt > 1) + while(dt > 1 && length(inactive_skillchips)) + var/obj/item/skillchip/chip = inactive_skillchips[length(inactive_skillchips)] + if(chip.slot_cost <= dt) + chip.on_apply(src) + B.skillchips += chip + dt -= chip.slot_cost + inactive_skillchips -= chip diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 6d332704428..473415f8de8 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -75,7 +75,7 @@ if(!affecting) //missing limb? we select the first bodypart (you can never have zero, because of chest) affecting = bodyparts[1] SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) - send_item_attack_message(I, user, affecting.name) + send_item_attack_message(I, user, affecting.name, affecting) if(I.force) apply_damage(I.force, I.damtype, affecting, wound_bonus = I.wound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness()) if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC) @@ -96,14 +96,41 @@ head.add_mob_blood(src) update_inv_head() - //dismemberment - var/probability = I.get_dismemberment_chance(affecting) - if(prob(probability)) - if(affecting.dismember(I.damtype)) - I.add_mob_blood(src) - playsound(get_turf(src), I.get_dismember_sound(), 80, TRUE) return TRUE //successful attack +/mob/living/carbon/send_item_attack_message(obj/item/I, mob/living/user, hit_area, obj/item/bodypart/hit_bodypart) + var/message_verb = "attacked" + if(length(I.attack_verb)) + message_verb = "[pick(I.attack_verb)]" + else if(!I.force) + return + + var/extra_wound_details = "" + if(I.damtype == BRUTE && hit_bodypart.can_dismember()) + var/mangled_state = hit_bodypart.get_mangled_state() + var/bio_state = get_biological_state() + if(mangled_state == BODYPART_MANGLED_BOTH) + extra_wound_details = ", threatening to sever it entirely" + else if((mangled_state == BODYPART_MANGLED_FLESH && I.get_sharpness()) || (mangled_state & BODYPART_MANGLED_BONE && bio_state == BIO_JUST_BONE)) + extra_wound_details = ", [I.get_sharpness() == SHARP_EDGED ? "slicing" : "piercing"] through to the bone" + else if((mangled_state == BODYPART_MANGLED_BONE && I.get_sharpness()) || (mangled_state & BODYPART_MANGLED_FLESH && bio_state == BIO_JUST_FLESH)) + extra_wound_details = ", [I.get_sharpness() == SHARP_EDGED ? "slicing" : "piercing"] at the remaining tissue" + + var/message_hit_area = "" + if(hit_area) + message_hit_area = " in the [hit_area]" + var/attack_message = "[src] is [message_verb][message_hit_area] with [I][extra_wound_details]!" + var/attack_message_local = "You're [message_verb][message_hit_area] with [I][extra_wound_details]!" + if(user in viewers(src, null)) + attack_message = "[user] [message_verb] [src][message_hit_area] with [I][extra_wound_details]!" + attack_message_local = "[user] [message_verb] you[message_hit_area] with [I][extra_wound_details]!" + if(user == src) + attack_message_local = "You [message_verb] yourself[message_hit_area] with [I][extra_wound_details]" + visible_message("[attack_message]",\ + "[attack_message_local]", null, COMBAT_MESSAGE_RANGE) + return TRUE + + /mob/living/carbon/attack_drone(mob/living/simple_animal/drone/user) return //so we don't call the carbon's attack_hand(). @@ -124,13 +151,14 @@ if(!(mobility_flags & MOBILITY_STAND) || !S.lying_required) if(user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM) if(S.next_step(user, user.a_intent)) - return 1 + return TRUE - for(var/datum/wound/W in all_wounds) + for(var/i in all_wounds) + var/datum/wound/W = i if(W.try_handling(user)) - return 1 + return TRUE - return 0 + return FALSE /mob/living/carbon/attack_paw(mob/living/carbon/monkey/M) @@ -148,13 +176,13 @@ if(M.a_intent == INTENT_HELP) help_shake_act(M) - return 0 + return FALSE if(..()) //successful monkey bite. for(var/thing in M.diseases) var/datum/disease/D = thing ForceContractDisease(D) - return 1 + return TRUE /mob/living/carbon/attack_slime(mob/living/simple_animal/slime/M) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 636d13c2dc7..489425213f8 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -77,3 +77,8 @@ var/list/all_wounds /// All of the scars a carbon has afflicted throughout their limbs var/list/all_scars + + /// Maximum number of skillchips slots we can support before they stop working + var/max_skillchip_slots = 2 + /// Currently used skillchip slots + var/used_skillchip_slots = 0 diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index c64dd449cfc..df5067da7d0 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -1,6 +1,6 @@ -/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) +/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE) SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone) var/hit_percent = (100-blocked)/100 if(!damage || (!forced && hit_percent <= 0)) @@ -209,7 +209,7 @@ * * It automatically updates health status */ -/mob/living/carbon/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) +/mob/living/carbon/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE) var/list/obj/item/bodypart/parts = get_damageable_bodyparts(required_status) if(!parts.len) return diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 0040bed767f..12ecaffcd3f 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -45,7 +45,8 @@ msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] stuck to [t_his] [BP.name]!\n" else msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n" - for(var/datum/wound/W in BP.wounds) + for(var/i in BP.wounds) + var/datum/wound/W = i msg += "[W.get_examine_description(user)]\n" for(var/X in disabled) @@ -111,7 +112,7 @@ switch(scar_severity) if(1 to 2) - msg += "[t_He] [t_has] visible scarring, you can look again to take a closer look...\n" + msg += "[t_He] [t_has] visible scarring, you can look again to take a closer look...\n" if(3 to 4) msg += "[t_He] [t_has] several bad scars, you can look again to take a closer look...\n" if(5 to 6) diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm index 231f85097b0..0947cfe49db 100644 --- a/code/modules/mob/living/carbon/human/damage_procs.dm +++ b/code/modules/mob/living/carbon/human/damage_procs.dm @@ -1,4 +1,4 @@ /// depending on the species, it will run the corresponding apply_damage code there -/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) +/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE) return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index b6e484e4a32..1a17d1d0603 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -151,8 +151,9 @@ else msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n" - for(var/datum/wound/W in BP.wounds) - msg += "[W.get_examine_description(user)]\n" + for(var/i in BP.wounds) + var/datum/wound/iter_wound = i + msg += "[iter_wound.get_examine_description(user)]\n" for(var/X in disabled) var/obj/item/bodypart/BP = X @@ -259,7 +260,13 @@ bleeding_limbs += BP var/num_bleeds = LAZYLEN(bleeding_limbs) - var/bleed_text = "[t_He] [t_is] bleeding from [t_his]" + + var/list/bleed_text + if(appears_dead) + bleed_text = list("Blood is visible in [t_his] open") + else + bleed_text = list("[t_He] [t_is] bleeding from [t_his]") + switch(num_bleeds) if(1 to 2) bleed_text += " [bleeding_limbs[1].name][num_bleeds == 2 ? " and [bleeding_limbs[2].name]" : ""]" @@ -268,11 +275,15 @@ var/obj/item/bodypart/BP = bleeding_limbs[i] bleed_text += " [BP.name]," bleed_text += " and [bleeding_limbs[num_bleeds].name]" - if(reagents.has_reagent(/datum/reagent/toxin/heparin, needs_metabolizing = TRUE)) - bleed_text += " incredibly quickly" - bleed_text += "!\n" - msg += bleed_text + if(appears_dead) + bleed_text += ", but it has pooled and is not flowing.\n" + else + if(reagents.has_reagent(/datum/reagent/toxin/heparin, needs_metabolizing = TRUE)) + bleed_text += " incredibly quickly" + + bleed_text += "!\n" + msg += bleed_text.Join() if(reagents.has_reagent(/datum/reagent/teslium, needs_metabolizing = TRUE)) msg += "[t_He] [t_is] emitting a gentle blue glow!\n" @@ -349,7 +360,7 @@ switch(scar_severity) if(1 to 2) - msg += "[t_He] [t_has] visible scarring, you can look again to take a closer look...\n" + msg += "[t_He] [t_has] visible scarring, you can look again to take a closer look...\n" if(3 to 4) msg += "[t_He] [t_has] several bad scars, you can look again to take a closer look...\n" if(5 to 6) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 8b5ce86bc13..33828f2fc6c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -18,7 +18,7 @@ . = ..() - RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_blood) + RegisterSignal(src, COMSIG_COMPONENT_CLEAN_FACE_ACT, .proc/clean_face) AddComponent(/datum/component/personal_crafting) AddComponent(/datum/component/footstep, FOOTSTEP_MOB_HUMAN, 1, 2) GLOB.human_list += src @@ -700,16 +700,82 @@ if(..()) dropItemToGround(I) -/mob/living/carbon/human/proc/clean_blood(datum/source, strength) - if(strength < CLEAN_STRENGTH_BLOOD) - return +/** + * Wash the hands, cleaning either the gloves if equipped and not obscured, otherwise the hands themselves if they're not obscured. + * + * Returns false if we couldn't wash our hands due to them being obscured, otherwise true + */ +/mob/living/carbon/human/proc/wash_hands(clean_types) + var/list/obscured = check_obscured_slots() + if(ITEM_SLOT_GLOVES in obscured) + return FALSE + if(gloves) - if(SEND_SIGNAL(gloves, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) - update_inv_gloves() - else - if(bloody_hands) - bloody_hands = 0 + if(gloves.wash(clean_types)) update_inv_gloves() + else if((clean_types & CLEAN_TYPE_BLOOD) && blood_in_hands > 0) + blood_in_hands = 0 + update_inv_gloves() + + return TRUE + +/** + * Cleans the lips of any lipstick. Returns TRUE if the lips had any lipstick and was thus cleaned + */ +/mob/living/carbon/human/proc/clean_lips() + if(isnull(lip_style) && lip_color == initial(lip_color)) + return FALSE + lip_style = null + lip_color = initial(lip_color) + update_body() + return TRUE + +/** + * Called on the COMSIG_COMPONENT_CLEAN_FACE_ACT signal + */ +/mob/living/carbon/human/proc/clean_face(datum/source, clean_types) + if(!is_mouth_covered() && clean_lips()) + . = TRUE + + if(glasses && is_eyes_covered(FALSE, TRUE, TRUE) && glasses.wash(clean_types)) + update_inv_glasses() + . = TRUE + + var/list/obscured = check_obscured_slots() + if(wear_mask && !(ITEM_SLOT_MASK in obscured) && wear_mask.wash(clean_types)) + update_inv_wear_mask() + . = TRUE + +/** + * Called when this human should be washed + */ +/mob/living/carbon/human/wash(clean_types) + . = ..() + + // Wash equipped stuff that cannot be covered + if(wear_suit?.wash(clean_types)) + update_inv_wear_suit() + . = TRUE + + if(belt?.wash(clean_types)) + update_inv_belt() + . = TRUE + + // Check and wash stuff that can be covered + var/list/obscured = check_obscured_slots() + + if(w_uniform && !(ITEM_SLOT_ICLOTHING in obscured) && w_uniform.wash(clean_types)) + update_inv_w_uniform() + . = TRUE + + if(!is_mouth_covered() && clean_lips()) + . = TRUE + + // Wash hands if exposed + if(!gloves && (clean_types & CLEAN_TYPE_BLOOD) && blood_in_hands > 0 && !(ITEM_SLOT_GLOVES in obscured)) + blood_in_hands = 0 + update_inv_gloves() + . = TRUE //Turns a mob black, flashes a skeleton overlay //Just like a cartoon! @@ -1103,24 +1169,6 @@ remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown) remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying) -/mob/living/carbon/human/washed(var/atom/washer) - . = ..() - if(wear_suit && wear_suit.washed(washer)) - update_inv_wear_suit() - else if(w_uniform && w_uniform.washed(washer)) - update_inv_w_uniform() - - if(!is_mouth_covered()) - lip_style = null - update_body() - if(belt && belt.washed(washer)) - update_inv_belt() - - var/list/obscured = check_obscured_slots() - - if(gloves && !(HIDEGLOVES in obscured) && gloves.washed(washer)) - update_inv_gloves() - /mob/living/carbon/human/adjust_nutrition(change) //Honestly FUCK the oldcoders for putting nutrition on /mob someone else can move it up because holy hell I'd have to fix SO many typechecks if(HAS_TRAIT(src, TRAIT_NOHUNGER)) return FALSE diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index ac5e7db5041..144c6d936b6 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -64,3 +64,7 @@ var/hardcore_survival_score = 0 /// For agendered spessmen, which body type to use var/body_type = MALE + + /// How many "units of blood" we have on our hands + var/blood_in_hands = 0 + diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index cb13e795c63..6bf01049be9 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -178,19 +178,29 @@ /// For use formatting all of the scars this human has for saving for persistent scarring /mob/living/carbon/human/proc/format_scars() - if(!all_scars) + var/list/missing_bodyparts = get_missing_limbs() + if(!all_scars && !length(missing_bodyparts)) return var/scars = "" + for(var/i in missing_bodyparts) + var/datum/scar/scaries = new + scars += "[scaries.format_amputated(i)]" for(var/i in all_scars) - var/datum/scar/S = i - scars += "[S.format()];" + var/datum/scar/scaries = i + scars += "[scaries.format()];" return scars /// Takes a single scar from the persistent scar loader and recreates it from the saved data /mob/living/carbon/human/proc/load_scar(scar_line) var/list/scar_data = splittext(scar_line, "|") - if(LAZYLEN(scar_data) != 4) + if(LAZYLEN(scar_data) != SCAR_SAVE_LENGTH) return // invalid, should delete - var/obj/item/bodypart/BP = get_bodypart("[scar_data[SCAR_SAVE_ZONE]]") - var/datum/scar/S = new - return S.load(BP, scar_data[SCAR_SAVE_DESC], scar_data[SCAR_SAVE_PRECISE_LOCATION], text2num(scar_data[SCAR_SAVE_SEVERITY])) + var/version = text2num(scar_data[SCAR_SAVE_VERS]) + if(!version || version < SCAR_CURRENT_VERSION) // get rid of old scars + return + var/obj/item/bodypart/the_part = get_bodypart("[scar_data[SCAR_SAVE_ZONE]]") + var/datum/scar/scaries = new + return scaries.load(the_part, scar_data[SCAR_SAVE_VERS], scar_data[SCAR_SAVE_DESC], scar_data[SCAR_SAVE_PRECISE_LOCATION], text2num(scar_data[SCAR_SAVE_SEVERITY])) + +/mob/living/carbon/human/get_biological_state() + return dna.species.get_biological_state() diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index 16320113a8b..2ff1204844a 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -80,27 +80,4 @@ /mob/living/carbon/human/get_alt_name() if(name != GetVoice()) - return " (as [get_id_name("Unknown")])" - -/mob/living/carbon/human/proc/forcesay(list/append) //this proc is at the bottom of the file because quote fuckery makes notepad++ cri - if(stat == CONSCIOUS) - if(client) - var/temp = winget(client, "input", "text") - var/say_starter = "Say \"" //" - if(findtextEx(temp, say_starter, 1, length(say_starter) + 1) && length(temp) > length(say_starter)) //case sensitive means - - temp = trim_left(copytext(temp, length(say_starter) + 1)) - temp = replacetext(temp, ";", "", 1, 2) //general radio - while(trim_left(temp)[1] == ":") //dept radio again (necessary) - temp = copytext_char(trim_left(temp), 3) - - if(temp[1] == "*") //emotes - return - - var/trimmed = trim_left(temp) - if(length(trimmed)) - if(append) - trimmed += pick(append) - - say(trimmed) - winset(client, "input", "text=[null]") + return " (as [get_id_name("Unknown")])"\ diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index 92bd6b3ec4b..fe32c33cf0a 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -173,7 +173,7 @@ There are several things that need to be remembered: var/obj/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_GLOVES) + 1] inv.update_icon() - if(!gloves && bloody_hands) + if(!gloves && blood_in_hands) var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER) if(get_num_arms(FALSE) < 2) if(has_left_hand(FALSE)) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 454eaea180f..70bf9cce8fa 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -40,6 +40,10 @@ handle_liver() dna.species.spec_life(src) // for mutantraces + else + for(var/i in all_wounds) + var/datum/wound/iter_wound = i + iter_wound.on_stasis() //Update our name based on whether our face is obscured/disfigured name = get_visible_name() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 946c3fce6f2..66f3c4536a3 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -283,10 +283,12 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(slot == ORGAN_SLOT_BRAIN) var/obj/item/organ/brain/brain = oldorgan if(!brain.decoy_override)//"Just keep it if it's fake" - confucius, probably + brain.before_organ_replacement(neworgan) brain.Remove(C,TRUE, TRUE) //brain argument used so it doesn't cause any... sudden death. QDEL_NULL(brain) oldorgan = null //now deleted else + oldorgan.before_organ_replacement(neworgan) oldorgan.Remove(C,TRUE) QDEL_NULL(oldorgan) //we cannot just tab this out because we need to skip the deleting if it is a decoy brain. @@ -1383,10 +1385,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) to_chat(user, "You knock [target] down!") var/knockdown_duration = 40 + (target.getStaminaLoss() + (target.getBruteLoss()*0.5))*0.8 //50 total damage = 40 base stun + 40 stun modifier = 80 stun duration, which is the old base duration target.apply_effect(knockdown_duration, EFFECT_KNOCKDOWN, armor_block) - target.forcesay(GLOB.hit_appends) log_combat(user, target, "got a stun punch with their previous punch") - else if(!(target.mobility_flags & MOBILITY_STAND)) - target.forcesay(GLOB.hit_appends) /datum/species/proc/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target) return @@ -1559,7 +1558,6 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/armor_block = H.run_armor_check(affecting, "melee", "Your armor has protected your [hit_area]!", "Your armor has softened a hit to your [hit_area]!",I.armour_penetration) armor_block = min(90,armor_block) //cap damage reduction at 90% - var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) var/Iwound_bonus = I.wound_bonus // this way, you can't wound with a surgical tool on help intent if they have a surgery active and are laying down, so a misclick with a circular saw on the wrong limb doesn't bleed them dry (they still get hit tho) @@ -1569,18 +1567,11 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/weakness = H.check_weakness(I, user) apply_damage(I.force * weakness, I.damtype, def_zone, armor_block, H, wound_bonus = Iwound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness()) - H.send_item_attack_message(I, user, hit_area) + H.send_item_attack_message(I, user, hit_area, affecting) if(!I.force) return 0 //item force is zero - //dismemberment - var/probability = I.get_dismemberment_chance(affecting) - if(prob(probability) || (HAS_TRAIT(H, TRAIT_EASYDISMEMBER) && prob(probability))) //try twice - if(affecting.dismember(I.damtype)) - I.add_mob_blood(H) - playsound(get_turf(H), I.get_dismember_sound(), 80, TRUE) - var/bloody = 0 if(((I.damtype == BRUTE) && I.force && prob(25 + (I.force * 2)))) if(affecting.status == BODYPART_ORGANIC) @@ -1639,11 +1630,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.w_uniform.add_mob_blood(H) H.update_inv_w_uniform() - if(Iforce > 10 || Iforce >= 5 && prob(33)) - H.forcesay(GLOB.hit_appends) //forcesay checks stat already. return TRUE -/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) +/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE) SEND_SIGNAL(H, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone, wound_bonus, bare_wound_bonus, sharpness) // make sure putting wound_bonus here doesn't screw up other signals or uses for this signal var/hit_percent = (100-(blocked+armor))/100 hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100 @@ -2117,3 +2106,13 @@ GLOBAL_LIST_EMPTY(roundstart_races) else to_chat(H, "You beat your wings and begin to hover gently above the ground...") H.set_resting(FALSE, TRUE) + +/** + * The human species version of [/mob/living/carbon/proc/get_biological_state]. Depends on the HAS_FLESH and HAS_BONE species traits, having bones lets you have bone wounds, having flesh lets you have burn, slash, and piercing wounds + */ +/datum/species/proc/get_biological_state(mob/living/carbon/human/H) + . = BIO_INORGANIC + if(HAS_FLESH in species_traits) + . |= BIO_JUST_FLESH + if(HAS_BONE in species_traits) + . |= BIO_JUST_BONE diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index 9935717ba80..f977dd0c4aa 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -2,7 +2,7 @@ name = "Dullahan" id = "dullahan" default_color = "FFFFFF" - species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS) + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS, HAS_FLESH, HAS_BONE) inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH) default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None") use_skintones = TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index 7153cacfdcb..3db33a17cb6 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -15,7 +15,7 @@ payday_modifier = 0.75 attack_type = BURN //burn bish damage_overlay_type = "" //We are too cool for regular damage overlays - species_traits = list(DYNCOLORS, AGENDER, NO_UNDERWEAR, HAIR) + species_traits = list(DYNCOLORS, AGENDER, NO_UNDERWEAR, HAIR, HAS_FLESH, HAS_BONE) // i mean i guess they have blood so they can have wounds too changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT species_language_holder = /datum/language_holder/ethereal inherent_traits = list(TRAIT_NOHUNGER) diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 3cb9bc4237d..8c59ab07567 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -914,7 +914,7 @@ special_names = list("Head", "Broth", "Fracture", "Rattler", "Appetit") liked_food = GROSS | MEAT | RAW toxic_food = null - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES) + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,HAS_BONE) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutanttongue = /obj/item/organ/tongue/bone sexes = FALSE @@ -942,8 +942,10 @@ H.reagents.remove_reagent(chem.type, chem.volume - 10) to_chat(H, "The excess milk is dripping off your bones!") H.heal_bodypart_damage(1.5,0, 0) + for(var/i in H.all_wounds) + var/datum/wound/iter_wound = i + iter_wound.on_xadone(2) H.reagents.remove_reagent(chem.type, chem.metabolization_rate) - return TRUE if(chem.type == /datum/reagent/toxin/bonehurtingjuice) H.adjustStaminaLoss(7.5, 0) H.adjustBruteLoss(0.5, 0) diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index 2c61d6a5e61..2c80700c589 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -2,7 +2,7 @@ name = "Human" id = "human" default_color = "FFFFFF" - species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,CAN_SCAR) + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,HAS_FLESH,HAS_BONE) default_features = list("mcolor" = "FFF", "wings" = "None") use_skintones = 1 skinned_type = /obj/item/stack/sheet/animalhide/human diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 271245d0e26..42a054bc6b9 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -641,6 +641,8 @@ /datum/action/innate/linked_speech/Activate() var/mob/living/carbon/human/H = owner + if(H.stat == DEAD) + return if(!species || !(H in species.linked_mobs)) to_chat(H, "The link seems to have been severed...") Remove(H) diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 3e8654bf684..ed7f3df50d3 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -4,7 +4,7 @@ id = "lizard" say_mod = "hisses" default_color = "00FF00" - species_traits = list(MUTCOLORS,EYECOLOR,LIPS,CAN_SCAR) + species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAS_FLESH,HAS_BONE) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs") mutanttongue = /obj/item/organ/tongue/lizard @@ -84,6 +84,6 @@ name = "Ash Walker" id = "ashlizard" limbs_id = "lizard" - species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE,CAN_SCAR) + species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE,HAS_FLESH,HAS_BONE) inherent_traits = list(TRAIT_CHUNKYFINGERS,TRAIT_NOBREATH) species_language_holder = /datum/language_holder/lizard/ash diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index c28fa0768e0..c6704cef159 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -3,7 +3,7 @@ id = "moth" say_mod = "flutters" default_color = "00FF00" - species_traits = list(LIPS, NOEYESPRITES, CAN_SCAR) + species_traits = list(LIPS, NOEYESPRITES, HAS_FLESH, HAS_BONE) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG mutant_bodyparts = list("moth_wings", "moth_markings") default_features = list("moth_wings" = "Plain", "moth_markings" = "None") diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index 8e302abbb29..ca20e5e6aa7 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -10,7 +10,7 @@ nojumpsuit = TRUE say_mod = "poofs" //what does a mushroom sound like - species_traits = list(MUTCOLORS, NOEYESPRITES, NO_UNDERWEAR) + species_traits = list(MUTCOLORS, NOEYESPRITES, NO_UNDERWEAR, HAS_FLESH, HAS_BONE) inherent_traits = list(TRAIT_NOBREATH, TRAIT_NOFLASH) inherent_factions = list("mushroom") speedmod = 1.5 //faster than golems but not by much diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 6e6a1b7ba4f..51327257ed5 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -4,7 +4,7 @@ say_mod = "rattles" sexes = 0 meat = /obj/item/stack/sheet/mineral/plasma - species_traits = list(NOBLOOD,NOTRANSSTING) + species_traits = list(NOBLOOD,NOTRANSSTING, HAS_BONE) inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_NOHUNGER,TRAIT_ALWAYS_CLEAN) inherent_biotypes = MOB_HUMANOID|MOB_MINERAL mutantlungs = /obj/item/organ/lungs/plasmaman @@ -150,14 +150,23 @@ /datum/species/plasmaman/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) . = ..() - if(chem.type == /datum/reagent/consumable/milk) + if(istype(chem, /datum/reagent/consumable/milk)) if(chem.volume > 10) H.reagents.remove_reagent(chem.type, chem.volume - 10) to_chat(H, "The excess milk is dripping off your bones!") H.heal_bodypart_damage(1.5,0, 0) H.reagents.remove_reagent(chem.type, chem.metabolization_rate) + for(var/i in H.all_wounds) + var/datum/wound/iter_wound = i + iter_wound.on_xadone(2) return TRUE - if(chem.type == /datum/reagent/toxin/bonehurtingjuice) + if(istype(chem, /datum/reagent/toxin/plasma)) + H.reagents.remove_reagent(chem.type, chem.metabolization_rate) + for(var/i in H.all_wounds) + var/datum/wound/iter_wound = i + iter_wound.on_xadone(4) // plasmamen use plasma to reform their bones or whatever + return TRUE + if(istype(chem, /datum/reagent/toxin/bonehurtingjuice)) H.adjustStaminaLoss(7.5, 0) H.adjustBruteLoss(0.5, 0) if(prob(20)) diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 4d9f557f02d..742ca01cd67 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -3,7 +3,7 @@ name = "Podperson" id = "pod" default_color = "59CE00" - species_traits = list(MUTCOLORS,EYECOLOR) + species_traits = list(MUTCOLORS,EYECOLOR, HAS_FLESH, HAS_BONE) inherent_traits = list(TRAIT_ALWAYS_CLEAN) inherent_factions = list("plants", "vines") attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index d2ec289fdcb..b3102eab051 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -172,7 +172,7 @@ righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' item_flags = ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE - sharpness = IS_SHARP + sharpness = SHARP_EDGED wound_bonus = -60 bare_wound_bonus = 20 @@ -187,37 +187,63 @@ return if(isopenturf(AM)) //So you can actually melee with it return + if(isliving(AM)) var/mob/living/L = AM if(isethereal(AM)) AM.emp_act(EMP_LIGHT) - if(iscyborg(AM)) + else if(iscyborg(AM)) var/mob/living/silicon/robot/borg = AM if(borg.lamp_intensity) borg.update_headlamp(TRUE, INFINITY) to_chat(borg, "Your headlamp is fried! You'll need a human to help replace it.") - else - for(var/obj/item/O in AM) + else if(ishuman(AM)) + var/mob/living/carbon/human/H = AM + for(var/obj/item/O in H.get_all_gear()) //less expensive than getallcontents if(O.light_range && O.light_power) - disintegrate(O) + disintegrate(O, AM) + else + for(var/obj/item/O in AM.GetAllContents()) + if(O.light_range && O.light_power) + disintegrate(O, AM) if(L.pulling && L.pulling.light_range && isitem(L.pulling)) - disintegrate(L.pulling) + disintegrate(L.pulling, L.pulling) + else if(isitem(AM)) var/obj/item/I = AM if(I.light_range && I.light_power) - disintegrate(I) + disintegrate(I, I) -/obj/item/light_eater/proc/disintegrate(obj/item/O) + else if(ismecha(AM)) + var/obj/mecha/M = AM + if(M.haslights) + M.visible_message("[M]'s lights burn out!") + M.haslights = FALSE + M.set_light(-M.lights_power) + if(M.occupant) + M.lights_action.Remove(M.occupant) + for(var/obj/item/O in AM.GetAllContents()) + if(O.light_range && O.light_power) + disintegrate(O, M) + + else if(istype(AM, /obj/machinery/light)) + var/obj/machinery/light/L = AM + if(L.status == 1) + return + disintegrate(L.drop_light_tube(), AM) + + +/obj/item/light_eater/proc/disintegrate(obj/item/O, atom/A) if(istype(O, /obj/item/pda)) var/obj/item/pda/PDA = O PDA.set_light(0) PDA.fon = FALSE PDA.f_lum = 0 PDA.update_icon() - visible_message("The light in [PDA] shorts out!") + A.visible_message("The light in [PDA] shorts out!") else - visible_message("[O] is disintegrated by [src]!") + A.visible_message("[O] is disintegrated by [src]!") O.burn() playsound(src, 'sound/items/welder.ogg', 50, TRUE) diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index 3ea96e01468..7443224e7f6 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -5,7 +5,7 @@ say_mod = "rattles" sexes = 0 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton - species_traits = list(NOBLOOD) + species_traits = list(NOBLOOD, HAS_BONE) inherent_traits = list(TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,\ TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH,TRAIT_XENO_IMMUNE,TRAIT_NOCLONELOSS) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID @@ -29,6 +29,9 @@ if(chem.volume > 10) H.reagents.remove_reagent(chem.type, chem.volume - 10) to_chat(H, "The excess milk is dripping off your bones!") + for(var/i in H.all_wounds) + var/datum/wound/iter_wound = i + iter_wound.on_xadone(2) H.heal_bodypart_damage(1,1, 0) H.reagents.remove_reagent(chem.type, chem.metabolization_rate) return TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm index 73b133f46f3..0b4c9537089 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -3,7 +3,7 @@ id = "snail" offset_features = list(OFFSET_UNIFORM = list(0,0), OFFSET_ID = list(0,0), OFFSET_GLOVES = list(0,0), OFFSET_GLASSES = list(0,4), OFFSET_EARS = list(0,0), OFFSET_SHOES = list(0,0), OFFSET_S_STORE = list(0,0), OFFSET_FACEMASK = list(0,0), OFFSET_HEAD = list(0,0), OFFSET_FACE = list(0,0), OFFSET_BELT = list(0,0), OFFSET_BACK = list(0,0), OFFSET_SUIT = list(0,0), OFFSET_NECK = list(0,0)) default_color = "336600" //vomit green - species_traits = list(MUTCOLORS, NO_UNDERWEAR) + species_traits = list(MUTCOLORS, NO_UNDERWEAR, HAS_FLESH, HAS_BONE) inherent_traits = list(TRAIT_ALWAYS_CLEAN, TRAIT_NOSLIPALL) attack_verb = "slap" say_mod = "slurs" diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm index 266a3e09142..86effae9c1b 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -9,7 +9,7 @@ meat = null damage_overlay_type = "synth" limbs_id = "synth" - var/disguise_fail_health = 75 //When their health gets to this level their instabitaluri partially falls off + var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off var/datum/species/fake_species //a species to do most of our work for us, unless we're damaged var/list/initial_species_traits //for getting these values back for assume_disguise() var/list/initial_inherent_traits @@ -41,7 +41,7 @@ UnregisterSignal(H, COMSIG_MOB_SAY) /datum/species/synth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - if(chem.type == /datum/reagent/medicine/c2/instabitaluri) + if(chem.type == /datum/reagent/medicine/c2/synthflesh) chem.expose_mob(H, TOUCH, 2 ,0) //heal a little H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) return 1 diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 1bd65fc01ab..e1ece348605 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -2,7 +2,7 @@ name = "Vampire" id = "vampire" default_color = "FFFFFF" - species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD) + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD, HAS_FLESH, HAS_BONE) inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None") diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 31f2b715a18..2ebf0c5f729 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -7,7 +7,7 @@ say_mod = "moans" sexes = 0 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie - species_traits = list(NOBLOOD,NOZOMBIE,NOTRANSSTING) + species_traits = list(NOBLOOD,NOZOMBIE,NOTRANSSTING, HAS_FLESH, HAS_BONE) inherent_traits = list(TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NODEATH,TRAIT_FAKEDEATH,TRAIT_NOCLONELOSS) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutanttongue = /obj/item/organ/tongue/zombie @@ -46,7 +46,7 @@ /datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H,amount) . = min(20, amount) -/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) +/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE) . = ..() if(.) regen_cooldown = world.time + REGENERATION_DELAY @@ -64,9 +64,9 @@ C.heal_overall_damage(heal_amt,heal_amt) C.adjustToxLoss(-heal_amt) for(var/i in C.all_wounds) - var/datum/wound/W = i - if(prob(4-W.severity)) - W.remove_wound() + var/datum/wound/iter_wound = i + if(prob(4-iter_wound.severity)) + iter_wound.remove_wound() if(!C.InCritical() && prob(4)) playsound(C, pick(spooks), 50, TRUE, 10) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 07150513e2f..dfcd3a826ee 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -197,7 +197,8 @@ to_chat(src, "You have no empty hands!") return if(!giver.temporarilyRemoveItemFromInventory(I)) - visible_message("[src] tries to hand over [I] but it's stuck to them....", \ - " You make a fool of yourself trying to give away an item stuck to your hands") + visible_message("[giver] tries to hand over [I] but it's stuck to them....") return + visible_message("[src] takes [I] from [giver]", \ + "You take [I] from [giver]") put_in_hands(I) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 55cf8d56a1a..18cb1c5b236 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -14,7 +14,7 @@ * * Returns TRUE if damage applied */ -/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) +/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE) SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone) var/hit_percent = (100-blocked)/100 if(!damage || (!forced && hit_percent <= 0)) @@ -263,7 +263,7 @@ update_stamina() /// damage ONE external organ, organ gets randomly selected from damaged ones. -/mob/living/proc/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) +/mob/living/proc/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE) adjustBruteLoss(brute, FALSE) //zero as argument for no instant health update adjustFireLoss(burn, FALSE) adjustStaminaLoss(stamina, FALSE) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index dace9d9c70e..c1c5b14182d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -677,41 +677,56 @@ return /mob/living/proc/makeTrail(turf/target_turf, turf/start, direction) - if(!has_gravity()) + if(!has_gravity() || !isturf(start) || !blood_volume) return - var/blood_exists = FALSE - for(var/obj/effect/decal/cleanable/trail_holder/C in start) //checks for blood splatter already on the floor - blood_exists = TRUE - if(isturf(start)) - var/trail_type = getTrail() - if(trail_type) - var/brute_ratio = round(getBruteLoss() / maxHealth, 0.1) - if(blood_volume && blood_volume > max(BLOOD_VOLUME_NORMAL*(1 - brute_ratio * 0.25), 0))//don't leave trail if blood volume below a threshold - blood_volume = max(blood_volume - max(1, brute_ratio * 2), 0) //that depends on our brute damage. - var/newdir = get_dir(target_turf, start) - if(newdir != direction) - newdir = newdir | direction - if(newdir == 3) //N + S - newdir = NORTH - else if(newdir == 12) //E + W - newdir = EAST - if((newdir in GLOB.cardinals) && (prob(50))) - newdir = turn(get_dir(target_turf, start), 180) - if(!blood_exists) - new /obj/effect/decal/cleanable/trail_holder(start, get_static_viruses()) + var/blood_exists = locate(/obj/effect/decal/cleanable/trail_holder) in start - for(var/obj/effect/decal/cleanable/trail_holder/TH in start) - if((!(newdir in TH.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && TH.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled) - TH.existing_dirs += newdir - TH.add_overlay(image('icons/effects/blood.dmi', trail_type, dir = newdir)) - TH.transfer_mob_blood_dna(src) + var/trail_type = getTrail() + if(!trail_type) + return + + var/brute_ratio = round(getBruteLoss() / maxHealth, 0.1) + if(blood_volume < max(BLOOD_VOLUME_NORMAL*(1 - brute_ratio * 0.25), 0))//don't leave trail if blood volume below a threshold + return + + var/bleed_amount = bleedDragAmount() + blood_volume = max(blood_volume - bleed_amount, 0) //that depends on our brute damage. + var/newdir = get_dir(target_turf, start) + if(newdir != direction) + newdir = newdir | direction + if(newdir == (NORTH|SOUTH)) + newdir = NORTH + else if(newdir == (EAST|WEST)) + newdir = EAST + if((newdir in GLOB.cardinals) && (prob(50))) + newdir = turn(get_dir(target_turf, start), 180) + if(!blood_exists) + new /obj/effect/decal/cleanable/trail_holder(start, get_static_viruses()) + + for(var/obj/effect/decal/cleanable/trail_holder/TH in start) + if((!(newdir in TH.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && TH.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled) + TH.existing_dirs += newdir + TH.add_overlay(image('icons/effects/blood.dmi', trail_type, dir = newdir)) + TH.transfer_mob_blood_dna(src) /mob/living/carbon/human/makeTrail(turf/T) if((NOBLOOD in dna.species.species_traits) || !is_bleeding() || bleedsuppress) return ..() +///Returns how much blood we're losing from being dragged a tile, from [mob/living/proc/makeTrail] +/mob/living/proc/bleedDragAmount() + var/brute_ratio = round(getBruteLoss() / maxHealth, 0.1) + return max(1, brute_ratio * 2) + +/mob/living/carbon/bleedDragAmount() + var/bleed_amount = 0 + for(var/i in all_wounds) + var/datum/wound/iter_wound = i + bleed_amount += iter_wound.drag_bleed_amount() + return bleed_amount + /mob/living/proc/getTrail() if(getBruteLoss() < 300) return pick("ltrails_1", "ltrails_2") @@ -927,6 +942,8 @@ /mob/living/singularity_pull(S, current_size) ..() + if(move_resist == INFINITY) + return if(current_size >= STAGE_SIX) //your puny magboots/wings/whatever will not save you against supermatter singularity throw_at(S, 14, 3, src, TRUE) else if(!src.mob_negates_gravity()) @@ -1150,11 +1167,6 @@ //Mobs on Fire end -//Washing -/mob/living/washed(var/atom/washer) - . = ..() - SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - // used by secbot and monkeys Crossed /mob/living/proc/knockOver(var/mob/living/carbon/C) if(C.key) //save us from monkey hordes @@ -1294,14 +1306,24 @@ SSmobs.clients_by_zlevel[registered_z] -= src if (client) if (new_z) + //Figure out how many clients were here before + var/oldlen = SSmobs.clients_by_zlevel[new_z].len SSmobs.clients_by_zlevel[new_z] += src for (var/I in length(SSidlenpcpool.idle_mobs_by_zlevel[new_z]) to 1 step -1) //Backwards loop because we're removing (guarantees optimal rather than worst-case performance), it's fine to use .len here but doesn't compile on 511 var/mob/living/simple_animal/SA = SSidlenpcpool.idle_mobs_by_zlevel[new_z][I] - if (SA && get_dist(get_turf(src), get_turf(SA)) < MAX_SIMPLEMOB_WAKEUP_RANGE) - SA.consider_wakeup() // Ask the mob if it wants to turn on it's AI + if (SA) + if(oldlen == 0) + //Start AI idle if nobody else was on this z level before (mobs will switch off when this is the case) + SA.toggle_ai(AI_IDLE) + + //If they are also within a close distance ask the AI if it wants to wake up + if(get_dist(get_turf(src), get_turf(SA)) < MAX_SIMPLEMOB_WAKEUP_RANGE) + SA.consider_wakeup() // Ask the mob if it wants to turn on it's AI + //They should clean up in destroy, but often don't so we get them here else SSidlenpcpool.idle_mobs_by_zlevel[new_z] -= SA + registered_z = new_z else registered_z = null @@ -1504,7 +1526,7 @@ ///Checks if the user is incapacitated or on cooldown. /mob/living/proc/can_look_up() - return !((next_move > world.time) || incapacitated(ignore_restraints = TRUE)) + return !(incapacitated(ignore_restraints = TRUE)) /** * look_up Changes the perspective of the mob to any openspace turf above the mob @@ -1513,27 +1535,91 @@ * */ /mob/living/proc/look_up() - if(client.perspective != MOB_PERSPECTIVE) //We are already looking up. stop_look_up() - return if(!can_look_up()) return + changeNext_move(CLICK_CD_LOOK_UP) + RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, .proc/stop_look_up) //We stop looking up if we move. + RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/start_look_up) //We start looking again after we move. + start_look_up() + +/mob/living/proc/start_look_up() var/turf/ceiling = get_step_multiz(src, UP) if(!ceiling) //We are at the highest z-level. to_chat(src, "You can't see through the ceiling above you.") return else if(!istransparentturf(ceiling)) //There is no turf we can look through above us - to_chat(src, "You can't see through the floor above you.") - return + var/turf/front_hole = get_step(ceiling, dir) + if(istransparentturf(front_hole)) + ceiling = front_hole + else + var/list/checkturfs = block(locate(x-1,y-1,ceiling.z),locate(x+1,y+1,ceiling.z))-ceiling-front_hole //Try find hole near of us + for(var/turf/checkhole in checkturfs) + if(istransparentturf(checkhole)) + ceiling = checkhole + break + if(!istransparentturf(ceiling)) + to_chat(src, "You can't see through the floor above you.") + return - changeNext_move(CLICK_CD_LOOK_UP) reset_perspective(ceiling) - RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, .proc/stop_look_up) //We stop looking up if we move. /mob/living/proc/stop_look_up() reset_perspective() + +/mob/living/proc/end_look_up() + stop_look_up() UnregisterSignal(src, COMSIG_MOVABLE_PRE_MOVE) + UnregisterSignal(src, COMSIG_MOVABLE_MOVED) + +/** + * look_down Changes the perspective of the mob to any openspace turf below the mob + * + * This also checks if an openspace turf is below the mob before looking down or resets the perspective if already looking up + * + */ +/mob/living/proc/look_down() + if(client.perspective != MOB_PERSPECTIVE) //We are already looking down. + stop_look_down() + if(!can_look_up()) //if we cant look up, we cant look down. + return + changeNext_move(CLICK_CD_LOOK_UP) + RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, .proc/stop_look_down) //We stop looking down if we move. + RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/start_look_down) //We start looking again after we move. + start_look_down() + +/mob/living/proc/start_look_down() + var/turf/floor = get_turf(src) + var/turf/lower_level = get_step_multiz(floor, DOWN) + if(!lower_level) //We are at the lowest z-level. + to_chat(src, "You can't see through the floor below you.") + return + else if(!istransparentturf(floor)) //There is no turf we can look through below us + var/turf/front_hole = get_step(floor, dir) + if(istransparentturf(front_hole)) + floor = front_hole + lower_level = get_step_multiz(front_hole, DOWN) + else + var/list/checkturfs = block(locate(x-1,y-1,z),locate(x+1,y+1,z))-floor //Try find hole near of us + for(var/turf/checkhole in checkturfs) + if(istransparentturf(checkhole)) + floor = checkhole + lower_level = get_step_multiz(checkhole, DOWN) + break + if(!istransparentturf(floor)) + to_chat(src, "You can't see through the floor below you.") + return + + reset_perspective(lower_level) + +/mob/living/proc/stop_look_down() + reset_perspective() + +/mob/living/proc/end_look_down() + stop_look_down() + UnregisterSignal(src, COMSIG_MOVABLE_PRE_MOVE) + UnregisterSignal(src, COMSIG_MOVABLE_MOVED) /mob/living/set_stat(new_stat) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index b634bd42822..4748489e0c8 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -51,7 +51,7 @@ var/armor = run_armor_check(def_zone, P.flag, "","",P.armour_penetration) var/on_hit_state = P.on_hit(src, armor) if(!P.nodamage && on_hit_state != BULLET_ACT_BLOCK) - apply_damage(P.damage, P.damage_type, def_zone, armor, wound_bonus=P.wound_bonus, bare_wound_bonus=P.bare_wound_bonus, sharpness=P.sharpness) + apply_damage(P.damage, P.damage_type, def_zone, armor, wound_bonus=P.wound_bonus, bare_wound_bonus=P.bare_wound_bonus, sharpness = P.sharpness) apply_effects(P.stun, P.knockdown, P.unconscious, P.irradiate, P.slur, P.stutter, P.eyeblur, P.drowsy, armor, P.stamina, P.jitter, P.paralyze, P.immobilize) if(P.dismemberment) check_projectile_dismemberment(P, def_zone) @@ -80,14 +80,16 @@ dtype = I.damtype if(!blocked) - visible_message("[src] is hit by [I]!", \ - "You're hit by [I]!") - if(!I.throwforce) - return - var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].",I.armour_penetration) - apply_damage(I.throwforce, dtype, zone, armor, sharpness=I.sharpness) if(I.thrownby) log_combat(I.thrownby, src, "threw and hit", I) + if(!nosell_hit) + visible_message("[src] is hit by [I]!", \ + "You're hit by [I]!") + if(!I.throwforce) + return + var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].",I.armour_penetration) + apply_damage(I.throwforce, dtype, zone, armor, sharpness=I.get_sharpness(), wound_bonus=(nosell_hit * CANT_WOUND)) + else return 1 else diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index 15bb5f2f1fa..1a6e3e16492 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -1,5 +1,5 @@ -/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) +/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE) var/hit_percent = (100-blocked)/100 if((!damage || (!forced && hit_percent <= 0))) return 0 @@ -9,9 +9,6 @@ adjustBruteLoss(damage_amount, forced = forced) if(BURN) adjustFireLoss(damage_amount, forced = forced) - if(OXY) - if(damage < 0 || forced) //we shouldn't be taking oxygen damage through this proc, but we'll let it heal. - adjustOxyLoss(damage_amount, forced = forced) return 1 @@ -30,14 +27,26 @@ /mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE) return FALSE -/mob/living/silicon/adjustStaminaLoss(amount, updating_health = TRUE, forced = FALSE)//immune to stamina damage. +/mob/living/silicon/adjustStaminaLoss(amount, updating_health = TRUE, forced = FALSE) //immune to stamina damage. return FALSE /mob/living/silicon/setStaminaLoss(amount, updating_health = TRUE) return FALSE -/mob/living/silicon/adjustOrganLoss(slot, amount, maximum = 500) +/mob/living/silicon/adjustOrganLoss(slot, amount, maximum = 500) //immune to organ damage (no organs, duh) return FALSE /mob/living/silicon/setOrganLoss(slot, amount) return FALSE + +/mob/living/silicon/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE) //immune to oxygen damage + if(istype(src, /mob/living/silicon/ai)) //ais are snowflakes and use oxyloss for being in AI cards and having no battery + return ..() + + return FALSE + +/mob/living/silicon/setOxyLoss(amount, updating_health = TRUE, forced = FALSE) + if(istype(src, /mob/living/silicon/ai)) //ditto + return ..() + + return FALSE diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index cd14bdfbae0..487cb4f93ff 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -8,7 +8,7 @@ /mob/living/silicon/proc/deadchat_lawchange() var/list/the_laws = laws.get_law_list(include_zeroth = TRUE) var/lawtext = the_laws.Join("
") - deadchat_broadcast("'s laws were changed. View", "[src]", follow_target=src, message_type=DEADCHAT_LAWCHANGE) + deadchat_broadcast("'s laws were changed. View", "[src]", follow_target=src, message_type=DEADCHAT_LAWCHANGE) /mob/living/silicon/proc/post_lawchange(announce = TRUE) throw_alert("newlaw", /obj/screen/alert/newlaw) diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm index 3272173da24..e21b73ad1cd 100644 --- a/code/modules/mob/living/silicon/pai/pai_defense.dm +++ b/code/modules/mob/living/silicon/pai/pai_defense.dm @@ -86,15 +86,6 @@ /mob/living/silicon/pai/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) return take_holo_damage(amount) -/mob/living/silicon/pai/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) - return FALSE - -/mob/living/silicon/pai/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE) - return FALSE - -/mob/living/silicon/pai/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) - return FALSE - /mob/living/silicon/pai/adjustStaminaLoss(amount, updating_health, forced = FALSE) if(forced) take_holo_damage(amount) @@ -106,27 +97,3 @@ /mob/living/silicon/pai/getFireLoss() return emittermaxhealth - emitterhealth - -/mob/living/silicon/pai/getToxLoss() - return FALSE - -/mob/living/silicon/pai/getOxyLoss() - return FALSE - -/mob/living/silicon/pai/getCloneLoss() - return FALSE - -/mob/living/silicon/pai/getStaminaLoss() - return FALSE - -/mob/living/silicon/pai/setCloneLoss() - return FALSE - -/mob/living/silicon/pai/setStaminaLoss(amount, updating_health = TRUE) - return FALSE - -/mob/living/silicon/pai/setToxLoss() - return FALSE - -/mob/living/silicon/pai/setOxyLoss() - return FALSE diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 60ac3f975cd..3e59b227521 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -1,215 +1,390 @@ //These procs handle putting stuff in your hand. It's probably best to use these rather than setting stuff manually //as they handle all relevant stuff like adding it to the player's screen and such -//Returns the thing in our active hand (whatever is in our active module-slot, in this case) +/** + * Returns the thing in our active hand (whatever is in our active module-slot, in this case) + */ /mob/living/silicon/robot/get_active_held_item() return module_active +/** + * Parent proc - triggers when an item/module is unequipped from a cyborg. + */ /obj/item/proc/cyborg_unequip(mob/user) return -/mob/living/silicon/robot/proc/uneq_module(obj/item/O) - if(!O) - return 0 - O.mouse_opacity = MOUSE_OPACITY_OPAQUE - if(istype(O, /obj/item/borg/sight)) - var/obj/item/borg/sight/S = O - sight_mode &= ~S.sight_mode - update_sight() - else if(istype(O, /obj/item/storage/bag/tray/)) - SEND_SIGNAL(O, COMSIG_TRY_STORAGE_QUICK_EMPTY) - if(client) - client.screen -= O - observer_screen_update(O,FALSE) +/** + * Finds the first available slot and attemps to put item item_module in it. + * + * Arguments + * * item_module - the item being equipped to a slot. + */ +/mob/living/silicon/robot/proc/activate_module(obj/item/item_module) + if(QDELETED(item_module)) + CRASH("activate_module called with improper item_module") - if(module_active == O) - module_active = null - if(held_items[1] == O) - inv1.icon_state = "inv1" - held_items[1] = null - else if(held_items[2] == O) - inv2.icon_state = "inv2" - held_items[2] = null - else if(held_items[3] == O) - inv3.icon_state = "inv3" - held_items[3] = null + if(!(item_module in module.modules)) + CRASH("activate_module called with item_module not in module.modules") - if(O.item_flags & DROPDEL) - O.item_flags &= ~DROPDEL //we shouldn't HAVE things with DROPDEL_1 in our modules, but better safe than runtiming horribly - - O.forceMove(module) //Return item to module so it appears in its contents, so it can be taken out again. - O.cyborg_unequip(src) - - hud_used.update_robot_modules_display() - return 1 - -/mob/living/silicon/robot/proc/activate_module(obj/item/O) - . = FALSE - if(!(O in module.modules)) - return - if(activated(O)) + if(activated(item_module)) to_chat(src, "That module is already activated.") - return - if(!held_items[1]) - held_items[1] = O - O.screen_loc = inv1.screen_loc - . = TRUE - else if(!held_items[2]) - held_items[2] = O - O.screen_loc = inv2.screen_loc - . = TRUE - else if(!held_items[3]) - held_items[3] = O - O.screen_loc = inv3.screen_loc - . = TRUE - else - to_chat(src, "You need to disable a module first!") - if(.) - O.equipped(src, ITEM_SLOT_HANDS) - O.mouse_opacity = initial(O.mouse_opacity) - O.layer = ABOVE_HUD_LAYER - O.plane = ABOVE_HUD_PLANE - observer_screen_update(O,TRUE) - O.forceMove(src) - if(istype(O, /obj/item/borg/sight)) - var/obj/item/borg/sight/S = O - sight_mode |= S.sight_mode - update_sight() + return FALSE + + if(disabled_modules & BORG_MODULE_ALL_DISABLED) + to_chat(src, "All modules are disabled!") + return FALSE + + /// What's the first free slot for the borg? + var/first_free_slot = !held_items[1] ? 1 : (!held_items[2] ? 2 : (!held_items[3] ? 3 : null)) + + if(!first_free_slot || is_invalid_module_number(first_free_slot)) + to_chat(src, "Deactivate a module first!") + return FALSE + + return equip_module_to_slot(item_module, first_free_slot) + +/** + * Is passed an item and a module slot. Equips the item to that borg slot. + * + * Arguments + * * item_module - the item being equipped to a slot + * * module_num - the slot number being equipped to. + */ +/mob/living/silicon/robot/proc/equip_module_to_slot(obj/item/item_module, module_num) + switch(module_num) + if(1) + item_module.screen_loc = inv1.screen_loc + if(2) + item_module.screen_loc = inv2.screen_loc + if(3) + item_module.screen_loc = inv3.screen_loc + + held_items[module_num] = item_module + item_module.equipped(src, ITEM_SLOT_HANDS) + item_module.mouse_opacity = initial(item_module.mouse_opacity) + item_module.layer = ABOVE_HUD_LAYER + item_module.plane = ABOVE_HUD_PLANE + item_module.forceMove(src) + + if(istype(item_module, /obj/item/borg/sight)) + var/obj/item/borg/sight/borg_sight = item_module + sight_mode |= borg_sight.sight_mode + update_sight() + + observer_screen_update(item_module, TRUE) + return TRUE + +/** + * Unequips item item_module from slot module_num. Deletes it if delete_after = TRUE. + * + * Arguments + * * item_module - the item being unequipped + * * module_num - the slot number being unequipped. + */ +/mob/living/silicon/robot/proc/unequip_module_from_slot(obj/item/item_module, module_num) + if(QDELETED(item_module)) + CRASH("unequip_module_from_slot called with improper item_module") + + if(!(item_module in module.modules)) + CRASH("unequip_module_from_slot called with item_module not in module.modules") + + item_module.mouse_opacity = MOUSE_OPACITY_OPAQUE + + if(istype(item_module, /obj/item/storage/bag/tray/)) + SEND_SIGNAL(item_module, COMSIG_TRY_STORAGE_QUICK_EMPTY) + if(istype(item_module, /obj/item/borg/sight)) + var/obj/item/borg/sight/borg_sight = item_module + sight_mode &= ~borg_sight.sight_mode + update_sight() + + if(client) + client.screen -= item_module + + if(module_active == item_module) + module_active = null + + switch(module_num) + if(1) + if(!(disabled_modules & BORG_MODULE_ALL_DISABLED)) + inv1.icon_state = initial(inv1.icon_state) + if(2) + if(!(disabled_modules & BORG_MODULE_TWO_DISABLED)) + inv2.icon_state = initial(inv2.icon_state) + if(3) + if(!(disabled_modules & BORG_MODULE_THREE_DISABLED)) + inv3.icon_state = initial(inv3.icon_state) + + if(item_module.item_flags & DROPDEL) + item_module.item_flags &= ~DROPDEL //we shouldn't HAVE things with DROPDEL_1 in our modules, but better safe than runtiming horribly + + held_items[module_num] = null + item_module.cyborg_unequip(src) + item_module.forceMove(module) //Return item to module so it appears in its contents, so it can be taken out again. + + observer_screen_update(item_module, FALSE) + hud_used.update_robot_modules_display() + return TRUE + +/** + * Breaks the slot number, changing the icon. + * + * Arguments + * * module_num - the slot number being repaired. + */ +/mob/living/silicon/robot/proc/break_cyborg_slot(module_num) + if(is_invalid_module_number(module_num, TRUE)) + return FALSE + + if(held_items[module_num]) //If there's a held item, unequip it first. + if(!unequip_module_from_slot(held_items[module_num], module_num)) //If we fail to unequip it, then don't continue + return FALSE + + switch(module_num) + if(1) + if(disabled_modules & BORG_MODULE_ALL_DISABLED) + return FALSE + + inv1.icon_state = "[initial(inv1.icon_state)] +b" + disabled_modules |= BORG_MODULE_ALL_DISABLED + + playsound(src, 'sound/machines/warning-buzzer.ogg', 75, TRUE, TRUE) + audible_message("[src] sounds an alarm! \"CRITICAL ERROR: ALL modules OFFLINE.\"") + to_chat(src, "CRITICAL ERROR: ALL modules OFFLINE.") + + if(2) + if(disabled_modules & BORG_MODULE_TWO_DISABLED) + return FALSE + + inv2.icon_state = "[initial(inv2.icon_state)] +b" + disabled_modules |= BORG_MODULE_TWO_DISABLED + + playsound(src, 'sound/machines/warning-buzzer.ogg', 60, TRUE, TRUE) + audible_message("[src] sounds an alarm! \"SYSTEM ERROR: Module [module_num] OFFLINE.\"") + to_chat(src, "SYSTEM ERROR: Module [module_num] OFFLINE.") + + if(3) + if(disabled_modules & BORG_MODULE_THREE_DISABLED) + return FALSE + + inv3.icon_state = "[initial(inv3.icon_state)] +b" + disabled_modules |= BORG_MODULE_THREE_DISABLED + + playsound(src, 'sound/machines/warning-buzzer.ogg', 50, TRUE, TRUE) + audible_message("[src] sounds an alarm! \"SYSTEM ERROR: Module [module_num] OFFLINE.\"") + to_chat(src, "SYSTEM ERROR: Module [module_num] OFFLINE.") + + return TRUE -/mob/living/silicon/robot/proc/observer_screen_update(obj/item/I,add = TRUE) +/** + * Breaks all of a cyborg's slots. + */ +/mob/living/silicon/robot/proc/break_all_cyborg_slots() + for(var/cyborg_slot in 1 to 3) + break_cyborg_slot(cyborg_slot) + +/** + * Repairs the slot number, updating the icon. + * + * Arguments + * * module_num - the module number being repaired. + */ +/mob/living/silicon/robot/proc/repair_cyborg_slot(module_num) + if(is_invalid_module_number(module_num, TRUE)) + return FALSE + + switch(module_num) + if(1) + if(!(disabled_modules & BORG_MODULE_ALL_DISABLED)) + return FALSE + + inv1.icon_state = initial(inv1.icon_state) + disabled_modules &= ~BORG_MODULE_ALL_DISABLED + if(2) + if(!(disabled_modules & BORG_MODULE_TWO_DISABLED)) + return FALSE + + inv2.icon_state = initial(inv2.icon_state) + disabled_modules &= ~BORG_MODULE_TWO_DISABLED + if(3) + if(!(disabled_modules & BORG_MODULE_THREE_DISABLED)) + return FALSE + + inv3.icon_state = initial(inv3.icon_state) + disabled_modules &= ~BORG_MODULE_THREE_DISABLED + + to_chat(src, "ERROR CLEARED: Module [module_num] back online.") + + return TRUE + +/** + * Repairs all slots. Unbroken slots are unaffected. + */ +/mob/living/silicon/robot/proc/repair_all_cyborg_slots() + for(var/cyborg_slot in 1 to 3) + repair_cyborg_slot(cyborg_slot) + +/** + * Updates the observers's screens with cyborg itemss. + * Arguments + * * item_module - the item being added or removed from the screen + * * add - whether or not the item is being added, or removed. + */ +/mob/living/silicon/robot/proc/observer_screen_update(obj/item/item_module, add = TRUE) if(observers && observers.len) for(var/M in observers) var/mob/dead/observe = M if(observe.client && observe.client.eye == src) if(add) - observe.client.screen += I + observe.client.screen += item_module else - observe.client.screen -= I + observe.client.screen -= item_module else observers -= observe if(!observers.len) observers = null break +/** + * Unequips the active held item, if there is one. + */ /mob/living/silicon/robot/proc/uneq_active() - uneq_module(module_active) + if(module_active) + unequip_module_from_slot(module_active, get_selected_module()) +/** + * Unequips all held items. + */ /mob/living/silicon/robot/proc/uneq_all() - for(var/obj/item/I in held_items) - uneq_module(I) + for(var/cyborg_slot in 1 to 3) + if(!held_items[cyborg_slot]) + continue + unequip_module_from_slot(held_items[cyborg_slot], cyborg_slot) -/mob/living/silicon/robot/proc/activated(obj/item/O) - if(O in held_items) +/** + * Checks if the item is currently in a slot. + * + * If the item is found in a slot, this returns TRUE. Otherwise, it returns FALSE + * Arguments + * * item_module - the item being checked + */ +/mob/living/silicon/robot/proc/activated(obj/item/item_module) + if(item_module in held_items) return TRUE return FALSE -//Helper procs for cyborg modules on the UI. -//These are hackish but they help clean up code elsewhere. +/** + * Checks if the provided module number is a valid number. + * + * If the number is between 1 and 3 (if check_all_slots is true) or between 1 and the number of disabled + * modules (if check_all_slots is false), then it returns FALSE. Otherwise, it returns TRUE. + * Arguments + * * module_num - the passed module num that is checked for validity. + * * check_all_slots - TRUE = the proc checks all slots | FALSE = the proc only checks un-disabled slots + */ +/mob/living/silicon/robot/proc/is_invalid_module_number(module_num, check_all_slots = FALSE) + if(!module_num) + return TRUE -//module_selected(module) - Checks whether the module slot specified by "module" is currently selected. -/mob/living/silicon/robot/proc/module_selected(module) //Module is 1-3 - return module == get_selected_module() + /// The number of module slots we're checking + var/max_number = 3 + if(!check_all_slots) + if(disabled_modules & BORG_MODULE_ALL_DISABLED) + max_number = 0 + else if(disabled_modules & BORG_MODULE_TWO_DISABLED) + max_number = 1 + else if(disabled_modules & BORG_MODULE_THREE_DISABLED) + max_number = 2 -//module_active(module) - Checks whether there is a module active in the slot specified by "module". -/mob/living/silicon/robot/proc/module_active(module) //Module is 1-3 - if(module < 1 || module > 3) - return FALSE + return module_num < 1 || module_num > max_number - if(LAZYLEN(held_items) >= module) - if(held_items[module]) - return TRUE - return FALSE - -//get_selected_module() - Returns the slot number of the currently selected module. Returns 0 if no modules are selected. +/** + * Returns the slot number of the selected module, or zero if no modules are selected. + */ /mob/living/silicon/robot/proc/get_selected_module() if(module_active) return held_items.Find(module_active) return 0 -//select_module(module) - Selects the module slot specified by "module" -/mob/living/silicon/robot/proc/select_module(module) //Module is 1-3 - if(module < 1 || module > 3) - return +/** + * Selects the module in the slot module_num. + * Arguments + * * module_num - the slot number being selected + */ +/mob/living/silicon/robot/proc/select_module(module_num) + if(is_invalid_module_number(module_num) || !held_items[module_num]) //If the slot number is invalid, or there's nothing there, we have nothing to equip + return FALSE - if(!module_active(module)) - return - - switch(module) + switch(module_num) if(1) - if(module_active != held_items[module]) - inv1.icon_state = "inv1 +a" - inv2.icon_state = "inv2" - inv3.icon_state = "inv3" + if(module_active != held_items[module_num]) + inv1.icon_state = "[initial(inv1.icon_state)] +a" if(2) - if(module_active != held_items[module]) - inv1.icon_state = "inv1" - inv2.icon_state = "inv2 +a" - inv3.icon_state = "inv3" + if(module_active != held_items[module_num]) + inv2.icon_state = "[initial(inv2.icon_state)] +a" if(3) - if(module_active != held_items[module]) - inv1.icon_state = "inv1" - inv2.icon_state = "inv2" - inv3.icon_state = "inv3 +a" - module_active = held_items[module] + if(module_active != held_items[module_num]) + inv3.icon_state = "[initial(inv3.icon_state)] +a" + module_active = held_items[module_num] + return TRUE -//deselect_module(module) - Deselects the module slot specified by "module" -/mob/living/silicon/robot/proc/deselect_module(module) //Module is 1-3 - if(module < 1 || module > 3) - return - - if(!module_active(module)) - return - - switch(module) +/** + * Deselects the module in the slot module_num. + * Arguments + * * module_num - the slot number being de-selected + */ +/mob/living/silicon/robot/proc/deselect_module(module_num) + switch(module_num) if(1) - if(module_active == held_items[module]) - inv1.icon_state = "inv1" + if(module_active == held_items[module_num]) + inv1.icon_state = initial(inv1.icon_state) if(2) - if(module_active == held_items[module]) - inv2.icon_state = "inv2" + if(module_active == held_items[module_num]) + inv2.icon_state = initial(inv2.icon_state) if(3) - if(module_active == held_items[module]) - inv3.icon_state = "inv3" + if(module_active == held_items[module_num]) + inv3.icon_state = initial(inv3.icon_state) module_active = null + return TRUE -//toggle_module(module) - Toggles the selection of the module slot specified by "module". -/mob/living/silicon/robot/proc/toggle_module(module) //Module is 1-3 - if(module < 1 || module > 3) - return +/** + * Toggles selection of the module in the slot module_num. + * Arguments + * * module_num - the slot number being toggled + */ +/mob/living/silicon/robot/proc/toggle_module(module_num) + if(is_invalid_module_number(module_num)) + return FALSE - if(module_selected(module)) - deselect_module(module) - else - if(module_active(module)) - select_module(module) - else - deselect_module(get_selected_module()) //If we can't do select anything, at least deselect the current module. - return + if(module_num == get_selected_module()) + deselect_module(module_num) + return TRUE -//cycle_modules() - Cycles through the list of selected modules. + if(module_active != held_items[module_num]) + deselect_module(get_selected_module()) + + return select_module(module_num) + +/** + * Cycles through the list of enabled modules, deselecting the current one and selecting the next one. + */ /mob/living/silicon/robot/proc/cycle_modules() var/slot_start = get_selected_module() + var/slot_num if(slot_start) deselect_module(slot_start) //Only deselect if we have a selected slot. - - var/slot_num - if(slot_start == 0) + slot_num = slot_start + 1 + else slot_num = 1 slot_start = 4 - else - slot_num = slot_start + 1 while(slot_num != slot_start) //If we wrap around without finding any free slots, just give up. - if(module_active(slot_num)) - select_module(slot_num) + if(select_module(slot_num)) return slot_num++ if(slot_num > 4) // not >3 otherwise cycling with just one item on module 3 wouldn't work slot_num = 1 //Wrap around. - - /mob/living/silicon/robot/swap_hand() cycle_modules() diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 910a2a6fea0..afad167f231 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -4,7 +4,6 @@ return ..() - adjustOxyLoss(-10) //we're a robot! handle_robot_hud_updates() handle_robot_cell() @@ -100,4 +99,3 @@ mobility_flags = MOBILITY_FLAGS_DEFAULT update_transform() update_action_buttons_icon() - diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 57fa699c111..70f46207645 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -24,6 +24,8 @@ var/mob/living/silicon/ai/mainframe = null var/datum/action/innate/undeployment/undeployment_action = new + /// the last health before updating - to check net change in health + var/previous_health //Hud stuff var/obj/screen/inv1 = null @@ -41,6 +43,9 @@ var/obj/item/module_active = null held_items = list(null, null, null) //we use held_items for the module holding, because that makes sense to do! + /// For checking which modules are disabled or not. + var/disabled_modules + var/mutable_appearance/eye_lights var/mob/living/silicon/ai/connected_ai = null @@ -110,6 +115,8 @@ ident = rand(1, 999) + previous_health = health + if(ispath(cell)) cell = new cell(src) @@ -220,7 +227,6 @@ module.transform_to(modulelist[input_module]) - /mob/living/silicon/robot/proc/updatename(client/C) if(shell) return @@ -447,11 +453,10 @@ /mob/living/silicon/robot/proc/self_destruct() if(emagged) - if(mmi) - qdel(mmi) - explosion(src.loc,1,2,4,flame_range = 2) + QDEL_NULL(mmi) + explosion(loc,1,2,4,flame_range = 2) else - explosion(src.loc,-1,0,2) + explosion(loc,-1,0,2) gib() /mob/living/silicon/robot/proc/UnlinkSelf() @@ -705,21 +710,30 @@ /mob/living/silicon/robot/updatehealth() ..() - if(health < maxHealth*0.5) //Gradual break down of modules as more damage is sustained - if(uneq_module(held_items[3])) - playsound(loc, 'sound/machines/warning-buzzer.ogg', 50, TRUE, TRUE) - audible_message("[src] sounds an alarm! \"SYSTEM ERROR: Module 3 OFFLINE.\"") - to_chat(src, "SYSTEM ERROR: Module 3 OFFLINE.") - if(health < 0) - if(uneq_module(held_items[2])) - audible_message("[src] sounds an alarm! \"SYSTEM ERROR: Module 2 OFFLINE.\"") - to_chat(src, "SYSTEM ERROR: Module 2 OFFLINE.") - playsound(loc, 'sound/machines/warning-buzzer.ogg', 60, TRUE, TRUE) - if(health < -maxHealth*0.5) - if(uneq_module(held_items[1])) - audible_message("[src] sounds an alarm! \"CRITICAL ERROR: All modules OFFLINE.\"") - to_chat(src, "CRITICAL ERROR: All modules OFFLINE.") - playsound(loc, 'sound/machines/warning-buzzer.ogg', 75, TRUE, TRUE) + + /// the current percent health of the robot (-1 to 1) + var/percent_hp = health/maxHealth + if(health <= previous_health) //if change in health is negative (we're losing hp) + if(percent_hp <= 0.5) + break_cyborg_slot(3) + + if(percent_hp <= 0) + break_cyborg_slot(2) + + if(percent_hp <= -0.5) + break_cyborg_slot(1) + + else //if change in health is positive (we're gaining hp) + if(percent_hp >= 0.5) + repair_cyborg_slot(3) + + if(percent_hp >= 0) + repair_cyborg_slot(2) + + if(percent_hp >= -0.5) + repair_cyborg_slot(1) + + previous_health = health /mob/living/silicon/robot/update_sight() if(!client) @@ -968,6 +982,8 @@ mainframe.diag_hud_set_deployed() if(mainframe.laws) mainframe.laws.show_laws(mainframe) //Always remind the AI when switching + if(mainframe.eyeobj) + mainframe.eyeobj.setLoc(loc) mainframe = null /mob/living/silicon/robot/attack_ai(mob/user) @@ -980,7 +996,7 @@ cell = null /mob/living/silicon/robot/mouse_buckle_handling(mob/living/M, mob/living/user) - if(can_buckle && istype(M) && !(M in buckled_mobs) && ((user!=src)||(a_intent != INTENT_HARM))) + if(can_buckle && isliving(user) && isliving(M) && !(M in buckled_mobs) && ((user != src) || (a_intent != INTENT_HARM))) if(buckle_mob(M)) return TRUE diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 358464b81be..bc872ba0608 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -18,7 +18,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real return adjustBruteLoss(-30) - updatehealth() add_fingerprint(user) visible_message("[user] fixes some of the dents on [src].") return @@ -33,8 +32,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real return if (coil.use(1)) adjustFireLoss(-30) - adjustToxLoss(-30) - updatehealth() user.visible_message("[user] fixes some of the burnt wires on [src].", "You fix some of the burnt wires on [src].") else to_chat(user, "You need more cable to repair [src]!") @@ -268,7 +265,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real damage = rand(5, 35) damage = round(damage / 2) // borgs receive half damage adjustBruteLoss(damage) - updatehealth() return @@ -399,25 +395,3 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real updatehealth() if(prob(75) && Proj.damage > 0) spark_system.start() - - -/mob/living/silicon/robot/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(isnull(.)) - return - if(. <= (maxHealth * 0.5)) - if(getOxyLoss() > (maxHealth * 0.5)) - ADD_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) - else if(getOxyLoss() <= (maxHealth * 0.5)) - REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) - - -/mob/living/silicon/robot/setOxyLoss(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(isnull(.)) - return - if(. <= (maxHealth * 0.5)) - if(getOxyLoss() > (maxHealth * 0.5)) - ADD_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) - else if(getOxyLoss() <= (maxHealth * 0.5)) - REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index a9cbaf00e81..8db514ba47b 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -161,7 +161,8 @@ /obj/item/robot_module/proc/rebuild_modules() //builds the usable module list from the modules we have var/mob/living/silicon/robot/R = loc - var/held_modules = R.held_items.Copy() + var/list/held_modules = R.held_items.Copy() + var/active_module = R.module_active R.uneq_all() modules = list() for(var/obj/item/I in basic_modules) @@ -173,7 +174,9 @@ add_module(I, FALSE, FALSE) for(var/i in held_modules) if(i) - R.activate_module(i) + R.equip_module_to_slot(i, held_modules.Find(i)) + if(active_module) + R.select_module(held_modules.Find(active_module)) if(R.hud_used) R.hud_used.update_robot_modules_display() @@ -215,7 +218,7 @@ flick("[cyborg_base_icon]_transform", R) R.notransform = TRUE R.SetLockdown(1) - R.anchored = TRUE + R.set_anchored(TRUE) sleep(1) for(var/i in 1 to 4) playsound(R, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1) @@ -223,8 +226,9 @@ if(!prev_lockcharge) R.SetLockdown(0) R.setDir(SOUTH) - R.anchored = FALSE + R.set_anchored(FALSE) R.notransform = FALSE + R.updatehealth() R.update_headlamp(FALSE, BORG_LAMP_CD_RESET) R.notify_ai(NEW_MODULE) if(R.hud_used) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index be914903255..de8ea801b82 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -215,6 +215,9 @@ statelaws() if (href_list["printlawtext"]) // this is kinda backwards + if (href_list["dead"] && (!isdead(usr) && !usr.client.holder)) // do not print deadchat law notice if the user is now alive + to_chat(usr, "You cannot view law changes that were made while you were dead.") + return to_chat(usr, href_list["printlawtext"]) return diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 13c4364f73c..5068397f9cd 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -41,14 +41,6 @@ adjustBruteLoss(damage) if(BURN) adjustFireLoss(damage) - if(TOX) - adjustToxLoss(damage) - if(OXY) - adjustOxyLoss(damage) - if(CLONE) - adjustCloneLoss(damage) - if(STAMINA) - adjustStaminaLoss(damage) /mob/living/silicon/attack_paw(mob/living/user) return attack_hand(user) diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm index 518572b1449..4fb39e54783 100644 --- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm +++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm @@ -77,7 +77,7 @@ if(Adjacent(target) && isturf(target.loc)) // if right next to perp target_lastloc = target.loc //stun_attack() can clear the target if they're dead, so this needs to be set first stun_attack(target) - anchored = TRUE + set_anchored(TRUE) return else // not next to perp var/turf/olddist = get_dist(src, target) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 1a3afbd358d..866b5536e33 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -130,6 +130,7 @@ update_mobility() set_light(initial(light_range)) update_icon() + to_chat(src, "You turned on!") diag_hud_set_botstat() return TRUE @@ -138,6 +139,7 @@ update_mobility() set_light(0) bot_reset() //Resets an AI's call, should it exist. + to_chat(src, "You turned off!") update_icon() /mob/living/simple_animal/bot/Initialize() diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 9ec194dce53..89fdd74fe19 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -312,18 +312,14 @@ target_types = typecacheof(target_types) /mob/living/simple_animal/bot/cleanbot/UnarmedAttack(atom/A) - if(is_cleanable(A)) + if(ismopable(A)) icon_state = "cleanbot-c" mode = BOT_CLEANING var/turf/T = get_turf(A) if(do_after(src, 1, target = T)) - SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) + T.wash(CLEAN_WASH) visible_message("[src] cleans \the [T].") - for(var/atom/dirtything in T) - if(is_cleanable(dirtything)) - qdel(dirtything) - target = null mode = BOT_IDLE diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index d825667116d..62fcac4897c 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -148,7 +148,7 @@ if("autotile") autotile = !autotile if("anchor") - anchored = !anchored + set_anchored(!anchored) if("eject") if(specialtiles && tiletype != null) empty_tiles() @@ -235,7 +235,7 @@ repair(target) else if(emagged == 2 && isfloorturf(target)) var/turf/open/floor/F = target - anchored = TRUE + set_anchored(TRUE) mode = BOT_REPAIRING F.ReplaceWithLattice() audible_message("[src] makes an excited booping sound.") @@ -283,11 +283,11 @@ if(HULL_BREACH) //The most common job, patching breaches in the station's hull. if(is_hull_breach(scan_target)) //Ensure that the targeted space turf is actually part of the station, and not random space. result = scan_target - anchored = TRUE //Prevent the floorbot being blown off-course while trying to reach a hull breach. + set_anchored(TRUE) //Prevent the floorbot being blown off-course while trying to reach a hull breach. if(LINE_SPACE_MODE) //Space turfs in our chosen direction are considered. if(get_dir(src, scan_target) == targetdirection) result = scan_target - anchored = TRUE + set_anchored(TRUE) if(PLACE_TILE) F = scan_target if(isplatingturf(F)) //The floor must not already have a tile. @@ -318,7 +318,7 @@ else if(!isfloorturf(target_turf)) return if(isspaceturf(target_turf)) //If we are fixing an area not part of pure space, it is - anchored = TRUE + set_anchored(TRUE) icon_state = "[toolbox_color]floorbot-c" visible_message("[targetdirection ? "[src] begins installing a bridge plating." : "[src] begins to repair the hole."] ") mode = BOT_REPAIRING @@ -333,7 +333,7 @@ var/turf/open/floor/F = target_turf if(F.type != initial(tiletype.turf_type) && (F.broken || F.burnt || isplatingturf(F)) || F.type == (initial(tiletype.turf_type) && (F.broken || F.burnt))) - anchored = TRUE + set_anchored(TRUE) icon_state = "[toolbox_color]floorbot-c" mode = BOT_REPAIRING visible_message("[src] begins repairing the floor.") @@ -344,7 +344,7 @@ F.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) if(replacetiles && F.type != initial(tiletype.turf_type) && specialtiles && !isplatingturf(F)) - anchored = TRUE + set_anchored(TRUE) icon_state = "[toolbox_color]floorbot-c" mode = BOT_REPAIRING visible_message("[src] begins replacing the floor tiles.") diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 73feb8384a5..1c097e736df 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -250,7 +250,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, if(threatlevel >= 6) set waitfor = 0 stun_attack(target) - anchored = FALSE + set_anchored(FALSE) target_lastloc = target.loc return diff --git a/code/modules/mob/living/simple_animal/bot/hygienebot.dm b/code/modules/mob/living/simple_animal/bot/hygienebot.dm index ed4a8aba02d..4c476ef2148 100644 --- a/code/modules/mob/living/simple_animal/bot/hygienebot.dm +++ b/code/modules/mob/living/simple_animal/bot/hygienebot.dm @@ -234,7 +234,7 @@ Maintenance panel is [open ? "opened" : "closed"]"} if(emagged) A.fire_act() //lol pranked no cleaning besides that else - A.washed(src) + A.wash(CLEAN_WASH) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 1d0da61f1b4..fba1b774c05 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -203,7 +203,7 @@ if(tech_boosters) heal_amount = (round(tech_boosters/2,0.1)*initial(heal_amount))+initial(heal_amount) //every 2 tend wounds tech gives you an extra 100% healing, adjusting for unique branches (combo is bonus) if(oldheal_amount < heal_amount) - speak("Surgical Knowledge Found! Efficiency is increased by [round(heal_amount/oldheal_amount*100)]%!") + speak("New knowledge found! Surgical efficacy improved to [round(heal_amount/initial(heal_amount)*100)]%!") update_controls() return @@ -264,9 +264,8 @@ else messagevoice = list("Thank you!" = 'sound/voice/medbot/thank_you.ogg', "You are a good person." = 'sound/voice/medbot/youre_good.ogg') else - visible_message("[src] manages to writhe wiggle enough to right itself.") + visible_message("[src] manages to wriggle enough to right itself.") messagevoice = list("Fuck you." = 'sound/voice/medbot/fuck_you.ogg', "Your behavior has been reported, have a nice day." = 'sound/voice/medbot/reported.ogg') - tipper_name = null if(world.time > last_tipping_action_voice + 15 SECONDS) last_tipping_action_voice = world.time @@ -539,7 +538,8 @@ if(!treatment_method && emagged != 2) //If they don't need any of that they're probably cured! if(C.maxHealth - C.get_organic_health() < heal_threshold) - to_chat(src, "[C] is healthy! Your programming prevents you from injecting anyone without at least [heal_threshold] damage of any one type ([heal_threshold + 5] for oxygen damage.)") + to_chat(src, "[C] is healthy! Your programming prevents you from tending the wounds of anyone without at least [heal_threshold] damage of any one type ([heal_threshold + 5] for oxygen damage.)") + var/list/messagevoice = list("All patched up!" = 'sound/voice/medbot/patchedup.ogg',"An apple a day keeps me away." = 'sound/voice/medbot/apple.ogg',"Feel better soon!" = 'sound/voice/medbot/feelbetter.ogg') var/message = pick(messagevoice) speak(message) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 52c3fb37d89..800aea566fa 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -30,6 +30,7 @@ bot_type = MULE_BOT model = "MULE" bot_core_type = /obj/machinery/bot_core/mulebot + hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_PATH_HUD = HUD_LIST_LIST) //Diagnostic HUD views /// unique identifier in case there are multiple mulebots. var/id @@ -50,6 +51,7 @@ var/report_delivery = TRUE /// true if bot will announce an arrival to a location. var/obj/item/stock_parts/cell/cell /// Internal Powercell + var/cell_move_power_usage = 1///How much power we use when we move. var/bloodiness = 0 ///If we've run over a mob, how many tiles will we leave tracks on while moving var/num_steps = 0 ///The amount of steps we should take until we rest for a time. @@ -75,6 +77,7 @@ D.set_vehicle_dir_layer(NORTH, layer) D.set_vehicle_dir_layer(EAST, layer) D.set_vehicle_dir_layer(WEST, layer) + diag_hud_set_mulebotcell() /mob/living/simple_animal/bot/mulebot/ComponentInitialize() . = ..() @@ -86,6 +89,7 @@ if(A == cell) turn_off() cell = null + diag_hud_set_mulebotcell() return ..() /mob/living/simple_animal/bot/mulebot/examine(mob/user) @@ -148,6 +152,7 @@ if(!user.transferItemToLoc(I, src)) return cell = I + diag_hud_set_mulebotcell() visible_message("[user] inserts \a [cell] into [src].", "You insert [cell] into [src].") else if(I.tool_behaviour == TOOL_CROWBAR && open && user.a_intent != INTENT_HARM) @@ -162,6 +167,7 @@ visible_message("[user] crowbars [cell] out from [src].", "You pry [cell] out of [src].") cell = null + diag_hud_set_mulebotcell() else if(is_wire_tool(I) && open) return attack_hand(user) else if(load && ismob(load)) // chance to knock off rider @@ -246,7 +252,7 @@ data["modeStatus"] = "average" if(BOT_NO_ROUTE) data["modeStatus"] = "bad" - data["load"] = load ? load.name : null //IF YOU CHANGE THE NAME OF THIS, UPDATE MULEBOT/PARANORMAL/UI_DATA. + data["load"] = get_load_name() data["destination"] = destination ? destination : null data["home"] = home_destination data["destinations"] = GLOB.deliverybeacontags @@ -359,8 +365,9 @@ dat += "[mode_name[BOT_NO_ROUTE]]" dat += "
" - dat += "Current Load: [isobserver(load) ? "Unknown" : (load ? load.name : "None")]
" - dat += "Destination: [!destination ? "none" : destination]
" + var/load_message = get_load_name() + dat += "Current Load: [load_message ? load_message : "None"]
" + dat += "Destination: [!destination ? "None" : destination]
" dat += "Power level: [cell ? cell.percent() : 0]%" if(locked && !ai && !isAdminGhostAI(user)) @@ -452,6 +459,10 @@ mode = BOT_IDLE update_icon() +///resolves the name to display for the loaded mob. primarily needed for the paranormal subtype since we don't want to show the name of ghosts riding it. +/mob/living/simple_animal/bot/mulebot/proc/get_load_name() + return load ? load.name : null + /mob/living/simple_animal/bot/mulebot/proc/load_mob(mob/living/M) can_buckle = TRUE if(buckle_mob(M)) @@ -492,6 +503,15 @@ update_icon() +/mob/living/simple_animal/bot/mulebot/Stat() + ..() + if(statpanel("Status")) + if(cell) + stat("Charge Left:", "[cell.charge]/[cell.maxcharge]") + else + stat(null, text("No Cell Inserted!")) + if(load) + stat("Current Load:", get_load_name()) /mob/living/simple_animal/bot/mulebot/call_bot() ..() @@ -502,6 +522,9 @@ start() /mob/living/simple_animal/bot/mulebot/Move(atom/newloc, direct) //handle leaving bloody tracks. can't be done via Moved() since that can end up putting the tracks somewhere BEFORE we get bloody. + if(!has_power((client || paicard))) //turn off if we ran out of power. + turn_off() + return FALSE if(!bloodiness) //important to check this first since Bump() is called in the Move() -> Entered() chain return ..() var/atom/oldLoc = loc @@ -513,6 +536,15 @@ B.setDir(direct) bloodiness-- +/mob/living/simple_animal/bot/mulebot/Moved() //make sure we always use power after moving. + . = ..() + if(!cell) + return + cell.use(cell_move_power_usage) + if(cell.charge < cell_move_power_usage) //make sure we have enough power to move again, otherwise turn off. + turn_off() + diag_hud_set_mulebotcell() + /mob/living/simple_animal/bot/mulebot/handle_automated_action() if(!on) return @@ -551,7 +583,6 @@ if(isturf(next)) var/oldloc = loc var/moved = step_towards(src, next) // attempt to move - cell.use(1) if(moved && oldloc!=loc) // successful move blockcount = 0 path -= loc @@ -853,11 +884,10 @@ ghost_overlay.pixel_y = 12 . += ghost_overlay -/mob/living/simple_animal/bot/mulebot/paranormal/ui_data(mob/user) - var/list/data = ..() - if(isobserver(load)) - data["load"] = "Unknown" //don't reveal the name of the ghost to prevent metagaming. - return data +/mob/living/simple_animal/bot/mulebot/paranormal/get_load_name() //Don't reveal the name of ghosts so we can't metagame who died and all that. + . = ..() + if(. && isobserver(load)) + return "Unknown" /mob/living/simple_animal/bot/mulebot/paranormal/proc/ghostmoved() visible_message("The ghostly figure vanishes...") diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 557c3135938..5975700e3a6 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -325,7 +325,7 @@ Auto Patrol: []"}, stun_attack(target) mode = BOT_PREP_ARREST - anchored = TRUE + set_anchored(TRUE) target_lastloc = target.loc return @@ -359,7 +359,7 @@ Auto Patrol: []"}, if(BOT_ARREST) if(!target) - anchored = FALSE + set_anchored(FALSE) mode = BOT_IDLE last_found = world.time frustration = 0 @@ -377,7 +377,7 @@ Auto Patrol: []"}, return else //Try arresting again if the target escapes. mode = BOT_PREP_ARREST - anchored = FALSE + set_anchored(FALSE) if(BOT_START_PATROL) look_for_perp() diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index a0bbb585dd7..f8124dc3078 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -535,20 +535,20 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the [mob_name] of [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_HOLOPARASITE) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - spawn_guardian(user, C.key) + var/mob/dead/observer/candidate = pick(candidates) + spawn_guardian(user, candidate) else to_chat(user, "[failure_message]") used = FALSE -/obj/item/guardiancreator/proc/spawn_guardian(mob/living/user, key) +/obj/item/guardiancreator/proc/spawn_guardian(mob/living/user, mob/dead/candidate) var/guardiantype = "Standard" if(random) guardiantype = pick(possible_guardians) else guardiantype = input(user, "Pick the type of [mob_name]", "[mob_name] Creation") as null|anything in sortList(possible_guardians) - if(!guardiantype) + if(!guardiantype || !candidate.client) to_chat(user, "[failure_message]" ) used = FALSE return @@ -596,7 +596,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians var/mob/living/simple_animal/hostile/guardian/G = new pickedtype(user, theme) G.name = mob_name G.summoner = user - G.key = key + G.key = candidate.key G.mind.enslave_mind_to_creator(user) log_game("[key_name(user)] has summoned [key_name(G)], a [guardiantype] holoparasite.") switch(theme) diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 1030ba9fd09..b9a4407a57e 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -177,11 +177,9 @@ /mob/living/simple_animal/hostile/alien/maid/AttackingTarget() if(ismovable(target)) + target.wash(CLEAN_WASH) if(istype(target, /obj/effect/decal/cleanable)) visible_message("[src] cleans up \the [target].") - qdel(target) - return TRUE - var/atom/movable/M = target - SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - visible_message("[src] polishes \the [target].") + else + visible_message("[src] polishes \the [target].") return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 7f3056ec998..056a448f349 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -29,7 +29,7 @@ melee_damage_upper = 15 wound_bonus = -5 bare_wound_bonus = 10 // BEAR wound bonus am i right - sharpness = TRUE + sharpness = SHARP_EDGED attack_verb_continuous = "claws" attack_verb_simple = "claw" attack_sound = 'sound/weapons/bladeslice.ogg' @@ -128,7 +128,7 @@ to_chat(user, "You strap the armor plating to [A] and sharpen [A.p_their()] claws with the nail filer. This was a great idea.") qdel(src) -mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Several functions used from it. +/mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Several functions used from it. name = "Terrygold" icon_state = "butterbear" icon_living = "butterbear" @@ -173,7 +173,7 @@ mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Seve to_chat(src, "Your name is now \"new_name\"!") name = new_name -mob/living/simple_animal/hostile/bear/butter/AttackingTarget() //Makes some attacks by the butter bear slip those who dare cross its path. +/mob/living/simple_animal/hostile/bear/butter/AttackingTarget() //Makes some attacks by the butter bear slip those who dare cross its path. if(isliving(target)) var/mob/living/L = target if((L.mobility_flags & MOBILITY_STAND)) diff --git a/code/modules/mob/living/simple_animal/hostile/cockroach.dm b/code/modules/mob/living/simple_animal/hostile/cockroach.dm index 8008858a8bd..f50d8fd9724 100644 --- a/code/modules/mob/living/simple_animal/hostile/cockroach.dm +++ b/code/modules/mob/living/simple_animal/hostile/cockroach.dm @@ -96,7 +96,7 @@ gold_core_spawnable = HOSTILE_SPAWN attack_sound = 'sound/weapons/bladeslice.ogg' faction = list("hostile") - sharpness = IS_SHARP + sharpness = SHARP_POINTY squish_chance = 0 // manual squish if relevant /mob/living/simple_animal/hostile/cockroach/hauberoach/ComponentInitialize() diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 78fed859431..fa33a58b4a5 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -466,7 +466,7 @@ DestroyObjectsInDirection(direction) -mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with megafauna destroying everything around them +/mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with megafauna destroying everything around them if(environment_smash) EscapeConfinement() for(var/dir in GLOB.cardinals) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index f469e1edb5c..d18d05fda0c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -291,6 +291,7 @@ Difficulty: Very Hard resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF pixel_y = -4 use_power = NO_POWER_USE + base_build_path = /obj/machinery/smartfridge/black_box var/memory_saved = FALSE var/list/stored_items = list() var/list/blacklist = list() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 01b718a4b3b..d9f3340e3f6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -395,7 +395,7 @@ Difficulty: Medium return FALSE return ..() -/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs) +/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE) if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit return return ..() @@ -520,7 +520,7 @@ Difficulty: Medium else animate(src, pixel_x = -16, pixel_z = 0, time = 5) -obj/effect/temp_visual/fireball +/obj/effect/temp_visual/fireball icon = 'icons/obj/wizard.dmi' icon_state = "fireball" name = "fireball" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 7d0a40810dd..2d5542c6887 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -519,15 +519,15 @@ Difficulty: Hard icon_state = "wall" light_range = MINIMUM_USEFUL_LIGHT_RANGE duration = 100 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE /obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caster) . = ..() - queue_smooth_neighbors(src) - queue_smooth(src) + QUEUE_SMOOTH_NEIGHBORS(src) + QUEUE_SMOOTH(src) /obj/effect/temp_visual/hierophant/wall/Destroy() - queue_smooth_neighbors(src) + QUEUE_SMOOTH_NEIGHBORS(src) return ..() /obj/effect/temp_visual/hierophant/wall/CanAllowThrough(atom/movable/mover, turf/target) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm index de280a579d1..c0c9e3018d8 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm @@ -102,7 +102,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa /mob/living/simple_animal/hostile/swarmer/ai/Initialize() . = ..() - ToggleLight() //so you can see them eating you out of house and home/shooting you/stunlocking you for eternity + toggle_light() //so you can see them eating you out of house and home/shooting you/stunlocking you for eternity LAZYINITLIST(GLOB.AISwarmersByType[type]) GLOB.AISwarmers += src GLOB.AISwarmersByType[type] += src @@ -114,7 +114,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa return ..() -/mob/living/simple_animal/hostile/swarmer/ai/SwarmerTypeToCreate() +/mob/living/simple_animal/hostile/swarmer/ai/swarmer_type_to_create() return GetUncappedAISwarmerType() @@ -124,7 +124,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa if(!stop_automated_movement) if(health < maxHealth*0.25) StartAction(100) - RepairSelf() + repair_self() return @@ -211,16 +211,16 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa if(!stop_automated_movement) if(GLOB.AISwarmers.len < GetTotalAISwarmerCap() && resources >= 50) StartAction(100) //so they'll actually sit still and use the verbs - CreateSwarmer() + create_swarmer() return if(resources > 5) if(prob(5)) //lower odds, as to prioritise reproduction StartAction(10) //not a typo - CreateBarricade() + create_barricade() return if(prob(5)) - CreateTrap() + create_trap() return @@ -267,7 +267,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa if(isliving(target)) if(prob(35)) StartAction(30) - DisperseTarget(target) + prepare_target(target) else var/mob/living/L = target L.attack_animal(src) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index ef5784a93a0..fd4b832575d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -81,7 +81,7 @@ projectiletype = /obj/projectile/temp/basilisk/heated addtimer(CALLBACK(src, .proc/cool_down), 3000) -mob/living/simple_animal/hostile/asteroid/basilisk/proc/cool_down() +/mob/living/simple_animal/hostile/asteroid/basilisk/proc/cool_down() visible_message("[src] appears to be cooling down...") if(stat != DEAD) icon_state = "Basilisk" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 16a1480e8ec..a5249905cdd 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -304,7 +304,7 @@ While using this makes the system rely on OnFire, it still gives options for tim icon = 'icons/turf/walls/hierophant_wall_temp.dmi' icon_state = "wall" duration = 50 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_TRUE layer = BELOW_MOB_LAYER color = rgb(255,0,0) light_range = MINIMUM_USEFUL_LIGHT_RANGE @@ -314,11 +314,11 @@ While using this makes the system rely on OnFire, it still gives options for tim /obj/effect/temp_visual/elite_tumor_wall/Initialize(mapload, new_caster) . = ..() - queue_smooth_neighbors(src) - queue_smooth(src) + QUEUE_SMOOTH_NEIGHBORS(src) + QUEUE_SMOOTH(src) /obj/effect/temp_visual/elite_tumor_wall/Destroy() - queue_smooth_neighbors(src) + QUEUE_SMOOTH_NEIGHBORS(src) activator = null ourelite = null return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index b0793ee453e..dec465d9516 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -209,7 +209,7 @@ * Arguments: * * turf/T - The turf to trigger the effects on. */ -mob/living/simple_animal/hostile/space_dragon/proc/dragon_fire_line(turf/T) +/mob/living/simple_animal/hostile/space_dragon/proc/dragon_fire_line(turf/T) var/list/hit_list = list() hit_list += src new /obj/effect/hotspot(T) diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 32039a58efb..936a98ab718 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -108,7 +108,7 @@ if(!can_be_seen(get_turf(loc))) ..() -/mob/living/simple_animals/hostile/statue/IsVocal() //we're a statue, of course we can't talk. +/mob/living/simple_animal/hostile/statue/IsVocal() //we're a statue, of course we can't talk. return FALSE /mob/living/simple_animal/hostile/statue/proc/can_be_seen(turf/destination) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 4804bb09e59..3deed6857b1 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -296,7 +296,7 @@ melee_damage_upper = 15 wound_bonus = -10 bare_wound_bonus = 20 - sharpness = TRUE + sharpness = SHARP_EDGED obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE attack_verb_continuous = "cuts" diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index c07032fe4e3..37af7f4139c 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -16,7 +16,7 @@ layer = SPACEVINE_MOB_LAYER opacity = 0 canSmoothWith = list() - smooth = SMOOTH_FALSE + smoothing_flags = NONE /// The amount of time it takes to create a venus human trap, in deciseconds var/growth_time = 1200 @@ -37,7 +37,7 @@ * Spawns a venus human trap, then qdels itself. * * Displays a message, spawns a human venus trap, then qdels itself. - */ + */ /obj/structure/alien/resin/flower_bud_enemy/proc/bear_fruit() visible_message("The plant has borne fruit!") new /mob/living/simple_animal/hostile/venus_human_trap(get_turf(src)) @@ -103,7 +103,7 @@ /mob/living/simple_animal/hostile/venus_human_trap/Life() . = ..() pull_vines() - + /mob/living/simple_animal/hostile/venus_human_trap/AttackingTarget() . = ..() if(isliving(target)) @@ -125,7 +125,7 @@ for(var/obj/O in T) if(O.density) return - + var/datum/beam/newVine = Beam(the_target, "vine", time=INFINITY, maxdistance = vine_grab_distance, beam_type=/obj/effect/ebeam/vine) RegisterSignal(newVine, COMSIG_PARENT_QDELETING, .proc/remove_vine, newVine) vines += newVine @@ -188,5 +188,5 @@ * Arguments: * * datum/beam/vine - The vine to be removed from the list. */ -mob/living/simple_animal/hostile/venus_human_trap/proc/remove_vine(datum/beam/vine, force) +/mob/living/simple_animal/hostile/venus_human_trap/proc/remove_vine(datum/beam/vine, force) vines -= vine diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 4f3f481226a..a7625a7b6ef 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -150,7 +150,7 @@ ///How much bare wounding power it has var/bare_wound_bonus = 0 ///If the attacks from this are sharp - var/sharpness = FALSE + var/sharpness = SHARP_NONE ///Generic flags var/simple_mob_flags = NONE diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index fec024cebf2..014929f6eee 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -18,7 +18,7 @@ /mob/living/proc/taste(datum/reagents/from) if(last_taste_time + 50 < world.time) var/taste_sensitivity = get_taste_sensitivity() - var/text_output = from.generate_taste_message(taste_sensitivity) + var/text_output = from.generate_taste_message(taste_sensitivity,src) // We dont want to spam the same message over and over again at the // person. Give it a bit of a buffer. if(hallucination > 50 && prob(25)) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 66a75d6f54b..e1a27d230c9 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -179,19 +179,27 @@ * * vision_distance (optional) define how many tiles away the message can be seen. * * ignored_mob (optional) doesn't show any message to a given mob if TRUE. */ -/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs) +/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE) var/turf/T = get_turf(src) if(!T) return + if(!islist(ignored_mobs)) ignored_mobs = list(ignored_mobs) var/list/hearers = get_hearers_in_view(vision_distance, src) //caches the hearers and then removes ignored mobs. hearers -= ignored_mobs + if(self_message) hearers -= src + + var/raw_msg = message + if(visible_message_flags & EMOTE_MESSAGE) + message = "[src] [message]" + for(var/mob/M in hearers) if(!M.client) continue + //This entire if/else chain could be in two lines but isn't for readibilties sake. var/msg = message if(M.see_invisible < invisibility)//if src is invisible to M @@ -202,10 +210,15 @@ msg = blind_message if(!msg) continue + + if(visible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(M, visible_message_flags)) + M.create_chat_message(src, raw_message = raw_msg, runechat_flags = visible_message_flags) + M.show_message(msg, MSG_VISUAL, blind_message, MSG_AUDIBLE) + ///Adds the functionality to self_message. -/mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs) +/mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE) . = ..() if(self_message) show_message(self_message, MSG_VISUAL, blind_message, MSG_AUDIBLE) @@ -220,11 +233,16 @@ * * deaf_message (optional) is what deaf people will see. * * hearing_distance (optional) is the range, how many tiles away the message can be heard. */ -/atom/proc/audible_message(message, deaf_message, hearing_distance = DEFAULT_MESSAGE_RANGE, self_message) +/atom/proc/audible_message(message, deaf_message, hearing_distance = DEFAULT_MESSAGE_RANGE, self_message, audible_message_flags = NONE) var/list/hearers = get_hearers_in_view(hearing_distance, src) if(self_message) hearers -= src + var/raw_msg = message + if(audible_message_flags & EMOTE_MESSAGE) + message = "[src] [message]" for(var/mob/M in hearers) + if(audible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(M, audible_message_flags)) + M.create_chat_message(src, raw_message = raw_msg, runechat_flags = audible_message_flags) M.show_message(message, MSG_AUDIBLE, deaf_message, MSG_VISUAL) /** @@ -238,11 +256,28 @@ * * deaf_message (optional) is what deaf people will see. * * hearing_distance (optional) is the range, how many tiles away the message can be heard. */ -/mob/audible_message(message, deaf_message, hearing_distance = DEFAULT_MESSAGE_RANGE, self_message) +/mob/audible_message(message, deaf_message, hearing_distance = DEFAULT_MESSAGE_RANGE, self_message, audible_message_flags = NONE) . = ..() if(self_message) show_message(self_message, MSG_AUDIBLE, deaf_message, MSG_VISUAL) + +///Returns the client runechat visible messages preference according to the message type. +/atom/proc/runechat_prefs_check(mob/target, visible_message_flags = NONE) + if(!target.client?.prefs.chat_on_map || !target.client.prefs.see_chat_non_mob) + return FALSE + if(visible_message_flags & EMOTE_MESSAGE && !target.client.prefs.see_rc_emotes) + return FALSE + return TRUE + +/mob/runechat_prefs_check(mob/target, visible_message_flags = NONE) + if(!target.client?.prefs.chat_on_map) + return FALSE + if(visible_message_flags & EMOTE_MESSAGE && !target.client.prefs.see_rc_emotes) + return FALSE + return TRUE + + ///Get the item on the mob in the storage slot identified by the id passed in /mob/proc/get_item_by_slot(slot_id) return null @@ -252,7 +287,7 @@ return ///Is the mob incapacitated -/mob/proc/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE) +/mob/proc/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_stasis = FALSE) return /** diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index e07f93fef57..d6b6e4839df 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -205,8 +205,6 @@ var/datum/h_sandbox/sandbox = null - var/bloody_hands = 0 - var/datum/focus //What receives our keyboard inputs. src by default /// Used for tracking last uses of emotes for cooldown purposes diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 4fbb4bf4669..71bd9ae285c 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -297,52 +297,18 @@ // moved out of admins.dm because things other than admin procs were calling this. -/** - * Is this mob special to the gamemode? - * - * returns 1 for special characters and 2 for heroes of gamemode - * - */ +/// Returns TRUE if the game has started and we're either an AI with a 0th law, or we're someone with a special role/antag datum /proc/is_special_character(mob/M) if(!SSticker.HasRoundStarted()) return FALSE if(!istype(M)) return FALSE - if(issilicon(M)) - if(iscyborg(M)) //For cyborgs, returns 1 if the cyborg has a law 0 and special_role. Returns 0 if the borg is merely slaved to an AI traitor. - return FALSE - else if(isAI(M)) - var/mob/living/silicon/ai/A = M - if(A.laws && A.laws.zeroth && A.mind && A.mind.special_role) - return TRUE + if(iscyborg(M)) //as a borg you're now beholden to your laws rather than greentext return FALSE - if(M.mind && M.mind.special_role)//If they have a mind and special role, they are some type of traitor or antagonist. - switch(SSticker.mode.config_tag) - if("revolution") - if(is_revolutionary(M)) - return 2 - if("cult") - if(M.mind in SSticker.mode.cult) - return 2 - if("nuclear") - if(M.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE)) - return 2 - if("changeling") - if(M.mind.has_antag_datum(/datum/antagonist/changeling,TRUE)) - return 2 - if("wizard") - if(iswizard(M)) - return 2 - if("apprentice") - if(M.mind in SSticker.mode.apprentices) - return 2 - if("monkey") - if(isliving(M)) - var/mob/living/L = M - if(L.diseases && (locate(/datum/disease/transformation/jungle_fever) in L.diseases)) - return 2 - return TRUE - if(M.mind && LAZYLEN(M.mind.antag_datums)) //they have an antag datum! + if(isAI(M)) + var/mob/living/silicon/ai/A = M + return (A.laws?.zeroth && (A.mind?.special_role || !isnull(M.mind?.antag_datums))) + if(M.mind?.special_role || !isnull(M.mind?.antag_datums)) //they have an antag datum! return TRUE return FALSE diff --git a/code/modules/mob/mob_say.dm b/code/modules/mob/mob_say.dm index 8b57f5f8fa0..a21c92a399c 100644 --- a/code/modules/mob/mob_say.dm +++ b/code/modules/mob/mob_say.dm @@ -116,6 +116,10 @@ */ /mob/proc/get_message_mods(message, list/mods) for(var/I in 1 to MESSAGE_MODS_LENGTH) + // Prevents "...text" from being read as a radio message + if (length(message) > 1 && message[2] == message[1]) + continue + var/key = message[1] var/chop_to = 2 //By default we just take off the first char if(key == "#" && !mods[WHISPER_MODE]) diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index cdd00377b97..fd017e2b0f8 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -36,9 +36,9 @@ ui = SStgui.try_update_ui(user, src, ui) if (!ui) ui = new(user, src, "NtosMain") - ui.send_asset(get_asset_datum(/datum/asset/simple/headers)) ui.set_autoupdate(TRUE) ui.open() + ui.send_asset(get_asset_datum(/datum/asset/simple/headers)) /obj/item/modular_computer/ui_data(mob/user) diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index bf6c6a42730..cb593ff7d01 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -170,8 +170,8 @@ ui = SStgui.try_update_ui(user, src, ui) if(!ui && tgui_id) ui = new(user, src, tgui_id, filedesc) - ui.send_asset(get_asset_datum(/datum/asset/simple/headers)) ui.open() + ui.send_asset(get_asset_datum(/datum/asset/simple/headers)) // CONVENTIONS, READ THIS WHEN CREATING NEW PROGRAM AND OVERRIDING THIS PROC: // Topic calls are automagically forwarded from NanoModule this program contains. diff --git a/code/modules/modular_computers/file_system/programs/airestorer.dm b/code/modules/modular_computers/file_system/programs/airestorer.dm index c2a1aa4ca75..b86d2785277 100644 --- a/code/modules/modular_computers/file_system/programs/airestorer.dm +++ b/code/modules/modular_computers/file_system/programs/airestorer.dm @@ -71,14 +71,18 @@ ai_slot.locked = FALSE restoring = FALSE return - ai_slot.locked =TRUE - A.adjustOxyLoss(-5, 0) - A.adjustFireLoss(-5, 0) - A.adjustToxLoss(-5, 0) - A.adjustBruteLoss(-5, 0) + ai_slot.locked = TRUE + A.adjustOxyLoss(-5, FALSE) + A.adjustFireLoss(-5, FALSE) + A.adjustBruteLoss(-5, FALSE) + + // Please don't forget to update health, otherwise the below if statements will probably always fail. A.updatehealth() + if(A.health >= 0 && A.stat == DEAD) A.revive(full_heal = FALSE, admin_revive = FALSE) + cardhold.update_icon() + // Finished restoring if(A.health >= 100) ai_slot.locked = FALSE diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index 151952097fe..e21894eb0cc 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -14,7 +14,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "cut") slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT - sharpness = IS_SHARP + sharpness = SHARP_EDGED max_integrity = 200 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF var/datum/effect_system/spark_spread/spark_system diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm index ccce6c3af2b..a0c6073281a 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm @@ -14,5 +14,5 @@ /obj/item/throwing_star/ninja name = "ninja throwing star" - throwforce = 30 + throwforce = 20 embedding = list("pain_mult" = 6, "embed_chance" = 100, "fall_chance" = 0) diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 68b385abf76..437d8f676bb 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -3,6 +3,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "clipboard" inhand_icon_state = "clipboard" + worn_icon_state = "clipboard" throwforce = 0 w_class = WEIGHT_CLASS_SMALL throw_speed = 3 diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index e4a9f8168dc..2ce129daa0d 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -50,7 +50,7 @@ to_chat(user, "You begin to [anchored ? "unwrench" : "wrench"] [src].") if(P.use_tool(src, user, 20, volume=50)) to_chat(user, "You successfully [anchored ? "unwrench" : "wrench"] [src].") - anchored = !anchored + set_anchored(!anchored) else if(P.w_class < WEIGHT_CLASS_NORMAL) if(!user.transferItemToLoc(P, src)) return diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index ac3a4d8ff4f..1d21d88dd08 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -58,6 +58,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "paper" inhand_icon_state = "paper" + worn_icon_state = "paper" custom_fire_overlay = "paper_onfire_overlay" throwforce = 0 w_class = WEIGHT_CLASS_TINY diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 013a025391b..898c133a8a9 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -29,6 +29,7 @@ var/degrees = 0 var/font = PEN_FONT embedding = list() + sharpness = SHARP_POINTY /obj/item/pen/suicide_act(mob/user) user.visible_message("[user] is scribbling numbers all over [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit sudoku...") @@ -101,7 +102,7 @@ throw_speed = 4 colour = "crimson" custom_materials = list(/datum/material/gold = 750) - sharpness = IS_SHARP + sharpness = SHARP_EDGED resistance_flags = FIRE_PROOF unique_reskin = list("Oak" = "pen-fountain-o", "Gold" = "pen-fountain-g", @@ -196,7 +197,7 @@ */ /obj/item/pen/edagger attack_verb = list("slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "cut") //these won't show up if the pen is off - sharpness = IS_SHARP + sharpness = SHARP_EDGED var/on = FALSE /obj/item/pen/edagger/ComponentInitialize() diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 9a375f09724..2ca575b5d7a 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -29,6 +29,10 @@ var/mob/living/ass //i can't believe i didn't write a stupid-ass comment about this var when i first coded asscopy. var/busy = FALSE +/obj/machinery/photocopier/Initialize() + . = ..() + AddComponent(/datum/component/payment, 5, SSeconomy.get_dep_account(ACCOUNT_CIV), PAYMENT_CLINICAL) + /obj/machinery/photocopier/ui_interact(mob/user) . = ..() var/list/dat = list("Photocopier

") @@ -56,8 +60,12 @@ return if(href_list["copy"]) if(copy) + if(busy) + return for(var/i = 0, i < copies, i++) - if(toner > 0 && !busy && copy) + if(toner > 0 && copy) + if(attempt_charge(src, usr) & COMPONENT_OBJ_CANCEL_CHARGE) + return var/copy_as_paper = 1 if(istype(copy, /obj/item/paper/contract/employment)) var/obj/item/paper/contract/employment/E = copy @@ -89,16 +97,24 @@ break updateUsrDialog() else if(photocopy) + if(busy) + return for(var/i = 0, i < copies, i++) - if(toner >= 5 && !busy && photocopy) //Was set to = 0, but if there was say 3 toner left and this ran, you would get -2 which would be weird for ink + if(attempt_charge(src, usr) & COMPONENT_OBJ_CANCEL_CHARGE) + return + if(toner >= 5 && photocopy) //Was set to = 0, but if there was say 3 toner left and this ran, you would get -2 which would be weird for ink new /obj/item/photo (loc, photocopy.picture.Copy(greytoggle == "Greyscale"? TRUE : FALSE)) busy = TRUE addtimer(CALLBACK(src, .proc/reset_busy), 1.5 SECONDS) else break else if(doccopy) + if(busy) + return for(var/i = 0, i < copies, i++) - if(toner > 5 && !busy && doccopy) + if(attempt_charge(src, usr) & COMPONENT_OBJ_CANCEL_CHARGE) + return + if(toner > 5 && doccopy) new /obj/item/documents/photocopy(loc, doccopy) toner-= 6 // the sprite shows 6 papers, yes I checked busy = TRUE @@ -107,7 +123,11 @@ break updateUsrDialog() else if(ass) //ASS COPY. By Miauw + if(busy) + return for(var/i = 0, i < copies, i++) + if(attempt_charge(src, usr) & COMPONENT_OBJ_CANCEL_CHARGE) + return var/icon/temp_img if(ishuman(ass) && (ass.get_item_by_slot(ITEM_SLOT_ICLOTHING) || ass.get_item_by_slot(ITEM_SLOT_OCLOTHING))) to_chat(usr, "You feel kind of silly, copying [ass == usr ? "your" : ass][ass == usr ? "" : "\'s"] ass with [ass == usr ? "your" : "[ass.p_their()]"] clothes on." ) diff --git a/code/modules/photography/photos/album.dm b/code/modules/photography/photos/album.dm index 4d12d0c8565..b09805c3cb6 100644 --- a/code/modules/photography/photos/album.dm +++ b/code/modules/photography/photos/album.dm @@ -96,10 +96,10 @@ name = "photo album (Library)" persistence_id = "library" -obj/item/storage/photo_album/chapel +/obj/item/storage/photo_album/chapel name = "photo album (Chapel)" persistence_id = "chapel" -obj/item/storage/photo_album/prison +/obj/item/storage/photo_album/prison name = "photo album (Prison)" persistence_id = "prison" diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm index d57dec29d5b..cb94f281dba 100644 --- a/code/modules/plumbing/ducts.dm +++ b/code/modules/plumbing/ducts.dm @@ -41,7 +41,7 @@ All the important duct code: if(no_anchor) active = FALSE - anchored = FALSE + set_anchored(FALSE) else if(!can_anchor()) qdel(src) CRASH("Overlapping ducts detected") @@ -152,8 +152,9 @@ All the important duct code: return TRUE ///we disconnect ourself from our neighbours. we also destroy our ductnet and tell our neighbours to make a new one -/obj/machinery/duct/proc/disconnect_duct() - anchored = FALSE +/obj/machinery/duct/proc/disconnect_duct(skipanchor) + if(!skipanchor) //since set_anchored calls us too. + set_anchored(FALSE) active = FALSE if(duct) duct.remove_duct(src) @@ -272,24 +273,26 @@ All the important duct code: pixel_y = offset +/obj/machinery/duct/set_anchored(anchorvalue) + . = ..() + if(isnull(.)) + return + if(anchorvalue) + active = TRUE + attempt_connect() + else + disconnect_duct(TRUE) + /obj/machinery/duct/wrench_act(mob/living/user, obj/item/I) //I can also be the RPD ..() add_fingerprint(user) I.play_tool_sound(src) - if(anchored) + if(anchored || can_anchor()) + set_anchored(!anchored) user.visible_message( \ - "[user] unfastens \the [src].", \ - "You unfasten \the [src].", \ + "[user] [anchored ? null : "un"]fastens \the [src].", \ + "You [anchored ? null : "un"]fasten \the [src].", \ "You hear ratcheting.") - disconnect_duct() - else if(can_anchor()) - anchored = TRUE - active = TRUE - user.visible_message( \ - "[user] fastens \the [src].", \ - "You fasten \the [src].", \ - "You hear ratcheting.") - attempt_connect() return TRUE ///collection of all the sanity checks to prevent us from stacking ducts that shouldn't be stacked /obj/machinery/duct/proc/can_anchor(turf/T) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 8f96e0cf003..12c3e5fccae 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -379,7 +379,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri // Definitions //////////////////////////////// -GLOBAL_LIST_INIT(cable_coil_recipes, list(new/datum/stack_recipe("cable restraints", /obj/item/restraints/handcuffs/cable, 15), new/datum/stack_recipe("multilayer cable", /obj/structure/cable/multilayer, 1), new/datum/stack_recipe("multiZ cable", /obj/structure/cable/multilayer/multiz, 1))) +GLOBAL_LIST_INIT(cable_coil_recipes, list(new/datum/stack_recipe("cable restraints", /obj/item/restraints/handcuffs/cable, 15))) /obj/item/stack/cable_coil name = "cable coil" diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index e5940e2ad84..5f723f72c6e 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -189,7 +189,7 @@ . = ..() if(!panel_open) return - anchored = !anchored + set_anchored(!anchored) I.play_tool_sound(src) if(!anchored) kill_circs() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 47ca16f3a2a..636ad2b3488 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -172,6 +172,15 @@ /obj/machinery/power/port_gen/pacman/proc/overheat() explosion(src.loc, 2, 5, 2, -1) +/obj/machinery/power/port_gen/pacman/set_anchored(anchorvalue) + . = ..() + if(isnull(.)) + return //no need to process if we didn't change anything. + if(anchorvalue) + connect_to_network() + else + disconnect_from_network() + /obj/machinery/power/port_gen/pacman/attackby(obj/item/O, mob/user, params) if(istype(O, sheet_path)) var/obj/item/stack/addstack = O @@ -186,12 +195,10 @@ else if(!active) if(O.tool_behaviour == TOOL_WRENCH) if(!anchored && !isinspace()) - anchored = TRUE - connect_to_network() + set_anchored(TRUE) to_chat(user, "You secure the generator to the floor.") else if(anchored) - anchored = FALSE - disconnect_from_network() + set_anchored(FALSE) to_chat(user, "You unsecure the generator from the floor.") playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index a2f6603ef47..369224af6dc 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -23,8 +23,9 @@ var/drainratio = 1 var/powerproduction_drain = 0.001 -/obj/machinery/power/rad_collector/anchored - anchored = TRUE +/obj/machinery/power/rad_collector/anchored/Initialize() + . = ..() + set_anchored(TRUE) /obj/machinery/power/rad_collector/anchored/delta //Deltastation's engine is shared by engineers and atmos techs desc = "A device which uses Hawking Radiation and plasma to produce power. This model allows access by Atmospheric Technicians." @@ -77,13 +78,14 @@ return FAILED_UNFASTEN return ..() -/obj/machinery/power/rad_collector/default_unfasten_wrench(mob/user, obj/item/I, time = 20) +/obj/machinery/power/rad_collector/set_anchored(anchorvalue) . = ..() - if(. == SUCCESSFUL_UNFASTEN) - if(anchored) - connect_to_network() - else - disconnect_from_network() + if(isnull(.)) + return //no need to process if we didn't change anything. + if(anchorvalue) + connect_to_network() + else + disconnect_from_network() /obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/tank/internals/plasma)) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 59e49a35ef7..3d0fe96f2a7 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -60,7 +60,7 @@ wires = new /datum/wires/emitter(src) if(welded) if(!anchored) - setAnchored(TRUE) + set_anchored(TRUE) connect_to_network() sparks = new @@ -71,7 +71,7 @@ . = ..() AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) -/obj/machinery/power/emitter/setAnchored(anchorvalue) +/obj/machinery/power/emitter/set_anchored(anchorvalue) . = ..() if(!anchored && welded) //make sure they're keep in sync in case it was forcibly unanchored by badmins or by a megafauna. welded = FALSE @@ -168,7 +168,7 @@ /obj/machinery/power/emitter/attack_animal(mob/living/simple_animal/M) if(ismegafauna(M) && anchored) - setAnchored(FALSE) + set_anchored(FALSE) M.visible_message("[M] rips [src] free from its moorings!") else . = ..() diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 45172ba50e0..4eb625c73ea 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -61,7 +61,7 @@ field_generator power level display /obj/machinery/field/generator/anchored/Initialize() . = ..() - setAnchored(TRUE) + set_anchored(TRUE) /obj/machinery/field/generator/ComponentInitialize() . = ..() @@ -88,8 +88,10 @@ field_generator power level display else to_chat(user, "[src] needs to be firmly secured to the floor first!") -/obj/machinery/field/generator/setAnchored(anchorvalue) +/obj/machinery/field/generator/set_anchored(anchorvalue) . = ..() + if(isnull(.)) + return if(active) turn_off() state = anchorvalue ? FG_SECURED : FG_UNSECURED @@ -147,7 +149,7 @@ field_generator power level display /obj/machinery/field/generator/attack_animal(mob/living/simple_animal/M) if(M.environment_smash & ENVIRONMENT_SMASH_RWALLS && active == FG_OFFLINE && state != FG_UNSECURED) - setAnchored(FALSE) + set_anchored(FALSE) M.visible_message("[M] rips [src] free from its moorings!") else ..() diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index a37aa2a2ca3..816fa750795 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -59,6 +59,14 @@ AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ) +/obj/structure/particle_accelerator/set_anchored(anchorvalue) + . = ..() + if(isnull(.)) + return + construction_state = anchorvalue ? PA_CONSTRUCTION_UNWIRED : PA_CONSTRUCTION_UNSECURED + update_state() + update_icon() + /obj/structure/particle_accelerator/attackby(obj/item/W, mob/user, params) var/did_something = FALSE @@ -66,19 +74,19 @@ if(PA_CONSTRUCTION_UNSECURED) if(W.tool_behaviour == TOOL_WRENCH && !isinspace()) W.play_tool_sound(src, 75) - anchored = TRUE + set_anchored(TRUE) user.visible_message("[user.name] secures the [name] to the floor.", \ "You secure the external bolts.") - construction_state = PA_CONSTRUCTION_UNWIRED - did_something = TRUE + user.changeNext_move(CLICK_CD_MELEE) + return //set_anchored handles the rest of the stuff we need to do. if(PA_CONSTRUCTION_UNWIRED) if(W.tool_behaviour == TOOL_WRENCH) W.play_tool_sound(src, 75) - anchored = FALSE + set_anchored(FALSE) user.visible_message("[user.name] detaches the [name] from the floor.", \ "You remove the external bolts.") - construction_state = PA_CONSTRUCTION_UNSECURED - did_something = TRUE + user.changeNext_move(CLICK_CD_MELEE) + return //set_anchored handles the rest of the stuff we need to do. else if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/CC = W if(CC.use(1)) diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index f26edda43fc..d5a3179731b 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -199,6 +199,14 @@ if(PA_CONSTRUCTION_PANEL_OPEN) . += "The panel is open." +/obj/machinery/particle_accelerator/control_box/set_anchored(anchorvalue) + . = ..() + if(isnull(.)) + return + construction_state = anchorvalue ? PA_CONSTRUCTION_UNWIRED : PA_CONSTRUCTION_UNSECURED + update_state() + update_icon() + /obj/machinery/particle_accelerator/control_box/attackby(obj/item/W, mob/user, params) var/did_something = FALSE @@ -206,19 +214,19 @@ if(PA_CONSTRUCTION_UNSECURED) if(W.tool_behaviour == TOOL_WRENCH && !isinspace()) W.play_tool_sound(src, 75) - anchored = TRUE + set_anchored(TRUE) user.visible_message("[user.name] secures the [name] to the floor.", \ "You secure the external bolts.") - construction_state = PA_CONSTRUCTION_UNWIRED - did_something = TRUE + user.changeNext_move(CLICK_CD_MELEE) + return //set_anchored handles the rest of the stuff we need to do. if(PA_CONSTRUCTION_UNWIRED) if(W.tool_behaviour == TOOL_WRENCH) W.play_tool_sound(src, 75) - anchored = FALSE + set_anchored(FALSE) user.visible_message("[user.name] detaches the [name] from the floor.", \ "You remove the external bolts.") - construction_state = PA_CONSTRUCTION_UNSECURED - did_something = TRUE + user.changeNext_move(CLICK_CD_MELEE) + return //set_anchored handles the rest of the stuff we need to do. else if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/CC = W if(CC.use(1)) @@ -250,7 +258,7 @@ update_icon() return - ..() + return ..() /obj/machinery/particle_accelerator/control_box/blob_act(obj/structure/blob/B) if(prob(50)) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index c8bdb7831f6..fd9fb0e3078 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -59,7 +59,7 @@ if(!S) S = new /obj/item/solar_assembly(src) S.glass_type = /obj/item/stack/sheet/glass - S.anchored = TRUE + S.set_anchored(TRUE) else S.forceMove(src) if(S.glass_type == /obj/item/stack/sheet/rglass) //if the panel is in reinforced glass @@ -229,23 +229,21 @@ new glass_type(Tsec, 2) glass_type = null +/obj/item/solar_assembly/set_anchored(anchorvalue) + . = ..() + if(isnull(.)) + return + randomise_offset(anchored ? 0 : random_offset) /obj/item/solar_assembly/attackby(obj/item/W, mob/user, params) if(W.tool_behaviour == TOOL_WRENCH && isturf(loc)) if(isinspace()) to_chat(user, "You can't secure [src] here.") return - anchored = !anchored - if(anchored) - user.visible_message("[user] wrenches the solar assembly into place.", "You wrench the solar assembly into place.") - W.play_tool_sound(src, 75) - pixel_x = 0 - pixel_y = 0 - else - user.visible_message("[user] unwrenches the solar assembly from its place.", "You unwrench the solar assembly from its place.") - W.play_tool_sound(src, 75) - randomise_offset(random_offset) - return 1 + set_anchored(!anchored) + user.visible_message("[user] [anchored ? null : "un"]wrenches the solar assembly into place.", "You [anchored ? null : "un"]wrench the solar assembly into place.") + W.play_tool_sound(src, 75) + return TRUE if(istype(W, /obj/item/stack/sheet/glass) || istype(W, /obj/item/stack/sheet/rglass)) if(!anchored) @@ -263,22 +261,22 @@ else to_chat(user, "You need two sheets of glass to put them into a solar panel!") return - return 1 + return TRUE if(!tracker) if(istype(W, /obj/item/electronics/tracker)) if(!user.temporarilyRemoveItemFromInventory(W)) return - tracker = 1 + tracker = TRUE qdel(W) user.visible_message("[user] inserts the electronics into the solar assembly.", "You insert the electronics into the solar assembly.") - return 1 + return TRUE else if(W.tool_behaviour == TOOL_CROWBAR) new /obj/item/electronics/tracker(src.loc) - tracker = 0 + tracker = FALSE user.visible_message("[user] takes out the electronics from the solar assembly.", "You take out the electronics from the solar assembly.") - return 1 + return TRUE return ..() // @@ -414,7 +412,7 @@ A.circuit = M A.state = 3 A.icon_state = "3" - A.anchored = TRUE + A.set_anchored(TRUE) qdel(src) else to_chat(user, "You disconnect the monitor.") @@ -425,7 +423,7 @@ A.circuit = M A.state = 4 A.icon_state = "4" - A.anchored = TRUE + A.set_anchored(TRUE) qdel(src) else if(user.a_intent != INTENT_HARM && !(I.item_flags & NOBLUDGEON)) attack_hand(user) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 1a1ce943177..cc023a7a683 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -840,7 +840,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) dust_mob(user, cause = "hand") /obj/machinery/power/supermatter_crystal/proc/dust_mob(mob/living/nom, vis_msg, mob_msg, cause) - if(nom.incorporeal_move || nom.status_flags & GODMODE) + if(nom.incorporeal_move || nom.status_flags & GODMODE) //try to keep supermatter sliver's + hemostat's dust conditions in sync with this too return if(!vis_msg) vis_msg = "[nom] reaches out and touches [src], inducing a resonance... [nom.p_their()] body starts to glow and burst into flames before flashing into dust!" diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 577014b1832..9619a3a73fb 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -50,7 +50,7 @@ S = new /obj/item/solar_assembly(src) S.glass_type = /obj/item/stack/sheet/glass S.tracker = 1 - S.anchored = TRUE + S.set_anchored(TRUE) S.forceMove(src) /obj/machinery/power/tracker/crowbar_act(mob/user, obj/item/I) diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index 9d303245688..039fd3a9769 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -46,6 +46,25 @@ icon_state = "[initial(icon_state)][BB ? "-live" : ""]" desc = "[initial(desc)][BB ? "" : " This one is spent."]" +/* + * On accidental consumption, 'spend' the ammo, and add in some gunpowder + */ +/obj/item/ammo_casing/on_accidental_consumption(mob/living/carbon/M, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE) + if(BB) + BB = null + update_icon() + var/obj/item/reagent_containers/food/snacks/S = source_item + if(istype(S)) + if(S.reagents) + S.reagents.add_reagent(/datum/reagent/gunpowder, S.reagents.total_volume*(2/3)) + if(S.tastes?.len) + S.tastes += "salt" + S.tastes["salt"] = 3 + + M.reagents?.add_reagent(/datum/reagent/gunpowder, 3) + + return ..() + //proc to magically refill a casing with a new projectile /obj/item/ammo_casing/proc/newshot() //For energy weapons, syringe gun, shotgun shells and wands (!). if(!BB) diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index cc5122052db..8ffa5b51a7a 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -38,7 +38,7 @@ /obj/item/ammo_box/c38/dumdum name = "speed loader (.38 DumDum)" - desc = "Designed to quickly reload revolvers. DumDum bullets shatter on impact and shred the target's innards, likely getting caught inside." + desc = "Designed to quickly reload revolvers. These rounds expand on impact, allowing them to shred the target and cause massive bleeding. Very weak against armor and distant targets." ammo_type = /obj/item/ammo_casing/c38/dumdum /obj/item/ammo_box/c38/hotshot diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index a1f58f00d6f..fc0e58659df 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -179,7 +179,7 @@ /obj/item/gun/afterattack(atom/target, mob/living/user, flag, params) . = ..() - if(!target) + if(QDELETED(target)) return if(firing_burst) return @@ -198,7 +198,8 @@ return if(iscarbon(target)) var/mob/living/carbon/C = target - for(var/datum/wound/W in C.all_wounds) + for(var/i in C.all_wounds) + var/datum/wound/W = i if(W.try_treating(src, user)) return // another coward cured! diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 980a2722e43..1da8baa8024 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -16,11 +16,11 @@ bolt_drop_sound = 'sound/weapons/gun/rifle/bolt_in.ogg' tac_reloads = FALSE -obj/item/gun/ballistic/rifle/update_overlays() +/obj/item/gun/ballistic/rifle/update_overlays() . = ..() . += "[icon_state]_bolt[bolt_locked ? "_locked" : ""]" -obj/item/gun/ballistic/rifle/rack(mob/user = null) +/obj/item/gun/ballistic/rifle/rack(mob/user = null) if (bolt_locked == FALSE) to_chat(user, "You open the bolt of \the [src].") playsound(src, rack_sound, rack_sound_volume, rack_sound_vary) @@ -30,12 +30,12 @@ obj/item/gun/ballistic/rifle/rack(mob/user = null) return drop_bolt(user) -obj/item/gun/ballistic/rifle/can_shoot() +/obj/item/gun/ballistic/rifle/can_shoot() if (bolt_locked) return FALSE return ..() -obj/item/gun/ballistic/rifle/attackby(obj/item/A, mob/user, params) +/obj/item/gun/ballistic/rifle/attackby(obj/item/A, mob/user, params) if (!bolt_locked) to_chat(user, "The bolt is closed!") return diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index d279ef9cf6c..c08bd8e6afa 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -128,7 +128,7 @@ flags_1 = CONDUCT_1 attack_verb = list("attacked", "slashed", "cut", "sliced") force = 12 - sharpness = IS_SHARP + sharpness = SHARP_EDGED can_charge = FALSE heat = 3800 diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index b5135d66bd4..2046ecf1d22 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -87,7 +87,7 @@ force = 20 armour_penetration = 75 block_chance = 50 - sharpness = IS_SHARP + sharpness = SHARP_EDGED max_charges = 4 /obj/item/gun/magic/staff/spellblade/Initialize() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index d18be3b119e..ea5fdbde6b6 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -11,6 +11,7 @@ pass_flags = PASSTABLE mouse_opacity = MOUSE_OPACITY_TRANSPARENT movement_type = FLYING + wound_bonus = CANT_WOUND // can't wound by default //The sound this plays on impact. var/hitsound = 'sound/weapons/pierce.ogg' var/hitsound_wall = "" @@ -124,23 +125,36 @@ var/temporary_unstoppable_movement = FALSE - ///If defined, on hit we create an item of this type then call hitby() on the hit target with this + ///If defined, on hit we create an item of this type then call hitby() on the hit target with this, mainly used for embedding items (bullets) in targets var/shrapnel_type + ///If we have a shrapnel_type defined, these embedding stats will be passed to the spawned shrapnel type, which will roll for embedding on the target + var/list/embedding + ///If TRUE, hit mobs even if they're on the floor and not our target var/hit_stunned_targets = FALSE - wound_bonus = CANT_WOUND - /// For telling whether we want to roll for bone breaking or lacerations if we're bothering with wounds - var/sharpness = FALSE + ///For what kind of brute wounds we're rolling for, if we're doing such a thing. Lasers obviously don't care since they do burn instead. + var/sharpness = SHARP_NONE + ///How much we want to drop both wound_bonus and bare_wound_bonus (to a minimum of 0 for the latter) per tile, for falloff purposes + var/wound_falloff_tile + ///How much we want to drop the embed_chance value, if we can embed, per tile, for falloff purposes + var/embed_falloff_tile /obj/projectile/Initialize() . = ..() permutated = list() decayedRange = range + if(embedding) + updateEmbedding() /obj/projectile/proc/Range() range-- + if(wound_bonus != CANT_WOUND) + wound_bonus += wound_falloff_tile + bare_wound_bonus = max(0, bare_wound_bonus + wound_falloff_tile) + if(embedding) + embedding["embed_chance"] += embed_falloff_tile if(range <= 0 && loc) on_range() @@ -743,3 +757,23 @@ /obj/projectile/experience_pressure_difference() return + +///Like [/obj/item/proc/updateEmbedding] but for projectiles instead, call this when you want to add embedding or update the stats on the embedding element +/obj/projectile/proc/updateEmbedding() + if(!shrapnel_type || !LAZYLEN(embedding)) + return + + AddElement(/datum/element/embed,\ + embed_chance = (!isnull(embedding["embed_chance"]) ? embedding["embed_chance"] : EMBED_CHANCE),\ + fall_chance = (!isnull(embedding["fall_chance"]) ? embedding["fall_chance"] : EMBEDDED_ITEM_FALLOUT),\ + pain_chance = (!isnull(embedding["pain_chance"]) ? embedding["pain_chance"] : EMBEDDED_PAIN_CHANCE),\ + pain_mult = (!isnull(embedding["pain_mult"]) ? embedding["pain_mult"] : EMBEDDED_PAIN_MULTIPLIER),\ + remove_pain_mult = (!isnull(embedding["remove_pain_mult"]) ? embedding["remove_pain_mult"] : EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER),\ + rip_time = (!isnull(embedding["rip_time"]) ? embedding["rip_time"] : EMBEDDED_UNSAFE_REMOVAL_TIME),\ + ignore_throwspeed_threshold = (!isnull(embedding["ignore_throwspeed_threshold"]) ? embedding["ignore_throwspeed_threshold"] : FALSE),\ + impact_pain_mult = (!isnull(embedding["impact_pain_mult"]) ? embedding["impact_pain_mult"] : EMBEDDED_IMPACT_PAIN_MULTIPLIER),\ + jostle_chance = (!isnull(embedding["jostle_chance"]) ? embedding["jostle_chance"] : EMBEDDED_JOSTLE_CHANCE),\ + jostle_pain_mult = (!isnull(embedding["jostle_pain_mult"]) ? embedding["jostle_pain_mult"] : EMBEDDED_JOSTLE_PAIN_MULTIPLIER),\ + pain_stam_pct = (!isnull(embedding["pain_stam_pct"]) ? embedding["pain_stam_pct"] : EMBEDDED_PAIN_STAM_PCT),\ + projectile_payload = shrapnel_type) + return TRUE diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index b76ff677c56..8dac813f8e5 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -6,5 +6,13 @@ nodamage = FALSE flag = "bullet" hitsound_wall = "ricochet" - sharpness = TRUE + sharpness = SHARP_POINTY impact_effect_type = /obj/effect/temp_visual/impact_effect + shrapnel_type = /obj/item/shrapnel/bullet + embedding = list(embed_chance=15, fall_chance=2, jostle_chance=0, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.5, pain_mult=3, rip_time=10) + wound_falloff_tile = -5 + embed_falloff_tile = -5 + +/obj/projectile/bullet/smite + name = "divine retribution" + damage = 10 diff --git a/code/modules/projectiles/projectile/bullets/lmg.dm b/code/modules/projectiles/projectile/bullets/lmg.dm index a6e2f3386d0..e05240a7369 100644 --- a/code/modules/projectiles/projectile/bullets/lmg.dm +++ b/code/modules/projectiles/projectile/bullets/lmg.dm @@ -25,8 +25,10 @@ /obj/projectile/bullet/mm712x82 name = "7.12x82mm bullet" - damage = 45 + damage = 40 armour_penetration = 5 + wound_bonus = -50 + wound_falloff_tile = 0 /obj/projectile/bullet/mm712x82_ap name = "7.12x82mm armor-piercing bullet" @@ -35,8 +37,12 @@ /obj/projectile/bullet/mm712x82_hp name = "7.12x82mm hollow-point bullet" - damage = 60 + damage = 50 armour_penetration = -60 + sharpness = SHARP_EDGED + wound_bonus = -40 + bare_wound_bonus = 30 + wound_falloff_tile = -8 /obj/projectile/bullet/incendiary/mm712x82 name = "7.12x82mm incendiary bullet" @@ -50,4 +56,4 @@ ricochet_chance = 60 ricochet_auto_aim_range = 4 ricochet_incidence_leeway = 35 - + wound_bonus = -50 diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm index 1e53db3cdbd..0752c0f8533 100644 --- a/code/modules/projectiles/projectile/bullets/pistol.dm +++ b/code/modules/projectiles/projectile/bullets/pistol.dm @@ -3,11 +3,13 @@ /obj/projectile/bullet/c9mm name = "9mm bullet" damage = 30 + embedding = list(embed_chance=15, fall_chance=3, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10) /obj/projectile/bullet/c9mm_ap name = "9mm armor-piercing bullet" damage = 27 armour_penetration = 40 + embedding = null /obj/projectile/bullet/c9mm_hp name = "9mm hollow-point bullet" diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index 0c713426365..dc7b56d77ae 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -19,8 +19,9 @@ ricochet_chance = 50 ricochet_auto_aim_angle = 10 ricochet_auto_aim_range = 3 - wound_bonus = -35 - sharpness = TRUE + wound_bonus = -20 + bare_wound_bonus = 10 + embedding = list(embed_chance=15, fall_chance=2, jostle_chance=2, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=3, jostle_pain_mult=5, rip_time=10) /obj/projectile/bullet/c38/match name = ".38 Match bullet" @@ -42,14 +43,21 @@ ricochet_chance = 130 ricochet_decay_damage = 0.8 shrapnel_type = NONE + sharpness = SHARP_NONE + embedding = null +// premium .38 ammo from cargo, weak against armor, lower base damage, but excellent at embedding and causing slice wounds at close range /obj/projectile/bullet/c38/dumdum name = ".38 DumDum bullet" damage = 15 armour_penetration = -30 ricochets_max = 0 - wound_bonus = 0 - shrapnel_type = /obj/item/shrapnel/bullet/c38/dumdum + sharpness = SHARP_EDGED + wound_bonus = 20 + bare_wound_bonus = 20 + embedding = list(embed_chance=75, fall_chance=3, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10) + wound_falloff_tile = -5 + embed_falloff_tile = -15 /obj/projectile/bullet/c38/trac name = ".38 TRAC bullet" @@ -98,6 +106,7 @@ /obj/projectile/bullet/a357 name = ".357 bullet" damage = 60 + wound_bonus = -70 // admin only really, for ocelot memes /obj/projectile/bullet/a357/match diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index 1f596e75f29..d1794ef3036 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -4,6 +4,7 @@ name = "5.56mm bullet" damage = 35 armour_penetration = 30 + wound_bonus = -40 /obj/projectile/bullet/a556/phasic name = "5.56mm phasic bullet" @@ -17,6 +18,8 @@ /obj/projectile/bullet/a762 name = "7.62 bullet" damage = 60 + wound_bonus = -35 + wound_falloff_tile = 0 /obj/projectile/bullet/a762_enchanted name = "enchanted 7.62 bullet" diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 70ab3dd7aa3..4128eb39d22 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -1,23 +1,26 @@ /obj/projectile/bullet/shotgun_slug name = "12g shotgun slug" - damage = 60 + damage = 50 + sharpness = SHARP_POINTY + wound_bonus = 0 /obj/projectile/bullet/shotgun_slug/executioner name = "executioner slug" // admin only, can dismember limbs - sharpness = TRUE - wound_bonus = 0 + sharpness = SHARP_EDGED + wound_bonus = 80 /obj/projectile/bullet/shotgun_slug/pulverizer name = "pulverizer slug" // admin only, can crush bones - sharpness = FALSE - wound_bonus = 0 + sharpness = SHARP_NONE + wound_bonus = 80 /obj/projectile/bullet/shotgun_beanbag name = "beanbag slug" damage = 10 stamina = 55 wound_bonus = 20 - sharpness = FALSE + sharpness = SHARP_NONE + embedding = null /obj/projectile/bullet/incendiary/shotgun name = "incendiary slug" @@ -68,18 +71,22 @@ return BULLET_ACT_HIT /obj/projectile/bullet/pellet - var/tile_dropoff = 0.75 + var/tile_dropoff = 0.45 var/tile_dropoff_s = 0.5 /obj/projectile/bullet/pellet/shotgun_buckshot name = "buckshot pellet" - damage = 12.5 - wound_bonus = -10 + damage = 7.5 + wound_bonus = 5 + bare_wound_bonus = 5 + wound_falloff_tile = -2.5 // low damage + additional dropoff will already curb wounding potential anything past point blank /obj/projectile/bullet/pellet/shotgun_rubbershot name = "rubbershot pellet" damage = 3 stamina = 11 + sharpness = SHARP_NONE + embedding = null /obj/projectile/bullet/pellet/shotgun_incapacitate name = "incapacitating pellet" @@ -96,8 +103,10 @@ qdel(src) /obj/projectile/bullet/pellet/shotgun_improvised - tile_dropoff = 0.55 //Come on it does 6 damage don't be like that. + tile_dropoff = 0.35 //Come on it does 6 damage don't be like that. damage = 6 + wound_bonus = 0 + bare_wound_bonus = 7.5 /obj/projectile/bullet/pellet/shotgun_improvised/Initialize() . = ..() diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm index faa0fd98ca2..3cdf3de789e 100644 --- a/code/modules/projectiles/projectile/bullets/smg.dm +++ b/code/modules/projectiles/projectile/bullets/smg.dm @@ -2,7 +2,9 @@ /obj/projectile/bullet/c45 name = ".45 bullet" - damage = 35 + damage = 30 + wound_bonus = -10 + wound_falloff_tile = -10 /obj/projectile/bullet/c45_ap name = ".45 armor-piercing bullet" @@ -19,11 +21,15 @@ /obj/projectile/bullet/c46x30mm name = "4.6x30mm bullet" damage = 20 + wound_bonus = -5 + bare_wound_bonus = 5 + embed_falloff_tile = -4 /obj/projectile/bullet/c46x30mm_ap name = "4.6x30mm armor-piercing bullet" damage = 15 armour_penetration = 40 + embedding = null /obj/projectile/bullet/incendiary/c46x30mm name = "4.6x30mm incendiary bullet" diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 41ed6f59d5b..4bf005df06d 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -491,11 +491,11 @@ var/list/cached_required_catalysts = C.required_catalysts var/total_required_catalysts = cached_required_catalysts.len var/total_matching_catalysts= 0 - var/matching_container = 0 - var/matching_other = 0 + var/matching_container = FALSE + var/matching_other = FALSE var/required_temp = C.required_temp var/is_cold_recipe = C.is_cold_recipe - var/meets_temp_requirement = 0 + var/meets_temp_requirement = FALSE for(var/B in cached_required_reagents) if(!has_reagent(B, cached_required_reagents[B])) @@ -507,29 +507,28 @@ total_matching_catalysts++ if(cached_my_atom) if(!C.required_container) - matching_container = 1 - + matching_container = TRUE else if(cached_my_atom.type == C.required_container) - matching_container = 1 + matching_container = TRUE if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs - return + matching_container = FALSE if(!C.required_other) - matching_other = 1 + matching_other = TRUE else if(istype(cached_my_atom, /obj/item/slime_extract)) var/obj/item/slime_extract/M = cached_my_atom if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1 + matching_other = TRUE else if(!C.required_container) - matching_container = 1 + matching_container = TRUE if(!C.required_other) - matching_other = 1 + matching_other = TRUE if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp)) - meets_temp_requirement = 1 + meets_temp_requirement = TRUE if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement) possible_reactions += C @@ -923,7 +922,7 @@ Needs matabolizing takes into consideration if the chemical is matabolizing when * Arguments: * * minimum_percent - the lower the minimum percent, the more sensitive the message is. */ -/datum/reagents/proc/generate_taste_message(minimum_percent=15) +/datum/reagents/proc/generate_taste_message(minimum_percent=15,mob/living/taster) var/list/out = list() var/list/tastes = list() //descriptor = strength if(minimum_percent <= 100) @@ -931,22 +930,12 @@ Needs matabolizing takes into consideration if the chemical is matabolizing when if(!R.taste_mult) continue - if(istype(R, /datum/reagent/consumable/nutriment)) - var/list/taste_data = R.data - for(var/taste in taste_data) - var/ratio = taste_data[taste] - var/amount = ratio * R.taste_mult * R.volume - if(taste in tastes) - tastes[taste] += amount - else - tastes[taste] = amount - else - var/taste_desc = R.taste_description - var/taste_amount = R.volume * R.taste_mult - if(taste_desc in tastes) - tastes[taste_desc] += taste_amount + var/list/taste_data = R.get_taste_description(taster) + for(var/taste in taste_data) + if(taste in tastes) + tastes[taste] += taste_data[taste] * R.volume * R.taste_mult else - tastes[taste_desc] = taste_amount + tastes[taste] = taste_data[taste] * R.volume * R.taste_mult //deal with percentages // TODO it would be great if we could sort these from strong to weak var/total_taste = counterlist_sum(tastes) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 680edb61f23..12ec7b4de92 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -76,6 +76,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/list/reagent_removal_skip_list = list() /datum/reagent/New() + SHOULD_CALL_PARENT(TRUE) . = ..() if(!addiction_type) @@ -210,6 +211,11 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) if(!mytray) return +/// Should return a associative list where keys are taste descriptions and values are strength ratios +/datum/reagent/proc/get_taste_description(mob/living/taster) + return list("[taste_description]" = 1) + + /proc/pretty_string_from_reagent_list(list/reagent_list) //Convert reagent list to a printable string for logging etc var/list/rs = list() diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index e77a51fcd98..a79616f4bca 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -103,7 +103,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "dish water" glass_name = "glass of light beer" glass_desc = "A freezing pint of watery light beer." - + /datum/reagent/consumable/ethanol/beer/maltliquor name = "Malt Liquor" description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety is stronger than usual, super cheap, and super terrible." @@ -374,6 +374,19 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "A very classy looking drink." shot_glass_icon_state = "shotglassred" +/datum/reagent/consumable/ethanol/wine/on_merge(data) + . = ..() + if(src.data && data && data["vintage"] != src.data["vintage"]) + src.data["vintage"] = "mixed wine" + +/datum/reagent/consumable/ethanol/wine/get_taste_description(mob/living/taster) + if(HAS_TRAIT(taster,TRAIT_WINE_TASTER)) + if(data && data["vintage"]) + return list("[data["vintage"]]" = 1) + else + return list("synthetic wine"=1) + return ..() + /datum/reagent/consumable/ethanol/lizardwine name = "Lizard wine" description = "An alcoholic beverage from Space China, made by infusing lizard tails in ethanol." @@ -683,14 +696,14 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/M) if(HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE)) metabolization_rate = 0.8 - if(!HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + if(M.mind != null && !HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) B = new() M.gain_trauma(B, TRAUMA_RESILIENCE_ABSOLUTE) ..() /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/carbon/M) M.Jitter(2) - if(HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + if(M.mind != null && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) M.adjustStaminaLoss(-10, 0) if(prob(20)) new /datum/hallucination/items_other(M) @@ -705,7 +718,7 @@ All effects don't start immediately, but rather get worse over time; the rate is return ..() /datum/reagent/consumable/ethanol/beepsky_smash/overdose_start(mob/living/carbon/M) - if(!HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + if(M.mind != null && !HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) M.gain_trauma(/datum/brain_trauma/mild/phobia/security, TRAUMA_RESILIENCE_BASIC) /datum/reagent/consumable/ethanol/irish_cream @@ -1521,7 +1534,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/M) //Securidrink in line with the Screwdriver for engineers or Nothing for mimes - if(HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + if(M.mind != null && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) M.heal_bodypart_damage(1, 1) M.adjustBruteLoss(-2,0) . = 1 @@ -1540,7 +1553,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/M) //Securidrink in line with the Screwdriver for engineers or Nothing for mimes but STRONG.. - if(HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + if(M.mind != null && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) M.heal_bodypart_damage(2,2,2) M.adjustBruteLoss(-5,0) M.adjustOxyLoss(-5,0) @@ -2154,7 +2167,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "boozy Catholicism in a glass." /datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/M) - if(M.mind.holy_role) + if(M.mind?.holy_role) M.adjustFireLoss(-2.5, 0) M.jitteriness = max(0, M.jitteriness-1) M.stuttering = max(0, M.stuttering-1) diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index b655ae30568..f6cd5e84129 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -406,13 +406,13 @@ #undef issyrinormusc /******COMBOS******/ /*Suffix: Combo of healing, prob gonna get wack REAL fast*/ -/datum/reagent/medicine/c2/instabitaluri - name = "Synthflesh (Instabitaluri)" +/datum/reagent/medicine/c2/synthflesh + name = "Synthflesh" description = "Heals brute and burn damage at the cost of toxicity (66% of damage healed). Touch application only." reagent_state = LIQUID color = "#FFEBEB" -/datum/reagent/medicine/c2/instabitaluri/expose_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) +/datum/reagent/medicine/c2/synthflesh/expose_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) if(iscarbon(M)) var/mob/living/carbon/carbies = M if (carbies.stat == DEAD) @@ -420,13 +420,14 @@ if(method in list(PATCH, TOUCH, VAPOR)) var/harmies = min(carbies.getBruteLoss(),carbies.adjustBruteLoss(-1.25 * reac_volume)*-1) var/burnies = min(carbies.getFireLoss(),carbies.adjustFireLoss(-1.25 * reac_volume)*-1) - for(var/datum/wound/burn/burn_wound in carbies.all_wounds) - burn_wound.regenerate_flesh(reac_volume) + for(var/i in carbies.all_wounds) + var/datum/wound/iter_wound = i + iter_wound.on_synthflesh(reac_volume) carbies.adjustToxLoss((harmies+burnies)*0.66) if(show_message) to_chat(carbies, "You feel your burns and bruises healing! It stings like hell!") SEND_SIGNAL(carbies, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) - if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && carbies.getFireLoss() < THRESHOLD_UNHUSK && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/c2/instabitaluri) + reac_volume >= 100)) + if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && carbies.getFireLoss() < THRESHOLD_UNHUSK && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/c2/synthflesh) + reac_volume >= 100)) carbies.cure_husk("burn") carbies.visible_message("A rubbery liquid coats [carbies]'s burns. [carbies] looks a lot healthier!") //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because carbies could be a skeleton or a golem or something ..() diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 19aa060636a..a94b4f7130c 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -132,6 +132,25 @@ . = 1 ..() +// i googled "natural coagulant" and a couple of results came up for banana peels, so after precisely 30 more seconds of research, i now dub grinding banana peels good for your blood +/datum/reagent/consumable/banana_peel + name = "Pulped Banana Peel" + description = "Okay, so you put a banana peel in a grinder... Why, exactly?" + color = "#863333" // rgb: 175, 175, 0 + reagent_state = SOLID + taste_description = "stringy, bitter pulp" + glass_name = "glass of banana peel pulp" + glass_desc = "Okay, so you put a banana peel in a grinder... Why, exactly?" + +/datum/reagent/consumable/baked_banana_peel + name = "Baked Banana Peel Powder" + description = "You took a banana peel... pulped it... baked it... Where are you going with this?" + color = "#863333" // rgb: 175, 175, 0 + reagent_state = SOLID + taste_description = "bitter powder" + glass_name = "glass of banana peel powder" + description = "You took a banana peel... pulped it... baked it... Where are you going with this?" + /datum/reagent/consumable/nothing name = "Nothing" description = "Absolutely nothing." @@ -525,7 +544,7 @@ /datum/reagent/consumable/pwr_game/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) if(prob(10)) - M?.mind.adjust_experience(/datum/skill/gaming, 5) + M.mind?.adjust_experience(/datum/skill/gaming, 5) ..() /datum/reagent/consumable/shamblers @@ -690,28 +709,6 @@ ..() . = 1 -/datum/reagent/consumable/chocolatepudding - name = "Chocolate Pudding" - description = "A great dessert for chocolate lovers." - color = "#800000" - quality = DRINK_VERYGOOD - nutriment_factor = 4 * REAGENTS_METABOLISM - taste_description = "sweet chocolate" - glass_icon_state = "chocolatepudding" - glass_name = "chocolate pudding" - glass_desc = "Tasty." - -/datum/reagent/consumable/vanillapudding - name = "Vanilla Pudding" - description = "A great dessert for vanilla lovers." - color = "#FAFAD2" - quality = DRINK_VERYGOOD - nutriment_factor = 4 * REAGENTS_METABOLISM - taste_description = "sweet vanilla" - glass_icon_state = "vanillapudding" - glass_name = "vanilla pudding" - glass_desc = "Tasty." - /datum/reagent/consumable/cherryshake name = "Cherry Shake" description = "A cherry flavored milkshake." @@ -921,11 +918,11 @@ /datum/reagent/consumable/bungojuice name = "Bungo Juice" color = "#F9E43D" - description = "Exotic! You feel like you are on vactation already." + description = "Exotic! You feel like you are on vacation already." taste_description = "succulent bungo" glass_icon_state = "glass_yellow" glass_name = "glass of bungo juice" - glass_desc = "Exotic! You feel like you are on vactation already." + glass_desc = "Exotic! You feel like you are on vacation already." /datum/reagent/consumable/prunomix name = "pruno mixture" diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 2e10f5be432..84aa0ee6832 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -418,7 +418,7 @@ /datum/reagent/drug/happiness/addiction_act_stage1(mob/living/M)// all work and no play makes jack a dull boy var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) - mood.setSanity(min(mood.sanity, SANITY_DISTURBED)) + mood?.setSanity(min(mood.sanity, SANITY_DISTURBED)) M.Jitter(5) if(prob(20)) M.emote(pick("twitch","laugh","frown")) @@ -426,7 +426,7 @@ /datum/reagent/drug/happiness/addiction_act_stage2(mob/living/M) var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) - mood.setSanity(min(mood.sanity, SANITY_UNSTABLE)) + mood?.setSanity(min(mood.sanity, SANITY_UNSTABLE)) M.Jitter(10) if(prob(30)) M.emote(pick("twitch","laugh","frown")) @@ -434,7 +434,7 @@ /datum/reagent/drug/happiness/addiction_act_stage3(mob/living/M) var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) - mood.setSanity(min(mood.sanity, SANITY_CRAZY)) + mood?.setSanity(min(mood.sanity, SANITY_CRAZY)) M.Jitter(15) if(prob(40)) M.emote(pick("twitch","laugh","frown")) @@ -442,7 +442,7 @@ /datum/reagent/drug/happiness/addiction_act_stage4(mob/living/carbon/human/M) var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) - mood.setSanity(SANITY_INSANE) + mood?.setSanity(SANITY_INSANE) M.Jitter(20) if(prob(50)) M.emote(pick("twitch","laugh","frown")) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 52a3bade891..02d224baffb 100755 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -95,6 +95,9 @@ data = taste_amounts +/datum/reagent/consumable/nutriment/get_taste_description(mob/living/taster) + return data + /datum/reagent/consumable/nutriment/vitamin name = "Vitamin" description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form." @@ -798,3 +801,25 @@ color = "#78280A" // rgb: 120 40, 10 taste_mult = 2.5 //sugar's 1.5, capsacin's 1.5, so a good middle ground. taste_description = "smokey sweetness" + +/datum/reagent/consumable/chocolatepudding + name = "Chocolate Pudding" + description = "A great dessert for chocolate lovers." + color = "#800000" + quality = DRINK_VERYGOOD + nutriment_factor = 4 * REAGENTS_METABOLISM + taste_description = "sweet chocolate" + glass_icon_state = "chocolatepudding" + glass_name = "chocolate pudding" + glass_desc = "Tasty." + +/datum/reagent/consumable/vanillapudding + name = "Vanilla Pudding" + description = "A great dessert for vanilla lovers." + color = "#FAFAD2" + quality = DRINK_VERYGOOD + nutriment_factor = 4 * REAGENTS_METABOLISM + taste_description = "sweet vanilla" + glass_icon_state = "vanillapudding" + glass_name = "vanilla pudding" + glass_desc = "Tasty." diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 325ef4646b2..f6d5385100a 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -151,8 +151,8 @@ M.adjustToxLoss(-power, 0, TRUE) //heals TOXINLOVERs M.adjustCloneLoss(-power, 0) for(var/i in M.all_wounds) - var/datum/wound/W = i - W.on_xadone(power) + var/datum/wound/iter_wound = i + iter_wound.on_xadone(power) REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) //fixes common causes for disfiguration . = 1 metabolization_rate = REAGENTS_METABOLISM * (0.00001 * (M.bodytemperature ** 2) + 0.5) @@ -204,8 +204,8 @@ M.adjustToxLoss(-power, 0, TRUE) M.adjustCloneLoss(-power, 0) for(var/i in M.all_wounds) - var/datum/wound/W = i - W.on_xadone(power) + var/datum/wound/iter_wound = i + iter_wound.on_xadone(power) REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) . = 1 ..() @@ -272,7 +272,7 @@ /datum/reagent/medicine/salglu_solution name = "Saline-Glucose Solution" - description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a temporary blood substitute." + description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a temporary blood substitute, as well as slowly speeding blood regeneration." reagent_state = LIQUID color = "#DCDCDC" metabolization_rate = 0.5 * REAGENTS_METABOLISM @@ -280,6 +280,7 @@ taste_description = "sweetness and salt" var/last_added = 0 var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active + var/extra_regen = 0.25 // in addition to acting as temporary blood, also add this much to their actual blood per tick /datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M) if(last_added) @@ -289,7 +290,7 @@ var/amount_to_add = min(M.blood_volume, volume*5) var/new_blood_level = min(M.blood_volume + amount_to_add, maximum_reachable) last_added = new_blood_level - M.blood_volume - M.blood_volume = new_blood_level + M.blood_volume = new_blood_level + extra_regen if(prob(33)) M.adjustBruteLoss(-0.5*REM, 0) M.adjustFireLoss(-0.5*REM, 0) @@ -569,7 +570,7 @@ /datum/reagent/medicine/morphine name = "Morphine" - description = "A painkiller that allows the patient to move at full speed even in bulky objects. Causes drowsiness and eventually unconsciousness in high doses. Overdose will cause a variety of effects, ranging from minor to lethal." + description = "A painkiller that allows the patient to move at full speed even when injured. Causes drowsiness and eventually unconsciousness in high doses. Overdose will cause a variety of effects, ranging from minor to lethal." reagent_state = LIQUID color = "#A9FBFB" metabolization_rate = 0.5 * REAGENTS_METABOLISM @@ -1217,7 +1218,7 @@ M.confused = max(0, M.confused-6) M.disgust = max(0, M.disgust-6) var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) - if(mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then... + if(mood != null && mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then... mood.setSanity(min(mood.sanity+5, SANITY_NEUTRAL)) // set minimum to prevent unwanted spiking over neutral ..() . = 1 @@ -1337,10 +1338,57 @@ L.Dizzy(0) L.Jitter(0) -// handled in cut wounds process +// helps bleeding wounds clot faster /datum/reagent/medicine/coagulant name = "Sanguirite" - description = "A coagulant used to help open cuts clot faster." + description = "A proprietary coagulant used to help bleeding wounds clot faster." reagent_state = LIQUID color = "#bb2424" metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 20 + /// How much base clotting we do per bleeding wound, multiplied by the below number for each bleeding wound + var/clot_rate = 0.25 + /// If we have multiple bleeding wounds, we count the number of bleeding wounds, then multiply the clot rate by this^(n) before applying it to each cut, so more cuts = less clotting per cut (though still more total clotting) + var/clot_coeff_per_wound = 0.9 + +/datum/reagent/medicine/coagulant/on_mob_life(mob/living/carbon/M) + . = ..() + if(!M.blood_volume || !M.all_wounds) + return + + var/effective_clot_rate = clot_rate + + for(var/i in M.all_wounds) + var/datum/wound/iter_wound = i + if(iter_wound.blood_flow) + effective_clot_rate *= clot_coeff_per_wound + + for(var/i in M.all_wounds) + var/datum/wound/iter_wound = i + iter_wound.blood_flow = max(0, iter_wound.blood_flow - effective_clot_rate) + +/datum/reagent/medicine/coagulant/overdose_process(mob/living/M) + . = ..() + if(!M.blood_volume) + return + + if(prob(15)) + M.losebreath += rand(2,4) + M.adjustOxyLoss(rand(1,3)) + if(prob(30)) + to_chat(M, "You can feel your blood clotting up in your veins!") + else if(prob(10)) + to_chat(M, "You feel like your blood has stopped moving!") + + if(prob(50)) + var/obj/item/organ/lungs/our_lungs = M.getorganslot(ORGAN_SLOT_LUNGS) + our_lungs.applyOrganDamage(1) + else + var/obj/item/organ/heart/our_heart = M.getorganslot(ORGAN_SLOT_HEART) + our_heart.applyOrganDamage(1) + +// can be synthesized on station rather than bought. made by grinding a banana peel, heating it up, then mixing the banana peel powder with salglu +/datum/reagent/medicine/coagulant/weak + name = "Synthi-Sanguirite" + description = "A synthetic coagulant used to help bleeding wounds clot faster. Not quite as effective as name brand Sanguirite, especially on patients with lots of cuts." + clot_coeff_per_wound = 0.8 diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index fd15da2df22..cd42a1a1c5c 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -201,6 +201,11 @@ M.ExtinguishMob() ..() +/datum/reagent/water/on_mob_life(mob/living/carbon/M) + . = ..() + if(M.blood_volume) + M.blood_volume += 0.1 // water is good for you! + /datum/reagent/water/holywater name = "Holy Water" description = "Water blessed by some deity." @@ -233,6 +238,8 @@ ..() /datum/reagent/water/holywater/on_mob_life(mob/living/carbon/M) + if(M.blood_volume) + M.blood_volume += 0.1 // water is good for you! if(!data) data = list("misc" = 1) data["misc"]++ @@ -1056,55 +1063,26 @@ color = "#A5F0EE" // rgb: 165, 240, 238 taste_description = "sourness" reagent_weight = 0.6 //so it sprays further + var/clean_types = CLEAN_WASH /datum/reagent/space_cleaner/expose_obj(obj/O, reac_volume) - if(istype(O, /obj/effect/decal/cleanable)) - qdel(O) - else - if(O) - O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + O?.wash(clean_types) /datum/reagent/space_cleaner/expose_turf(turf/T, reac_volume) if(reac_volume >= 1) - T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - for(var/obj/effect/decal/cleanable/C in T) - qdel(C) + T.wash(clean_types) + for(var/am in T) + var/atom/movable/movable_content + if(ismopable(movable_content)) // Mopables will be cleaned anyways by the turf wash + continue + movable_content.wash(clean_types) for(var/mob/living/simple_animal/slime/M in T) M.adjustToxLoss(rand(5,10)) /datum/reagent/space_cleaner/expose_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) - M.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.lip_style) - H.lip_style = null - H.update_body() - for(var/obj/item/I in C.held_items) - SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - if(C.wear_mask) - if(SEND_SIGNAL(C.wear_mask, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) - C.update_inv_wear_mask() - if(ishuman(M)) - var/mob/living/carbon/human/H = C - if(H.head) - if(SEND_SIGNAL(H.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) - H.update_inv_head() - if(H.wear_suit) - if(SEND_SIGNAL(H.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) - H.update_inv_wear_suit() - else if(H.w_uniform) - if(SEND_SIGNAL(H.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) - H.update_inv_w_uniform() - if(H.shoes) - if(SEND_SIGNAL(H.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) - H.update_inv_shoes() - SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + M.wash(clean_types) /datum/reagent/space_cleaner/ez_clean name = "EZ Clean" @@ -1375,6 +1353,7 @@ description = "An invisible powder. Unfortunately, since it's invisible, it doesn't look like it'd color much of anything..." else description = "\An [colorname] powder, used for coloring things [colorname]." + return ..() /datum/reagent/colorful_reagent/powder/red name = "Red Powder" @@ -1748,6 +1727,7 @@ /datum/reagent/colorful_reagent/New() SSticker.OnRoundstart(CALLBACK(src,.proc/UpdateColor)) + return ..() /datum/reagent/colorful_reagent/proc/UpdateColor() color = pick(random_color_list) @@ -1773,6 +1753,7 @@ /datum/reagent/hair_dye/New() SSticker.OnRoundstart(CALLBACK(src,.proc/UpdateColor)) + return ..() /datum/reagent/hair_dye/proc/UpdateColor() color = pick(potential_colors) @@ -2282,6 +2263,7 @@ reagent_state = LIQUID color = "#D2FFFA" metabolization_rate = 0.75 * REAGENTS_METABOLISM // 5u (WOUND_DETERMINATION_CRITICAL) will last for ~17 ticks + self_consuming = TRUE /// Whether we've had at least WOUND_DETERMINATION_SEVERE (2.5u) of determination at any given time. No damage slowdown immunity or indication we're having a second wind if it's just a single moderate wound var/significant = FALSE diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 3165fe9f4a8..0f834c6c2a3 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -30,6 +30,18 @@ results = list(/datum/reagent/medicine/salglu_solution = 3) required_reagents = list(/datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1) +/datum/chemical_reaction/baked_banana_peel + results = list(/datum/reagent/consumable/baked_banana_peel = 1) + required_temp = 413.15 // if it's good enough for caramel it's good enough for this + required_reagents = list(/datum/reagent/consumable/banana_peel = 1) + mix_message = "The pulp dries up and takes on a powdery state!" + mob_react = FALSE + +/datum/chemical_reaction/coagulant_weak + results = list(/datum/reagent/medicine/coagulant/weak = 3) + required_reagents = list(/datum/reagent/medicine/salglu_solution = 2, /datum/reagent/consumable/baked_banana_peel = 1) + mob_react = FALSE + /datum/chemical_reaction/mine_salve results = list(/datum/reagent/medicine/mine_salve = 3) required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/water = 1, /datum/reagent/iron = 1) @@ -38,8 +50,8 @@ results = list(/datum/reagent/medicine/mine_salve = 15) required_reagents = list(/datum/reagent/toxin/plasma = 5, /datum/reagent/iron = 5, /datum/reagent/consumable/sugar = 1) // A sheet of plasma, a twinkie and a sheet of metal makes four of these -/datum/chemical_reaction/instabitaluri - results = list(/datum/reagent/medicine/c2/instabitaluri = 3) +/datum/chemical_reaction/synthflesh + results = list(/datum/reagent/medicine/c2/synthflesh = 3) required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/c2/libital = 1) /datum/chemical_reaction/calomel diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index bb5f6f2e5b3..5f87268d040 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -401,14 +401,14 @@ required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1, /datum/reagent/medicine/cryoxadone = 1, /datum/reagent/consumable/triple_citrus = 1) /datum/chemical_reaction/life - required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/c2/instabitaluri = 1, /datum/reagent/blood = 1) + required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/c2/synthflesh = 1, /datum/reagent/blood = 1) required_temp = 374 /datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume) chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (hostile)") //defaults to HOSTILE_SPAWN /datum/chemical_reaction/life_friendly - required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/c2/instabitaluri = 1, /datum/reagent/consumable/sugar = 1) + required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/c2/synthflesh = 1, /datum/reagent/consumable/sugar = 1) required_temp = 374 /datum/chemical_reaction/life_friendly/on_reaction(datum/reagents/holder, created_volume) @@ -442,7 +442,7 @@ //water electrolysis /datum/chemical_reaction/electrolysis - results = list(/datum/reagent/oxygen = 10, /datum/reagent/hydrogen = 20) + results = list(/datum/reagent/oxygen = 1.5, /datum/reagent/hydrogen = 3) required_reagents = list(/datum/reagent/consumable/liquidelectricity = 1, /datum/reagent/water = 5) //butterflium diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm index 57b813f086c..9774d3ecfc3 100644 --- a/code/modules/reagents/chemistry/recipes/special.dm +++ b/code/modules/reagents/chemistry/recipes/special.dm @@ -54,7 +54,7 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related var/list/possible_results = list() /datum/chemical_reaction/randomized/proc/GenerateRecipe() - created = world.time + created = world.realtime if(randomize_container) required_container = pick(possible_containers) if(randomize_req_temperature) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index fea4aed8016..fb2e586244f 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -63,6 +63,17 @@ return 0 return 1 +/* + * On accidental consumption, transfer a portion of the reagents to the eater and the item it's in, then continue to the base proc (to deal with shattering glass containers) + */ +/obj/item/reagent_containers/on_accidental_consumption(mob/living/carbon/M, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE) + M.losebreath += 2 + reagents?.trans_to(M, min(15, reagents.total_volume / rand(5,10)), transfered_by = user, method = INGEST) + if(source_item?.reagents) + reagents.trans_to(source_item, min(source_item.reagents.total_volume / 2, reagents.total_volume / 5), transfered_by = user, method = TOUCH) + + return ..() + /obj/item/reagent_containers/ex_act() if(reagents) for(var/datum/reagent/R in reagents.reagent_list) diff --git a/code/modules/reagents/reagent_containers/chem_pack.dm b/code/modules/reagents/reagent_containers/chem_pack.dm index 4bb64506100..666f812e705 100644 --- a/code/modules/reagents/reagent_containers/chem_pack.dm +++ b/code/modules/reagents/reagent_containers/chem_pack.dm @@ -33,7 +33,7 @@ . += "Alt-click to seal it." -obj/item/reagent_containers/chem_pack/attack_self(mob/user) +/obj/item/reagent_containers/chem_pack/attack_self(mob/user) if(sealed) return ..() diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index b7286eaa239..5bfefbcd12c 100755 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -48,8 +48,20 @@ log_combat(user, M, "fed", reagents.log_list()) else to_chat(user, "You swallow a gulp of [src].") + SEND_SIGNAL(src, COMSIG_GLASS_DRANK, M, user) addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5, TRUE, TRUE, FALSE, user, FALSE, INGEST), 5) playsound(M.loc,'sound/items/drink.ogg', rand(10,50), TRUE) + if(iscarbon(M)) + var/mob/living/carbon/carbon_drinker = M + var/list/diseases = carbon_drinker.get_static_viruses() + if(LAZYLEN(diseases)) + var/list/datum/disease/diseases_to_add = list() + for(var/d in diseases) + var/datum/disease/malady = d + if(malady.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS) + diseases_to_add += malady + if(LAZYLEN(diseases_to_add)) + AddComponent(/datum/component/infective, diseases_to_add) /obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity) . = ..() @@ -108,6 +120,13 @@ return ..() +/* + * On accidental consumption, make sure the container is partially glass, and continue to the reagent_container proc + */ +/obj/item/reagent_containers/glass/on_accidental_consumption(mob/living/carbon/M, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE) + if(!custom_materials) + custom_materials = list(SSmaterials.GetMaterialRef(/datum/material/glass) = 5) //sets it to glass so, later on, it gets picked up by the glass catch (hope it doesn't 'break' things lol) + return ..() /obj/item/reagent_containers/glass/beaker name = "beaker" @@ -206,8 +225,8 @@ name = "epinephrine reserve tank (diluted)" list_reagents = list(/datum/reagent/medicine/epinephrine = 50) -/obj/item/reagent_containers/glass/beaker/instabitaluri - list_reagents = list(/datum/reagent/medicine/c2/instabitaluri = 50) +/obj/item/reagent_containers/glass/beaker/synthflesh + list_reagents = list(/datum/reagent/medicine/c2/synthflesh = 50) /obj/item/reagent_containers/glass/bucket name = "bucket" diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 6226e681e66..6711be55a1e 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -277,7 +277,14 @@ /obj/item/reagent_containers/hypospray/medipen/ekit name = "emergency first-aid autoinjector" - desc = "An epinephrine medipen with trace amounts of coagulants and antibiotics to help stabilize bad cuts and burns." + desc = "An epinephrine medipen with extra coagulant and antibiotics to help stabilize bad cuts and burns." volume = 15 amount_per_transfer_from_this = 15 list_reagents = list(/datum/reagent/medicine/epinephrine = 12, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/medicine/spaceacillin = 0.5) + +/obj/item/reagent_containers/hypospray/medipen/blood_loss + name = "hypovolemic-response autoinjector" + desc = "A medipen designed to stabilize and rapidly reverse severe bloodloss." + volume = 15 + amount_per_transfer_from_this = 15 + list_reagents = list(/datum/reagent/medicine/epinephrine = 5, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/iron = 3.5, /datum/reagent/medicine/salglu_solution = 4) diff --git a/code/modules/reagents/reagent_containers/medigel.dm b/code/modules/reagents/reagent_containers/medigel.dm index 78f910aa942..f8a11e186b9 100644 --- a/code/modules/reagents/reagent_containers/medigel.dm +++ b/code/modules/reagents/reagent_containers/medigel.dm @@ -88,12 +88,12 @@ current_skin = "burngel" list_reagents = list(/datum/reagent/medicine/c2/aiuri = 24, /datum/reagent/medicine/granibitaluri = 36) -/obj/item/reagent_containers/medigel/instabitaluri - name = "medical gel (instabitaluri)" - desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains instabitaluri, a slightly toxic medicine capable of healing both bruises and burns." +/obj/item/reagent_containers/medigel/synthflesh + name = "medical gel (synthflesh)" + desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains synthflesh, a slightly toxic medicine capable of healing both bruises and burns." icon_state = "synthgel" current_skin = "synthgel" - list_reagents = list(/datum/reagent/medicine/c2/instabitaluri = 60) + list_reagents = list(/datum/reagent/medicine/c2/synthflesh = 60) custom_price = 600 /obj/item/reagent_containers/medigel/sterilizine diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index b0f2701cecf..0642313f5b5 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -39,8 +39,8 @@ list_reagents = list(/datum/reagent/medicine/c2/aiuri = 2, /datum/reagent/medicine/granibitaluri = 8) icon_state = "bandaid_burn" -/obj/item/reagent_containers/pill/patch/instabitaluri - name = "instabitaluri patch" +/obj/item/reagent_containers/pill/patch/synthflesh + name = "synthflesh patch" desc = "Helps with brute and burn injuries. Slightly toxic." - list_reagents = list(/datum/reagent/medicine/c2/instabitaluri = 20) + list_reagents = list(/datum/reagent/medicine/c2/synthflesh = 20) icon_state = "bandaid_both" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 1ae0c2442a9..1766949e89d 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -73,6 +73,18 @@ reagents.trans_to(target, reagents.total_volume, transfered_by = user) qdel(src) +/* + * On accidental consumption, consume the pill + */ +/obj/item/reagent_containers/pill/on_accidental_consumption(mob/living/carbon/M, mob/living/carbon/user, obj/item/source_item, discover_after = FALSE) + to_chat(M, "You swallow something small. Was that in \the [source_item]?") + if(reagents?.total_volume) + reagents.trans_to(M, reagents.total_volume, transfered_by = user, method = INGEST) + + source_item?.contents -= src + qdel(src) + return discover_after + /obj/item/reagent_containers/pill/tox name = "toxins pill" desc = "Highly toxic." diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 412f54e4b06..a42895061ce 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/janitor.dmi' icon_state = "sprayer_large" inhand_icon_state = "cleaner" + worn_icon_state = "spraybottle" lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' item_flags = NOBLUDGEON diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 53c6e2abb18..0aa074a33cd 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -15,6 +15,7 @@ custom_materials = list(/datum/material/iron=10, /datum/material/glass=20) reagent_flags = TRANSPARENT custom_price = 150 + sharpness = SHARP_POINTY /obj/item/reagent_containers/syringe/Initialize() . = ..() @@ -155,6 +156,17 @@ mode = SYRINGE_DRAW update_icon() +/* + * On accidental consumption, inject the eater with 2/3rd of the syringe and reveal it + */ +/obj/item/reagent_containers/syringe/on_accidental_consumption(mob/living/carbon/M, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE) + to_chat(M, "There's a syringe in \the [source_item]!!") + M.apply_damage(5, BRUTE, BODY_ZONE_HEAD) + if(reagents?.total_volume) + reagents.trans_to(M, round(reagents.total_volume*(2/3)), transfered_by = user, method = INJECT) + + return discover_after + /obj/item/reagent_containers/syringe/update_icon_state() var/rounded_vol = get_rounded_vol() icon_state = "[rounded_vol]" diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index f8eb5607209..db07523ef1a 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -228,7 +228,7 @@ if(stored) stored.forceMove(T) src.transfer_fingerprints_to(stored) - stored.anchored = FALSE + stored.set_anchored(FALSE) stored.density = TRUE stored.update_icon() for(var/atom/movable/AM in src) //out, out, darned crowbar! diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index b97d3a77b5f..a548e699b6a 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -13,12 +13,18 @@ var/obj/pipe_type = /obj/structure/disposalpipe/segment var/pipename +/obj/structure/disposalconstruct/set_anchored(anchorvalue) + . = ..() + if(isnull(.)) + return + density = anchorvalue ? initial(pipe_type.density) : FALSE + /obj/structure/disposalconstruct/Initialize(loc, _pipe_type, _dir = SOUTH, flip = FALSE, obj/make_from) . = ..() if(make_from) pipe_type = make_from.type setDir(make_from.dir) - anchored = TRUE + set_anchored(TRUE) else if(_pipe_type) @@ -104,8 +110,7 @@ /obj/structure/disposalconstruct/wrench_act(mob/living/user, obj/item/I) ..() if(anchored) - anchored = FALSE - density = FALSE + set_anchored(FALSE) to_chat(user, "You detach the [pipename] from the underfloor.") else var/ispipe = is_pipe() // Indicates if we should change the level of this pipe @@ -140,8 +145,7 @@ to_chat(user, "The [pipename] requires a trunk underneath it in order to work!") return TRUE - anchored = TRUE - density = initial(pipe_type.density) + set_anchored(TRUE) to_chat(user, "You attach the [pipename] to the underfloor.") I.play_tool_sound(src, 100) update_icon() diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index eb9172fef38..a58bb4ddb87 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -328,6 +328,7 @@ desc = "Used to set the destination of properly wrapped packages." icon = 'icons/obj/device.dmi' icon_state = "cargotagger" + worn_icon_state = "cargotagger" var/currTag = 0 //Destinations are stored in code\globalvars\lists\flavor_misc.dm var/locked_destination = FALSE //if true, users can't open the destination tag window to prevent changing the tagger's current destination w_class = WEIGHT_CLASS_TINY @@ -382,6 +383,7 @@ desc = "A scanner that lets you tag wrapped items for sale, splitting the profit between you and cargo. Ctrl-Click to clear the registered account." icon = 'icons/obj/device.dmi' icon_state = "salestagger" + worn_icon_state = "salestagger" inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' diff --git a/code/modules/research/bepis.dm b/code/modules/research/bepis.dm index 69cc42b1a54..e76ad7c9ad5 100644 --- a/code/modules/research/bepis.dm +++ b/code/modules/research/bepis.dm @@ -4,8 +4,8 @@ #define MACHINE_OPERATION 100000 #define MACHINE_OVERLOAD 500000 -#define MAJOR_THRESHOLD 5500 -#define MINOR_THRESHOLD 3500 +#define MAJOR_THRESHOLD 3000 +#define MINOR_THRESHOLD 2000 #define STANDARD_DEVIATION 1000 /obj/machinery/rnd/bepis @@ -94,7 +94,7 @@ update_icon_state() say("Attempting to deposit 0 credits. Aborting.") return - deposit_value = clamp(round(deposit_value, 1), 1, 15000) + deposit_value = clamp(round(deposit_value, 1), 1, 10000) if(!account) say("Cannot find user account. Please swipe a valid ID.") return diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index cae328fd0ba..b804cd89fc8 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -311,3 +311,10 @@ build_path = /obj/item/circuitboard/computer/advanced_camera category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/board/bountypad_control + name = "Computer Design (Civilian Bounty Pad Control)" + desc = "Allows for the construction of circuit boards used to build a new civilian bounty pad console." + id = "bounty_pad_control" + build_path = /obj/item/circuitboard/computer/bountypad + category = list("Computer Boards") diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index 4064592cea2..ae5e84acf70 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -6,7 +6,7 @@ name = "Left Arm" id = "leftarm" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/instabitaluri = 25) + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 25) build_path = /obj/item/bodypart/l_arm category = list("initial","human","lizard","moth","plasmaman","ethereal") @@ -14,7 +14,7 @@ name = "Right Arm" id = "rightarm" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/instabitaluri = 25) + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 25) build_path = /obj/item/bodypart/r_arm category = list("initial","human","lizard","moth","plasmaman","ethereal") @@ -22,7 +22,7 @@ name = "Left Leg" id = "leftleg" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/instabitaluri = 25) + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 25) build_path = /obj/item/bodypart/l_leg category = list("initial","human","lizard","moth","plasmaman","ethereal") @@ -30,7 +30,7 @@ name = "Right Leg" id = "rightleg" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/instabitaluri = 25) + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 25) build_path = /obj/item/bodypart/r_leg category = list("initial","human","lizard","moth","plasmaman","ethereal") @@ -40,7 +40,7 @@ name = "Arm Blade" id = "armblade" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/instabitaluri = 75) + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 75) build_path = /obj/item/melee/synthetic_arm_blade category = list("other","emagged") @@ -48,7 +48,7 @@ name = "Heart" id = "heart" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/instabitaluri = 30) + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 30) build_path = /obj/item/organ/heart category = list("other") @@ -56,7 +56,7 @@ name = "Lungs" id = "lungs" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/instabitaluri = 20) + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) build_path = /obj/item/organ/lungs category = list("other") @@ -64,7 +64,7 @@ name = "Liver" id = "liver" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/instabitaluri = 20) + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) build_path = /obj/item/organ/liver category = list("other") @@ -72,7 +72,7 @@ name = "Stomach" id = "stomach" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/instabitaluri = 15) + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 15) build_path = /obj/item/organ/stomach category = list("other") @@ -80,7 +80,7 @@ name = "Appendix" id = "appendix" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/instabitaluri = 5) //why would you need this + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 5) //why would you need this build_path = /obj/item/organ/appendix category = list("other") @@ -88,7 +88,7 @@ name = "Eyes" id = "eyes" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/instabitaluri = 10) + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10) build_path = /obj/item/organ/eyes category = list("other") @@ -96,7 +96,7 @@ name = "Ears" id = "ears" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/instabitaluri = 10) + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10) build_path = /obj/item/organ/ears category = list("other") @@ -104,6 +104,6 @@ name = "Tongue" id = "tongue" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/instabitaluri = 10) + reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10) build_path = /obj/item/organ/tongue category = list("other") diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 2ff5c6270a6..19ba8458e6e 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -230,7 +230,7 @@ id = "bepis" build_path = /obj/item/circuitboard/machine/bepis category = list("Research Machinery") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_CARGO /datum/design/board/protolathe name = "Machine Design (Protolathe Board)" @@ -610,15 +610,30 @@ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/board/sheetifier - name = "Sheetifier" - desc = "This machine turns weird things into sheets." + name = "Machine Design (Sheet-meister 2000)" + desc = "The circuit board for a Sheet-meister 2000." id = "sheetifier" build_path = /obj/item/circuitboard/machine/sheetifier category = list ("Misc. Machinery") /datum/design/board/vendatray - name = "Vend-a-Tray" + name = "Machine Design (Vend-a-Tray)" desc = "The circuit board for a Vend-a-Tray." id = "vendatray" build_path = /obj/item/circuitboard/machine/vendatray category = list ("Misc. Machinery") + +/datum/design/board/bountypad + name = "Machine Design (Civilian Bounty Pad)" + desc = "The circuit board for a Civilian Bounty Pad." + id = "bounty_pad" + build_path = /obj/item/circuitboard/machine/bountypad + category = list ("Misc. Machinery") + +/datum/design/board/skill_station + name = "Machine Design (Skill station)" + desc = "The circuit board for Skill station." + id = "skill_station" + build_path = /obj/item/circuitboard/machine/skill_station + category = list ("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SERVICE diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index fa5e30df7ee..16d132af94f 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -613,7 +613,7 @@ construction_time = 40 materials = list(/datum/material/iron = 500, /datum/material/glass = 500) build_path = /obj/item/organ/stomach/cybernetic - category = list("Misc", "Medical Designs") + category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cybernetic_stomach/tier2 @@ -803,7 +803,7 @@ /datum/design/surgery/wing_reconstruction name = "Wing Reconstruction" - desc = "An experimental surgical procedure that reconstructs the damaged wings of moth people. Requires Instabitaluri." + desc = "An experimental surgical procedure that reconstructs the damaged wings of moth people. Requires Synthflesh." id = "surgery_wing_reconstruction" surgery = /datum/surgery/advanced/wing_reconstruction research_icon_state = "surgery_chest" diff --git a/code/modules/research/nanites/nanite_chamber.dm b/code/modules/research/nanites/nanite_chamber.dm index 782d0ef0fdd..73871777689 100644 --- a/code/modules/research/nanites/nanite_chamber.dm +++ b/code/modules/research/nanites/nanite_chamber.dm @@ -178,7 +178,7 @@ return TRUE -/obj/machinery/nanite_chamber/relaymove(mob/user as mob) +/obj/machinery/nanite_chamber/relaymove(mob/user) if(user.stat || locked) if(message_cooldown <= world.time) message_cooldown = world.time + 50 diff --git a/code/modules/research/nanites/public_chamber.dm b/code/modules/research/nanites/public_chamber.dm index 946abae9900..625f3cd7bee 100644 --- a/code/modules/research/nanites/public_chamber.dm +++ b/code/modules/research/nanites/public_chamber.dm @@ -172,7 +172,7 @@ return TRUE -/obj/machinery/public_nanite_chamber/relaymove(mob/user as mob) +/obj/machinery/public_nanite_chamber/relaymove(mob/user) if(user.stat || locked) if(message_cooldown <= world.time) message_cooldown = world.time + 50 diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index b5383c94864..3006723d902 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -6,6 +6,7 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good desc = "Special mechanical module made to store, sort, and apply standard machine parts." icon_state = "RPED" inhand_icon_state = "RPED" + worn_icon_state = "RPED" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' w_class = WEIGHT_CLASS_HUGE diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 08c57c986d0..7e71f86788b 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -131,6 +131,7 @@ display_name = "Data Theory" description = "Big Data, in space!" prereq_ids = list("base") + design_ids = list("bounty_pad","bounty_pad_control") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -301,6 +302,7 @@ display_name = "Neural Programming" description = "Study into networks of processing units that mimic our brains." prereq_ids = list("biotech", "datatheory") + design_ids = list("skill_station") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -1078,23 +1080,12 @@ hidden = TRUE experimental = TRUE -/datum/techweb_node/rolling_table - id = "rolling_table" - display_name = "Advanced Wheel Applications" - description = "Adding wheels to things can lead to extremely beneficial outcomes." +/datum/techweb_node/extreme_office + id = "extreme_office" + display_name = "Advanced Office Applications" + description = "Some of our smartest lab guys got together on a Friday and improved our office efficiency by 350%. Here's how." prereq_ids = list("base") - design_ids = list("rolling_table") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - export_price = 2500 - hidden = TRUE - experimental = TRUE - -/datum/techweb_node/mauna_mug - id = "mauna_mug" - display_name = "Mauna Mug" - description = "A bored scientist was thinking to himself for very long...and then realized his coffee got cold! He made this invention to solve this extreme problem." - prereq_ids = list("base") - design_ids = list("mauna_mug") + design_ids = list("rolling_table", "mauna_mug") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 2500 hidden = TRUE diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index ac3a051031b..4439a19b448 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -223,7 +223,7 @@ duration = -1 alert_type = null -datum/status_effect/rebreathing/tick() +/datum/status_effect/rebreathing/tick() owner.adjustOxyLoss(-6, 0) //Just a bit more than normal breathing. /////////////////////////////////////////////////////// @@ -505,7 +505,7 @@ datum/status_effect/rebreathing/tick() ADD_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus") return ..() -datum/status_effect/stabilized/blue/on_remove() +/datum/status_effect/stabilized/blue/on_remove() REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus") /datum/status_effect/stabilized/metal diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 5cc8fbe33b1..717409bc8f7 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -2,6 +2,7 @@ #define ENGINES_START_TIME 100 #define ENGINES_STARTED (SSshuttle.emergency.mode == SHUTTLE_IGNITING) #define IS_DOCKED (SSshuttle.emergency.mode == SHUTTLE_DOCKED || (ENGINES_STARTED)) +#define SHUTTLE_CONSOLE_ACTION_DELAY (5 SECONDS) /obj/machinery/computer/emergency_shuttle name = "emergency shuttle console" @@ -11,6 +12,7 @@ var/auth_need = 3 var/list/authorized = list() + var/list/acted_recently = list() /obj/machinery/computer/emergency_shuttle/attackby(obj/item/I, mob/user,params) if(istype(I, /obj/item/card/id)) @@ -21,13 +23,12 @@ return GLOB.human_adjacent_state /obj/machinery/computer/emergency_shuttle/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "EmergencyShuttleConsole", name) ui.open() -/obj/machinery/computer/emergency_shuttle/ui_data() +/obj/machinery/computer/emergency_shuttle/ui_data(user) var/list/data = list() data["timer_str"] = SSshuttle.emergency.getTimerStr() @@ -45,7 +46,7 @@ A += list(list("name" = name, "job" = job)) data["authorizations"] = A - data["enabled"] = (IS_DOCKED && !ENGINES_STARTED) + data["enabled"] = (IS_DOCKED && !ENGINES_STARTED) && !(user in acted_recently) data["emagged"] = obj_flags & EMAGGED ? 1 : 0 return data @@ -70,7 +71,11 @@ to_chat(user, "The access level of your card is not high enough.") return + if (user in acted_recently) + return + var/old_len = authorized.len + addtimer(CALLBACK(src, .proc/clear_recent_action, user), SHUTTLE_CONSOLE_ACTION_DELAY) switch(action) if("authorize") @@ -95,6 +100,9 @@ if(repeal) minor_announce("Early launch authorization revoked, [remaining] authorizations needed") + acted_recently += user + ui_interact(user) + /obj/machinery/computer/emergency_shuttle/proc/authorize(mob/user, source) var/obj/item/card/id/ID = user.get_idcard(TRUE) @@ -113,6 +121,11 @@ . = TRUE process() +/obj/machinery/computer/emergency_shuttle/proc/clear_recent_action(mob/user) + acted_recently -= user + if (!QDELETED(user)) + ui_interact(user) + /obj/machinery/computer/emergency_shuttle/process() // Launch check is in process in case auth_need changes for some reason // probably external. @@ -595,3 +608,4 @@ #undef ENGINES_START_TIME #undef ENGINES_STARTED #undef IS_DOCKED +#undef SHUTTLE_CONSOLE_ACTION_DELAY diff --git a/code/modules/shuttle/shuttle_rotate.dm b/code/modules/shuttle/shuttle_rotate.dm index 5b5f325d9f4..fbdfd91dbf2 100644 --- a/code/modules/shuttle/shuttle_rotate.dm +++ b/code/modules/shuttle/shuttle_rotate.dm @@ -12,8 +12,8 @@ If ever any of these procs are useful for non-shuttles, rename it to proc/rotate setDir(angle2dir(rotation+dir2angle(dir))) //resmooth if need be. - if(smooth && (params & ROTATE_SMOOTH)) - queue_smooth(src) + if(smoothing_flags && (params & ROTATE_SMOOTH)) + QUEUE_SMOOTH(src) //rotate the pixel offsets too. if((pixel_x || pixel_y) && (params & ROTATE_OFFSET)) diff --git a/code/modules/shuttle/spaceship_navigation_beacon.dm b/code/modules/shuttle/spaceship_navigation_beacon.dm index ec6efb1e6b4..e5b4cf4ea79 100644 --- a/code/modules/shuttle/spaceship_navigation_beacon.dm +++ b/code/modules/shuttle/spaceship_navigation_beacon.dm @@ -21,7 +21,7 @@ . = ..() SSshuttle.beacons |= src -obj/machinery/spaceship_navigation_beacon/emp_act() +/obj/machinery/spaceship_navigation_beacon/emp_act() locked = TRUE /obj/machinery/spaceship_navigation_beacon/Destroy() diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 144f38ec681..006ce3abaa4 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -331,7 +331,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th var/obj/effect/overlay/spell = new /obj/effect/overlay(location) spell.icon = overlay_icon spell.icon_state = overlay_icon_state - spell.anchored = TRUE + spell.set_anchored(TRUE) spell.density = FALSE QDEL_IN(spell, overlay_lifespan) diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index e9b8d039cc3..34f006110f4 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -102,6 +102,19 @@ /obj/machinery/satellite/interact(mob/user) toggle(user) +/obj/machinery/satellite/set_anchored(anchorvalue) + . = ..() + if(isnull(.)) + return //no need to process if we didn't change anything. + active = anchorvalue + if(anchorvalue) + begin_processing() + animate(src, pixel_y = 2, time = 10, loop = -1) + else + end_processing() + animate(src, pixel_y = 0, time = 10) + update_icon() + /obj/machinery/satellite/proc/toggle(mob/user) if(!active && !isinspace()) if(user) @@ -109,16 +122,7 @@ return FALSE if(user) to_chat(user, "You [active ? "deactivate": "activate"] [src].") - active = !active - if(active) - begin_processing() - animate(src, pixel_y = 2, time = 10, loop = -1) - anchored = TRUE - else - end_processing() - animate(src, pixel_y = 0, time = 10) - anchored = FALSE - update_icon() + set_anchored(!anchored) /obj/machinery/satellite/update_icon_state() icon_state = active ? "sat_active" : "sat_inactive" diff --git a/code/modules/surgery/advanced/wingreconstruction.dm b/code/modules/surgery/advanced/wingreconstruction.dm index fa16e902adc..ae2df9ea7f8 100644 --- a/code/modules/surgery/advanced/wingreconstruction.dm +++ b/code/modules/surgery/advanced/wingreconstruction.dm @@ -1,6 +1,6 @@ /datum/surgery/advanced/wing_reconstruction name = "Wing Reconstruction" - desc = "An experimental surgical procedure that reconstructs the damaged wings of moth people. Requires Instabitaluri." + desc = "An experimental surgical procedure that reconstructs the damaged wings of moth people. Requires Synthflesh." steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, @@ -15,7 +15,7 @@ name = "start wing reconstruction" implements = list(TOOL_HEMOSTAT = 85, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) time = 200 - chems_needed = list(/datum/reagent/medicine/c2/instabitaluri) + chems_needed = list(/datum/reagent/medicine/c2/synthflesh) require_all_chems = FALSE /datum/surgery_step/wing_reconstruction/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 55ca39ec0a6..0adebde80d8 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -81,12 +81,12 @@ /// A hat won't cover your face, but a shirt covering your chest will cover your... you know, chest var/scars_covered_by_clothes = TRUE - /// Descriptions for the locations on the limb for scars to be assigned, just cosmetic - var/list/specific_locations = list("general area") /// So we know if we need to scream if this limb hits max damage var/last_maxed /// How much generic bleedstacks we have on this bodypart var/generic_bleedstacks + /// If we have a gauze wrapping currently applied (not including splints) + var/obj/item/stack/current_gauze /obj/item/bodypart/examine(mob/user) @@ -149,9 +149,23 @@ var/turf/T = get_turf(src) if(status != BODYPART_ROBOTIC) playsound(T, 'sound/misc/splort.ogg', 50, TRUE, -1) + if(current_gauze) + QDEL_NULL(current_gauze) + for(var/obj/item/organ/drop_organ in get_organs()) + drop_organ.transfer_to_limb(src, owner) for(var/obj/item/I in src) I.forceMove(T) +///since organs aren't actually stored in the bodypart themselves while attached to a person, we have to query the owner for what we should have +/obj/item/bodypart/proc/get_organs() + if(!owner) + return + . = list() + for(var/i in owner.internal_organs) //internal organs inside the dismembered limb are dropped. + var/obj/item/organ/organ_check = i + if(check_zone(organ_check.zone) == body_zone) + . += organ_check + /obj/item/bodypart/proc/consider_processing() if(stamina_dam > DAMAGE_PRECISION) . = TRUE @@ -169,7 +183,7 @@ //Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all. //Damage will not exceed max_damage using this proc //Cannot apply negative damage -/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, blocked = 0, updating_health = TRUE, required_status = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) // maybe separate BRUTE_SHARP and BRUTE_OTHER eventually somehow hmm +/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, blocked = 0, updating_health = TRUE, required_status = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE) // maybe separate BRUTE_SHARP and BRUTE_OTHER eventually somehow hmm var/hit_percent = (100-blocked)/100 if((!brute && !burn && !stamina) || hit_percent <= 0) return FALSE @@ -197,16 +211,64 @@ if(ALIEN_BODYPART,LARVA_BODYPART) //aliens take double burn //nothing can burn with so much snowflake code around burn *= 2 - var/wounding_type = (brute > burn ? WOUND_BRUTE : WOUND_BURN) + /* + // START WOUND HANDLING + */ + + // what kind of wounds we're gonna roll for, take the greater between brute and burn, then if it's brute, we subdivide based on sharpness + var/wounding_type = (brute > burn ? WOUND_BLUNT : WOUND_BURN) var/wounding_dmg = max(brute, burn) - if(wounding_type == WOUND_BRUTE && sharpness) - wounding_type = WOUND_SHARP - // i know this is effectively the same check as above but i don't know if those can null the damage by rounding and want to be safe - if(owner && wounding_dmg > 4 && wound_bonus != CANT_WOUND) - // if you want to make tox wounds or some other type, this will need to be expanded and made more modular - // handle all our wounding stuff + + var/mangled_state = get_mangled_state() + var/bio_state = owner.get_biological_state() + var/easy_dismember = HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) // if we have easydismember, we don't reduce damage when redirecting damage to different types (slashing weapons on mangled/skinless limbs attack at 100% instead of 50%) + + if(wounding_type == WOUND_BLUNT) + if(sharpness == SHARP_EDGED) + wounding_type = WOUND_SLASH + else if(sharpness == SHARP_POINTY) + wounding_type = WOUND_PIERCE + + //Handling for bone only/flesh only(none right now)/flesh and bone targets + switch(bio_state) + // if we're bone only, all cutting attacks go straight to the bone + if(BIO_JUST_BONE) + if(wounding_type == WOUND_SLASH) + wounding_type = WOUND_BLUNT + wounding_dmg *= (easy_dismember ? 1 : 0.5) + else if(wounding_type == WOUND_PIERCE) + wounding_type = WOUND_BLUNT + wounding_dmg *= (easy_dismember ? 1 : 0.75) + if((mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)) + return + // note that there's no handling for BIO_JUST_FLESH since we don't have any that are that right now (slimepeople maybe someday) + // standard humanoids + if(BIO_FLESH_BONE) + // if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate + // So a big sharp weapon is still all you need to destroy a limb + if(mangled_state == BODYPART_MANGLED_FLESH && sharpness) + playsound(src, "sound/effects/wounds/crackandbleed.ogg", 100) + if(wounding_type == WOUND_SLASH && !easy_dismember) + wounding_dmg *= 0.5 // edged weapons pass along 50% of their wounding damage to the bone since the power is spread out over a larger area + if(wounding_type == WOUND_PIERCE && !easy_dismember) + wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated + wounding_type = WOUND_BLUNT + else if(mangled_state == BODYPART_MANGLED_BOTH && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)) + return + + // now we have our wounding_type and are ready to carry on with wounds and dealing the actual damage + if(owner && wounding_dmg >= WOUND_MINIMUM_DAMAGE && wound_bonus != CANT_WOUND) check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus) + for(var/i in wounds) + var/datum/wound/iter_wound = i + iter_wound.receive_damage(wounding_type, wounding_dmg, wound_bonus) + + /* + // END WOUND HANDLING + */ + + //back to our regularly scheduled program, we now actually apply damage if there's room below limb damage cap var/can_inflict = max_damage - get_damage() var/total_damage = brute + burn if(total_damage > can_inflict && total_damage > 0) // TODO: the second part of this check should be removed once disabling is all done @@ -219,10 +281,6 @@ brute_dam += brute burn_dam += burn - for(var/i in wounds) - var/datum/wound/W = i - W.receive_damage(wounding_type, wounding_dmg, wound_bonus) - //We've dealt the physical damages, if there's room lets apply the stamina damage. stamina_dam += round(clamp(stamina, 0, max_stamina_damage - stamina_dam), DAMAGE_PRECISION) @@ -236,14 +294,58 @@ update_disabled() return update_bodypart_damage_state() || . +/// Allows us to roll for and apply a wound without actually dealing damage. Used for aggregate wounding power with pellet clouds +/obj/item/bodypart/proc/painless_wound_roll(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus, sharpness=SHARP_NONE) + if(!owner || phantom_wounding_dmg <= WOUND_MINIMUM_DAMAGE || wound_bonus == CANT_WOUND) + return + + var/mangled_state = get_mangled_state() + var/bio_state = owner.get_biological_state() + var/easy_dismember = HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) // if we have easydismember, we don't reduce damage when redirecting damage to different types (slashing weapons on mangled/skinless limbs attack at 100% instead of 50%) + + if(wounding_type == WOUND_BLUNT) + if(sharpness == SHARP_EDGED) + wounding_type = WOUND_SLASH + else if(sharpness == SHARP_POINTY) + wounding_type = WOUND_PIERCE + + //Handling for bone only/flesh only(none right now)/flesh and bone targets + switch(bio_state) + // if we're bone only, all cutting attacks go straight to the bone + if(BIO_JUST_BONE) + if(wounding_type == WOUND_SLASH) + wounding_type = WOUND_BLUNT + phantom_wounding_dmg *= (easy_dismember ? 1 : 0.5) + else if(wounding_type == WOUND_PIERCE) + wounding_type = WOUND_BLUNT + phantom_wounding_dmg *= (easy_dismember ? 1 : 0.75) + if((mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus)) + return + // note that there's no handling for BIO_JUST_FLESH since we don't have any that are that right now (slimepeople maybe someday) + // standard humanoids + if(BIO_FLESH_BONE) + // if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate + // So a big sharp weapon is still all you need to destroy a limb + if(mangled_state == BODYPART_MANGLED_FLESH && sharpness) + playsound(src, "sound/effects/wounds/crackandbleed.ogg", 100) + if(wounding_type == WOUND_SLASH && !easy_dismember) + phantom_wounding_dmg *= 0.5 // edged weapons pass along 50% of their wounding damage to the bone since the power is spread out over a larger area + if(wounding_type == WOUND_PIERCE && !easy_dismember) + phantom_wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated + wounding_type = WOUND_BLUNT + else if(mangled_state == BODYPART_MANGLED_BOTH && try_dismember(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus)) + return + + check_wounding(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus) + /** * check_wounding() is where we handle rolling for, selecting, and applying a wound if we meet the criteria * - * We generate a "score" for how woundable the attack was based on the damage and other factors discussed in [check_wounding_mods()], then go down the list from most severe to least severe wounds in that category. + * We generate a "score" for how woundable the attack was based on the damage and other factors discussed in [/obj/item/bodypart/proc/check_wounding_mods], then go down the list from most severe to least severe wounds in that category. * We can promote a wound from a lesser to a higher severity this way, but we give up if we have a wound of the given type and fail to roll a higher severity, so no sidegrades/downgrades * * Arguments: - * * woundtype- Either WOUND_SHARP, WOUND_BRUTE, or WOUND_BURN based on the attack type. + * * woundtype- Either WOUND_BLUNT, WOUND_SLASH, WOUND_PIERCE, or WOUND_BURN based on the attack type. * * damage- How much damage is tied to this attack, since wounding potential scales with damage in an attack (see: WOUND_DAMAGE_EXPONENT) * * wound_bonus- The wound_bonus of an attack * * bare_wound_bonus- The bare_wound_bonus of an attack @@ -252,21 +354,29 @@ // actually roll wounds if applicable if(HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE)) damage *= 1.5 + else + damage = min(damage, WOUND_MAX_CONSIDERED_DAMAGE) if(HAS_TRAIT(owner,TRAIT_HARDLIMBDISABLE)) - damage *= 0.5 + damage *= 0.8 + + if(HAS_TRAIT(owner, TRAIT_EASYDISMEMBER)) + damage *= 1.25 var/base_roll = rand(1, round(damage ** WOUND_DAMAGE_EXPONENT)) var/injury_roll = base_roll injury_roll += check_woundings_mods(woundtype, damage, wound_bonus, bare_wound_bonus) - var/list/wounds_checking + var/list/wounds_checking = GLOB.global_wound_types[woundtype] - switch(woundtype) - if(WOUND_SHARP) - wounds_checking = WOUND_LIST_CUT - if(WOUND_BRUTE) - wounds_checking = WOUND_LIST_BONE - if(WOUND_BURN) - wounds_checking = WOUND_LIST_BURN + // quick re-check to see if bare_wound_bonus applies, for the benefit of log_wound(), see about getting the check from check_woundings_mods() somehow + if(ishuman(owner)) + var/mob/living/carbon/human/human_wearer = owner + var/list/clothing = human_wearer.clothingonpart(src) + for(var/i in clothing) + var/obj/item/clothing/clothes_check = i + // unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary + if(clothes_check.armor.getRating("wound")) + bare_wound_bonus = 0 + break //cycle through the wounds of the relevant category from the most severe down for(var/PW in wounds_checking) @@ -281,21 +391,22 @@ replaced_wound = existing_wound if(initial(possible_wound.threshold_minimum) < injury_roll) + var/datum/wound/new_wound if(replaced_wound) - var/datum/wound/new_wound = replaced_wound.replace_wound(possible_wound) - log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) + new_wound = replaced_wound.replace_wound(possible_wound) + log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) // dismembering wounds are logged in the apply_wound() for loss wounds since they delete themselves immediately, these will be immediately returned else - var/datum/wound/new_wound = new possible_wound + new_wound = new possible_wound new_wound.apply_wound(src) log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) - return + return new_wound // try forcing a specific wound, but only if there isn't already a wound of that severity or greater for that type on this bodypart /obj/item/bodypart/proc/force_wound_upwards(specific_woundtype, smited = FALSE) var/datum/wound/potential_wound = specific_woundtype for(var/i in wounds) var/datum/wound/existing_wound = i - if(existing_wound.type in (initial(potential_wound.wound_type))) + if(existing_wound.wound_type == initial(potential_wound.wound_type)) if(existing_wound.severity < initial(potential_wound.severity)) // we only try if the existing one is inferior to the one we're trying to force existing_wound.replace_wound(potential_wound, smited) return @@ -303,12 +414,20 @@ var/datum/wound/new_wound = new potential_wound new_wound.apply_wound(src, smited = smited) +/** + * check_wounding_mods() is where we handle the various modifiers of a wound roll + * + * A short list of things we consider: any armor a human target may be wearing, and if they have no wound armor on the limb, if we have a bare_wound_bonus to apply, plus the plain wound_bonus + * We also flick through all of the wounds we currently have on this limb and add their threshold penalties, so that having lots of bad wounds makes you more liable to get hurt worse + * Lastly, we add the inherent wound_resistance variable the bodypart has (heads and chests are slightly harder to wound), and a small bonus if the limb is already disabled + * + * Arguments: + * * It's the same ones on [receive_damage] + */ /obj/item/bodypart/proc/check_woundings_mods(wounding_type, damage, wound_bonus, bare_wound_bonus) var/armor_ablation = 0 var/injury_mod = 0 - //var/bwb = 0 - if(owner && ishuman(owner)) var/mob/living/carbon/human/H = owner var/list/clothing = H.clothingonpart(src) @@ -316,7 +435,7 @@ var/obj/item/clothing/C = c // unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary armor_ablation += C.armor.getRating("wound") - if(wounding_type == WOUND_SHARP) + if(wounding_type == WOUND_SLASH) C.take_damage_zone(body_zone, damage, BRUTE, armour_penetration) else if(wounding_type == WOUND_BURN && damage >= 10) // lazy way to block freezing from shredding clothes without adding another var onto apply_damage() C.take_damage_zone(body_zone, damage, BURN, armour_penetration) @@ -332,7 +451,7 @@ injury_mod += W.threshold_penalty var/part_mod = -wound_resistance - if(is_disabled()) + if(get_damage(TRUE) >= max_damage) part_mod += disabled_wound_penalty injury_mod += part_mod @@ -382,12 +501,11 @@ if(can_dismember() && !HAS_TRAIT(owner, TRAIT_NOLIMBDISABLE)) . = disabled //inertia, to avoid limbs healing 0.1 damage and being re-enabled - // TODO: figure if i'm keeping disabling to broken bones only - if((get_damage(TRUE) >= max_damage) || (HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE) && (get_damage(TRUE) >= (max_damage * 0.6)))) //Easy limb disable disables the limb at 40% health instead of 0% + if(get_damage(TRUE) >= max_damage * (HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE) ? 0.6 : 1)) //Easy limb disable disables the limb at 40% health instead of 0% if(!last_maxed) owner.emote("scream") last_maxed = TRUE - if(!is_organic_limb()) + if(!is_organic_limb() || stamina_dam >= max_damage) return BODYPART_DISABLED_DAMAGE else if(disabled && (get_damage(TRUE) <= (max_damage * 0.8))) // reenabled at 80% now instead of 50% as of wounds update last_maxed = FALSE @@ -603,18 +721,29 @@ if(isnull(wounds)) return - for(var/thing in wounds) - var/datum/wound/W = thing - if(istype(W, checking_type)) - return W + for(var/i in wounds) + if(istype(i, checking_type)) + return i -/// very rough start for updating efficiency and other stats on a body part whenever a wound is gained/lost -/obj/item/bodypart/proc/update_wounds() +/** + * update_wounds() is called whenever a wound is gained or lost on this bodypart, as well as if there's a change of some kind on a bone wound possibly changing disabled status + * + * Covers tabulating the damage multipliers we have from wounds (burn specifically), as well as deleting our gauze wrapping if we don't have any wounds that can use bandaging + * + * Arguments: + * * replaced- If true, this is being called from the remove_wound() of a wound that's being replaced, so the bandage that already existed is still relevant, but the new wound hasn't been added yet + */ +/obj/item/bodypart/proc/update_wounds(replaced = FALSE) var/dam_mul = 1 //initial(wound_damage_multiplier) - // we can only have one wound per type, but remember there's multiple types - for(var/datum/wound/W in wounds) - dam_mul *= W.damage_mulitplier_penalty + // we can (normally) only have one wound per type, but remember there's multiple types (smites like :B:loodless can generate multiple cuts on a limb) + for(var/i in wounds) + var/datum/wound/iter_wound = i + dam_mul *= iter_wound.damage_mulitplier_penalty + + if(!LAZYLEN(wounds) && current_gauze && !replaced) + owner.visible_message("\The [current_gauze] on [owner]'s [name] fall away.", "The [current_gauze] on your [name] fall away.") + QDEL_NULL(current_gauze) wound_damage_multiplier = dam_mul update_disabled() @@ -627,9 +756,6 @@ if(generic_bleedstacks > 0) bleed_rate++ - if(brute_dam >= 40) - bleed_rate += (brute_dam * 0.008) - //We want an accurate reading of .len listclearnulls(embedded_objects) for(var/obj/item/embeddies in embedded_objects) @@ -640,4 +766,40 @@ var/datum/wound/W = thing bleed_rate += W.blood_flow + if(owner.mobility_flags & ~MOBILITY_STAND) + bleed_rate *= 0.75 return bleed_rate + +/** + * apply_gauze() is used to- well, apply gauze to a bodypart + * + * As of the Wounds 2 PR, all bleeding is now bodypart based rather than the old bleedstacks system, and 90% of standard bleeding comes from flesh wounds (the exception is embedded weapons). + * The same way bleeding is totaled up by bodyparts, gauze now applies to all wounds on the same part. Thus, having a slash wound, a pierce wound, and a broken bone wound would have the gauze + * applying blood staunching to the first two wounds, while also acting as a sling for the third one. Once enough blood has been absorbed or all wounds with the ACCEPTS_GAUZE flag have been cleared, + * the gauze falls off. + * + * Arguments: + * * gauze- Just the gauze stack we're taking a sheet from to apply here + */ +/obj/item/bodypart/proc/apply_gauze(obj/item/stack/gauze) + if(!istype(gauze) || !gauze.absorption_capacity) + return + QDEL_NULL(current_gauze) + current_gauze = new gauze.type(src, 1) + gauze.use(1) + +/** + * seep_gauze() is for when a gauze wrapping absorbs blood or pus from wounds, lowering its absorption capacity. + * + * The passed amount of seepage is deducted from the bandage's absorption capacity, and if we reach a negative absorption capacity, the bandages fall off and we're left with nothing. + * + * Arguments: + * * seep_amt - How much absorption capacity we're removing from our current bandages (think, how much blood or pus are we soaking up this tick?) + */ +/obj/item/bodypart/proc/seep_gauze(seep_amt = 0) + if(!current_gauze) + return + current_gauze.absorption_capacity -= seep_amt + if(current_gauze.absorption_capacity < 0) + owner.visible_message("\The [current_gauze] on [owner]'s [name] fall away in rags.", "\The [current_gauze] on your [name] fall away in rags.", vision_distance=COMBAT_MESSAGE_RANGE) + QDEL_NULL(current_gauze) diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 48312107dad..f02c7a86a36 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -4,7 +4,7 @@ return TRUE //Dismember a limb -/obj/item/bodypart/proc/dismember(dam_type = BRUTE) +/obj/item/bodypart/proc/dismember(dam_type = BRUTE, silent=TRUE) if(!owner) return FALSE var/mob/living/carbon/C = owner @@ -17,7 +17,8 @@ var/obj/item/bodypart/affecting = C.get_bodypart(BODY_ZONE_CHEST) affecting.receive_damage(clamp(brute_dam/2 * affecting.body_damage_coeff, 15, 50), clamp(burn_dam/2 * affecting.body_damage_coeff, 0, 50), wound_bonus=CANT_WOUND) //Damage the chest based on limb's existing damage - C.visible_message("[C]'s [src.name] is violently dismembered!") + if(!silent) + C.visible_message("[C]'s [name] is violently dismembered!") C.emote("scream") playsound(get_turf(C), 'sound/effects/dismember.ogg', 80, TRUE) SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered) @@ -34,6 +35,7 @@ burn() return TRUE add_mob_blood(C) + C.bleed(rand(20, 40)) var/direction = pick(GLOB.cardinals) var/t_range = rand(2,max(throw_range/2, 2)) var/turf/target_turf = get_turf(src) @@ -154,7 +156,52 @@ forceMove(Tsec) +/** + * get_mangled_state() is relevant for flesh and bone bodyparts, and returns whether this bodypart has mangled skin, mangled bone, or both (or neither i guess) + * + * Dismemberment for flesh and bone requires the victim to have the skin on their bodypart destroyed (either a critical cut or piercing wound), and at least a hairline fracture + * (severe bone), at which point we can start rolling for dismembering. The attack must also deal at least 10 damage, and must be a brute attack of some kind (sorry for now, cakehat, maybe later) + * + * Returns: BODYPART_MANGLED_NONE if we're fine, BODYPART_MANGLED_FLESH if our skin is broken, BODYPART_MANGLED_BONE if our bone is broken, or BODYPART_MANGLED_BOTH if both are broken and we're up for dismembering + */ +/obj/item/bodypart/proc/get_mangled_state() + . = BODYPART_MANGLED_NONE + for(var/i in wounds) + var/datum/wound/iter_wound = i + if((iter_wound.wound_flags & MANGLES_BONE)) + . |= BODYPART_MANGLED_BONE + if((iter_wound.wound_flags & MANGLES_FLESH)) + . |= BODYPART_MANGLED_FLESH + +/** + * try_dismember() is used, once we've confirmed that a flesh and bone bodypart has both the skin and bone mangled, to actually roll for it + * + * Mangling is described in the above proc, [/obj/item/bodypart/proc/get_mangled_state()]. This simply makes the roll for whether we actually dismember or not + * using how damaged the limb already is, and how much damage this blow was for. If we have a critical bone wound instead of just a severe, we add +10% to the roll. + * Lastly, we choose which kind of dismember we want based on the wounding type we hit with. Note we don't care about all the normal mods or armor for this + * + * Arguments: + * * wounding_type: Either WOUND_BLUNT, WOUND_SLASH, or WOUND_PIERCE, basically only matters for the dismember message + * * wounding_dmg: The damage of the strike that prompted this roll, higher damage = higher chance + * * wound_bonus: Not actually used right now, but maybe someday + * * bare_wound_bonus: ditto above + */ +/obj/item/bodypart/proc/try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus) + if(wounding_dmg < DISMEMBER_MINIMUM_DAMAGE) + return + + var/base_chance = wounding_dmg + (get_damage() / max_damage * 50) // how much damage we dealt with this blow, + 50% of the damage percentage we already had on this bodypart + if(locate(/datum/wound/blunt/critical) in wounds) // we only require a severe bone break, but if there's a critical bone break, we'll add 10% more + base_chance += 10 + + if(!prob(base_chance)) + return + + var/datum/wound/loss/dismembering = new + dismembering.apply_dismember(src, wounding_type) + + return TRUE //when a limb is dropped, the internal organs are removed from the mob and put into the limb /obj/item/organ/proc/transfer_to_limb(obj/item/bodypart/LB, mob/living/carbon/C) @@ -414,4 +461,7 @@ if(!L.attach_limb(src, 1)) qdel(L) return FALSE + var/datum/scar/scaries = new + var/datum/wound/loss/phantom_loss = new // stolen valor, really + scaries.generate(L, phantom_loss) return TRUE diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 9abbf3441b6..61ddecefb1f 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -14,7 +14,6 @@ stam_damage_coeff = 1 max_stamina_damage = 100 wound_resistance = 10 - specific_locations = list("left eyebrow", "cheekbone", "neck", "throat", "jawline", "entire face") scars_covered_by_clothes = FALSE var/mob/living/brain/brainmob = null //The current occupant. @@ -94,7 +93,7 @@ /obj/item/bodypart/head/can_dismember(obj/item/I) - if(!((owner.stat == DEAD) || owner.InFullCritical())) + if(owner && !((owner.stat == DEAD) || owner.InFullCritical())) return FALSE return ..() diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index bd4abaa7650..3dea81eff1d 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -11,11 +11,10 @@ stam_damage_coeff = 1 max_stamina_damage = 120 var/obj/item/cavity_item - specific_locations = list("upper chest", "lower abdomen", "midsection", "collarbone", "lower back") wound_resistance = 10 /obj/item/bodypart/chest/can_dismember(obj/item/I) - if(!((owner.stat == DEAD) || owner.InFullCritical())) + if(!((owner.stat == DEAD) || owner.InFullCritical()) || !get_organs()) return FALSE return ..() @@ -72,7 +71,6 @@ held_index = 1 px_x = -6 px_y = 0 - specific_locations = list("outer left forearm", "inner left wrist", "left elbow", "left bicep", "left shoulder") /obj/item/bodypart/l_arm/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_ARM)) @@ -138,7 +136,6 @@ px_x = 6 px_y = 0 max_stamina_damage = 50 - specific_locations = list("outer right forearm", "inner right wrist", "right elbow", "right bicep", "right shoulder") /obj/item/bodypart/r_arm/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_ARM)) @@ -201,7 +198,6 @@ px_x = -2 px_y = 12 max_stamina_damage = 50 - specific_locations = list("inner left thigh", "outer left calf", "outer left hip", " left kneecap", "lower left shin") /obj/item/bodypart/l_leg/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_LEG)) @@ -261,7 +257,6 @@ px_x = 2 px_y = 12 max_stamina_damage = 50 - specific_locations = list("inner right thigh", "outer right calf", "outer right hip", "right kneecap", "lower right shin") /obj/item/bodypart/r_leg/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_LEG)) diff --git a/code/modules/surgery/bone_mending.dm b/code/modules/surgery/bone_mending.dm index 81d9fa8d97d..0c0083575bb 100644 --- a/code/modules/surgery/bone_mending.dm +++ b/code/modules/surgery/bone_mending.dm @@ -8,7 +8,7 @@ target_mobtypes = list(/mob/living/carbon/human) possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) requires_real_bodypart = TRUE - targetable_wound = /datum/wound/brute/bone/severe + targetable_wound = /datum/wound/blunt/severe /datum/surgery/repair_bone_hairline/can_start(mob/living/user, mob/living/carbon/target) if(..()) @@ -23,7 +23,7 @@ target_mobtypes = list(/mob/living/carbon/human) possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) requires_real_bodypart = TRUE - targetable_wound = /datum/wound/brute/bone/critical + targetable_wound = /datum/wound/blunt/critical /datum/surgery/repair_bone_compound/can_start(mob/living/user, mob/living/carbon/target) if(..()) diff --git a/code/modules/surgery/burn_dressing.dm b/code/modules/surgery/burn_dressing.dm index 1688f7b5d17..8bfa52d2454 100644 --- a/code/modules/surgery/burn_dressing.dm +++ b/code/modules/surgery/burn_dressing.dm @@ -94,7 +94,8 @@ log_combat(user, target, "dressed burns in", addition="INTENT: [uppertext(user.a_intent)]") burn_wound.sanitization += 3 burn_wound.flesh_healing += 5 - burn_wound.force_bandage(tool) + var/obj/item/bodypart/the_part = target.get_bodypart(target_zone) + the_part.apply_gauze(tool) else to_chat(user, "[target] has no burns there!") return ..() diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm index d5f6d66b75d..7801071a186 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -6,7 +6,7 @@ /datum/surgery_step/heal, /datum/surgery_step/close) - target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + target_mobtypes = list(/mob/living) possible_locs = list(BODY_ZONE_CHEST) requires_bodypart_type = FALSE replaced_by = /datum/surgery @@ -14,6 +14,15 @@ var/healing_step_type var/antispam = FALSE +/datum/surgery/healing/can_start(mob/user, mob/living/patient) + . = ..() + if(isanimal(patient)) + var/mob/living/simple_animal/critter = patient + if(!critter.healable) + return FALSE + if(!(patient.mob_biotypes & (MOB_ORGANIC|MOB_HUMANOID))) + return FALSE + /datum/surgery/healing/New(surgery_target, surgery_location, surgery_bodypart) ..() if(healing_step_type) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 2c22fc5bdb0..f8c25d5577d 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -126,6 +126,48 @@ /obj/item/organ/proc/OnEatFrom(eater, feeder) useable = FALSE //You can't use it anymore after eating it you spaztic +/* + * On accidental consumption, cause organ damage and check if they like eating organs + */ +/obj/item/organ/on_accidental_consumption(mob/living/carbon/M, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE) + if(organ_flags & ORGAN_SYNTHETIC) + return ..() + + if(organ_flags & ORGAN_FROZEN) + return TRUE + + applyOrganDamage(25) + OnEatFrom(M, user) + if(istype(src, /obj/item/organ/brain)) //brain takes some extra damage + applyOrganDamage(25) + if(!iszombie(M)) //brains... + M.adjust_disgust(50) + else if(istype(src, /obj/item/organ/heart)) //heart makes a puddle of blood + M.add_splatter_floor(get_turf(src)) + + var/obj/item/reagent_containers/food/snacks/S = source_item + if(S?.tastes?.len && istype(S)) + S.tastes += "meat" + S.tastes["meat"] = 3 + + if(organ_flags & ORGAN_EDIBLE) + var/datum/component/edible/EC = src.GetComponent(/datum/component/edible) + EC.checkLiked(1, M) + + //people who like gross food or are voracious (voracious people wouldn't even notice) + if(((M.dna.species.liked_food & GROSS) && (M.dna.species.liked_food & MEAT)) || M.has_quirk(/datum/quirk/voracious)) + M.visible_message("[M] looks like [M.p_theyve()] just bitten into something strange.", \ + "Huh, did I just bite into a [name]?") + else + M.visible_message("[M] looks like [M.p_theyve()] just bitten into something awful!", \ + "Ew!! Did I just bite into \a [name]?!") + + if((damage >= maxHealth) && !istype(src, /obj/item/organ/brain)) //don't qdel brains + discover_after = FALSE + qdel(src) //oops, all gone + + return discover_after + /obj/item/organ/item_action_slot_check(slot,mob/user) return //so we don't grant the organ's action to mobs who pick up the organ. @@ -225,3 +267,7 @@ */ /obj/item/organ/proc/get_availability(datum/species/S) return TRUE + +/// Called before organs are replaced in regenerate_organs with new ones +/obj/item/organ/proc/before_organ_replacement(obj/item/organ/replacement) + return diff --git a/code/modules/surgery/repair_puncture.dm b/code/modules/surgery/repair_puncture.dm new file mode 100644 index 00000000000..12aefefc822 --- /dev/null +++ b/code/modules/surgery/repair_puncture.dm @@ -0,0 +1,108 @@ + +/////BURN FIXING SURGERIES////// + +//the step numbers of each of these two, we only currently use the first to switch back and forth due to advancing after finishing steps anyway +#define REALIGN_INNARDS 1 +#define WELD_VEINS 2 + +///// Repair puncture wounds +/datum/surgery/repair_puncture + name = "Repair puncture" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/repair_innards, /datum/surgery_step/seal_veins, /datum/surgery_step/close) // repeat between steps 2 and 3 until healed + target_mobtypes = list(/mob/living/carbon) + possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) + requires_real_bodypart = TRUE + targetable_wound = /datum/wound/pierce + +/datum/surgery/repair_puncture/can_start(mob/living/user, mob/living/carbon/target) + . = ..() + if(.) + var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) + var/datum/wound/burn/pierce_wound = targeted_bodypart.get_wound_type(targetable_wound) + return(pierce_wound && pierce_wound.blood_flow > 0) + +//SURGERY STEPS + +///// realign the blood vessels so we can reweld them +/datum/surgery_step/repair_innards + name = "realign blood vessels" + implements = list(TOOL_HEMOSTAT = 100, TOOL_SCALPEL = 85, TOOL_WIRECUTTER = 40) + time = 3 SECONDS + +/datum/surgery_step/repair_innards/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/datum/wound/pierce/pierce_wound = surgery.operated_wound + if(!pierce_wound) + user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...") + return + + if(pierce_wound.blood_flow <= 0) + to_chat(user, "[target]'s [parse_zone(user.zone_selected)] has no puncture to repair!") + surgery.status++ + return + + display_results(user, target, "You begin to realign the torn blood vessels in [target]'s [parse_zone(user.zone_selected)]...", + "[user] begins to realign the torn blood vessels in [target]'s [parse_zone(user.zone_selected)] with [tool].", + "[user] begins to realign the torn blood vessels in [target]'s [parse_zone(user.zone_selected)].") + +/datum/surgery_step/repair_innards/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + var/datum/wound/pierce/pierce_wound = surgery.operated_wound + if(!pierce_wound) + to_chat(user, "[target] has no puncture wound there!") + return ..() + + display_results(user, target, "You successfully realign some of the blood vessels in [target]'s [parse_zone(target_zone)].", + "[user] successfully realigns some of the blood vessels in [target]'s [parse_zone(target_zone)] with [tool]!", + "[user] successfully realigns some of the blood vessels in [target]'s [parse_zone(target_zone)]!") + log_combat(user, target, "excised infected flesh in", addition="INTENT: [uppertext(user.a_intent)]") + surgery.operated_bodypart.receive_damage(brute=3, wound_bonus=CANT_WOUND) + pierce_wound.blood_flow -= 0.25 + return ..() + +/datum/surgery_step/repair_innards/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, var/fail_prob = 0) + . = ..() + display_results(user, target, "You jerk apart some of the blood vessels in [target]'s [parse_zone(target_zone)].", + "[user] jerks apart some of the blood vessels in [target]'s [parse_zone(target_zone)] with [tool]!", + "[user] jerk apart some of the blood vessels in [target]'s [parse_zone(target_zone)]!") + surgery.operated_bodypart.receive_damage(brute=rand(4,8), sharpness=SHARP_EDGED, wound_bonus = 10) + +///// Sealing the vessels back together +/datum/surgery_step/seal_veins + name = "weld veins" // if your doctor says they're going to weld your blood vessels back together, you're either A) on SS13, or B) in grave mortal peril + implements = list(TOOL_CAUTERY = 100, /obj/item/gun/energy/laser = 90, TOOL_WELDER = 70, /obj/item = 30) + time = 4 SECONDS + +/datum/surgery_step/seal_veins/tool_check(mob/user, obj/item/tool) + if(implement_type == TOOL_WELDER || implement_type == /obj/item) + return tool.get_temperature() + + return TRUE + +/datum/surgery_step/seal_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/datum/wound/pierce/pierce_wound = surgery.operated_wound + if(!pierce_wound) + user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...") + return + display_results(user, target, "You begin to meld some of the split blood vessels in [target]'s [parse_zone(user.zone_selected)]...", + "[user] begins to meld some of the split blood vessels in [target]'s [parse_zone(user.zone_selected)] with [tool].", + "[user] begins to meld some of the split blood vessels in [target]'s [parse_zone(user.zone_selected)].") + +/datum/surgery_step/seal_veins/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + var/datum/wound/pierce/pierce_wound = surgery.operated_wound + if(!pierce_wound) + to_chat(user, "[target] has no puncture there!") + return ..() + + display_results(user, target, "You successfully meld some of the split blood vessels in [target]'s [parse_zone(target_zone)] with [tool].", + "[user] successfully melds some of the split blood vessels in [target]'s [parse_zone(target_zone)] with [tool]!", + "[user] successfully melds some of the split blood vessels in [target]'s [parse_zone(target_zone)]!") + log_combat(user, target, "dressed burns in", addition="INTENT: [uppertext(user.a_intent)]") + pierce_wound.blood_flow -= 0.5 + if(pierce_wound.blood_flow > 0) + surgery.status = REALIGN_INNARDS + to_chat(user, "There still seems to be misaligned blood vessels to finish...") + else + to_chat(user, "You've repaired all the internal damage in [target]'s [parse_zone(target_zone)]!") + return ..() + +#undef REALIGN_INNARDS +#undef WELD_VEINS diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index aad9b0a1da1..defacbe1cd4 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -110,7 +110,7 @@ custom_materials = list(/datum/material/iron=4000, /datum/material/glass=1000) attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = IS_SHARP_ACCURATE + sharpness = SHARP_EDGED tool_behaviour = TOOL_SCALPEL toolspeed = 1 bare_wound_bonus = 20 @@ -146,7 +146,7 @@ throw_range = 5 custom_materials = list(/datum/material/iron=1000) attack_verb = list("attacked", "slashed", "sawed", "cut") - sharpness = IS_SHARP + sharpness = SHARP_EDGED tool_behaviour = TOOL_SAW toolspeed = 1 wound_bonus = 10 @@ -259,7 +259,7 @@ force = 16 toolspeed = 0.7 light_color = LIGHT_COLOR_GREEN - sharpness = IS_SHARP_ACCURATE + sharpness = SHARP_EDGED /obj/item/scalpel/advanced/Initialize() . = ..() @@ -349,7 +349,7 @@ throw_range = 5 custom_materials = list(/datum/material/iron=8000, /datum/material/titanium=6000) attack_verb = list("sheared", "snipped") - sharpness = IS_SHARP + sharpness = SHARP_EDGED custom_premium_price = 1800 /obj/item/shears/attack(mob/living/M, mob/user) diff --git a/code/modules/swarmers/swarmer.dm b/code/modules/swarmers/swarmer.dm new file mode 100644 index 00000000000..67dc4aa9ac2 --- /dev/null +++ b/code/modules/swarmers/swarmer.dm @@ -0,0 +1,457 @@ +/** + * # Swarmer + * + * Tiny machines made by an ancient civilization, they seek only to consume materials and replicate. + * + * Tiny robots which, while not lethal, seek to destroy station components in order to recycle them into more swarmers. + * Sentient player swarmers spawn from a beacon spawned in maintenance and they can spawn melee swarmers to protect them. + * Swarmers have the following abilities: + * - Can melee targets to deal stamina damage. Stuns cyborgs. + * - Can teleport friend and foe alike away using ctrl + click. Applies binds to carbons, preventing them from immediate retaliation + * - Can shoot lasers which deal stamina damage to carbons and direct damage to simple mobs + * - Can self repair for free, completely healing themselves + * - Can construct traps which stun targets, and walls which block non-swarmer entites and projectiles + * - Can create swarmer drones, which lack the above abilities sans melee stunning targets. A swarmer can order its drones around by middle-clicking a tile. + */ + +/mob/living/simple_animal/hostile/swarmer + name = "swarmer" + icon = 'icons/mob/swarmer.dmi' + desc = "Robotic constructs of unknown design, swarmers seek only to consume materials and replicate themselves indefinitely." + speak_emote = list("tones") + initial_language_holder = /datum/language_holder/swarmer + bubble_icon = "swarmer" + mob_biotypes = MOB_ROBOTIC + health = 40 + maxHealth = 40 + status_flags = CANPUSH + icon_state = "swarmer" + icon_living = "swarmer" + icon_dead = "swarmer_unactivated" + icon_gib = null + wander = 0 + harm_intent_damage = 5 + minbodytemp = 0 + maxbodytemp = 500 + 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) + unsuitable_atmos_damage = 0 + melee_damage_lower = 15 + melee_damage_upper = 15 + melee_damage_type = STAMINA + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) + hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD) + obj_damage = 0 + environment_smash = ENVIRONMENT_SMASH_NONE + attack_verb_continuous = "shocks" + attack_verb_simple = "shock" + attack_sound = 'sound/effects/empulse.ogg' + friendly_verb_continuous = "pinches" + friendly_verb_simple = "pinch" + speed = 0 + faction = list("swarmer") + AIStatus = AI_OFF + pass_flags = PASSTABLE + mob_size = MOB_SIZE_TINY + ventcrawler = VENTCRAWLER_ALWAYS + ranged = 1 + projectiletype = /obj/projectile/beam/disabler/swarmer + ranged_cooldown_time = 20 + projectilesound = 'sound/weapons/taser2.ogg' + loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/stack/ore/bluespace_crystal) + del_on_death = 1 + deathmessage = "explodes with a sharp pop!" + light_color = LIGHT_COLOR_CYAN + hud_type = /datum/hud/swarmer + speech_span = SPAN_ROBOT + ///Resource points, generated by consuming metal/glass + var/resources = 0 + ///Maximum amount of resources a swarmer can store + var/max_resources = 100 + ///List used for player swarmers to keep track of their drones + var/list/mob/living/simple_animal/hostile/swarmer/melee/dronelist + +/mob/living/simple_animal/hostile/swarmer/Initialize() + . = ..() + verbs -= /mob/living/verb/pulled + for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) + diag_hud.add_to_hud(src) + +/mob/living/simple_animal/hostile/swarmer/med_hud_set_health() + var/image/holder = hud_list[DIAG_HUD] + var/icon/I = icon(icon, icon_state, dir) + holder.pixel_y = I.Height() - world.icon_size + holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]" + +/mob/living/simple_animal/hostile/swarmer/med_hud_set_status() + var/image/holder = hud_list[DIAG_STAT_HUD] + var/icon/I = icon(icon, icon_state, dir) + holder.pixel_y = I.Height() - world.icon_size + holder.icon_state = "hudstat" + +/mob/living/simple_animal/hostile/swarmer/Stat() + ..() + if(statpanel("Status")) + stat("Resources:",resources) + +/mob/living/simple_animal/hostile/swarmer/emp_act() + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(health > 1) + adjustHealth(health-1) + else + death() + +/mob/living/simple_animal/hostile/swarmer/CanAllowThrough(atom/movable/O) + . = ..() + if(istype(O, /obj/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other + return TRUE + if(isswarmer(O)) + return TRUE + +////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S//// +/mob/living/simple_animal/hostile/swarmer/AttackingTarget() + if(!isliving(target)) + return target.swarmer_act(src) + if(iscyborg(target)) + var/mob/living/silicon/borg = target + borg.adjustBruteLoss(melee_damage_lower) + return ..() + +/mob/living/simple_animal/hostile/swarmer/MiddleClickOn(atom/A) + . = ..() + if(!LAZYLEN(dronelist)) + return + var/turf/clicked_turf = get_turf(A) + if(!clicked_turf) + return + for(var/d in dronelist) + var/mob/living/simple_animal/hostile/drone = d + drone.LoseTarget() + drone.Goto(clicked_turf, drone.move_to_delay) + +/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A) + face_atom(A) + if(!isturf(loc)) + return + if(next_move > world.time) + return + if(!A.Adjacent(src)) + return + prepare_target(src) + +////END CTRL CLICK FOR SWARMERS//// + +/** + * Called when a swarmer creates a structure or drone + * + * Proc called whenever a swarmer creates a structure or drone + * Arguments: + * * fabrication_object - The atom to create + * * fabrication_cost - How many resources it costs for a swarmer to create the object + */ +/mob/living/simple_animal/hostile/swarmer/proc/Fabricate(atom/fabrication_object,fabrication_cost = 0) + if(!isturf(loc)) + to_chat(src, "This is not a suitable location for fabrication. We need more space.") + return + if(resources < fabrication_cost) + to_chat(src, "You do not have the necessary resources to fabricate this object.") + return + resources -= fabrication_cost + return new fabrication_object(drop_location()) + +/** + * Called when a swarmer attempts to consume an object + * + * Proc which determines interaction between a swarmer and whatever it is attempting to consume + * Arguments: + * * target - The material or object the swarmer is attempting to consume + */ +/mob/living/simple_animal/hostile/swarmer/proc/Integrate(obj/target) + var/resource_gain = target.integrate_amount() + if(resources + resource_gain > max_resources) + to_chat(src, "We cannot hold more materials!") + return TRUE + if(!resource_gain) + to_chat(src, "[target] is incompatible with our internal matter recycler.") + return FALSE + resources += resource_gain + do_attack_animation(target) + changeNext_move(CLICK_CD_RAPID) + var/obj/effect/temp_visual/swarmer/integrate/I = new /obj/effect/temp_visual/swarmer/integrate(get_turf(target)) + I.pixel_x = target.pixel_x + I.pixel_y = target.pixel_y + I.pixel_z = target.pixel_z + if(istype(target, /obj/item/stack)) + var/obj/item/stack/S = target + S.use(1) + if(S.amount) + return TRUE + qdel(target) + return TRUE + +/** + * Called when a swarmer attempts to destroy a structure + * + * Proc which determines interaction between a swarmer and a structure it is destroying + * Arguments: + * * target - The material or object the swarmer is attempting to destroy + */ +/mob/living/simple_animal/hostile/swarmer/proc/dis_integrate(atom/movable/target) + new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target)) + do_attack_animation(target) + changeNext_move(CLICK_CD_MELEE) + SSexplosions.lowobj += target + +/** + * Called when a swarmer attempts to teleport a living entity away + * + * Proc which finds a safe location to teleport a living entity to when a swarmer teleports it away. Also energy handcuffs carbons. + * Arguments: + * * target - The entity the swarmer is trying to teleport away + */ +/mob/living/simple_animal/hostile/swarmer/proc/prepare_target(mob/living/target) + if(target == src) + return + + if(!is_station_level(z) && !is_mining_level(z)) + to_chat(src, "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.") + return + + to_chat(src, "Attempting to remove this being from our presence.") + + if(!do_mob(src, target, 30)) + return + + teleport_target(target) + +/mob/living/simple_animal/hostile/swarmer/proc/teleport_target(mob/living/target) + var/turf/open/floor/safe_turf = find_safe_turf(zlevels = z, extended_safety_checks = TRUE) + + if(!safe_turf ) + return + // If we're getting rid of a human, slap some energy cuffs on + // them to keep them away from us a little longer + + if(ishuman(target)) + var/mob/living/carbon/human/victim = target + if(!victim.handcuffed) + victim.handcuffed = new /obj/item/restraints/handcuffs/energy/used(victim) + victim.update_handcuffed() + log_combat(src, victim, "handcuffed") + + var/datum/effect_system/spark_spread/sparks = new + sparks.set_up(4,0,get_turf(target)) + sparks.start() + playsound(src, 'sound/effects/sparks4.ogg', 50, TRUE) + do_teleport(target, safe_turf , 0, channel = TELEPORT_CHANNEL_BLUESPACE) + +/mob/living/simple_animal/hostile/swarmer/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) + if(!(flags & SHOCK_TESLA)) + return FALSE + return ..() + +/** + * Called when a swarmer attempts to disassemble a machine + * + * Proc called when a swarmer attempts to disassemble a machine. Destroys the machine, and gives the swarmer metal. + * Arguments: + * * target - The machine the swarmer is attempting to disassemble + */ +/mob/living/simple_animal/hostile/swarmer/proc/dismantle_machine(obj/machinery/target) + do_attack_animation(target) + to_chat(src, "We begin to dismantle this machine. We will need to be uninterrupted.") + var/obj/effect/temp_visual/swarmer/dismantle/dismantle_effect = new /obj/effect/temp_visual/swarmer/dismantle(get_turf(target)) + dismantle_effect.pixel_x = target.pixel_x + dismantle_effect.pixel_y = target.pixel_y + dismantle_effect.pixel_z = target.pixel_z + if(do_mob(src, target, 100)) + to_chat(src, "Dismantling complete.") + var/atom/target_loc = target.drop_location() + new /obj/item/stack/sheet/metal(target_loc, 5) + for(var/p in target.component_parts) + var/obj/item/part = p + part.forceMove(target_loc) + var/obj/effect/temp_visual/swarmer/disintegration/disintegration_effect = new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target)) + disintegration_effect.pixel_x = target.pixel_x + disintegration_effect.pixel_y = target.pixel_y + disintegration_effect.pixel_z = target.pixel_z + target.dropContents() + if(istype(target, /obj/machinery/computer)) + var/obj/machinery/computer/computer_target = target + if(computer_target.circuit) + computer_target.circuit.forceMove(target_loc) + qdel(target) + +/** + * Called when a swarmer attempts to create a trap + * + * Proc used to allow a swarmer to create a trap. Checks if a trap is on the tile, then if the swarmer can afford, and then places the trap. + */ +/mob/living/simple_animal/hostile/swarmer/proc/create_trap() + set name = "Create trap" + set category = "Swarmer" + set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 4 resources." + if(locate(/obj/structure/swarmer/trap) in loc) + to_chat(src, "There is already a trap here. Aborting.") + return + if(resources < 4) + to_chat(src, "We do not have the resources for this!") + return + Fabricate(/obj/structure/swarmer/trap, 4) + +/** + * Called when a swarmer attempts to create a barricade + * + * Proc used to allow a swarmer to create a barricade. Checks if a barricade is on the tile, then if the swarmer can afford it, and then will attempt to create a barricade after a second delay. + */ +/mob/living/simple_animal/hostile/swarmer/proc/create_barricade() + set name = "Create barricade" + set category = "Swarmer" + set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through. Costs 4 resources." + if(locate(/obj/structure/swarmer/blockade) in loc) + to_chat(src, "There is already a blockade here. Aborting.") + return + if(resources < 4) + to_chat(src, "We do not have the resources for this!") + return + if(!do_mob(src, src, 1 SECONDS)) + return + Fabricate(/obj/structure/swarmer/blockade, 4) + +/** + * Called when a swarmer attempts to create a drone + * + * Proc used to allow a swarmer to create a drone. Checks if the swarmer can afford the drone, then creates it after 5 seconds, and also registers it to the creating swarmer so it can command it + */ +/mob/living/simple_animal/hostile/swarmer/proc/create_swarmer() + set name = "Replicate" + set category = "Swarmer" + set desc = "Creates a duplicate of ourselves, capable of protecting us while we complete our objectives." + to_chat(src, "We are attempting to replicate ourselves. We will need to stand still until the process is complete.") + if(resources < 20) + to_chat(src, "We do not have the resources for this!") + return + if(!isturf(loc)) + to_chat(src, "This is not a suitable location for replicating ourselves. We need more room.") + return + if(!do_mob(src, src, 5 SECONDS)) + return + var/createtype = swarmer_type_to_create() + if(!createtype) + return + var/mob/newswarmer = Fabricate(createtype, 20) + add_drone(newswarmer) + playsound(loc,'sound/items/poster_being_created.ogg', 20, TRUE, -1) + +/** + * Used to determine what type of swarmer a swarmer should create + * + * Returns the type of the swarmer to be created + */ +/mob/living/simple_animal/hostile/swarmer/proc/swarmer_type_to_create() + return /mob/living/simple_animal/hostile/swarmer/melee + +/** + * Called when a swarmer attempts to repair itself + * + * Proc used to allow a swarmer self-repair. If the swarmer does not move after a period of time, then it will heal fully + */ +/mob/living/simple_animal/hostile/swarmer/proc/repair_self() + if(!isturf(loc)) + return + to_chat(src, "Attempting to repair damage to our body, stand by...") + if(!do_mob(src, src, 10 SECONDS)) + return + adjustHealth(-maxHealth) + to_chat(src, "We successfully repaired ourselves.") + +/** + * Called when a swarmer toggles its light + * + * Proc used to allow a swarmer to toggle its light on and off. If a swarmer has any drones, change their light settings to match their master's. + */ +/mob/living/simple_animal/hostile/swarmer/proc/toggle_light() + if(!light_range) + set_light(3) + if(!mind) + return + for(var/d in dronelist) + var/mob/living/simple_animal/hostile/swarmer/melee/drone = d + drone.set_light(3) + else + set_light(0) + if(!mind) + return + for(var/d in dronelist) + var/mob/living/simple_animal/hostile/swarmer/melee/drone = d + drone.set_light(0) + +/** + * Proc which is used for swarmer comms + * + * Proc called which sends a message to all other swarmers. + * Arugments: + * * msg - The message the swarmer is sending, gotten from ContactSwarmers() + */ +/mob/living/simple_animal/hostile/swarmer/proc/swarmer_chat(msg) + var/rendered = "Swarm communication - [src] [say_quote(msg)]" + for(var/i in GLOB.mob_list) + var/mob/listener = i + if(isswarmer(listener)) + to_chat(listener, rendered) + else if(isobserver(listener)) + var/link = FOLLOW_LINK(listener, src) + to_chat(listener, "[link] [rendered]") + +/** + * Proc which is used for inputting a swarmer message + * + * Proc which is used for a swarmer to input a message on a pop-up box, then attempt to send that message to the other swarmers + */ +/mob/living/simple_animal/hostile/swarmer/proc/contact_swarmers() + var/message = stripped_input(src, "Announce to other swarmers", "Swarmer contact") + // TODO get swarmers their own colour rather than just boldtext + if(message) + swarmer_chat(message) + + +///Adds a drone to the swarmer list and keeps track of it in case it's deleted and requires cleanup. +/mob/living/simple_animal/hostile/swarmer/proc/add_drone(mob/newswarmer) + LAZYADD(dronelist, newswarmer) + RegisterSignal(newswarmer, COMSIG_PARENT_QDELETING, .proc/remove_drone, newswarmer) + + +/** + * Removes a drone from the swarmer's list. + * + * Removes the drone from our list. + * Called specifically when a drone is about to be destroyed, so we don't have any null references. + * Arguments: + * * mob/drone - The drone to be removed from the list. + */ +/mob/living/simple_animal/hostile/swarmer/proc/remove_drone(mob/drone, force) + UnregisterSignal(drone, COMSIG_PARENT_QDELETING) + dronelist -= drone + +/** + * # Swarmer Drone + * + * Melee subtype of swarmers, always AI-controlled under normal circumstances. Cannot fire projectiles, but does double stamina damage on melee + */ +/mob/living/simple_animal/hostile/swarmer/melee + icon_state = "swarmer_melee" + icon_living = "swarmer_melee" + ranged = FALSE + AIStatus = AI_ON + melee_damage_lower = 30 + melee_damage_upper = 30 + +/obj/projectile/beam/disabler/swarmer/on_hit(atom/target, blocked = FALSE) + . = ..() + if(!.) + return + if(!istype(target, /mob/living/simple_animal) || !istype(firer, /mob/living/simple_animal/hostile/swarmer)) + return + var/mob/living/simple_animal/hostile/swarmer/swarmer = firer + swarmer.teleport_target(target) diff --git a/code/modules/swarmers/swarmer_act.dm b/code/modules/swarmers/swarmer_act.dm new file mode 100644 index 00000000000..6590cacd9d5 --- /dev/null +++ b/code/modules/swarmers/swarmer_act.dm @@ -0,0 +1,231 @@ +/** + * Determines what happens to an atom when a swarmer interacts with it + * + * Determines behavior upon being interacted on by a swarmer. + * Arguments: + * * S - A reference to the swarmer doing the interaction + */ +/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + actor.dis_integrate(src) + return TRUE //return TRUE/FALSE whether or not an AI swarmer should try this swarmer_act() again, NOT whether it succeeded. + +/obj/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + if(resistance_flags & INDESTRUCTIBLE) + return FALSE + for(var/mob/living/living_content in contents) + if(issilicon(living_content) || isbrain(living_content)) + continue + to_chat(actor, "An organism has been detected inside this object. Aborting.") + return FALSE + return ..() + +/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + return actor.Integrate(src) + +/** + * Return used to determine how many resources a swarmer gains when consuming an object + */ +/obj/proc/integrate_amount() + return 0 + +/obj/item/integrate_amount() //returns the amount of resources gained when eating this item + if(custom_materials && (custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)] || custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)])) + return 1 + return ..() + +/obj/item/gun/swarmer_act()//Stops you from eating the entire armory + return FALSE + +/turf/open/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor + return FALSE + +/obj/structure/lattice/catwalk/swarmer_catwalk/swarmer_act() + return FALSE + +/obj/structure/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + if(actor.AIStatus == AI_ON) + return FALSE + return ..() + +/obj/effect/swarmer_act() + return FALSE + +/obj/effect/decal/cleanable/robot_debris/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + actor.dis_integrate(src) + qdel(src) + return TRUE + +/obj/structure/swarmer_beacon/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "This machine is required for further reproduction of swarmers. Aborting.") + return FALSE + +/obj/structure/flora/swarmer_act() + return FALSE + +/turf/open/lava/swarmer_act() + if(!is_safe()) + new /obj/structure/lattice/catwalk/swarmer_catwalk(src) + return FALSE + +/obj/machinery/atmospherics/swarmer_act() + return FALSE + +/obj/structure/disposalpipe/swarmer_act() + return FALSE + +/obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + actor.dismantle_machine(src) + return TRUE + +/obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + actor.dis_integrate(src) + return TRUE + +/obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + var/isonshuttle = istype(get_area(src), /area/shuttle) + for(var/turf/turf_in_range in range(1, src)) + var/area/turf_area = get_area(turf_in_range) + if(isspaceturf(turf_in_range) || (!isonshuttle && (istype(turf_area, /area/shuttle) || istype(turf_area, /area/space))) || (isonshuttle && !istype(turf_area, /area/shuttle))) + to_chat(actor, "Destroying this object has the potential to cause a hull breach. Aborting.") + actor.target = null + return FALSE + else if(istype(turf_area, /area/engine/supermatter)) + to_chat(actor, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.") + actor.target = null + return FALSE + actor.dis_integrate(src) + return TRUE + +/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + actor.dis_integrate(src) + if(!QDELETED(actor)) //If it got blown up no need to turn it off. + toggle_cam(actor, FALSE) + return TRUE + +/obj/machinery/particle_accelerator/control_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + actor.dis_integrate(src) + return TRUE + +/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + actor.dis_integrate(src) + return TRUE + +/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + actor.dis_integrate(src) + return TRUE + +/obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)//It's more visually interesting than dismantling the machine + actor.dis_integrate(src) + return TRUE + +/obj/machinery/turretid/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + actor.dis_integrate(src) + return TRUE + +/obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "The volatile chemicals in this machine would destroy us. Aborting.") + return FALSE + +/obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "This device's destruction would result in the extermination of everything in the area. Aborting.") + return FALSE + +/obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "Searching... sensor malfunction! Target lost. Aborting.") + return FALSE + +/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "Destroying this object could cause a chain reaction. Aborting.") + return FALSE + +/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "Disrupting the power grid would bring no benefit to us. Aborting.") + return FALSE + +/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "An inhospitable area may be created as a result of destroying this object. Aborting.") + return FALSE + +/obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.") + return FALSE + +/obj/machinery/deepfryer/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "This kitchen appliance should be preserved, it will make delicious unhealthy snacks for our masters in the future. Aborting.") + return FALSE + +/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "Disrupting the power grid would bring no benefit to us. Aborting.") + return FALSE + +/obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "This bluespace source will be important to us later. Aborting.") + return FALSE + +/turf/closed/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + var/isonshuttle = istype(loc, /area/shuttle) + for(var/turf/turf_in_range in range(1, src)) + var/area/turf_area = get_area(turf_in_range) + if(isspaceturf(turf_area) || (!isonshuttle && (istype(turf_area, /area/shuttle) || istype(turf_area, /area/space))) || (isonshuttle && !istype(turf_area, /area/shuttle))) + to_chat(actor, "Destroying this object has the potential to cause a hull breach. Aborting.") + actor.target = null + return TRUE + else if(istype(turf_area, /area/engine/supermatter)) + to_chat(actor, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.") + actor.target = null + return TRUE + return ..() + +/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + var/is_on_shuttle = istype(get_area(src), /area/shuttle) + for(var/turf/adj_turf in range(1, src)) + var/area/adj_area = get_area(adj_turf) + if(isspaceturf(adj_turf) || (!is_on_shuttle && (istype(adj_area, /area/shuttle) || istype(adj_area, /area/space))) || (is_on_shuttle && !istype(adj_area, /area/shuttle))) + to_chat(actor, "Destroying this object has the potential to cause a hull breach. Aborting.") + actor.target = null + return TRUE + if(istype(adj_area, /area/engine/supermatter)) + to_chat(actor, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.") + actor.target = null + return TRUE + return ..() + +/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)//Wiring would be too effective as a resource + to_chat(actor, "This object does not contain enough materials to work with.") + return FALSE + +/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "Attempting to dismantle this machine would result in an immediate counterattack. Aborting.") + return FALSE + +/obj/machinery/porta_turret_cover/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "Attempting to dismantle this machine would result in an immediate counterattack. Aborting.") + return FALSE + +/obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + var/turf/here = get_turf(src) + for(var/a in here.contents) + if(istype(a, /obj/structure/cable)) + to_chat(actor, "Disrupting the power grid would bring no benefit to us. Aborting.") + return FALSE + return ..() + +/obj/machinery/hydroponics/soil/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "This object does not contain enough materials to work with.") + return FALSE + +/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "Destroying this object would cause a catastrophic chain reaction. Aborting.") + return FALSE + +/obj/machinery/field/containment/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "This object does not contain solid matter. Aborting.") + return FALSE + +/obj/machinery/power/shieldwallgen/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "Destroying this object would have an unpredictable effect on structure integrity. Aborting.") + return FALSE + +/obj/machinery/shieldwall/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor) + to_chat(actor, "This object does not contain solid matter. Aborting.") + return FALSE diff --git a/code/modules/swarmers/swarmer_objs.dm b/code/modules/swarmers/swarmer_objs.dm new file mode 100644 index 00000000000..ea67eff04b0 --- /dev/null +++ b/code/modules/swarmers/swarmer_objs.dm @@ -0,0 +1,153 @@ +/obj/structure/swarmer //Default swarmer effect object visual feedback + name = "swarmer ui" + desc = null + gender = NEUTER + icon = 'icons/mob/swarmer.dmi' + icon_state = "ui_light" + layer = MOB_LAYER + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + light_color = LIGHT_COLOR_CYAN + max_integrity = 30 + anchored = TRUE + ///How strong the light effect for the structure is + var/glow_range = 1 + +/obj/structure/swarmer/Initialize(mapload) + . = ..() + set_light(glow_range) + +/obj/structure/swarmer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = NONE) + switch(damage_type) + if(BRUTE) + playsound(src, 'sound/weapons/egloves.ogg', 80, TRUE) + if(BURN) + playsound(src, 'sound/items/welder.ogg', 100, TRUE) + +/obj/structure/swarmer/emp_act() + . = ..() + if(. & EMP_PROTECT_SELF) + return + qdel(src) + +/** + * # Swarmer Beacon + * + * Beacon which creates sentient player swarmers. + * + * The beacon which creates sentient player swarmers during the swarmer event. Spawns in maint on xeno locations, and can create a player swarmer once every 30 seconds. + * The beacon cannot be damaged by swarmers, and must be destroyed to prevent the spawning of further player-controlled swarmers. + * Holds a swarmer within itself during the 30 seconds before releasing it and allowing for another swarmer to be spawned in. + */ + +/obj/structure/swarmer_beacon + name = "swarmer beacon" + desc = "A machine that prints swarmers." + icon = 'icons/mob/swarmer.dmi' + icon_state = "swarmer_console" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + max_integrity = 400 + layer = MASSIVE_OBJ_LAYER + light_color = LIGHT_COLOR_CYAN + light_range = 10 + anchored = TRUE + density = FALSE + ///Whether or not a swarmer is currently being created by this beacon + var/processing_swarmer = FALSE + +/obj/structure/swarmer_beacon/attack_ghost(mob/user) + . = ..() + if(processing_swarmer) + to_chat(user, "A swarmer is currently being created. Try again soon.") + return + que_swarmer(user) + +/** + * Interaction when a ghost interacts with a swarmer beacon + * + * Called when a ghost interacts with a swarmer beacon, allowing them to become a swarmer + * Arguments: + * * user - A reference to the ghost interacting with the beacon + */ +/obj/structure/swarmer_beacon/proc/que_swarmer(mob/user) + var/swarm_ask = alert("Become a swarmer?", "Do you wish to consume the station?", "Yes", "No") + if(swarm_ask == "No" || QDELETED(src) || QDELETED(user) || processing_swarmer) + return FALSE + var/mob/living/simple_animal/hostile/swarmer/newswarmer = new /mob/living/simple_animal/hostile/swarmer(src) + newswarmer.key = user.key + addtimer(CALLBACK(src, .proc/release_swarmer, newswarmer), 30 SECONDS) + to_chat(newswarmer, "SWARMER CONSTURCTION INITIALIZED. TIME TO COMPLETION: 30 SECONDS") + processing_swarmer = TRUE + return TRUE + +/** + * Releases a swarmer from the beacon and tells it what to do + * + * Occcurs 30 seconds after a ghost becomes a swarmer. The beacon releases it, tells it what to do, and opens itself up to spawn in a new swarmer. + * Arguments: + * * swarmer - The swarmer being released and told what to do + */ +/obj/structure/swarmer_beacon/proc/release_swarmer(mob/swarmer) + to_chat(swarmer, "SWARMER CONSTURCTION COMPLETED. OBJECTIVES:\n\ + 1. CONSUME RESOURCES AND REPLICATE UNTIL THERE ARE NO MORE RESOURCES LEFT\n\ + 2. ENSURE PROTECTION OF THE BEACON SO THIS LOCATION CAN BE INVADED AT A LATER DATE; DO NOT PERFORM ACTIONS THAT WOULD RENDER THIS LOCATION DANGEROUS OR INHOSPITABLE\n\ + 3. BIOLOGICAL RESOURCES WILL BE HARVESTED AT A LATER DATE: DO NOT HARM THEM\n\ + OPERATOR NOTES:\n\ + - CONSUME RESOURCES TO CONSTRUCT TRAPS, BARRIERS, AND FOLLOWER DRONES\n\ + - FOLLOWER DRONES CAN BE ORDERED TO MOVE VIA MIDDLE CLICKING ON A TILE. WHILE DRONES CANNOT ASSIST IN RESOURCE HARVESTING, THEY CAN PROTECT YOU FROM THREATS\n\ + - LCTRL + ATTACKING AN ORGANIC WILL ALOW YOU TO REMOVE SAID ORGANIC FROM THE AREA\n\ + - YOU AND YOUR DRONES HAVE A STUN EFFECT ON MELEE. YOU ARE ALSO ARMED WITH A DISABLER PROJECTILE, USE THESE TO PREVENT ORGANICS FROM HALTING YOUR PROGRESS\n\ + GLORY TO !*# $*#^") + swarmer.forceMove(get_turf(src)) + processing_swarmer = FALSE + +/obj/structure/swarmer/trap + name = "swarmer trap" + desc = "A quickly assembled trap that electrifies living beings and overwhelms machine sensors. Will not retain its form if damaged enough." + icon_state = "trap" + max_integrity = 10 + density = FALSE + +/obj/structure/swarmer/trap/Crossed(atom/movable/AM) + if(isliving(AM)) + var/mob/living/living_crosser = AM + if(!istype(living_crosser, /mob/living/simple_animal/hostile/swarmer)) + playsound(loc,'sound/effects/snap.ogg',50, TRUE, -1) + living_crosser.electrocute_act(0, src, 1, flags = SHOCK_NOGLOVES|SHOCK_ILLUSION) + if(iscyborg(living_crosser)) + living_crosser.Paralyze(100) + qdel(src) + return ..() + +/obj/structure/swarmer/blockade + name = "swarmer blockade" + desc = "A quickly assembled energy blockade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through." + icon_state = "barricade" + light_range = MINIMUM_USEFUL_LIGHT_RANGE + max_integrity = 50 + +/obj/structure/swarmer/blockade/CanAllowThrough(atom/movable/O) + . = ..() + if(isswarmer(O)) + return TRUE + if(istype(O, /obj/projectile/beam/disabler)) + return TRUE + +/obj/effect/temp_visual/swarmer //temporary swarmer visual feedback objects + icon = 'icons/mob/swarmer.dmi' + layer = BELOW_MOB_LAYER + +/obj/effect/temp_visual/swarmer/disintegration + icon_state = "disintegrate" + duration = 1 SECONDS + +/obj/effect/temp_visual/swarmer/disintegration/Initialize() + . = ..() + playsound(loc, "sparks", 100, TRUE) + +/obj/effect/temp_visual/swarmer/dismantle + icon_state = "dismantle" + duration = 2.5 SECONDS + +/obj/effect/temp_visual/swarmer/integrate + icon_state = "integrate" + duration = 0.5 SECONDS diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index 3390d26dec7..5eacfd07fe2 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -33,8 +33,6 @@ var/status = UI_INTERACTIVE /// Topic state used to determine status/interactability. var/datum/ui_state/state = null - /// Asset data to be sent with every update - var/list/asset_data /** * public @@ -82,11 +80,14 @@ opened_at = world.time window.acquire_lock(src) if(!window.is_ready()) - window.initialize() + window.initialize(inline_assets = list( + get_asset_datum(/datum/asset/simple/tgui), + )) else window.send_message("ping") + window.send_asset(get_asset_datum(/datum/asset/simple/fontawesome)) for(var/datum/asset/asset in src_object.ui_assets(user)) - send_asset(asset) + window.send_asset(asset) window.send_message("update", get_payload( with_data = TRUE, with_static_data = TRUE)) @@ -143,14 +144,10 @@ * * required asset datum/asset */ -/datum/tgui/proc/send_asset(var/datum/asset/asset) - if(!user.client) - return - if(istype(asset, /datum/asset/spritesheet)) - var/datum/asset/spritesheet/spritesheet = asset - LAZYINITLIST(asset_data) - LAZYADD(asset_data["styles"], list(spritesheet.css_filename())) - asset.send(user) +/datum/tgui/proc/send_asset(datum/asset/asset) + if(!window) + CRASH("send_asset() can only be called after open().") + window.send_asset(asset) /** * public @@ -216,8 +213,6 @@ var/static_data = with_static_data && src_object.ui_static_data(user) if(static_data) json_data["static_data"] = static_data - if(asset_data) - json_data["assets"] = asset_data if(src_object.tgui_shared_states) json_data["shared"] = src_object.tgui_shared_states return json_data @@ -292,6 +287,8 @@ if(href_list["fatal"]) close(can_be_suspended = FALSE) if("setSharedState") + if(status != UI_INTERACTIVE) + return LAZYINITLIST(src_object.tgui_shared_states) src_object.tgui_shared_states[href_list["key"]] = href_list["value"] SStgui.update_uis(src_object) diff --git a/code/modules/tgui/tgui_window.dm b/code/modules/tgui/tgui_window.dm index 1ef370317c7..3f271163c9c 100644 --- a/code/modules/tgui/tgui_window.dm +++ b/code/modules/tgui/tgui_window.dm @@ -13,6 +13,7 @@ var/datum/tgui/locked_by var/fatally_errored = FALSE var/message_queue + var/sent_assets = list() /** * public @@ -36,8 +37,10 @@ * Initializes the window with a fresh page. Puts window into the "loading" * state. You can begin sending messages right after initializing. Messages * will be put into the queue until the window finishes loading. + * + * optional inline_assets list List of assets to inline into the html. */ -/datum/tgui_window/proc/initialize() +/datum/tgui_window/proc/initialize(inline_assets = list()) log_tgui(client, "[id]/initialize") if(!client) return @@ -52,13 +55,23 @@ else options += "titlebar=1;can_resize=1;" // Generate page html - // TODO: Make this static var/html = SStgui.basehtml html = replacetextEx(html, "\[tgui:windowId]", id) - // Send required assets - var/datum/asset/asset - asset = get_asset_datum(/datum/asset/group/tgui) - asset.send(client) + // Process inline assets + var/inline_styles = "" + var/inline_scripts = "" + for(var/datum/asset/asset in inline_assets) + var/mappings = asset.get_url_mappings() + for(var/name in mappings) + var/url = mappings[name] + // Not urlencoding since asset strings are considered safe + if(copytext(name, -4) == ".css") + inline_styles += "\n" + else if(copytext(name, -3) == ".js") + inline_scripts += "\n" + asset.send() + html = replacetextEx(html, "\n", inline_styles) + html = replacetextEx(html, "\n", inline_scripts) // Open the window client << browse(html, "window=[id];[options]") // Instruct the client to signal UI when the window is closed. @@ -86,7 +99,7 @@ && pooled \ && pool_index > 0 \ && pool_index <= TGUI_WINDOW_SOFT_LIMIT \ - && status >= TGUI_WINDOW_READY + && status == TGUI_WINDOW_READY /** * public @@ -107,6 +120,9 @@ * Release the window lock. */ /datum/tgui_window/proc/release_lock() + // Clean up assets sent by tgui datum which requested the lock + if(locked) + sent_assets = list() locked = FALSE locked_by = null @@ -126,8 +142,7 @@ send_message("suspend") return log_tgui(client, "[id]/close") - locked = FALSE - locked_by = null + release_lock() status = TGUI_WINDOW_CLOSED message_queue = null // Do not close the window to give user some time @@ -157,13 +172,30 @@ // Pack for sending via output() message = url_encode(message) // Place into queue if window is still loading - if(!force && status == TGUI_WINDOW_LOADING) + if(!force && status != TGUI_WINDOW_READY) if(!message_queue) message_queue = list() message_queue += list(message) return client << output(message, "[id].browser:update") +/** + * public + * + * Makes an asset available to use in tgui. + * + * required asset datum/asset + */ +/datum/tgui_window/proc/send_asset(datum/asset/asset) + if(!client || !asset) + return + if(istype(asset, /datum/asset/spritesheet)) + var/datum/asset/spritesheet/spritesheet = asset + send_message("asset/stylesheet", spritesheet.css_filename()) + send_message("asset/mappings", asset.get_url_mappings()) + sent_assets += list(asset) + asset.send(client) + /** * private * @@ -184,6 +216,11 @@ /datum/tgui_window/proc/on_message(type, list/payload, list/href_list) switch(type) if("ready") + // Status can be READY if user has refreshed the window. + if(status == TGUI_WINDOW_READY) + // Resend the assets + for(var/asset in sent_assets) + send_asset(asset) status = TGUI_WINDOW_READY if("log") if(href_list["fatal"]) diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 5d7994f737c..45f634b11e4 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -15,10 +15,14 @@ #include "card_mismatch.dm" #include "chain_pull_through_space.dm" #include "component_tests.dm" +#include "keybinding_init.dm" +#include "medical_wounds.dm" +#include "metabolizing.dm" #include "outfit_sanity.dm" #include "plantgrowth_tests.dm" #include "reagent_id_typos.dm" #include "reagent_recipe_collisions.dm" +#include "say.dm" #include "siunit.dm" #include "spawn_humans.dm" #include "species_whitelists.dm" diff --git a/code/modules/unit_tests/keybinding_init.dm b/code/modules/unit_tests/keybinding_init.dm new file mode 100644 index 00000000000..2bd2fdee1e2 --- /dev/null +++ b/code/modules/unit_tests/keybinding_init.dm @@ -0,0 +1,6 @@ +/datum/unit_test/keybinding_init/Run() + for(var/i in subtypesof(/datum/keybinding)) + var/datum/keybinding/KB = i + if(initial(KB.keybind_signal) || !initial(KB.name)) + continue + Fail("[KB.name] does not have a keybind signal defined.") diff --git a/code/modules/unit_tests/medical_wounds.dm b/code/modules/unit_tests/medical_wounds.dm new file mode 100644 index 00000000000..75c08931f16 --- /dev/null +++ b/code/modules/unit_tests/medical_wounds.dm @@ -0,0 +1,87 @@ +/// This test is used to make sure a flesh-and-bone base human can suffer all the types of wounds, and that suffering more severe wounds removes and replaces the lesser wound. Also tests that [/mob/living/carbon/proc/fully_heal] removes all wounds +/datum/unit_test/test_human_base/Run() + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human) + + /// the limbs have no wound resistance like the chest and head do, so let's go with the r_arm + var/obj/item/bodypart/tested_part = victim.get_bodypart(BODY_ZONE_R_ARM) + /// In order of the wound types we're trying to inflict, what sharpness do we need to deal them? + var/list/sharps = list(SHARP_NONE, SHARP_EDGED, SHARP_POINTY, SHARP_NONE) + /// Since burn wounds need burn damage, duh + var/list/dam_types = list(BRUTE, BRUTE, BRUTE, BURN) + + var/i = 1 + var/list/iter_test_wound_list + + for(iter_test_wound_list in list(list(/datum/wound/blunt/moderate, /datum/wound/blunt/severe, /datum/wound/blunt/critical),\ + list(/datum/wound/slash/moderate, /datum/wound/slash/severe, /datum/wound/slash/critical),\ + list(/datum/wound/pierce/moderate, /datum/wound/pierce/severe, /datum/wound/pierce/critical),\ + list(/datum/wound/burn/moderate, /datum/wound/burn/severe, /datum/wound/burn/critical))) + + TEST_ASSERT_EQUAL(length(victim.all_wounds), 0, "Patient is somehow wounded before test") + var/datum/wound/iter_test_wound + var/threshold_penalty = 0 + + for(iter_test_wound in iter_test_wound_list) + var/threshold = initial(iter_test_wound.threshold_minimum) - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty + if(dam_types[i] == BRUTE) + tested_part.receive_damage(WOUND_MINIMUM_DAMAGE, 0, wound_bonus = threshold, sharpness=sharps[i]) + else if(dam_types[i] == BURN) + tested_part.receive_damage(0, WOUND_MINIMUM_DAMAGE, wound_bonus = threshold, sharpness=sharps[i]) + + TEST_ASSERT(length(victim.all_wounds), "Patient has no wounds when one wound is expected. Severity: [initial(iter_test_wound.severity)]") + TEST_ASSERT_EQUAL(length(victim.all_wounds), 1, "Patient has more than one wound when only one is expected. Severity: [initial(iter_test_wound.severity)]") + var/datum/wound/actual_wound = victim.all_wounds[1] + TEST_ASSERT_EQUAL(actual_wound.type, iter_test_wound, "Patient has wound of incorrect severity. Expected: [initial(iter_test_wound.name)] Got: [actual_wound]") + threshold_penalty = actual_wound.threshold_penalty + i++ + victim.fully_heal(TRUE) // should clear all wounds between types + + +/// This test is used for making sure species with bones but no flesh (skeletons, plasmamen) can only suffer BONE_WOUNDS, and nothing tagged with FLESH_WOUND (it's possible to require both) +/datum/unit_test/test_human_bone/Run() + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human) + + /// the limbs have no wound resistance like the chest and head do, so let's go with the r_arm + var/obj/item/bodypart/tested_part = victim.get_bodypart(BODY_ZONE_R_ARM) + /// In order of the wound types we're trying to inflict, what sharpness do we need to deal them? + var/list/sharps = list(SHARP_NONE, SHARP_EDGED, SHARP_POINTY, SHARP_NONE) + /// Since burn wounds need burn damage, duh + var/list/dam_types = list(BRUTE, BRUTE, BRUTE, BURN) + + var/i = 1 + var/list/iter_test_wound_list + victim.dna.species.species_traits &= HAS_FLESH // take away the base human's flesh (ouchie!) ((not actually ouchie, this just affects their wounds and dismemberment handling)) + + for(iter_test_wound_list in list(list(/datum/wound/blunt/moderate, /datum/wound/blunt/severe, /datum/wound/blunt/critical),\ + list(/datum/wound/slash/moderate, /datum/wound/slash/severe, /datum/wound/slash/critical),\ + list(/datum/wound/pierce/moderate, /datum/wound/pierce/severe, /datum/wound/pierce/critical),\ + list(/datum/wound/burn/moderate, /datum/wound/burn/severe, /datum/wound/burn/critical))) + + TEST_ASSERT_EQUAL(length(victim.all_wounds), 0, "Patient is somehow wounded before test") + var/datum/wound/iter_test_wound + var/threshold_penalty = 0 + + for(iter_test_wound in iter_test_wound_list) + var/threshold = initial(iter_test_wound.threshold_minimum) - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty + if(dam_types[i] == BRUTE) + tested_part.receive_damage(WOUND_MINIMUM_DAMAGE, 0, wound_bonus = threshold, sharpness=sharps[i]) + else if(dam_types[i] == BURN) + tested_part.receive_damage(0, WOUND_MINIMUM_DAMAGE, wound_bonus = threshold, sharpness=sharps[i]) + + // so if we just tried to deal a flesh wound, make sure we didn't actually suffer it. We may have suffered a bone wound instead, but we just want to make sure we don't have a flesh wound + if(initial(iter_test_wound.wound_flags) & FLESH_WOUND) + if(!length(victim.all_wounds)) // not having a wound is good news + continue + else // we have to check that it's actually a bone wound and not the intended wound type + TEST_ASSERT_EQUAL(length(victim.all_wounds), 1, "Patient has more than one wound when only one is expected. Severity: [initial(iter_test_wound.severity)]") + var/datum/wound/actual_wound = victim.all_wounds[1] + TEST_ASSERT((actual_wound.wound_flags & ~FLESH_WOUND), "Patient has flesh wound despite no HAS_FLESH flag, expected either no wound or bone wound. Offending wound: [actual_wound]") + threshold_penalty = actual_wound.threshold_penalty + else // otherwise if it's a bone wound, check that we have it per usual + TEST_ASSERT(length(victim.all_wounds), "Patient has no wounds when one wound is expected. Severity: [initial(iter_test_wound.severity)]") + TEST_ASSERT_EQUAL(length(victim.all_wounds), 1, "Patient has more than one wound when only one is expected. Severity: [initial(iter_test_wound.severity)]") + var/datum/wound/actual_wound = victim.all_wounds[1] + TEST_ASSERT_EQUAL(actual_wound.type, iter_test_wound, "Patient has wound of incorrect severity. Expected: [initial(iter_test_wound.name)] Got: [actual_wound]") + threshold_penalty = actual_wound.threshold_penalty + i++ + victim.fully_heal(TRUE) // should clear all wounds between types diff --git a/code/modules/unit_tests/metabolizing.dm b/code/modules/unit_tests/metabolizing.dm new file mode 100644 index 00000000000..895762c0ecc --- /dev/null +++ b/code/modules/unit_tests/metabolizing.dm @@ -0,0 +1,19 @@ +/datum/unit_test/metabolization/Run() + // Pause natural mob life so it can be handled entirely by the test + SSmobs.pause() + + var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) + var/mob/living/carbon/monkey/monkey = allocate(/mob/living/carbon/monkey) + + for (var/reagent_type in subtypesof(/datum/reagent)) + test_reagent(human, reagent_type) + test_reagent(monkey, reagent_type) + +/datum/unit_test/metabolization/proc/test_reagent(mob/living/carbon/C, reagent_type) + C.reagents.add_reagent(reagent_type, 10) + C.reagents.metabolize(C, can_overdose = TRUE) + C.reagents.clear_reagents() + +/datum/unit_test/metabolization/Destroy() + SSmobs.ignite() + return ..() diff --git a/code/modules/unit_tests/say.dm b/code/modules/unit_tests/say.dm new file mode 100644 index 00000000000..a7df5ad624b --- /dev/null +++ b/code/modules/unit_tests/say.dm @@ -0,0 +1,23 @@ +/// Test to verify message mods are parsed correctly +/datum/unit_test/get_message_mods + var/mob/host_mob + +/datum/unit_test/get_message_mods/Run() + host_mob = allocate(/mob/living/carbon/human) + + test("Hello", "Hello", list()) + test(";HELP", "HELP", list(MODE_HEADSET = TRUE)) + test(";%Never gonna give you up", "Never gonna give you up", list(MODE_HEADSET = TRUE, MODE_SING = TRUE)) + test(".s Gun plz", "Gun plz", list(RADIO_KEY = RADIO_KEY_SECURITY, RADIO_EXTENSION = RADIO_CHANNEL_SECURITY)) + test("...What", "...What", list()) + +/datum/unit_test/get_message_mods/proc/test(message, expected_message, list/expected_mods) + var/list/mods = list() + TEST_ASSERT_EQUAL(host_mob.get_message_mods(message, mods), expected_message, "Chopped message was not what we expected. Message: [message]") + + for (var/mod_key in mods) + TEST_ASSERT_EQUAL(mods[mod_key], expected_mods[mod_key], "The value for [mod_key] was not what we expected. Message: [message]") + expected_mods -= mod_key + + if (expected_mods.len) + Fail("Some message mods were expected, but were not returned by get_message_mods: [json_encode(expected_mods)]. Message: [message]") diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm index ead123cd1f1..f57e3dd5671 100644 --- a/code/modules/uplink/uplink_devices.dm +++ b/code/modules/uplink/uplink_devices.dm @@ -8,6 +8,7 @@ icon = 'icons/obj/radio.dmi' icon_state = "radio" inhand_icon_state = "walkietalkie" + worn_icon_state = "radio" desc = "A basic handheld radio that communicates with local telecommunication networks." lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 69b5b92469b..dd6b0de70bc 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1708,8 +1708,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/role_restricted/ancient_jumpsuit name = "Ancient Jumpsuit" - desc = "A tattered old jumpsuit that will provide absolutely no benefit to you. It fills the wearer with a strange compulsion to blurt out 'glorf'." - item = /obj/item/clothing/under/color/grey/glorf + desc = "A tattered old jumpsuit that will provide absolutely no benefit to you." + item = /obj/item/clothing/under/color/grey/ancient cost = 20 restricted_roles = list("Assistant") surplus = 0 @@ -1931,7 +1931,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) limited_stock = 1 item = /obj/item/devices/ocd_device restricted_roles = list("Head of Personnel", "Quartermaster") - + /datum/uplink_item/role_restricted/meathook name = "Butcher's Meat Hook" desc = "A brutal cleaver on a long chain, it allows you to pull people to your location." @@ -1966,7 +1966,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) name = "Clown Costume" desc = "Nothing is more terrifying than clowns with fully automatic weaponry." item = /obj/item/storage/backpack/duffelbag/clown/syndie - + /datum/uplink_item/badass/costumes/tactical_naptime name = "Sleepy Time Pajama Bundle" desc = "Even soldiers need to get a good nights rest. Comes with blood-red pajamas, a blankie, a hot mug of cocoa and a fuzzy friend." diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index f4fc524d0cb..fa4c2f20f77 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -318,10 +318,34 @@ GLOBAL_LIST_EMPTY(vending_products) if(!start_empty) R.amount = amount R.max_amount = amount - R.custom_price = initial(temp.custom_price) - R.custom_premium_price = initial(temp.custom_premium_price) + R.custom_price = initial(temp.custom_price) * SSeconomy.inflation_value() + R.custom_premium_price = initial(temp.custom_premium_price) * SSeconomy.inflation_value() R.age_restricted = initial(temp.age_restricted) recordlist += R + +/** + * Reassign the prices of the vending machine as a result of the inflation value, as provided by SSeconomy + * + * This rebuilds both /datum/data/vending_products lists for premium and standard products based on their most relevant pricing values. + * Arguments: + * * recordlist - the list of standard product datums in the vendor to refresh their prices. + * * premiumlist - the list of premium product datums in the vendor to refresh their prices. + */ +/obj/machinery/vending/proc/reset_prices(list/recordlist, list/premiumlist) + for(var/R in recordlist) + var/datum/data/vending_product/record = R + var/atom/potential_product = record.product_path + record.custom_price = round(initial(potential_product.custom_price) * SSeconomy.inflation_value()) + for(var/R in premiumlist) + var/datum/data/vending_product/record = R + var/atom/potential_product = record.product_path + var/premium_sanity = round(initial(potential_product.custom_premium_price)) + if(premium_sanity) + record.custom_premium_price = round(premium_sanity * SSeconomy.inflation_value()) + continue + //For some ungodly reason, some premium only items only have a custom_price + record.custom_premium_price = round(extra_price + (initial(potential_product.custom_price) * (SSeconomy.inflation_value() - 1))) + /** * Refill a vending machine from a refill canister * @@ -546,8 +570,7 @@ GLOBAL_LIST_EMPTY(vending_products) for(var/i in C.bodyparts) var/obj/item/bodypart/squish_part = i if(squish_part.is_organic_limb()) - //var/type_wound = pick(WOUND_LIST_BONE) - var/type_wound = pick(list(/datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/moderate)) + var/type_wound = pick(list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate)) squish_part.force_wound_upwards(type_wound) else squish_part.receive_damage(brute=30) diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 69622f13cc3..b8a0509d9fd 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -71,6 +71,7 @@ /obj/item/clothing/under/rank/captain/suit/skirt = 2, /obj/item/clothing/under/rank/civilian/head_of_personnel/suit/skirt = 2, /obj/item/clothing/suit/jacket = 2, + /obj/item/clothing/suit/hooded/wintercoat = 2, /obj/item/clothing/suit/jacket/puffer/vest = 2, /obj/item/clothing/suit/jacket/puffer = 2, /obj/item/clothing/suit/jacket/letterman = 2, @@ -100,6 +101,7 @@ /obj/item/clothing/suit/ianshirt = 1, /obj/item/clothing/shoes/laceup = 2, /obj/item/clothing/shoes/sandal = 2, + /obj/item/clothing/shoes/winterboots = 2, /obj/item/clothing/shoes/cowboy = 2, /obj/item/clothing/shoes/cowboy/white = 2, /obj/item/clothing/shoes/cowboy/black = 2, diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index e603af6f7f5..9f26a9589a9 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -14,7 +14,10 @@ /obj/item/camera = 3, /obj/item/cardpack/series_one = 10, /obj/item/cardpack/resin = 10, - /obj/item/storage/card_binder = 10) + /obj/item/storage/card_binder = 10, + /obj/item/skillchip/basketweaving=2, + /obj/item/skillchip/bonsai=2, + /obj/item/skillchip/wine_taster=2) contraband = list(/obj/item/dice/fudge = 9) premium = list(/obj/item/melee/skateboard/pro = 3, /obj/item/melee/skateboard/hoverboard = 1) diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index c56ecced315..382ff5349ce 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -35,7 +35,7 @@ /obj/item/reagent_containers/pill/multiver = 6, /obj/item/storage/box/gum/happiness = 3, /obj/item/storage/box/hug/medical = 1) - premium = list(/obj/item/reagent_containers/medigel/instabitaluri = 2, + premium = list(/obj/item/reagent_containers/medigel/synthflesh = 2, /obj/item/storage/pill_bottle/psicodine = 2, /obj/item/reagent_containers/hypospray/medipen = 3, /obj/item/storage/belt/medical = 3, diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 1c97853c466..ce844bf7db2 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -12,7 +12,7 @@ var/icon_right = "bloodhand_right" hitsound = 'sound/hallucinations/growl1.ogg' force = 21 // Just enough to break airlocks with melee attacks - sharpness = IS_SHARP + sharpness = SHARP_EDGED wound_bonus = -30 bare_wound_bonus = 15 damtype = "brute" diff --git a/config/config.txt b/config/config.txt index 0dba4ce4ae4..30edbecbea2 100644 --- a/config/config.txt +++ b/config/config.txt @@ -494,9 +494,13 @@ DEFAULT_VIEW_SQUARE 15x15 ## Enable automatic profiling - Byond 513.1506 and newer only. #AUTO_PROFILE +## Uncomment to enable global ban DB using the provided URL. The API should expect to receive a ckey at the end of the URL. +## More API details can be found here: https://centcom.melonmesa.com/swagger/index.html +#CENTCOM_BAN_DB https://centcom.melonmesa.com/ban/search + #### DISCORD STUFFS #### ## MAKE SURE ALL SECTIONS OF THIS ARE FILLED OUT BEFORE ENABLING -## Discord IDs can be obtained by following this guide: https://support.discordapp.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID- +## Discord IDs can be obtained by following this guide: https://support.discord.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID- ## Uncomment to enable discord auto-roling when users link their BYOND and Discord accounts #ENABLE_DISCORD_AUTOROLE diff --git a/html/changelog.html b/html/changelog.html index 3376ede8f93..66e84a36402 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -51,6 +51,472 @@ -->
+

30 July 2020

+

ATHATH updated:

+
    +
  • You can now store a dead mouse inside of your chef's hat. Y'know, in case the living mouse you keep in there dies.
  • +
+

AnturK updated:

+
    +
  • Learn new skills at your local library. Usefulness not guaranteed.
  • +
+

Dennok updated:

+
    +
  • Sheetifier and Vend-a-Tray has proper named circuit boards
  • +
  • Cable hubs no more can be created by handcraft. Cuble hubs available only in cable radial menu.
  • +
  • cyborg endoskeleton now check all parts for completion
  • +
+

Donkie updated:

+
    +
  • Fixed mobs/items/turfs not being predictably washed by the various methods on board
  • +
  • Fixed showers not properly reducing clothing radioactivity
  • +
  • Refactored the cleaning/washing system
  • +
+

Helianthus00 updated:

+
    +
  • Deltastation: Added a new and improved permabrig
  • +
+

Jared-Fogle updated:

+
    +
  • You can now only use the emergency shuttle console once per 5 seconds.
  • +
+

Melbert updated:

+
    +
  • user feedback for cyborgs trying to use modules while buckled to things
  • +
+

Paxilmaniac updated:

+
    +
  • a third spawn point for miners on meta so they don't spawn inside one another
  • +
+

TheVekter updated:

+
    +
  • Supermatter tongs are no longer rendered invisible once you pick up a supermatter sliver.
  • +
+ +

29 July 2020

+

ATHATH updated:

+
    +
  • The third law of the reporter lawset no longer obligates you to interfere with Mining and Xenobiology.
  • +
  • The fourth law of the corporate lawset no longer obligates you to depower/shut down Cargo.
  • +
+

Jared-Fogle updated:

+
    +
  • Added the "Check Timer Sources" debug command to help isolate problematic cases of addtimer.
  • +
+

Melbert updated:

+
    +
  • Fixes a cyborg runtime error
  • +
  • middle mouse click to cycle modules for cyborgs works properly again
  • +
+

Memedoktor updated:

+
    +
  • adds positive moodlet for chaplain eating holymelon
  • +
+

Ryll/Shaps updated:

+
    +
  • Non-emagged mediborgs will no longer embed people with lollipops. Emagged borgs, on the other hand..... well, they can. Fun!
  • +
  • Spears and other embeddables are now somewhat less effective at causing damage and bloodloss
  • +
+

ike709 and bobbahbrown updated:

+
    +
  • Admins can now see your bans on (some) other servers.
  • +
+

nightred updated:

+
    +
  • Prevents showing AI law changes after revival
  • +
  • Clown ops reinforcements spawn properly
  • +
+

oranges updated:

+
    +
  • disappointment has been reworked
  • +
+ +

28 July 2020

+

Jared-Fogle updated:

+
    +
  • Fixed a bug where you could not start messages with an ellipses.
  • +
  • Fixed not being able to sing over comms.
  • +
+

Skoglol updated:

+
    +
  • Statues can now properly not cast spells.
  • +
+

Time-Green updated:

+
    +
  • Instabitulari is called synthflesh again
  • +
+ +

27 July 2020

+

Ryll/Shaps updated:

+
    +
  • Stepping on an unopened bag of chips will pop it and ruin all the chips inside
  • +
  • Added 2 unit tests for wounds
  • +
+

ShizCalev updated:

+
    +
  • Fixed a minor runtime caused by ghosts pressing the lookup / lookdown keybind.
  • +
  • Supermatter slivers thrown by bombs / mass drivers will now consume a mob if they're hit by it.
  • +
  • Fixed an exploit allowing jaunting mobs to consume supermatter slivers on the ground.
  • +
  • Fixed simple animals (ie gorillas) not being consumed by supermatter slivers after picking them up.
  • +
  • Fixed an exploit allowing you to kill jaunting mobs with supermatter slivers held by tongs.
  • +
  • Objects and mobs that have move resist set to INFINITY will no longer be moved by a singularity.
  • +
  • Varediting a solar array assembly's anchored var will now correctly update its pixel offsets.
  • +
  • Smartfridges will now drop boards set to the type of fridge they were when deconstructed.
  • +
  • Fixed survival pods, black boxes, and drying racks potentially dropping basic smartfridge boards.
  • +
  • Newly constructed survival pods will no longer say that they're old and dusty.
  • +
  • Fixed "your MMI was unable to receive your mind" being sent to emagged borgs when self_destructed via a robotics console.
  • +
+

Wayland-Smithy updated:

+
    +
  • The "See runechat emotes" preference now works as intended.
  • +
+

nightred updated:

+
    +
  • Sheetifier now deconstructs properly
  • +
  • Fixed guardian runtime on ghost disconnect
  • +
+ +

26 July 2020

+

Ryll/Shaps updated:

+
    +
  • The "Disk, Please!" achievement will now be granted to any nuclear operative who holds up any conscious non-nukie holding the disk, rather than needing the Captain. Good luck!
  • +
+

Skoglol updated:

+
    +
  • Express supply console has had emagged pod amount reduced slightly and now has a cooldown.
  • +
  • *crack has a new sound effect.
  • +
+

Timberpoes updated:

+
    +
  • Cybernetic Stomachs are now correctly categorised under Cybernetics in the Exosuit Fabricator.
  • +
+

WondaMegapon updated:

+
    +
  • Telecommunication machines now use a TGUI based interface
  • +
  • Removed HTML based telecommunication machine code
  • +
  • Telecommunication machines can have their interfaces viewed without a multitool
  • +
  • Telecommunication machines now log changed settings
  • +
+

bobbahbrown updated:

+
    +
  • Runechat now runs under its own subsystem, this should improve performance and allow for finer control over its performance.
  • +
+

lordpidey updated:

+
    +
  • Arcade toy companies have found a surplus of promotional balloons from an old boyband and put them in the prize rotation. Warning: balloons may only be partially inflated, and may incite security forces to arrest you.
  • +
+ +

25 July 2020

+

ArcaneMusic updated:

+
    +
  • Adds a metric ton of belt icons.
  • +
  • Paper cash, when stacked, now displays an icon scaling with it's appropriate value.
  • +
+

Donkie updated:

+
    +
  • Fixed being able to cheese the voice analyzer by using multiple consecutive whitespaces
  • +
+

Indie-ana Jones updated:

+
    +
  • Swarmers have changed tactics. They now utilize a swarmer beacon for spawning, and have received a number of other changes.
  • +
+

Jared-Fogle updated:

+
    +
  • Fixed several edge cases where some reagents would prevent metabolization.
  • +
+

Ryll/Shaps updated:

+
    +
  • Anyone with an antag datum now is shown as an antag to admin features like (?|F)
  • +
  • You can now properly repair mangy/shredded clothing with cloth
  • +
+

Timberpoes updated:

+
    +
  • AI integrity restorer program now appropriately restores the integrity of AIs.
  • +
+

nightred updated:

+
    +
  • Titanium does not devolve in to iron when it rusts
  • +
+ +

24 July 2020

+

ArcaneMusic updated:

+
    +
  • The BEPIS has been moved to the Cargo Bay from Science, and it's prices have been adjusted to roughly late-game proportions for most players.
  • +
  • The Rolling Tables and Mauna Mug BEPIS techs have been merged into one.
  • +
+

EdgeLordExe updated:

+
    +
  • Ash ascension no longer kills user.
  • +
+

Galdar02 updated:

+
    +
  • Winter Boots and Coats can now be acquired from Clothesmates
  • +
+

Jared-Fogle updated:

+
    +
  • You can now take off clothes while in stasis.
  • +
+

Maurukas updated:

+
    +
  • All maps now receive a blood crate and surplus limb crate in Medical.
  • +
  • All maps now have a chemical locker in the Pharmacy or in Plumbing.
  • +
  • The last chemistry wardrobe locker has been removed from DeltaStation.
  • +
  • IceBox blood freezer not spawning the correct number of blood bags.
  • +
+

MrDoomBringer updated:

+
    +
  • Routing protocols for contractor pods have been fixed - they should no longer send victims to mysterious crystal filled rooms
  • +
+

Ryll/Shaps updated:

+
    +
  • Licking wounds on other people will automatically contract any diseases they're carrying. This is a one way transmission vector, you cannot contract disease from a felinid doctor in this way due to the partially antiseptic nature of cat saliva or whatever
  • +
  • You also cannot lick wounds if your mouth is covered or if you do not, in fact, possess a tongue
  • +
  • Your clothes and items will no longer be covered in distressingly human looking blood when bashing borgs to bits
  • +
  • Introduces piercing wounds, a new type of wound mostly related to pointy things like bullets. Piercing wounds cause bleeding that does not clot over time, as well as when that limb is hit.
  • +
  • Skeletons and plasmamen can now suffer bone wounds!
  • +
  • Dismemberment is now integrated with wounds! Simply apply a critical bleeding wound and a severe bone wound, keep whacking, and pop! Sharp weapons will cut through to bones on limbs with critical bleeding wounds, allowing you to still dismember with just a sword or axe.
  • +
  • A few projectile types, namely buckshot and shotgun slugs, have had their damage reduced slightly to account for their new wounding abilities. Buckshot may take three shots to crit now, but you can also blast peoples limbs off! Cool!
  • +
  • Health analyzers now tell you if a humanoid is missing a heart, lungs, liver, or stomach (and they need them to survive)
  • +
  • Formaldehyde replaces calomel in paramedic belts
  • +
  • Having brute damage on a limb no longer causes bleeding. Bandages now apply to all wounds on a limb, rather than be applied per-wound. Gauze also stops bleeding from dragging, but this wears out the gauze faster
  • +
  • Wounds that have their removal requirements met while the patient is on a stasis bed will now be cured of their wounds as expected. In addition, burn wounds will slowly recover while stasis'd if they have flesh regen/sanitizer applied
  • +
  • Examining a bleeding dead body now reflects that dead bodies don't actually bleed, saying their blood is pooling instead
  • +
  • Coagulant is now slightly less effective per bleeding wound for each bleed wound on a patient
  • +
+

Sirich96 updated:

+
    +
  • new stunbaton sprites
  • +
+

YPOQ updated:

+
    +
  • Fixed an issue that prevented throwing hats onto heads.
  • +
+

nightred updated:

+
    +
  • Only living mobs can buckle to borgs
  • +
  • The golden bike horn now works after round end,
  • +
+

zxaber updated:

+
    +
  • AIs disconnecting from a shell will be left looking at the shell rather than their core.
  • +
+ +

23 July 2020

+

ArcaneMusic updated:

+
    +
  • Civilian bounty pads, when submitting a bounty that the department can't pay for, will allow you to submit it later.
  • +
  • Fixes 2 duplicate bounties between security/assistants.
  • +
+

Coul updated:

+
    +
  • All keybinds send signals when pressed
  • +
+

Melbert updated:

+
    +
  • Fixes cyborg slot cycling (and a runtime)
  • +
+

Nebulacrity updated:

+
    +
  • Updated the reality fractures (Heretic influences) to have nicer sprites.
  • +
+

ShizCalev updated:

+
    +
  • Fixed display cases going invisible when you put things inside of them.
  • +
  • Fixed the pedestal for open display cases being glass colored.
  • +
+

Skoglol updated:

+
    +
  • electrolysis reaction now outputs 4.5u of reagents instead of 30u.
  • +
  • Removed forcesay on getting hit in classic mode.
  • +
+

nightred updated:

+
    +
  • Fixed medical records for quirks.
  • +
  • Quirks settings trigger after spawn now.
  • +
+

tralezab updated:

+
    +
  • More roles added for mafia!
  • +
  • Should have (outside of adminbus) way more balanced role lists in mafia now.
  • +
  • general improvements to the game have been made as well :)
  • +
+ +

22 July 2020

+

ArcaneMusic updated:

+
    +
  • early plant mutations from 30+ instability
  • +
  • The Implosion Compressor now has an updated sprite.
  • +
  • The photocopier now has a 5 credit cost to use.
  • +
  • There is now a uniform component for simple payments.
  • +
  • You can now make copies of paper with the photocopier again.
  • +
+

Coul updated:

+
    +
  • visible message when someone takes the item you offer them
  • +
  • cleaned up some spans and offer messages
  • +
+

Donkie updated:

+
    +
  • Prevent being able to finish a reinforced girder using regular metal, making the added reinforcement disappear.
  • +
+

Jared-Fogle updated:

+
    +
  • Fixed colorful reagent, red powder, and quantum hair dye breaking metabolization.
  • +
+

Melbert updated:

+
    +
  • You can no longer use broken cyborg slots by being fast at clicking
  • +
  • Removed a bunch of deprecated cyborg code involving taking toxin and oxygen damage
  • +
  • Refactored part of cyborg inventory code
  • +
+

Ryll/Shaps updated:

+
    +
  • Corpses buckled to chairs can no longer tackle
  • +
+

ShizCalev updated:

+
    +
  • Fixed a minor runtime caused by a mob being deleted while in a coma.
  • +
  • Converted everything to use setAnchored() as opposed to setting the anchored var directly. This means that COMSIG_MOVABLE_SETANCHORED can now actually be used reliably to track if an object's anchored var has changed.
  • +
  • The refactor also means that varediting the anchored var will now properly update most items' other states that rely on it being set a certain way.
  • +
  • Fixed bookcases having the incorrect icon when they're unanchored.
  • +
  • Fixed bookcases not automatically picking up spellbooks / storage books when made/spawned.
  • +
  • Fixed bookcases not dropping spellbooks / storage books when deconstructed.
  • +
  • Fixed a runtime causing emags to not properly emag airlocks.
  • +
  • Fixed a runtime caused by a target being deleted by a gun's projectiles.
  • +
  • The light eater will now eat -even more- lights.
  • +
  • Fixed a runtime when using the peacekeeper borg's Hyperkinetic Dampener Field.
  • +
  • Player/pAI controlled MULEbots will now use power when they move.
  • +
  • Player/pAI controlled MULEbots will now turn off properly if they ran out of power while moving.
  • +
  • MULEbot's power levels now show up on the diagnostic HUD.
  • +
  • Players controlling a MULEbot will now see their power level and current load on the status panel.
  • +
  • Player controlled bots (ie securitrons, ED209's, MULEbots, ect) will now get a chat notification when they're turned on/off.
  • +
+

Skoglol updated:

+
    +
  • Fixed a simplemob AI issue that prevented them from processing.
  • +
  • dead people can no longer slimelink
  • +
  • Re-added old keybinds for quick equip, set new default for suit storage slot if none was set yet.
  • +
  • Savefile version minimum bumped to 32.
  • +
+

Timberpoes updated:

+
    +
  • Revenants are no longer deaf.
  • +
+

Winterous updated:

+
    +
  • Changed some text for Medbots, including fixing incorrect message after updating research. Contributor's brain irreparably melted from hurdles.
  • +
+

bobbahbrown updated:

+
    +
  • Improved SIGN macro performance
  • +
+

nightred updated:

+
    +
  • Family heirloom moods clear on loss of the quirk.
  • +
  • Fixed the location of an Engineering sign on Meta
  • +
  • Fixed up plumbing issues in security for Meta
  • +
+ +

21 July 2020

+

ArcaneMusic updated:

+
    +
  • We got hydroponics belt and suit sprites.
  • +
  • We also got engineering tool mirror sprites.
  • +
+

Dennok updated:

+
    +
  • look_down verb that allow look down
  • +
  • look_up and look_down verbs don't interrupt by move, until you step under/over transparent turf.
  • +
+

EdgeLordExe updated:

+
    +
  • Ash ascension spells now deal actual damage.
  • +
+

Fikou updated:

+
    +
  • changes morphine description to be more accurate
  • +
+

Melbert updated:

+
    +
  • Items hidden in bread, cake, and cheeses can now have unique interactions when someone bites into it them.
  • +
  • Sharp objects like shards of glass, ammunition, beakers, bottles, syringes, pills, organs, and more will now have unique interactions if you somehow manage to accidentally bite or swallow one that was hidden in food.
  • +
  • You can now insert sharp objects into food containers (bread, cake, cheese) if you're on disarm intent.
  • +
+

Mickyan updated:

+
    +
  • Spraypaint can no longer be applied to any object type
  • +
+

RaveRadbury updated:

+
    +
  • New insect phobia
  • +
+

Rohesie updated:

+
    +
  • Emotes now show on runechat. You can disable them on your prefs.
  • +
+

Skoglol updated:

+
    +
  • Arrhytmic knife now updates movespeed every time it processes, as intended.
  • +
  • Arrhytmic knife movespeed change brought more in line with other speed increasing effects.
  • +
  • Moth week start date fixed
  • +
  • Added a few new buildmode modes. Outfit, to quickly apply or remove outfits. Delete, to quickly delete any atoms. Slightly overhauled the copy proc used here and in supply pods, now compatible with most mobs.
  • +
+

Winterous updated:

+
    +
  • Large water bottles (made from plastic) now have the same starting and optional transfer volumes as large beakers.
  • +
+

zxaber updated:

+
    +
  • Hulk arms no longer break with punching things unintended to break hulk arms
  • +
  • Hulk arms no longer break when punching machines (but still take a small bit of recoil damage).
  • +
+ +

20 July 2020

+

ArcaneMusic updated:

+
    +
  • Icebox NE Maintenance has fewer unnecessary pipes and wires, as well as less space.
  • +
  • The Civilian Bounty Pad and Console have been added to every map. Using your ID on the console will allow you to aquire a civilian bounty, which can be sent away for additional profit similar to cargo bounties.
  • +
  • Midround, the widely unstable space market can occasionally briefly completely collapse, resulting in vendor prices skyrocketing for short periods of time.
  • +
  • For admins, there are new debug items to fiddle with the economy.
  • +
  • Several new small bounties have been added to accompany the new sets of civilian bounties per job.
  • +
  • The Coin mint has been removed from the code and all maps.
  • +
  • Miasma Exports have been nerfed from 10 credits/mol to 2credits/mol when sold.
  • +
  • EXPERIMENTAL: Crew now start with higher starting balances, but lower passive income throughout the round.
  • +
  • A new economy mechanic has been added, the inflation value. In short, if player accounts hold more money than the station should probably have at a given time, the prices of vendors will go up. If vendor prices are unreasonably high, spend money with cargo or vendors.
  • +
  • Adjusted the Telepad sprite into the 2020s. sound: Telepads now make a whoopy teleport sound.
  • +
+

Cobby updated:

+
    +
  • You can now tend wounds on all healable mobs if they are organic!
  • +
+

Fikou updated:

+
    +
  • you can no longer cheat over the spraycanning clothes black restriction
  • +
+

Gamer025 updated:

+
    +
  • You can no longer enter book or author names that are too long for the database to store
  • +
+

Maurukas updated:

+
    +
  • Fix hidden pipes and unpowered devices in Icebox turbine.
  • +
+

ShizCalev updated:

+
    +
  • Discord urls updated since the old one is being depreciated.
  • +
  • The client playtime panel is now sorted alphabetically as opposed to the order in which they were added to the list.
  • +
  • Defibbing someone will no longer work if their chest is covered by thick clothing. Used to just check to see if they had a spacesuit someone on their person (even if they weren't wearing it / only had it stuck to their hands.)
  • +
  • Defibbing someone will now actually require you to hold the shock paddles for the entire duration of the process. No more defibbing someone if you were disarmed during the charge time.
  • +
+

stylemistake updated:

+
    +
  • tgui: Fixed a very rare case of exceptions thrown due to bugged localStorage. No more NTOS bluescreens.
  • +
+

tralezab updated:

+
    +
  • landmark cleanup on mafia
  • +
+

19 July 2020

ArcaneMusic updated:

    @@ -79,6 +545,7 @@

    Timberpoes updated:

    • Roboticists rejoice. NanoTrasen has heard your cries for help. They've seen CCTV footage (recorded by the AI) of you all staring enviously at geneticists, lording around their shiny, polished, usable DNA Consoles. Cry no more, for you can now please your Silicon Overlords and robust those Machine Cultist Chaplains in high definition glory with a beautiful new interface added to Exosuit Fabricators.
    • +
    • Depowered and/or non-interactive tgui interfaces are now approriately non-interactive.

    carshalash updated:

      @@ -1710,296 +2177,6 @@
      • remove unnecessary var/id from /datum/material
      - -

      27 May 2020

      -

      ArcaneMusic updated:

      -
        -
      • Icebox's mining, EVA Exits, and cargo shuttle areas have been adjusted to distinguish them from boxstation.
      • -
      • Adds Liquid Earthquake, a botany biogenerator chem that increases production speed, but increases plant weed susceptibility.
      • -
      • Adds Enduro Grow, a botany biogenerator chem that improves a plant's endurance stat, but decreases it's yield and potency.
      • -
      -

      ArcaneMusic/Azlan updated:

      -
        -
      • Updated the Ancient Spear sprite.
      • -
      -

      Kathy Ryals updated:

      -
        -
      • You can now altClick to take out a disk from a DNA Console.
      • -
      -

      Krysonism updated:

      -
        -
      • fixes the horticultural waders sprite by adding hand holes.
      • -
      -

      Kurgis updated:

      -
        -
      • New mouse detective poster.
      • -
      -

      LemonInTheDark updated:

      -
        -
      • Fixed smallscreen resizing on restart or when you die.
      • -
      • Pixel size and scaling method will properly save now.
      • -
      -

      MacBlaze1 updated:

      -
        -
      • Prevents doomsday activation while shunting and disabled doomsday if a malf shunts after activation.
      • -
      • fixed #50792, also known as the cool amazing bug that makes taking your clothes on and off duplicate an unknown onto the crew monitor program/console/device
      • -
      -

      Qustinnus updated:

      -
        -
      • You can no longer get hardcore random points by joining last second
      • -
      -

      Ryll/Shaps updated:

      -
        -
      • You can no longer shotgun canned beverages
      • -
      • Removed errant TP from the admin full monty
      • -
      -

      WarlockD updated:

      -
        -
      • Fixed the internal to use mask
      • -
      • flag change to the space heater and electrolyzer
      • -
      -

      actioninja updated:

      -
        -
      • missing textures
      • -
      -

      nemvar updated:

      -
        -
      • Scaling methods in the preference menu now have the correct names.
      • -
      -

      ohnoitsdixie updated:

      -
        -
      • Paramedics now have access to the Engineering Foyer, and no longer have to crawl into Engineering through maintenance like filthy assistants.
      • -
      -

      willox updated:

      -
        -
      • Botany grafts for traits other than 'perennial growth' are no longer non-functional
      • -
      • Cross-pollination can no longer result in plants entering an infinitely-harvestable state
      • -
      -

      zxaber updated:

      -
        -
      • Two new apps for modular computers are available: Lifeline for Medical, and Fission360 for anyone with access to the Syndicate repository. Lifeline is an improved suit sensors tracker, and Fission360 is the same but for nuclear-related things.
      • -
      - -

      26 May 2020

      -

      Fikou, spookydonut made the glove code sane updated:

      -
        -
      • concussive gauntlets! available at your local tendril chest
      • -
      • tendril loot has changed a bit
      • -
      • hulks can now break rocks
      • -
      -

      JoshAdamPowell updated:

      -
        -
      • Simplified granibitaluri recipe
      • -
      -

      MrDoomBringer updated:

      -
        -
      • Reaching legendary levels of any given skill will grant you an otherwise unobtainable reward.
      • -
      • Nanotrasen has recently acquired new software to track employee skill development, straight from your PDA! Check it out! In unrelated news, the rate of summary executions handed out to Nanotrasen's lowest performing employees has risen sharply.
      • -
      • Modify player's skills with the new Skill Panel menu, available from the Player Panel!
      • -
      -

      Paxilmaniac updated:

      -
        -
      • things to the bounty hunter ship that might be important, such as oxygen tanks, and a toolbox, along with two tiny fans in the airlocks
      • -
      -

      Pumpkinoe updated:

      -
        -
      • Added a new large emergency shuttle for purchase at 8000 Cr, the Dynamic Enviornment Interaction Shuttle. Try it out today and frolic with the monkeys!
      • -
      -

      Ryll/Shaps updated:

      -
        -
      • Sleeping carp no longer grants outright damage resistances to all forms of damage. Its price has been decreased to 12TC
      • -
      -

      TerraGS updated:

      -
        -
      • Material containers are better at managing local storage
      • -
      -

      Timberpoes updated:

      -
        -
      • SMES units now self-charge when containing yellow slime cores.
      • -
      -

      Tlaltecuhtli updated:

      -
        -
      • janibelt/medibelt can be opened from backpack
      • -
      • removed some defunct code (picking a color of cable but its all yellow in belt.dm)
      • -
      • bandoliers now hold their intended 18 shells.
      • -
      -

      WarlockD updated:

      -
        -
      • Swapped a few arguments out of the materials container
      • -
      -

      kevinz000 updated:

      -
        -
      • Hierophant now uses its ranged abilities in melee attacks, meaning the strategy of standing still and tanking the hits is no longer viable in 99% of circumstances.
      • -
      - -

      25 May 2020

      -

      Cyberboss updated:

      -
        -
      • The `notify` TGS command will no longer work if the related config setting is disabled
      • -
      • Fixed not actually limiting chat sends to tagged channels as the config should allow when running under TGS4.
      • -
      • Fixed the `notify` command not working for IRC users.
      • -
      -

      Fikou updated:

      -
        -
      • fixed science glasses recipe using beer goggles instead of science glasses
      • -
      -

      Gamer025 updated:

      -
        -
      • Nanotrasen checked the last few expenses reports and decided to reduce payday spending. Because of this, the salary of all non human employees has been reduced by 25%. Please consult your local Head of Personal for more information.
      • -
      -

      Kelenius updated:

      -
        -
      • Cyborgs (except Peacekeeper and Standard) now have access to their department's radio.
      • -
      -

      LemonInTheDark updated:

      -
        -
      • Changed the way h2o interacts with the engine. It should acts similar to o2 normally, but in high concentrations it cools the engine down. Have fun :)
      • -
      • Mulebots no longer go insane when shit starts to lag
      • -
      • Refactored client.view into a datum, changed some zoom values to work properly
      • -
      • Spinning while using a binocular will work as expected
      • -
      • Fully adds widescreen support to zooming
      • -
      • I've moved the pixel scaling and zoom methods from the menu bar to the game preferences window. You'll need to reset them.
      • -
      • Pixel size will now automatically update on zoom, so you won't end up with ui buttons you can't see.
      • -
      • FIxed the epic gamer skill of binocular applied to advanced camera console
      • -
      -

      LemonInTheDark, with thanks to ArcaneDefence for the pointer updated:

      -
        -
      • Scrubbers no longer cool pipenets attached to them when scrubbing space
      • -
      -

      MarioWizard119 updated:

      -
        -
      • Synthflesh now also works via vapor.
      • -
      -

      NewSta updated:

      -
        -
      • You might potentially see better a/an usage
      • -
      -

      Ryll/Shaps updated:

      -
        -
      • You can now use ! and ? at the end of 'spawn' chatbar verb commands to search for only the ends of paths, or to automatically select a random type of the paths your search returns! Happy badminning!
      • -
      • Adds a config option for OOC kindness commendations! When enabled, a small percentage of the crew gets asked if anyone made their round better, and those people will get a little heart next to their name in OOC for 24h!
      • -
      • lobby menu work again
      • -
      -

      Shadark updated:

      -
        -
      • Manually printed barcodes are now working correctly.
      • -
      -

      TetraK1 updated:

      -
        -
      • Ghosts can no longer control atmos stuff with alt/ctrl click.
      • -
      • Added logging to ctrl/alt clicks on atmos stuff
      • -
      -

      TheVekter updated:

      -
        -
      • Nanotrasen's export price for Hydrogen no longer violates the basic rules of supply and demand.
      • -
      -

      actioninja updated:

      -
        -
      • smon,k weed
      • -
      -

      antropod updated:

      -
        -
      • Fix PanDEMIC 2200 not showing Blood DNA and Blood Type
      • -
      -

      kevinz000 updated:

      -
        -
      • dir_inverse_multiz() should work now. should.
      • -
      -

      nemvar updated:

      -
        -
      • The camera console looks fancier now.
      • -
      -

      qustinnus updated:

      -
        -
      • you can no longer move up when you are going to fall down anyways, or you know, dead.
      • -
      • simple multi-z audio
      • -
      -

      spessman-007 updated:

      -
        -
      • Quite a few misspellings have been corrected
      • -
      -

      tralezab updated:

      -
        -
      • anomaly crystal theme warping for the jungle now uses wooden walls instead of sandstone ones
      • -
      -

      wesoda25 updated:

      -
        -
      • The progress bar for butchering large mobs is no longer offset.
      • -
      -

      zxaber updated:

      -
        -
      • Explosions that were able to destroy doors before will now rip them from the universe.
      • -
      - -

      24 May 2020

      -

      Cobby updated:

      -
        -
      • Dissection will now give XP instead of research points.
      • -
      -

      Fikou updated:

      -
        -
      • admins can now do html in ahelps properly
      • -
      -

      qustinnus updated:

      -
        -
      • Fixes you being able to put in more than one license plate in the license plate machine
      • -
      - -

      22 May 2020

      -

      ArcaneMusic updated:

      -
        -
      • Adds a new assembly component, the freezer, for gradually making the environment colder.
      • -
      -

      Dorsidwarf updated:

      -
        -
      • Swarmer structures are no longer broken.
      • -
      -

      Fikou updated:

      -
        -
      • you can no longer inject html in ahelps
      • -
      • you cant either, jannies
      • -
      -

      Ghilker updated:

      -
        -
      • Cryotubes can no longer reach fusion level heat
      • -
      • Cryotubes breakdown if the heat inside is higher than 2000 K
      • -
      • Cryotubes extinguish the mob if on fire
      • -
      -

      Mickyan updated:

      -
        -
      • Fixed missing icon on wigs
      • -
      -

      Whoneedspacee updated:

      -
        -
      • Icebox Station has been added, explore the depths of the Ice Moon with boxstation right on top of it, don't forget your coat and internals!
      • -
      • You can now mine rock flora into volcanic ash to make glass.
      • -
      -

      kevinz000 updated:

      -
        -
      • Circlegame items now properly delete on drop and can't be made with full hands.
      • -
      -

      wesoda25 updated:

      -
        -
      • fixes a misspelled xenobiology sign
      • -
      -

      willox updated:

      -
        -
      • diseases now retain the ability to infect people after having 'inorganic biology' or 'necrotic metabolism' removed from them
      • -
      - -

      20 May 2020

      -

      Skoglol updated:

      -
        -
      • Another dynamic rolling restricted roles as antags fix.
      • -
      -

      Thebleh updated:

      -
        -
      • Fixes MetaStation's disposals
      • -
      -

      dootdoom updated:

      -
        -
      • Straight Jacket now has bigger bolder red text to alert you someone is putting it on you.
      • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 0ffd719abf6..bf373072daf 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -40912,5 +40912,390 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. lording around their shiny, polished, usable DNA Consoles. Cry no more, for you can now please your Silicon Overlords and robust those Machine Cultist Chaplains in high definition glory with a beautiful new interface added to Exosuit Fabricators. + - bugfix: Depowered and/or non-interactive tgui interfaces are now approriately + non-interactive. carshalash: - tweak: Reintroduces module type to AI shell name +2020-07-20: + ArcaneMusic: + - bugfix: Icebox NE Maintenance has fewer unnecessary pipes and wires, as well as + less space. + - rscadd: The Civilian Bounty Pad and Console have been added to every map. Using + your ID on the console will allow you to aquire a civilian bounty, which can + be sent away for additional profit similar to cargo bounties. + - rscadd: Midround, the widely unstable space market can occasionally briefly completely + collapse, resulting in vendor prices skyrocketing for short periods of time. + - rscadd: For admins, there are new debug items to fiddle with the economy. + - rscadd: Several new small bounties have been added to accompany the new sets of + civilian bounties per job. + - rscdel: The Coin mint has been removed from the code and all maps. + - tweak: Miasma Exports have been nerfed from 10 credits/mol to 2credits/mol when + sold. + - balance: 'EXPERIMENTAL: Crew now start with higher starting balances, but lower + passive income throughout the round.' + - balance: A new economy mechanic has been added, the inflation value. In short, + if player accounts hold more money than the station should probably have at + a given time, the prices of vendors will go up. If vendor prices are unreasonably + high, spend money with cargo or vendors. + - imageadd: 'Adjusted the Telepad sprite into the 2020s. sound: Telepads now make + a whoopy teleport sound.' + Cobby: + - balance: You can now tend wounds on all healable mobs if they are organic! + Fikou: + - balance: you can no longer cheat over the spraycanning clothes black restriction + Gamer025: + - bugfix: You can no longer enter book or author names that are too long for the + database to store + Maurukas: + - bugfix: Fix hidden pipes and unpowered devices in Icebox turbine. + ShizCalev: + - spellcheck: Discord urls updated since the old one is being depreciated. + - admin: The client playtime panel is now sorted alphabetically as opposed to the + order in which they were added to the list. + - bugfix: Defibbing someone will no longer work if their chest is covered by thick + clothing. Used to just check to see if they had a spacesuit someone on their + person (even if they weren't wearing it / only had it stuck to their hands.) + - bugfix: Defibbing someone will now actually require you to hold the shock paddles + for the entire duration of the process. No more defibbing someone if you were + disarmed during the charge time. + stylemistake: + - bugfix: 'tgui: Fixed a very rare case of exceptions thrown due to bugged localStorage. + No more NTOS bluescreens.' + tralezab: + - bugfix: landmark cleanup on mafia +2020-07-21: + ArcaneMusic: + - imageadd: We got hydroponics belt and suit sprites. + - imageadd: We also got engineering tool mirror sprites. + Dennok: + - rscadd: look_down verb that allow look down + - tweak: look_up and look_down verbs don't interrupt by move, until you step under/over + transparent turf. + EdgeLordExe: + - balance: Ash ascension spells now deal actual damage. + Fikou: + - spellcheck: changes morphine description to be more accurate + Melbert: + - rscadd: Items hidden in bread, cake, and cheeses can now have unique interactions + when someone bites into it them. + - rscadd: Sharp objects like shards of glass, ammunition, beakers, bottles, syringes, + pills, organs, and more will now have unique interactions if you somehow manage + to accidentally bite or swallow one that was hidden in food. + - tweak: You can now insert sharp objects into food containers (bread, cake, cheese) + if you're on disarm intent. + Mickyan: + - rscdel: Spraypaint can no longer be applied to any object type + RaveRadbury: + - tweak: New insect phobia + Rohesie: + - rscadd: Emotes now show on runechat. You can disable them on your prefs. + Skoglol: + - bugfix: Arrhytmic knife now updates movespeed every time it processes, as intended. + - balance: Arrhytmic knife movespeed change brought more in line with other speed + increasing effects. + - bugfix: Moth week start date fixed + - admin: Added a few new buildmode modes. Outfit, to quickly apply or remove outfits. + Delete, to quickly delete any atoms. Slightly overhauled the copy proc used + here and in supply pods, now compatible with most mobs. + Winterous: + - tweak: Large water bottles (made from plastic) now have the same starting and + optional transfer volumes as large beakers. + zxaber: + - bugfix: Hulk arms no longer break with punching things unintended to break hulk + arms + - balance: Hulk arms no longer break when punching machines (but still take a small + bit of recoil damage). +2020-07-22: + ArcaneMusic: + - bugfix: early plant mutations from 30+ instability + - imageadd: The Implosion Compressor now has an updated sprite. + - tweak: The photocopier now has a 5 credit cost to use. + - code_imp: There is now a uniform component for simple payments. + - bugfix: You can now make copies of paper with the photocopier again. + Coul: + - rscadd: visible message when someone takes the item you offer them + - spellcheck: cleaned up some spans and offer messages + Donkie: + - tweak: Prevent being able to finish a reinforced girder using regular metal, making + the added reinforcement disappear. + Jared-Fogle: + - bugfix: Fixed colorful reagent, red powder, and quantum hair dye breaking metabolization. + Melbert: + - bugfix: You can no longer use broken cyborg slots by being fast at clicking + - code_imp: Removed a bunch of deprecated cyborg code involving taking toxin and + oxygen damage + - refactor: Refactored part of cyborg inventory code + Ryll/Shaps: + - bugfix: Corpses buckled to chairs can no longer tackle + ShizCalev: + - bugfix: Fixed a minor runtime caused by a mob being deleted while in a coma. + - refactor: Converted everything to use setAnchored() as opposed to setting the + anchored var directly. This means that COMSIG_MOVABLE_SETANCHORED can now actually + be used reliably to track if an object's anchored var has changed. + - bugfix: The refactor also means that varediting the anchored var will now properly + update most items' other states that rely on it being set a certain way. + - bugfix: Fixed bookcases having the incorrect icon when they're unanchored. + - bugfix: Fixed bookcases not automatically picking up spellbooks / storage books + when made/spawned. + - bugfix: Fixed bookcases not dropping spellbooks / storage books when deconstructed. + - bugfix: Fixed a runtime causing emags to not properly emag airlocks. + - bugfix: Fixed a runtime caused by a target being deleted by a gun's projectiles. + - bugfix: The light eater will now eat -even more- lights. + - bugfix: Fixed a runtime when using the peacekeeper borg's Hyperkinetic Dampener + Field. + - bugfix: Player/pAI controlled MULEbots will now use power when they move. + - bugfix: Player/pAI controlled MULEbots will now turn off properly if they ran + out of power while moving. + - tweak: MULEbot's power levels now show up on the diagnostic HUD. + - tweak: Players controlling a MULEbot will now see their power level and current + load on the status panel. + - bugfix: Player controlled bots (ie securitrons, ED209's, MULEbots, ect) will now + get a chat notification when they're turned on/off. + Skoglol: + - bugfix: Fixed a simplemob AI issue that prevented them from processing. + - bugfix: dead people can no longer slimelink + - bugfix: Re-added old keybinds for quick equip, set new default for suit storage + slot if none was set yet. + - code_imp: Savefile version minimum bumped to 32. + Timberpoes: + - bugfix: Revenants are no longer deaf. + Winterous: + - tweak: Changed some text for Medbots, including fixing incorrect message after + updating research. Contributor's brain irreparably melted from hurdles. + bobbahbrown: + - refactor: Improved SIGN macro performance + nightred: + - bugfix: Family heirloom moods clear on loss of the quirk. + - bugfix: Fixed the location of an Engineering sign on Meta + - bugfix: Fixed up plumbing issues in security for Meta +2020-07-23: + ArcaneMusic: + - bugfix: Civilian bounty pads, when submitting a bounty that the department can't + pay for, will allow you to submit it later. + - bugfix: Fixes 2 duplicate bounties between security/assistants. + Coul: + - code_imp: All keybinds send signals when pressed + Melbert: + - bugfix: Fixes cyborg slot cycling (and a runtime) + Nebulacrity: + - imageadd: Updated the reality fractures (Heretic influences) to have nicer sprites. + ShizCalev: + - bugfix: Fixed display cases going invisible when you put things inside of them. + - bugfix: Fixed the pedestal for open display cases being glass colored. + Skoglol: + - balance: electrolysis reaction now outputs 4.5u of reagents instead of 30u. + - rscdel: Removed forcesay on getting hit in classic mode. + nightred: + - bugfix: Fixed medical records for quirks. + - bugfix: Quirks settings trigger after spawn now. + tralezab: + - rscadd: More roles added for mafia! + - balance: Should have (outside of adminbus) way more balanced role lists in mafia + now. + - bugfix: general improvements to the game have been made as well :) +2020-07-24: + ArcaneMusic: + - tweak: The BEPIS has been moved to the Cargo Bay from Science, and it's prices + have been adjusted to roughly late-game proportions for most players. + - balance: The Rolling Tables and Mauna Mug BEPIS techs have been merged into one. + EdgeLordExe: + - bugfix: Ash ascension no longer kills user. + Galdar02: + - rscadd: Winter Boots and Coats can now be acquired from Clothesmates + Jared-Fogle: + - rscadd: You can now take off clothes while in stasis. + Maurukas: + - tweak: All maps now receive a blood crate and surplus limb crate in Medical. + - tweak: All maps now have a chemical locker in the Pharmacy or in Plumbing. + - rscdel: The last chemistry wardrobe locker has been removed from DeltaStation. + - bugfix: IceBox blood freezer not spawning the correct number of blood bags. + MrDoomBringer: + - bugfix: Routing protocols for contractor pods have been fixed - they should no + longer send victims to mysterious crystal filled rooms + Ryll/Shaps: + - tweak: Licking wounds on other people will automatically contract any diseases + they're carrying. This is a one way transmission vector, you cannot contract + disease from a felinid doctor in this way due to the partially antiseptic nature + of cat saliva or whatever + - tweak: You also cannot lick wounds if your mouth is covered or if you do not, + in fact, possess a tongue + - bugfix: Your clothes and items will no longer be covered in distressingly human + looking blood when bashing borgs to bits + - rscadd: Introduces piercing wounds, a new type of wound mostly related to pointy + things like bullets. Piercing wounds cause bleeding that does not clot over + time, as well as when that limb is hit. + - rscadd: Skeletons and plasmamen can now suffer bone wounds! + - tweak: Dismemberment is now integrated with wounds! Simply apply a critical bleeding + wound and a severe bone wound, keep whacking, and pop! Sharp weapons will cut + through to bones on limbs with critical bleeding wounds, allowing you to still + dismember with just a sword or axe. + - tweak: A few projectile types, namely buckshot and shotgun slugs, have had their + damage reduced slightly to account for their new wounding abilities. Buckshot + may take three shots to crit now, but you can also blast peoples limbs off! + Cool! + - rscadd: Health analyzers now tell you if a humanoid is missing a heart, lungs, + liver, or stomach (and they need them to survive) + - tweak: Formaldehyde replaces calomel in paramedic belts + - bugfix: Having brute damage on a limb no longer causes bleeding. Bandages now + apply to all wounds on a limb, rather than be applied per-wound. Gauze also + stops bleeding from dragging, but this wears out the gauze faster + - tweak: Wounds that have their removal requirements met while the patient is on + a stasis bed will now be cured of their wounds as expected. In addition, burn + wounds will slowly recover while stasis'd if they have flesh regen/sanitizer + applied + - bugfix: Examining a bleeding dead body now reflects that dead bodies don't actually + bleed, saying their blood is pooling instead + - tweak: Coagulant is now slightly less effective per bleeding wound for each bleed + wound on a patient + Sirich96: + - imageadd: new stunbaton sprites + YPOQ: + - bugfix: Fixed an issue that prevented throwing hats onto heads. + nightred: + - bugfix: Only living mobs can buckle to borgs + - bugfix: The golden bike horn now works after round end, + zxaber: + - tweak: AIs disconnecting from a shell will be left looking at the shell rather + than their core. +2020-07-25: + ArcaneMusic: + - imageadd: Adds a metric ton of belt icons. + - bugfix: Paper cash, when stacked, now displays an icon scaling with it's appropriate + value. + Donkie: + - bugfix: Fixed being able to cheese the voice analyzer by using multiple consecutive + whitespaces + Indie-ana Jones: + - balance: Swarmers have changed tactics. They now utilize a swarmer beacon for + spawning, and have received a number of other changes. + Jared-Fogle: + - bugfix: Fixed several edge cases where some reagents would prevent metabolization. + Ryll/Shaps: + - bugfix: Anyone with an antag datum now is shown as an antag to admin features + like (?|F) + - bugfix: You can now properly repair mangy/shredded clothing with cloth + Timberpoes: + - bugfix: AI integrity restorer program now appropriately restores the integrity + of AIs. + nightred: + - bugfix: Titanium does not devolve in to iron when it rusts +2020-07-26: + Ryll/Shaps: + - tweak: The "Disk, Please!" achievement will now be granted to any nuclear operative + who holds up any conscious non-nukie holding the disk, rather than needing the + Captain. Good luck! + Skoglol: + - tweak: Express supply console has had emagged pod amount reduced slightly and + now has a cooldown. + - soundadd: '*crack has a new sound effect.' + Timberpoes: + - bugfix: Cybernetic Stomachs are now correctly categorised under Cybernetics in + the Exosuit Fabricator. + WondaMegapon: + - rscadd: Telecommunication machines now use a TGUI based interface + - rscdel: Removed HTML based telecommunication machine code + - balance: Telecommunication machines can have their interfaces viewed without a + multitool + - server: Telecommunication machines now log changed settings + bobbahbrown: + - rscadd: Runechat now runs under its own subsystem, this should improve performance + and allow for finer control over its performance. + lordpidey: + - rscadd: 'Arcade toy companies have found a surplus of promotional balloons from + an old boyband and put them in the prize rotation. Warning: balloons may only + be partially inflated, and may incite security forces to arrest you.' +2020-07-27: + Ryll/Shaps: + - rscadd: Stepping on an unopened bag of chips will pop it and ruin all the chips + inside + - code_imp: Added 2 unit tests for wounds + ShizCalev: + - bugfix: Fixed a minor runtime caused by ghosts pressing the lookup / lookdown + keybind. + - bugfix: Supermatter slivers thrown by bombs / mass drivers will now consume a + mob if they're hit by it. + - bugfix: Fixed an exploit allowing jaunting mobs to consume supermatter slivers + on the ground. + - bugfix: Fixed simple animals (ie gorillas) not being consumed by supermatter slivers + after picking them up. + - bugfix: Fixed an exploit allowing you to kill jaunting mobs with supermatter slivers + held by tongs. + - bugfix: Objects and mobs that have move resist set to INFINITY will no longer + be moved by a singularity. + - bugfix: Varediting a solar array assembly's anchored var will now correctly update + its pixel offsets. + - bugfix: Smartfridges will now drop boards set to the type of fridge they were + when deconstructed. + - bugfix: Fixed survival pods, black boxes, and drying racks potentially dropping + basic smartfridge boards. + - bugfix: Newly constructed survival pods will no longer say that they're old and + dusty. + - bugfix: Fixed "your MMI was unable to receive your mind" being sent to emagged + borgs when self_destructed via a robotics console. + Wayland-Smithy: + - bugfix: The "See runechat emotes" preference now works as intended. + nightred: + - bugfix: Sheetifier now deconstructs properly + - bugfix: Fixed guardian runtime on ghost disconnect +2020-07-28: + Jared-Fogle: + - bugfix: Fixed a bug where you could not start messages with an ellipses. + - bugfix: Fixed not being able to sing over comms. + Skoglol: + - bugfix: Statues can now properly not cast spells. + Time-Green: + - tweak: Instabitulari is called synthflesh again +2020-07-29: + ATHATH: + - tweak: The third law of the reporter lawset no longer obligates you to interfere + with Mining and Xenobiology. + - tweak: The fourth law of the corporate lawset no longer obligates you to depower/shut + down Cargo. + Jared-Fogle: + - admin: Added the "Check Timer Sources" debug command to help isolate problematic + cases of addtimer. + Melbert: + - bugfix: Fixes a cyborg runtime error + - bugfix: middle mouse click to cycle modules for cyborgs works properly again + Memedoktor: + - tweak: adds positive moodlet for chaplain eating holymelon + Ryll/Shaps: + - bugfix: Non-emagged mediborgs will no longer embed people with lollipops. Emagged + borgs, on the other hand..... well, they can. Fun! + - balance: Spears and other embeddables are now somewhat less effective at causing + damage and bloodloss + ike709 and bobbahbrown: + - rscadd: Admins can now see your bans on (some) other servers. + nightred: + - bugfix: Prevents showing AI law changes after revival + - bugfix: Clown ops reinforcements spawn properly + oranges: + - soundadd: disappointment has been reworked +2020-07-30: + ATHATH: + - rscadd: You can now store a dead mouse inside of your chef's hat. Y'know, in case + the living mouse you keep in there dies. + AnturK: + - rscadd: Learn new skills at your local library. Usefulness not guaranteed. + Dennok: + - bugfix: Sheetifier and Vend-a-Tray has proper named circuit boards + - bugfix: Cable hubs no more can be created by handcraft. Cuble hubs available only + in cable radial menu. + - bugfix: cyborg endoskeleton now check all parts for completion + Donkie: + - bugfix: Fixed mobs/items/turfs not being predictably washed by the various methods + on board + - bugfix: Fixed showers not properly reducing clothing radioactivity + - refactor: Refactored the cleaning/washing system + Helianthus00: + - rscadd: 'Deltastation: Added a new and improved permabrig' + Jared-Fogle: + - tweak: You can now only use the emergency shuttle console once per 5 seconds. + Melbert: + - tweak: user feedback for cyborgs trying to use modules while buckled to things + Paxilmaniac: + - rscadd: a third spawn point for miners on meta so they don't spawn inside one + another + TheVekter: + - bugfix: Supermatter tongs are no longer rendered invisible once you pick up a + supermatter sliver. diff --git a/html/changelogs/AutoChangeLog-pr-52421.yml b/html/changelogs/AutoChangeLog-pr-52421.yml new file mode 100644 index 00000000000..2aed3b503d6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-52421.yml @@ -0,0 +1,4 @@ +author: "Couls" +delete-after: True +changes: + - rscadd: "Recent reports have seen increased rates of infection from reused glasses. Cleaning them with soap or rags drastically decreases chance of infection." diff --git a/icons/UI_Icons/chat/chat_icons.dmi b/icons/UI_Icons/chat/chat_icons.dmi index 7040b3966f0..8cc4b2c5598 100644 Binary files a/icons/UI_Icons/chat/chat_icons.dmi and b/icons/UI_Icons/chat/chat_icons.dmi differ diff --git a/icons/effects/eldritch.dmi b/icons/effects/eldritch.dmi index 61e67a971b1..0e0522b143c 100644 Binary files a/icons/effects/eldritch.dmi and b/icons/effects/eldritch.dmi differ diff --git a/icons/misc/buildmode.dmi b/icons/misc/buildmode.dmi index f0de428b6c5..fb51ad68116 100644 Binary files a/icons/misc/buildmode.dmi and b/icons/misc/buildmode.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index 0f0afb12639..482da90547f 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi index f054fdebb90..924aaf05259 100644 Binary files a/icons/mob/clothing/belt_mirror.dmi and b/icons/mob/clothing/belt_mirror.dmi differ diff --git a/icons/mob/easter.dmi b/icons/mob/easter.dmi index 300f418c7ab..2cd67d5112d 100644 Binary files a/icons/mob/easter.dmi and b/icons/mob/easter.dmi differ diff --git a/icons/mob/inhands/balloons_lefthand.dmi b/icons/mob/inhands/balloons_lefthand.dmi index 0e9eda3194c..cf51ac313e2 100644 Binary files a/icons/mob/inhands/balloons_lefthand.dmi and b/icons/mob/inhands/balloons_lefthand.dmi differ diff --git a/icons/mob/inhands/balloons_righthand.dmi b/icons/mob/inhands/balloons_righthand.dmi index e42884d0481..606f2007fd7 100644 Binary files a/icons/mob/inhands/balloons_righthand.dmi and b/icons/mob/inhands/balloons_righthand.dmi differ diff --git a/icons/mob/screen_cyborg.dmi b/icons/mob/screen_cyborg.dmi index 2f87e9796f1..c0c112bdeb9 100644 Binary files a/icons/mob/screen_cyborg.dmi and b/icons/mob/screen_cyborg.dmi differ diff --git a/icons/obj/balloons.dmi b/icons/obj/balloons.dmi index 0019c732e2f..0ed6f471bfb 100644 Binary files a/icons/obj/balloons.dmi and b/icons/obj/balloons.dmi differ diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index 7b5061d5431..8d2d8190ead 100644 Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 4e59fd1b61b..6dde67d6683 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi index f31169996e4..12780e758ff 100644 Binary files a/icons/obj/machines/research.dmi and b/icons/obj/machines/research.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 7cedd608b7e..5b59e357d78 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 672d8fca47d..c9e5bc31fe5 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi index 1e60c01131f..212981aa0ba 100644 Binary files a/icons/obj/telescience.dmi and b/icons/obj/telescience.dmi differ diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index ef4f35b56be..50c644f01cd 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -61,7 +61,10 @@ h1.alert, h2.alert {color: #000000;} .emote { font-style: italic;} .userdanger {color: #ff0000; font-weight: bold; font-size: 3;} +.danger {color: #ff0000; font-weight: bold;} .danger {color: #ff0000;} +.tinydanger {color: #ff0000; font-size: 85%;} +.smalldanger {color: #ff0000; font-size: 90%;} .warning {color: #ff0000; font-style: italic;} .boldwarning {color: #ff0000; font-style: italic; font-weight: bold} .announce {color: #228b22; font-weight: bold;} @@ -70,6 +73,9 @@ h1.alert, h2.alert {color: #000000;} .rose {color: #ff5050;} .info {color: #0000CC;} .notice {color: #000099;} +.tinynotice {color: #000099; font-size: 85%;} +.smallnotice {color: #000099; font-size: 90%;} +.smallnoticeital {color: #000099; font-style: italic; font-size: 90%;} .boldnotice {color: #000099; font-weight: bold;} .hear {color: #000099; font-style: italic;} .adminnotice {color: #0000ff;} @@ -87,6 +93,7 @@ h1.alert, h2.alert {color: #000000;} .hierophant_warning {color: #660099; font-style: italic;} .purple {color: #5e2d79;} .holoparasite {color: #35333a;} +.bounty {color: #ab6613; font-style: italic;} .revennotice {color: #1d2953;} .revenboldnotice {color: #1d2953; font-weight: bold;} diff --git a/sound/effects/chipbagpop.ogg b/sound/effects/chipbagpop.ogg new file mode 100644 index 00000000000..9f975ab6d24 Binary files /dev/null and b/sound/effects/chipbagpop.ogg differ diff --git a/sound/effects/blood1.ogg b/sound/effects/wounds/blood1.ogg similarity index 100% rename from sound/effects/blood1.ogg rename to sound/effects/wounds/blood1.ogg diff --git a/sound/effects/blood2.ogg b/sound/effects/wounds/blood2.ogg similarity index 100% rename from sound/effects/blood2.ogg rename to sound/effects/wounds/blood2.ogg diff --git a/sound/effects/blood3.ogg b/sound/effects/wounds/blood3.ogg similarity index 100% rename from sound/effects/blood3.ogg rename to sound/effects/wounds/blood3.ogg diff --git a/sound/effects/crack1.ogg b/sound/effects/wounds/crack1.ogg similarity index 100% rename from sound/effects/crack1.ogg rename to sound/effects/wounds/crack1.ogg diff --git a/sound/effects/crack2.ogg b/sound/effects/wounds/crack2.ogg similarity index 100% rename from sound/effects/crack2.ogg rename to sound/effects/wounds/crack2.ogg diff --git a/sound/effects/wounds/crackandbleed.ogg b/sound/effects/wounds/crackandbleed.ogg new file mode 100644 index 00000000000..ea07f13d482 Binary files /dev/null and b/sound/effects/wounds/crackandbleed.ogg differ diff --git a/sound/effects/wounds/pierce1.ogg b/sound/effects/wounds/pierce1.ogg new file mode 100644 index 00000000000..cd7b7c39610 Binary files /dev/null and b/sound/effects/wounds/pierce1.ogg differ diff --git a/sound/effects/wounds/pierce2.ogg b/sound/effects/wounds/pierce2.ogg new file mode 100644 index 00000000000..4977cab299f Binary files /dev/null and b/sound/effects/wounds/pierce2.ogg differ diff --git a/sound/effects/wounds/pierce3.ogg b/sound/effects/wounds/pierce3.ogg new file mode 100644 index 00000000000..e81700b1348 Binary files /dev/null and b/sound/effects/wounds/pierce3.ogg differ diff --git a/sound/effects/sizzle1.ogg b/sound/effects/wounds/sizzle1.ogg similarity index 100% rename from sound/effects/sizzle1.ogg rename to sound/effects/wounds/sizzle1.ogg diff --git a/sound/effects/sizzle2.ogg b/sound/effects/wounds/sizzle2.ogg similarity index 100% rename from sound/effects/sizzle2.ogg rename to sound/effects/wounds/sizzle2.ogg diff --git a/sound/machines/wewewew.ogg b/sound/machines/wewewew.ogg new file mode 100644 index 00000000000..b521e0c9761 Binary files /dev/null and b/sound/machines/wewewew.ogg differ diff --git a/sound/misc/knuckles.ogg b/sound/misc/knuckles.ogg index 0c8150b0a19..b61a50fb613 100644 Binary files a/sound/misc/knuckles.ogg and b/sound/misc/knuckles.ogg differ diff --git a/sound/misc/license.txt b/sound/misc/license.txt index 75a7cc1e93f..b92a4a279a9 100644 --- a/sound/misc/license.txt +++ b/sound/misc/license.txt @@ -1,2 +1,5 @@ bloop.ogg by my man Tim Khan (https://freesound.org/people/tim.kahn/sounds/130377/) + +knuckles.ogg by CGEffex. Shortened and cut. +https://freesound.org/people/CGEffex/sounds/93981/ \ No newline at end of file diff --git a/sound/roundend/disappointed.ogg b/sound/roundend/disappointed.ogg index 4a35dc5c513..984bedbcd4b 100644 Binary files a/sound/roundend/disappointed.ogg and b/sound/roundend/disappointed.ogg differ diff --git a/strings/phobia.json b/strings/phobia.json index 72eeb39373e..440057928e8 100644 --- a/strings/phobia.json +++ b/strings/phobia.json @@ -284,5 +284,18 @@ "neet", "ora", "~" + ], +"insects": [ + "fly", + "moth", + "buzz", + "flutter", + "insect", + "moff", + "roach", + "cockroach", + "glockroach", + "bee", + "sting" ] } diff --git a/strings/wounds/bone_scar_desc.json b/strings/wounds/bone_scar_desc.json new file mode 100644 index 00000000000..b1eb84bb8b7 --- /dev/null +++ b/strings/wounds/bone_scar_desc.json @@ -0,0 +1,26 @@ +{ + "generic": ["general disfigurement"], + + "bluntmoderate": [ + "the bone equivalent of a faded bruise", + "a series of tiny chip marks" + ], + + "bluntsevere": [ + "a series of faded hairline cracks", + "a small bone dent" + ], + + "bluntcritical": [ + "large streaks of refilled cracks", + "a fractal of reformed stress marks", + "a cluster of calluses" + ], + + "dismember": [ + "is slightly misaligned", + "has clearly been dropped recently", + "has a damaged socket" + ] + +} diff --git a/strings/wounds/flesh_scar_desc.json b/strings/wounds/flesh_scar_desc.json new file mode 100644 index 00000000000..047e614b790 --- /dev/null +++ b/strings/wounds/flesh_scar_desc.json @@ -0,0 +1,86 @@ +{ + "generic": ["general disfigurement"], + + "bluntmoderate": [ + "light discoloring", + "a slight blue tint" + ], + + "bluntsevere": [ + "a faded, fist-sized bruise", + "a vaguely triangular peel scar" + ], + + "bluntcritical": [ + "a section of janky skin lines and badly healed scars", + "a large patch of uneven skin tone", + "a cluster of calluses" + ], + + + + "slashmoderate": [ + "light, faded lines", + "minor cut marks", + "a small faded slit", + "a series of small scars" + ], + + "slashsevere": [ + "a twisted line of faded gashes", + "a gnarled sickle-shaped slice scar" + ], + + "slashcritical": [ + "a winding path of very badly healed scar tissue", + "a series of peaks and valleys along a gruesome line of cut scar tissue", + "a grotesque snake of indentations and stitching scars" + ], + + + + "piercemoderate": [ + "a small, faded bruise", + "a small twist of reformed skin", + "a thumb-sized puncture scar" + ], + + "piercesevere": [ + "an ink-splat shaped pocket of scar tissue", + "a long-faded puncture wound", + "a tumbling puncture hole with evidence of faded stitching" + ], + + "piercecritical": [ + "a rippling shockwave of scar tissue", + "a wide, scattered cloud of shrapnel marks", + "a gruesome multi-pronged puncture scar" + ], + + + + "burnmoderate": [ + "small amoeba-shaped skinmarks", + "a faded streak of depressed skin" + ], + + "burnsevere": [ + "a large, jagged patch of faded skin", + "random spots of shiny, smooth skin", + "spots of taut, leathery skin" + ], + + "burncritical": [ + "massive, disfiguring keloid scars", + "several long streaks of badly discolored and malformed skin", + "unmistakeable splotches of dead tissue from serious burns" + ], + + + "dismember": [ + "is several skintone shades paler than the rest of the body", + "is a gruesome patchwork of artificial flesh", + "has a large series of attachment scars at the articulation points" + ] + +} diff --git a/strings/wounds/scar_loc.json b/strings/wounds/scar_loc.json new file mode 100644 index 00000000000..4d1a639a9a1 --- /dev/null +++ b/strings/wounds/scar_loc.json @@ -0,0 +1,52 @@ +{ + "": ["general area"], + + "head": [ + "left eyebrow", + "cheekbone", + "neck", + "throat", + "jawline", + "entire face" + ], + + "chest": [ + "upper chest", + "lower abdomen", + "midsection", + "collarbone", + "lower back" + ], + + "l_arm": [ + "outer left forearm", + "inner left wrist", + "left elbow", + "left bicep", + "left shoulder" + ], + + "r_arm": [ + "outer right forearm", + "inner right wrist", + "right elbow", + "right bicep", + "right shoulder" + ], + + "l_leg": [ + "inner left thigh", + "outer left calf", + "outer left hip", + "left kneecap", + "lower left shin" + ], + + "r_leg": [ + "inner right thigh", + "outer right calf", + "outer right hip", + "right kneecap", + "lower right shin" + ] +} diff --git a/tgstation.dme b/tgstation.dme index 919b645023f..eaa7538d93e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -56,6 +56,7 @@ #include "code\__DEFINES\inventory.dm" #include "code\__DEFINES\is_helpers.dm" #include "code\__DEFINES\jobs.dm" +#include "code\__DEFINES\keybinding.dm" #include "code\__DEFINES\language.dm" #include "code\__DEFINES\layers.dm" #include "code\__DEFINES\lighting.dm" @@ -287,6 +288,7 @@ #include "code\controllers\subsystem\radiation.dm" #include "code\controllers\subsystem\radio.dm" #include "code\controllers\subsystem\research.dm" +#include "code\controllers\subsystem\runechat.dm" #include "code\controllers\subsystem\server_maint.dm" #include "code\controllers\subsystem\shuttle.dm" #include "code\controllers\subsystem\skills.dm" @@ -426,6 +428,7 @@ #include "code\datums\components\omen.dm" #include "code\datums\components\orbiter.dm" #include "code\datums\components\paintable.dm" +#include "code\datums\components\payment.dm" #include "code\datums\components\pellet_cloud.dm" #include "code\datums\components\pricetag.dm" #include "code\datums\components\punchcooldown.dm" @@ -601,6 +604,7 @@ #include "code\datums\mutations\chameleon.dm" #include "code\datums\mutations\cold.dm" #include "code\datums\mutations\hulk.dm" +#include "code\datums\mutations\passive.dm" #include "code\datums\mutations\radioactive.dm" #include "code\datums\mutations\sight.dm" #include "code\datums\mutations\space_adaptation.dm" @@ -652,7 +656,9 @@ #include "code\datums\wounds\_wounds.dm" #include "code\datums\wounds\bones.dm" #include "code\datums\wounds\burns.dm" -#include "code\datums\wounds\cuts.dm" +#include "code\datums\wounds\loss.dm" +#include "code\datums\wounds\pierce.dm" +#include "code\datums\wounds\slash.dm" #include "code\datums\wounds\scars\_scars.dm" #include "code\game\alternate_appearance.dm" #include "code\game\atoms.dm" @@ -724,6 +730,7 @@ #include "code\game\machinery\buttons.dm" #include "code\game\machinery\canister_frame.dm" #include "code\game\machinery\cell_charger.dm" +#include "code\game\machinery\civilian_bountys.dm" #include "code\game\machinery\constructable_frame.dm" #include "code\game\machinery\dance_machine.dm" #include "code\game\machinery\defibrillator_mount.dm" @@ -1125,6 +1132,7 @@ #include "code\game\objects\items\stacks\tiles\tile_types.dm" #include "code\game\objects\items\storage\backpack.dm" #include "code\game\objects\items\storage\bags.dm" +#include "code\game\objects\items\storage\basket.dm" #include "code\game\objects\items\storage\belt.dm" #include "code\game\objects\items\storage\book.dm" #include "code\game\objects\items\storage\boxes.dm" @@ -1526,7 +1534,6 @@ #include "code\modules\antagonists\space_dragon\space_dragon.dm" #include "code\modules\antagonists\survivalist\survivalist.dm" #include "code\modules\antagonists\swarmer\swarmer.dm" -#include "code\modules\antagonists\swarmer\swarmer_event.dm" #include "code\modules\antagonists\traitor\datum_traitor.dm" #include "code\modules\antagonists\traitor\syndicate_contract.dm" #include "code\modules\antagonists\traitor\equipment\contractor.dm" @@ -1642,8 +1649,10 @@ #include "code\modules\buildmode\submodes\basic.dm" #include "code\modules\buildmode\submodes\boom.dm" #include "code\modules\buildmode\submodes\copy.dm" +#include "code\modules\buildmode\submodes\delete.dm" #include "code\modules\buildmode\submodes\fill.dm" #include "code\modules\buildmode\submodes\mapgen.dm" +#include "code\modules\buildmode\submodes\outfit.dm" #include "code\modules\buildmode\submodes\throwing.dm" #include "code\modules\buildmode\submodes\variable_edit.dm" #include "code\modules\cargo\bounty.dm" @@ -1837,6 +1846,7 @@ #include "code\modules\events\immovable_rod.dm" #include "code\modules\events\ion_storm.dm" #include "code\modules\events\major_dust.dm" +#include "code\modules\events\market_crash.dm" #include "code\modules\events\mass_hallucination.dm" #include "code\modules\events\meateor_wave.dm" #include "code\modules\events\meteor_wave.dm" @@ -1855,6 +1865,7 @@ #include "code\modules\events\spider_infestation.dm" #include "code\modules\events\spontaneous_appendicitis.dm" #include "code\modules\events\stray_cargo.dm" +#include "code\modules\events\swarmer.dm" #include "code\modules\events\vent_clog.dm" #include "code\modules\events\wisdomcow.dm" #include "code\modules\events\wormholes.dm" @@ -2074,6 +2085,8 @@ #include "code\modules\library\lib_machines.dm" #include "code\modules\library\random_books.dm" #include "code\modules\library\soapstone.dm" +#include "code\modules\library\skill_learning\skill_station.dm" +#include "code\modules\library\skill_learning\skillchip.dm" #include "code\modules\lighting\emissive_blocker.dm" #include "code\modules\lighting\lighting_area.dm" #include "code\modules\lighting\lighting_atom.dm" @@ -2111,7 +2124,6 @@ #include "code\modules\mining\machine_vending.dm" #include "code\modules\mining\mine_items.dm" #include "code\modules\mining\minebot.dm" -#include "code\modules\mining\mint.dm" #include "code\modules\mining\money_bag.dm" #include "code\modules\mining\ores_coins.dm" #include "code\modules\mining\satchel_ore_boxdm.dm" @@ -3015,6 +3027,7 @@ #include "code\modules\surgery\plastic_surgery.dm" #include "code\modules\surgery\prosthetic_replacement.dm" #include "code\modules\surgery\remove_embedded_object.dm" +#include "code\modules\surgery\repair_puncture.dm" #include "code\modules\surgery\revival.dm" #include "code\modules\surgery\stomachpump.dm" #include "code\modules\surgery\surgery.dm" @@ -3060,6 +3073,9 @@ #include "code\modules\surgery\organs\tails.dm" #include "code\modules\surgery\organs\tongue.dm" #include "code\modules\surgery\organs\vocal_cords.dm" +#include "code\modules\swarmers\swarmer.dm" +#include "code\modules\swarmers\swarmer_act.dm" +#include "code\modules\swarmers\swarmer_objs.dm" #include "code\modules\tgs\includes.dm" #include "code\modules\tgui\external.dm" #include "code\modules\tgui\states.dm" diff --git a/tgui/package.json b/tgui/package.json index 8dd15925b2a..d0ef805c470 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "tgui", - "version": "3.0.0", + "version": "4.1.0", "workspaces": [ "packages/*" ], diff --git a/tgui/packages/common/package.json b/tgui/packages/common/package.json index fbd255ababc..22560d92f93 100644 --- a/tgui/packages/common/package.json +++ b/tgui/packages/common/package.json @@ -1,6 +1,6 @@ { "private": true, "name": "common", - "version": "3.0.0", + "version": "4.1.0", "type": "module" } diff --git a/tgui/packages/common/storage.js b/tgui/packages/common/storage.js index bcb010e77a7..8e1d2183e42 100644 --- a/tgui/packages/common/storage.js +++ b/tgui/packages/common/storage.js @@ -58,7 +58,19 @@ const createLocalStorage = () => { }; }; +const testLocalStorage = () => { + // Localstorage can sometimes throw an error, even if DOM storage is not + // disabled in IE11 settings. + // See: https://superuser.com/questions/1080011 + try { + return Boolean(window.localStorage && window.localStorage.getItem); + } + catch { + return false; + } +}; + export const storage = ( - window.localStorage && createLocalStorage() + testLocalStorage() && createLocalStorage() || createMock() ); diff --git a/tgui/packages/tgui-dev-server/link/client.js b/tgui/packages/tgui-dev-server/link/client.js index af7a920c64c..4671b340c53 100644 --- a/tgui/packages/tgui-dev-server/link/client.js +++ b/tgui/packages/tgui-dev-server/link/client.js @@ -98,8 +98,8 @@ const sendRawMessage = msg => { socket.send(json); } else { - // Keep only 10 latest messages in the queue - if (queue.length > 10) { + // Keep only 100 latest messages in the queue + if (queue.length > 100) { queue.shift(); } queue.push(json); diff --git a/tgui/packages/tgui-dev-server/package.json b/tgui/packages/tgui-dev-server/package.json index e397fe3e0bb..bcb02196e65 100644 --- a/tgui/packages/tgui-dev-server/package.json +++ b/tgui/packages/tgui-dev-server/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "tgui-dev-server", - "version": "3.0.0", + "version": "4.1.0", "type": "module", "dependencies": { "glob": "^7.1.4", diff --git a/tgui/packages/tgui/assets.js b/tgui/packages/tgui/assets.js index 2023a5c8842..b0f71bb9ffa 100644 --- a/tgui/packages/tgui/assets.js +++ b/tgui/packages/tgui/assets.js @@ -9,15 +9,46 @@ import { createLogger } from './logging'; const logger = createLogger('assets'); -const loadedAssets = { - styles: [], -}; +const EXCLUDED_PATTERNS = [ + /v4shim/i, +]; -export const loadCSS = filename => { - if (loadedAssets.styles.includes(filename)) { +const loadedStyles = []; +const loadedMappings = {}; + +export const loadCSS = url => { + if (loadedStyles.includes(url)) { return; } - loadedAssets.styles.push(filename); - logger.log(`loading stylesheet '${filename}'`); - fgLoadCSS(filename); + loadedStyles.push(url); + logger.log(`loading stylesheet '${url}'`); + fgLoadCSS(url); +}; + +export const resolveAsset = name => ( + loadedMappings[name] || name +); + +export const assetMiddleware = store => next => action => { + const { type, payload } = action; + if (type === 'asset/stylesheet') { + loadCSS(payload); + return; + } + if (type === 'asset/mappings') { + for (let name of Object.keys(payload)) { + // Skip anything that matches excluded patterns + if (EXCLUDED_PATTERNS.some(regex => regex.test(name))) { + continue; + } + const url = payload[name]; + const ext = name.split('.').pop(); + loadedMappings[name] = url; + if (ext === 'css') { + loadCSS(url); + } + } + return; + } + next(action); }; diff --git a/tgui/packages/tgui/backend.js b/tgui/packages/tgui/backend.js index 2c9bd093721..dab86ee918c 100644 --- a/tgui/packages/tgui/backend.js +++ b/tgui/packages/tgui/backend.js @@ -79,7 +79,6 @@ export const backendReducer = (state = initialState, action) => { return { ...state, config, - assets: payload.assets || {}, data, shared, visible, @@ -253,7 +252,6 @@ export const sendAct = (action, payload = {}) => { * }, * }, * data: any, - * assets: any, * shared: any, * visible: boolean, * interactive: boolean, diff --git a/tgui/packages/tgui/index.js b/tgui/packages/tgui/index.js index 0b2f1a652eb..f554c1c319f 100644 --- a/tgui/packages/tgui/index.js +++ b/tgui/packages/tgui/index.js @@ -30,7 +30,6 @@ import './styles/themes/syndicate.scss'; import { perf } from 'common/perf'; import { render } from 'inferno'; import { setupHotReloading } from 'tgui-dev-server/link/client'; -import { loadCSS } from './assets'; import { backendUpdate, backendSuspendSuccess, selectBackend, sendMessage } from './backend'; import { setupDrag } from './drag'; import { logger } from './logging'; @@ -96,8 +95,6 @@ const renderLayout = () => { if (initialRender) { initialRender = false; } - // Load assets - assets?.styles?.forEach(filename => loadCSS(filename)); }; // Parse JSON and report all abnormal JSON strings coming from BYOND @@ -143,9 +140,8 @@ const setupApp = () => { logger.debug(`received message '${message?.type}'`); const { type, payload } = message; if (type === 'update') { - window.__ref__ = payload.config.ref; if (suspended) { - logger.log('reinitializing to:', payload.config.ref); + logger.log('resuming'); initialRender = 'recycled'; } // Backend update dispatches a store action @@ -162,7 +158,8 @@ const setupApp = () => { }); return; } - logger.log('unhandled message', message); + // Pass the message directly to the store + store.dispatch(message); }; // Enable hot module reloading @@ -185,9 +182,6 @@ const setupApp = () => { } window.update(stateJson); } - - // Dynamically load font-awesome from browser's cache - loadCSS('font-awesome.css'); }; // Setup a fatal error reporter diff --git a/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.js b/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.js new file mode 100644 index 00000000000..5fe38744228 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.js @@ -0,0 +1,103 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { AnimatedNumber, Box, Button, Flex, LabeledList, NoticeBox, Section } from '../components'; +import { Window } from '../layouts'; + +export const CivCargoHoldTerminal = (props, context) => { + const { act, data } = useBackend(context); + const { + pad, + sending, + status_report, + id_inserted, + id_bounty_info, + id_bounty_value, + id_bounty_num, + } = data; + const in_text = "Welcome valued employee."; + const out_text = "To begin, insert your ID into the console."; + return ( + + + + + + {id_inserted ? in_text : out_text} + +
+ + + {pad ? "Online" : "Not Found"} + + + {status_report} + + +
+ +
+ + + + + +
+ This makes the next game what you input. + Resets after one round automatically. +
+ + +
+ + + )}
{!!roleinfo && ( @@ -49,37 +94,6 @@ export const MafiaPanel = (props, context) => { ))} - {!!admin_controls && ( -
- THESE ARE DEBUG, THEY WILL BREAK THE GAME, DO NOT TOUCH
- Also because an admin did it: do not gib/delete/etc - anyone! It will runtime the game to death!
- - - -
- -
- )}
{!!players && players.map(player => ( diff --git a/tgui/packages/tgui/interfaces/Mint.js b/tgui/packages/tgui/interfaces/Mint.js deleted file mode 100644 index 1b7e1456c3e..00000000000 --- a/tgui/packages/tgui/interfaces/Mint.js +++ /dev/null @@ -1,47 +0,0 @@ -import { useBackend } from '../backend'; -import { Button, LabeledList, Section } from '../components'; -import { Window } from '../layouts'; - -export const Mint = (props, context) => { - const { act, data } = useBackend(context); - const inserted_materials = data.inserted_materials || []; - return ( - - -
act(data.processing - ? 'stoppress' - : 'startpress')} /> - }> - - {inserted_materials.map(material => ( - act('changematerial', { - material_name: material.material, - })} /> - )}> - {material.amount} cm³ - - ))} - -
-
- Pressed {data.produced_coins} coins this cycle. -
-
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosArcade.js b/tgui/packages/tgui/interfaces/NtosArcade.js index 67c85db7be4..f0f7241ab87 100644 --- a/tgui/packages/tgui/interfaces/NtosArcade.js +++ b/tgui/packages/tgui/interfaces/NtosArcade.js @@ -1,3 +1,4 @@ +import { resolveAsset } from '../assets'; import { useBackend } from '../backend'; import { AnimatedNumber, Box, Button, Grid, LabeledList, ProgressBar, Section } from '../components'; import { NtosWindow } from '../layouts'; @@ -73,7 +74,7 @@ export const NtosArcade = (props, context) => { inline width="156px" textAlign="center"> - +
diff --git a/tgui/packages/tgui/interfaces/NtosRadar.js b/tgui/packages/tgui/interfaces/NtosRadar.js index 46b20546fa0..2d2fe6a452f 100644 --- a/tgui/packages/tgui/interfaces/NtosRadar.js +++ b/tgui/packages/tgui/interfaces/NtosRadar.js @@ -1,4 +1,5 @@ import { classes } from 'common/react'; +import { resolveAsset } from '../assets'; import { useBackend } from '../backend'; import { Box, Button, Flex, Icon, NoticeBox, Section } from '../components'; import { NtosWindow } from '../layouts'; @@ -68,7 +69,9 @@ export const NtosRadarContent = (props, context) => { { ) : !!target.userot && ( + }} /> ) || ( { size={2} color={target.color} top={((target.locy * 10) + 19) + 'px'} - left={((target.locx * 10) + 16) + 'px'} - /> + left={((target.locx * 10) + 16) + 'px'} /> )} diff --git a/tgui/packages/tgui/interfaces/Orbit.js b/tgui/packages/tgui/interfaces/Orbit.js index 4bc2d4d5ca0..7423dadbc4c 100644 --- a/tgui/packages/tgui/interfaces/Orbit.js +++ b/tgui/packages/tgui/interfaces/Orbit.js @@ -1,4 +1,5 @@ import { createSearch } from 'common/string'; +import { resolveAsset } from '../assets'; import { useBackend, useLocalState } from '../backend'; import { Box, Button, Flex, Icon, Input, Section } from '../components'; import { Window } from '../layouts'; @@ -67,7 +68,7 @@ const OrbitedButton = (props, context) => { {"("}{thing.orbiters}{" "} {")"} diff --git a/tgui/packages/tgui/interfaces/SkillStation.js b/tgui/packages/tgui/interfaces/SkillStation.js new file mode 100644 index 00000000000..8166cdaebe2 --- /dev/null +++ b/tgui/packages/tgui/interfaces/SkillStation.js @@ -0,0 +1,110 @@ +import { useBackend } from '../backend'; +import { Button, Box, Section, NoticeBox, TimeDisplay, Flex, Icon, Table } from '../components'; +import { Window } from '../layouts'; +import { Fragment } from 'inferno'; +import { FlexItem } from '../components/Flex'; + +export const SkillStation = (props, context) => { + const { act, data } = useBackend(context); + const { + working, + timeleft, + error, + current = [], + slots_used, + slots_max, + skillchip_ready, + implantable, + implantable_reason, + skill_name, + skill_desc, + skill_icon, + skill_cost, + } = data; + let skillchip_section_content; + if (!skillchip_ready) { + // I guess could use something better + skillchip_section_content = "Insert a skillchip to continue."; + } else { + skillchip_section_content = ( + + + + + + {skill_name} + {skill_desc} + Complexity: {skill_cost} + {!!implantable_reason && ( + + {implantable_reason} + )} + + + + + + ); + } + return ( + + + {!!error && ({error})} + {!!working && ( + + Operation in progress. Please do not leave the chamber. + Time Left : + )} + {!working && (
{skillchip_section_content}
)} +
{slots_used}/{slots_max}}> + {!current.length && "No skillchips detected."} + {!!current.length && ( + + + Chip + Complexity + Status + Actions + + {current.map(skill => ( + + + + {skill.name} + + + {skill.cost} + + + {!skill.active && ( + + )} + {!!skill.active && ( + + )} + + + {!working && ( +
+ )} +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/Telecomms.js b/tgui/packages/tgui/interfaces/Telecomms.js new file mode 100644 index 00000000000..d4e2be6224d --- /dev/null +++ b/tgui/packages/tgui/interfaces/Telecomms.js @@ -0,0 +1,254 @@ +import { map, sortBy } from 'common/collections'; +import { flow } from 'common/fp'; +import { useBackend } from '../backend'; +import { Button, Input, LabeledList, Section, Table, NoticeBox, NumberInput, LabeledControls, Box } from '../components'; +import { RADIO_CHANNELS } from '../constants'; +import { Window } from '../layouts'; + +export const Telecomms = (props, context) => { + const { act, data } = useBackend(context); + const { + type, + minfreq, + maxfreq, + frequency, + multitool, + multibuff, + toggled, + id, + network, + prefab, + changefrequency, + currfrequency, + broadcasting, + receiving, + } = data; + const linked = data.linked || []; + const frequencies = data.frequencies || []; + return ( + + + {!multitool && ( + Use a multitool to make changes. + )} +
+ + act('toggle')} /> + } /> + act('id', { value })} /> + } /> + act('network', { value })} /> + } /> + + } /> + +
+ {!!(toggled && multitool) && ( + + {(type === 'bus') && ( +
+ + + + Change Frequency: + + + {RADIO_CHANNELS + .find(channel => channel.freq === changefrequency) && ( + channel.freq === changefrequency) + .color} + ml={2}> + [{RADIO_CHANNELS + .find(channel => channel + .freq === changefrequency).name}] + + )} + + act( + 'change_freq', { value })} + /> +
+
+ )} + {(type === 'relay') && ( +
+
+ )} +
+ + {linked.map(entry => ( + + + {entry.index}. {entry.id} ({entry.name}) + + {!!multitool && ( +
+
+
+ + {frequencies.map(entry => ( + + + {entry/10} GHz + + + {RADIO_CHANNELS + .find(channel => channel.freq === entry) && ( + channel.freq === entry) + .color} + ml={2}> + [{RADIO_CHANNELS + .find(channel => channel + .freq === entry).name } ] + + )} + + + {!!multitool && ( +
+
+ {!!multitool && ( +
+ {!!multibuff && ( + + Current Buffer: {multibuff} + + )} + +
)} +
+ )} +
+
+ ); +}; diff --git a/tgui/packages/tgui/layouts/NtosWindow.js b/tgui/packages/tgui/layouts/NtosWindow.js index 5433b17f2a0..07f17ecc54b 100644 --- a/tgui/packages/tgui/layouts/NtosWindow.js +++ b/tgui/packages/tgui/layouts/NtosWindow.js @@ -4,6 +4,7 @@ * @license MIT */ +import { resolveAsset } from '../assets'; import { useBackend } from '../backend'; import { Box, Button } from '../components'; import { refocusLayout } from './Layout'; @@ -57,14 +58,14 @@ export const NtosWindow = (props, context) => { + src={resolveAsset(header.icon)} /> ))} {PC_ntneticon && ( + src={resolveAsset(PC_ntneticon)} /> )} {!!PC_showbatteryicon && PC_batteryicon && ( @@ -72,7 +73,7 @@ export const NtosWindow = (props, context) => { {PC_batteryicon && ( + src={resolveAsset(PC_batteryicon)} /> )} {PC_batterypercent && ( PC_batterypercent @@ -83,7 +84,7 @@ export const NtosWindow = (props, context) => { + src={resolveAsset(PC_apclinkicon)} /> )} {!!PC_showexitprogram && ( diff --git a/tgui/packages/tgui/package.json b/tgui/packages/tgui/package.json index 70c0e0c7716..fbbd15901f6 100644 --- a/tgui/packages/tgui/package.json +++ b/tgui/packages/tgui/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "tgui", - "version": "3.1.0", + "version": "4.1.0", "dependencies": { "@babel/core": "^7.6.2", "@babel/plugin-transform-jscript": "^7.2.0", diff --git a/tgui/packages/tgui/public/tgui.bundle.js b/tgui/packages/tgui/public/tgui.bundle.js index 4f2e07f73be..4284225f78a 100644 --- a/tgui/packages/tgui/public/tgui.bundle.js +++ b/tgui/packages/tgui/public/tgui.bundle.js @@ -1 +1 @@ -!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=186)}([function(e,t,n){"use strict";t.__esModule=!0;var o=n(401);Object.keys(o).forEach((function(e){"default"!==e&&"__esModule"!==e&&(t[e]=o[e])}))},function(e,t,n){"use strict";(function(e){t.__esModule=!0,t.useSharedState=t.useLocalState=t.useBackend=t.selectBackend=t.sendAct=t.sendMessage=t.backendMiddleware=t.backendReducer=t.backendSuspendSuccess=t.backendSuspendStart=t.backendSetSharedState=t.backendUpdate=void 0;var o=n(165),r=n(38),i=n(90);var a=(0,n(44).createLogger)("backend");t.backendUpdate=function(e){return{type:"backend/update",payload:e}};var c=function(e,t){return{type:"backend/setSharedState",payload:{key:e,nextState:t}}};t.backendSetSharedState=c;t.backendSuspendStart=function(){return{type:"backend/suspendStart"}};t.backendSuspendSuccess=function(){return{type:"backend/suspendSuccess",payload:{timestamp:Date.now()}}};var l={config:{},data:{}};t.backendReducer=function(e,t){void 0===e&&(e=l);var n=t.type,o=t.payload;if("backend/update"===n){var i=Object.assign({},e.config,o.config),a=Object.assign({},e.data,o.static_data,o.data),c=Object.assign({},e.shared);if(o.shared)for(var d=0,u=Object.keys(o.shared);d=0||(r[n]=e[n]);return r}(t,["payload"]),r=Object.assign({tgui:1,window_id:window.__windowId__},o);null!==n&&n!==undefined&&(r.payload=JSON.stringify(n)),Byond.topic(r)};t.sendMessage=d;var u=function(e,t){void 0===t&&(t={}),"object"!=typeof t||null===t||Array.isArray(t)?a.error("Payload for act() must be an object, got this:",t):d({type:"act/"+e,payload:t})};t.sendAct=u;var s=function(e){return e.backend||{}};t.selectBackend=s;t.useBackend=function(e){var t=e.store,n=s(t.getState());return Object.assign({},n,{act:u})};t.useLocalState=function(e,t,n){var o,r=e.store,i=null!=(o=s(r.getState()).shared)?o:{},a=t in i?i[t]:n;return[a,function(e){r.dispatch(c(t,"function"==typeof e?e(a):e))}]};t.useSharedState=function(e,t,n){var o,r=e.store,i=null!=(o=s(r.getState()).shared)?o:{},a=t in i?i[t]:n;return[a,function(e){d({type:"setSharedState",key:t,value:JSON.stringify("function"==typeof e?e(a):e)||""})}]}}).call(this,n(419).setImmediate)},function(e,t,n){"use strict";t.__esModule=!0,t.Window=t.NtosWindow=t.refocusLayout=t.Layout=void 0;var o=n(121);t.Layout=o.Layout,t.refocusLayout=o.refocusLayout;var r=n(426);t.NtosWindow=r.NtosWindow;var i=n(175);t.Window=i.Window},function(e,t,n){"use strict";t.__esModule=!0,t.TimeDisplay=t.Tooltip=t.Tabs=t.TextArea=t.Table=t.Slider=t.Section=t.ProgressBar=t.NumberInput=t.NoticeBox=t.Modal=t.LabeledList=t.LabeledControls=t.Knob=t.Input=t.Icon=t.Grid=t.Flex=t.Dropdown=t.DraggableControl=t.Divider=t.Dimmer=t.ColorBox=t.Collapsible=t.Chart=t.ByondUi=t.Button=t.Box=t.BlockQuote=t.AnimatedNumber=void 0;var o=n(122);t.AnimatedNumber=o.AnimatedNumber;var r=n(427);t.BlockQuote=r.BlockQuote;var i=n(17);t.Box=i.Box;var a=n(123);t.Button=a.Button;var c=n(428);t.ByondUi=c.ByondUi;var l=n(430);t.Chart=l.Chart;var d=n(431);t.Collapsible=d.Collapsible;var u=n(432);t.ColorBox=u.ColorBox;var s=n(170);t.Dimmer=s.Dimmer;var p=n(171);t.Divider=p.Divider;var m=n(125);t.DraggableControl=m.DraggableControl;var f=n(433);t.Dropdown=f.Dropdown;var h=n(172);t.Flex=h.Flex;var C=n(434);t.Grid=C.Grid;var g=n(124);t.Icon=g.Icon;var b=n(435);t.Input=b.Input;var N=n(436);t.Knob=N.Knob;var v=n(437);t.LabeledControls=v.LabeledControls;var V=n(174);t.LabeledList=V.LabeledList;var y=n(438);t.Modal=y.Modal;var k=n(439);t.NoticeBox=k.NoticeBox;var x=n(126);t.NumberInput=x.NumberInput;var _=n(440);t.ProgressBar=_.ProgressBar;var w=n(441);t.Section=w.Section;var B=n(442);t.Slider=B.Slider;var S=n(173);t.Table=S.Table;var L=n(443);t.TextArea=L.TextArea;var I=n(444);t.Tabs=I.Tabs;var T=n(169);t.Tooltip=T.Tooltip;var A=n(445);t.TimeDisplay=A.TimeDisplay},function(e,t,n){"use strict";var o=n(7),r=n(22).f,i=n(30),a=n(24),c=n(92),l=n(132),d=n(65);e.exports=function(e,t){var n,u,s,p,m,f=e.target,h=e.global,C=e.stat;if(n=h?o:C?o[f]||c(f,{}):(o[f]||{}).prototype)for(u in t){if(p=t[u],s=e.noTargetGet?(m=r(n,u))&&m.value:n[u],!d(h?u:f+(C?".":"#")+u,e.forced)&&s!==undefined){if(typeof p==typeof s)continue;l(p,s)}(e.sham||s&&s.sham)&&i(p,"sham",!0),a(n,u,p,e)}}},function(e,t,n){"use strict";e.exports=function(e){try{return!!e()}catch(t){return!0}}},function(e,t,n){"use strict";t.__esModule=!0,t.isFalsy=t.pureComponentHooks=t.shallowDiffers=t.normalizeChildren=t.classes=void 0;t.classes=function(e){for(var t="",n=0;n0?r(o(e),9007199254740991):0}},function(e,t,n){"use strict";var o=n(7),r=n(94),i=n(20),a=n(62),c=n(98),l=n(135),d=r("wks"),u=o.Symbol,s=l?u:u&&u.withoutSetter||a;e.exports=function(e){return i(d,e)||(c&&i(u,e)?d[e]=u[e]:d[e]=s("Symbol."+e)),d[e]}},function(e,t,n){"use strict";var o=n(9),r=n(129),i=n(10),a=n(35),c=Object.defineProperty;t.f=o?c:function(e,t,n){if(i(e),t=a(t,!0),i(n),r)try{return c(e,t,n)}catch(o){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){"use strict";t.__esModule=!0,t.keyOfMatchingRange=t.inRange=t.toFixed=t.round=t.scale=t.clamp01=t.clamp=void 0;t.clamp=function(e,t,n){return en?n:e};t.clamp01=function(e){return e<0?0:e>1?1:e};t.scale=function(e,t,n){return(e-t)/(n-t)};t.round=function(e,t){return!e||isNaN(e)?e:(t|=0,i=(e*=n=Math.pow(10,t))>0|-(e<0),r=Math.abs(e%1)>=.4999999999854481,o=Math.floor(e),r&&(e=o+(i>0)),(r?e:Math.round(e))/n);var n,o,r,i};t.toFixed=function(e,t){return void 0===t&&(t=0),Number(e).toFixed(Math.max(t,0))};var o=function(e,t){return t&&e>=t[0]&&e<=t[1]};t.inRange=o;t.keyOfMatchingRange=function(e,t){for(var n=0,r=Object.keys(t);nc)return 1}return 0};t.sortBy=function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&(t.style=l),t};t.computeBoxProps=C;var g=function(e){var t=e.textColor||e.color,n=e.backgroundColor;return(0,o.classes)([d(t)&&"color-"+t,d(n)&&"color-bg-"+n])};t.computeBoxClassName=g;var b=function(e){var t=e.as,n=void 0===t?"div":t,o=e.className,a=e.children,c=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}(e,["as","className","children"]);if("function"==typeof a)return a(C(e));var l="string"==typeof o?o+" "+g(c):g(c),d=C(c);return(0,r.createVNode)(i.VNodeFlags.HtmlElement,n,l,a,i.ChildFlags.UnknownChildren,d)};t.Box=b,b.defaultHooks=o.pureComponentHooks},function(e,t,n){"use strict";var o=n(23);e.exports=function(e){return Object(o(e))}},function(e,t,n){"use strict";function o(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n",apos:"'"};return e.replace(/
/gi,"\n").replace(/<\/?[a-z0-9-_]+[^>]*>/gi,"").replace(/&(nbsp|amp|quot|lt|gt|apos);/g,(function(e,n){return t[n]})).replace(/&#?([0-9]+);/gi,(function(e,t){var n=parseInt(t,10);return String.fromCharCode(n)})).replace(/&#x?([0-9a-f]+);/gi,(function(e,t){var n=parseInt(t,16);return String.fromCharCode(n)}))};t.buildQueryString=function(e){return Object.keys(e).map((function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])})).join("&")}},function(e,t,n){"use strict";var o={}.hasOwnProperty;e.exports=function(e,t){return o.call(e,t)}},function(e,t,n){"use strict";var o=n(52),r=n(61),i=n(18),a=n(12),c=n(67),l=[].push,d=function(e){var t=1==e,n=2==e,d=3==e,u=4==e,s=6==e,p=5==e||s;return function(m,f,h,C){for(var g,b,N=i(m),v=r(N),V=o(f,h,3),y=a(v.length),k=0,x=C||c,_=t?x(m,y):n?x(m,0):undefined;y>k;k++)if((p||k in v)&&(b=V(g=v[k],k,N),e))if(t)_[k]=b;else if(b)switch(e){case 3:return!0;case 5:return g;case 6:return k;case 2:l.call(_,g)}else if(u)return!1;return s?-1:d||u?u:_}};e.exports={forEach:d(0),map:d(1),filter:d(2),some:d(3),every:d(4),find:d(5),findIndex:d(6)}},function(e,t,n){"use strict";var o=n(9),r=n(74),i=n(50),a=n(26),c=n(35),l=n(20),d=n(129),u=Object.getOwnPropertyDescriptor;t.f=o?u:function(e,t){if(e=a(e),t=c(t,!0),d)try{return u(e,t)}catch(n){}if(l(e,t))return i(!r.f.call(e,t),e[t])}},function(e,t,n){"use strict";e.exports=function(e){if(e==undefined)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){"use strict";var o=n(7),r=n(30),i=n(20),a=n(92),c=n(93),l=n(36),d=l.get,u=l.enforce,s=String(String).split("String");(e.exports=function(e,t,n,c){var l=!!c&&!!c.unsafe,d=!!c&&!!c.enumerable,p=!!c&&!!c.noTargetGet;"function"==typeof n&&("string"!=typeof t||i(n,"name")||r(n,"name",t),u(n).source=s.join("string"==typeof t?t:"")),e!==o?(l?!p&&e[t]&&(d=!0):delete e[t],d?e[t]=n:r(e,t,n)):d?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&d(this).source||c(this)}))},function(e,t,n){"use strict";var o=n(9),r=n(5),i=n(20),a=Object.defineProperty,c={},l=function(e){throw e};e.exports=function(e,t){if(i(c,e))return c[e];t||(t={});var n=[][e],d=!!i(t,"ACCESSORS")&&t.ACCESSORS,u=i(t,0)?t[0]:l,s=i(t,1)?t[1]:undefined;return c[e]=!!n&&!r((function(){if(d&&!o)return!0;var e={length:-1};d?a(e,1,{enumerable:!0,get:l}):e[1]=1,n.call(e,u,s)}))}},function(e,t,n){"use strict";var o=n(61),r=n(23);e.exports=function(e){return o(r(e))}},function(e,t,n){"use strict";var o=n(133),r=n(20),i=n(139),a=n(14).f;e.exports=function(e){var t=o.Symbol||(o.Symbol={});r(t,e)||a(t,e,{value:i.f(e)})}},function(e,t,n){"use strict";var o=n(23),r=/"/g;e.exports=function(e,t,n,i){var a=String(o(e)),c="<"+t;return""!==n&&(c+=" "+n+'="'+String(i).replace(r,""")+'"'),c+">"+a+""}},function(e,t,n){"use strict";var o=n(5);e.exports=function(e){return o((function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}))}},function(e,t,n){"use strict";var o=n(9),r=n(14),i=n(50);e.exports=o?function(e,t,n){return r.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){"use strict";var o=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:o)(e)}},function(e,t,n){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},function(e,t,n){"use strict";function o(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n1?r-1:0),c=1;c1?o-1:0),i=1;it?2+3*d-c:0;return((0,o.toFixed)(p,m)+" "+s+n).trim()};t.formatSiUnit=a;t.formatPower=function(e,t){return void 0===t&&(t=0),a(e,t,"W")};t.formatMoney=function(e,t){if(void 0===t&&(t=0),!Number.isFinite(e))return e;var n=(0,o.round)(e,t);t>0&&(n=(0,o.toFixed)(e,t));var r=(n=String(n)).length,i=n.indexOf(".");-1===i&&(i=r);for(var a="",c=0;c0&&cn;)r[n]=t[n++];return r},U=function(e,t){T(e,t,{get:function(){return L(this)[t]}})},G=function(e){var t;return e instanceof P||"ArrayBuffer"==(t=g(e))||"SharedArrayBuffer"==t},K=function(e,t){return W(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},q=function(e,t){return K(e,t=h(t,!0))?u(2,e[t]):A(e,t)},Y=function(e,t,n){return!(K(e,t=h(t,!0))&&b(n)&&C(n,"value"))||C(n,"get")||C(n,"set")||n.configurable||C(n,"writable")&&!n.writable||C(n,"enumerable")&&!n.enumerable?T(e,t,n):(e[t]=n.value,e)};i?(O||(w.f=q,_.f=Y,U(D,"buffer"),U(D,"byteOffset"),U(D,"byteLength"),U(D,"length")),o({target:"Object",stat:!0,forced:!O},{getOwnPropertyDescriptor:q,defineProperty:Y}),e.exports=function(e,t,n){var i=e.match(/\d+$/)[0]/8,c=e+(n?"Clamped":"")+"Array",l="get"+e,u="set"+e,h=r[c],C=h,g=C&&C.prototype,_={},w=function(e,t){T(e,t,{get:function(){return function(e,t){var n=L(e);return n.view[l](t*i+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,o){var r=L(e);n&&(o=(o=E(o))<0?0:o>255?255:255&o),r.view[u](t*i+r.byteOffset,o,!0)}(this,t,e)},enumerable:!0})};O?a&&(C=t((function(e,t,n,o){return d(e,C,c),S(b(t)?G(t)?o!==undefined?new h(t,f(n,i),o):n!==undefined?new h(t,f(n,i)):new h(t):W(t)?H(C,t):y.call(C,t):new h(m(t)),e,C)})),v&&v(C,j),k(V(h),(function(e){e in C||s(C,e,h[e])})),C.prototype=g):(C=t((function(e,t,n,o){d(e,C,c);var r,a,l,u=0,s=0;if(b(t)){if(!G(t))return W(t)?H(C,t):y.call(C,t);r=t,s=f(n,i);var h=t.byteLength;if(o===undefined){if(h%i)throw M("Wrong length");if((a=h-s)<0)throw M("Wrong length")}else if((a=p(o)*i)+s>h)throw M("Wrong length");l=a/i}else l=m(t),r=new P(a=l*i);for(I(e,{buffer:r,byteOffset:s,byteLength:a,length:l,view:new R(r)});u2?n-2:0),r=2;r=i){var a=[t].concat(o).map((function(e){return"string"==typeof e?e:e instanceof Error?e.stack||String(e):JSON.stringify(e)})).filter((function(e){return e})).join(" ")+"\nUser Agent: "+navigator.userAgent;Byond.topic({tgui:1,window_id:window.__windowId__,type:"log",message:a})}},d=function(e){return{debug:function(){for(var t=arguments.length,n=new Array(t),r=0;r"+e+"<\/script>"},f=function(){try{o=document.domain&&new ActiveXObject("htmlfile")}catch(r){}var e,t;f=o?function(e){e.write(m("")),e.close();var t=e.parentWindow.Object;return e=null,t}(o):((t=d("iframe")).style.display="none",l.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(m("document.F=Object")),e.close(),e.F);for(var n=a.length;n--;)delete f.prototype[a[n]];return f()};c[s]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(p.prototype=r(e),n=new p,p.prototype=null,n[s]=e):n=f(),t===undefined?n:i(n,t)}},function(e,t,n){"use strict";var o=n(14).f,r=n(20),i=n(13)("toStringTag");e.exports=function(e,t,n){e&&!r(e=n?e:e.prototype,i)&&o(e,i,{configurable:!0,value:t})}},function(e,t,n){"use strict";var o=n(13),r=n(46),i=n(14),a=o("unscopables"),c=Array.prototype;c[a]==undefined&&i.f(c,a,{configurable:!0,value:r(null)}),e.exports=function(e){c[a][e]=!0}},function(e,t,n){"use strict";var o=n(10),r=n(32),i=n(13)("species");e.exports=function(e,t){var n,a=o(e).constructor;return a===undefined||(n=o(a)[i])==undefined?t:r(n)}},function(e,t,n){"use strict";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){"use strict";var o=n(134),r=n(96).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return o(e,r)}},function(e,t,n){"use strict";var o=n(32);e.exports=function(e,t,n){if(o(e),t===undefined)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,o){return e.call(t,n,o)};case 3:return function(n,o,r){return e.call(t,n,o,r)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){"use strict";var o=n(35),r=n(14),i=n(50);e.exports=function(e,t,n){var a=o(t);a in e?r.f(e,a,i(0,n)):e[a]=n}},function(e,t,n){"use strict";var o=n(10),r=n(145);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(i){}return function(n,i){return o(n),r(i),t?e.call(n,i):n.__proto__=i,n}}():undefined)},function(e,t,n){"use strict";var o=n(63),r=n(8),i=n(20),a=n(14).f,c=n(62),l=n(71),d=c("meta"),u=0,s=Object.isExtensible||function(){return!0},p=function(e){a(e,d,{value:{objectID:"O"+ ++u,weakData:{}}})},m=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!r(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,d)){if(!s(e))return"F";if(!t)return"E";p(e)}return e[d].objectID},getWeakData:function(e,t){if(!i(e,d)){if(!s(e))return!0;if(!t)return!1;p(e)}return e[d].weakData},onFreeze:function(e){return l&&m.REQUIRED&&s(e)&&!i(e,d)&&p(e),e}};o[d]=!0},function(e,t,n){"use strict";var o=n(34);e.exports=Array.isArray||function(e){return"Array"==o(e)}},function(e,t,n){"use strict";var o=n(39),r=n(14),i=n(13),a=n(9),c=i("species");e.exports=function(e){var t=o(e),n=r.f;a&&t&&!t[c]&&n(t,c,{configurable:!0,get:function(){return this}})}},function(e,t,n){"use strict";e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},function(e,t,n){"use strict";var o=n(23),r="["+n(84)+"]",i=RegExp("^"+r+r+"*"),a=RegExp(r+r+"*$"),c=function(e){return function(t){var n=String(o(t));return 1&e&&(n=n.replace(i,"")),2&e&&(n=n.replace(a,"")),n}};e.exports={start:c(1),end:c(2),trim:c(3)}},function(e,t,n){"use strict";t.__esModule=!0,t.InterfaceLockNoticeBox=void 0;var o=n(0),r=n(1),i=n(3);t.InterfaceLockNoticeBox=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=e.siliconUser,d=void 0===l?c.siliconUser:l,u=e.locked,s=void 0===u?c.locked:u,p=e.onLockStatusChange,m=void 0===p?function(){return a("lock")}:p,f=e.accessText,h=void 0===f?"an ID card":f;return d?(0,o.createComponentVNode)(2,i.NoticeBox,{color:d&&"grey",children:(0,o.createComponentVNode)(2,i.Flex,{align:"center",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:"Interface lock status:"}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Button,{m:0,color:s?"red":"green",icon:s?"lock":"unlock",content:s?"Locked":"Unlocked",onClick:function(){m&&m(!s)}})})]})}):(0,o.createComponentVNode)(2,i.NoticeBox,{children:["Swipe ",h," ","to ",s?"unlock":"lock"," this interface."]})}},function(e,t,n){"use strict";var o=n(5),r=n(34),i="".split;e.exports=o((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==r(e)?i.call(e,""):Object(e)}:Object},function(e,t,n){"use strict";var o=0,r=Math.random();e.exports=function(e){return"Symbol("+String(e===undefined?"":e)+")_"+(++o+r).toString(36)}},function(e,t,n){"use strict";e.exports={}},function(e,t,n){"use strict";var o=n(26),r=n(12),i=n(45),a=function(e){return function(t,n,a){var c,l=o(t),d=r(l.length),u=i(a,d);if(e&&n!=n){for(;d>u;)if((c=l[u++])!=c)return!0}else for(;d>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},function(e,t,n){"use strict";var o=n(5),r=/#|\.prototype\./,i=function(e,t){var n=c[a(e)];return n==d||n!=l&&("function"==typeof t?o(t):!!t)},a=i.normalize=function(e){return String(e).replace(r,".").toLowerCase()},c=i.data={},l=i.NATIVE="N",d=i.POLYFILL="P";e.exports=i},function(e,t,n){"use strict";var o=n(134),r=n(96);e.exports=Object.keys||function(e){return o(e,r)}},function(e,t,n){"use strict";var o=n(8),r=n(56),i=n(13)("species");e.exports=function(e,t){var n;return r(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!r(n.prototype)?o(n)&&null===(n=n[i])&&(n=undefined):n=undefined),new(n===undefined?Array:n)(0===t?0:t)}},function(e,t,n){"use strict";var o=n(5),r=n(13),i=n(99),a=r("species");e.exports=function(e){return i>=51||!o((function(){var t=[];return(t.constructor={})[a]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},function(e,t,n){"use strict";e.exports={}},function(e,t,n){"use strict";var o=n(24);e.exports=function(e,t,n){for(var r in t)o(e,r,t[r],n);return e}},function(e,t,n){"use strict";var o=n(5);e.exports=!o((function(){return Object.isExtensible(Object.preventExtensions({}))}))},function(e,t,n){"use strict";var o=n(10),r=n(101),i=n(12),a=n(52),c=n(102),l=n(142),d=function(e,t){this.stopped=e,this.result=t};(e.exports=function(e,t,n,u,s){var p,m,f,h,C,g,b,N=a(t,n,u?2:1);if(s)p=e;else{if("function"!=typeof(m=c(e)))throw TypeError("Target is not iterable");if(r(m)){for(f=0,h=i(e.length);h>f;f++)if((C=u?N(o(b=e[f])[0],b[1]):N(e[f]))&&C instanceof d)return C;return new d(!1)}p=m.call(e)}for(g=p.next;!(b=g.call(p)).done;)if("object"==typeof(C=l(p,N,b.value,u))&&C&&C instanceof d)return C;return new d(!1)}).stop=function(e){return new d(!0,e)}},function(e,t,n){"use strict";var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(r){"object"==typeof window&&(o=window)}e.exports=o},function(e,t,n){"use strict";var o={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!o.call({1:2},1);t.f=i?function(e){var t=r(this,e);return!!t&&t.enumerable}:o},function(e,t,n){"use strict";var o=n(94),r=n(62),i=o("keys");e.exports=function(e){return i[e]||(i[e]=r(e))}},function(e,t,n){"use strict";var o=n(39);e.exports=o("navigator","userAgent")||""},function(e,t,n){"use strict";var o=n(103),r=n(34),i=n(13)("toStringTag"),a="Arguments"==r(function(){return arguments}());e.exports=o?r:function(e){var t,n,o;return e===undefined?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(n){}}(t=Object(e),i))?n:a?r(t):"Object"==(o=r(t))&&"function"==typeof t.callee?"Arguments":o}},function(e,t,n){"use strict";var o=n(13)("iterator"),r=!1;try{var i=0,a={next:function(){return{done:!!i++}},"return":function(){r=!0}};a[o]=function(){return this},Array.from(a,(function(){throw 2}))}catch(c){}e.exports=function(e,t){if(!t&&!r)return!1;var n=!1;try{var i={};i[o]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(c){}return n}},function(e,t,n){"use strict";var o=n(32),r=n(18),i=n(61),a=n(12),c=function(e){return function(t,n,c,l){o(n);var d=r(t),u=i(d),s=a(d.length),p=e?s-1:0,m=e?-1:1;if(c<2)for(;;){if(p in u){l=u[p],p+=m;break}if(p+=m,e?p<0:s<=p)throw TypeError("Reduce of empty array with no initial value")}for(;e?p>=0:s>p;p+=m)p in u&&(l=n(l,u[p],p,d));return l}};e.exports={left:c(!1),right:c(!0)}},function(e,t,n){"use strict";var o=n(7),r=n(9),i=n(106),a=n(30),c=n(70),l=n(5),d=n(58),u=n(31),s=n(12),p=n(147),m=n(233),f=n(37),h=n(54),C=n(51).f,g=n(14).f,b=n(100),N=n(47),v=n(36),V=v.get,y=v.set,k=o.ArrayBuffer,x=k,_=o.DataView,w=_&&_.prototype,B=Object.prototype,S=o.RangeError,L=m.pack,I=m.unpack,T=function(e){return[255&e]},A=function(e){return[255&e,e>>8&255]},E=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},M=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},P=function(e){return L(e,23,4)},R=function(e){return L(e,52,8)},O=function(e,t){g(e.prototype,t,{get:function(){return V(this)[t]}})},F=function(e,t,n,o){var r=p(n),i=V(e);if(r+t>i.byteLength)throw S("Wrong index");var a=V(i.buffer).bytes,c=r+i.byteOffset,l=a.slice(c,c+t);return o?l:l.reverse()},j=function(e,t,n,o,r,i){var a=p(n),c=V(e);if(a+t>c.byteLength)throw S("Wrong index");for(var l=V(c.buffer).bytes,d=a+c.byteOffset,u=o(+r),s=0;sH;)(D=W[H++])in x||a(x,D,k[D]);z.constructor=x}h&&f(w)!==B&&h(w,B);var U=new _(new x(2)),G=w.setInt8;U.setInt8(0,2147483648),U.setInt8(1,2147483649),!U.getInt8(0)&&U.getInt8(1)||c(w,{setInt8:function(e,t){G.call(this,e,t<<24>>24)},setUint8:function(e,t){G.call(this,e,t<<24>>24)}},{unsafe:!0})}else x=function(e){d(this,x,"ArrayBuffer");var t=p(e);y(this,{bytes:b.call(new Array(t),0),byteLength:t}),r||(this.byteLength=t)},_=function(e,t,n){d(this,_,"DataView"),d(e,x,"DataView");var o=V(e).byteLength,i=u(t);if(i<0||i>o)throw S("Wrong offset");if(i+(n=n===undefined?o-i:s(n))>o)throw S("Wrong length");y(this,{buffer:e,byteLength:n,byteOffset:i}),r||(this.buffer=e,this.byteLength=n,this.byteOffset=i)},r&&(O(x,"byteLength"),O(_,"buffer"),O(_,"byteLength"),O(_,"byteOffset")),c(_.prototype,{getInt8:function(e){return F(this,1,e)[0]<<24>>24},getUint8:function(e){return F(this,1,e)[0]},getInt16:function(e){var t=F(this,2,e,arguments.length>1?arguments[1]:undefined);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=F(this,2,e,arguments.length>1?arguments[1]:undefined);return t[1]<<8|t[0]},getInt32:function(e){return M(F(this,4,e,arguments.length>1?arguments[1]:undefined))},getUint32:function(e){return M(F(this,4,e,arguments.length>1?arguments[1]:undefined))>>>0},getFloat32:function(e){return I(F(this,4,e,arguments.length>1?arguments[1]:undefined),23)},getFloat64:function(e){return I(F(this,8,e,arguments.length>1?arguments[1]:undefined),52)},setInt8:function(e,t){j(this,1,e,T,t)},setUint8:function(e,t){j(this,1,e,T,t)},setInt16:function(e,t){j(this,2,e,A,t,arguments.length>2?arguments[2]:undefined)},setUint16:function(e,t){j(this,2,e,A,t,arguments.length>2?arguments[2]:undefined)},setInt32:function(e,t){j(this,4,e,E,t,arguments.length>2?arguments[2]:undefined)},setUint32:function(e,t){j(this,4,e,E,t,arguments.length>2?arguments[2]:undefined)},setFloat32:function(e,t){j(this,4,e,P,t,arguments.length>2?arguments[2]:undefined)},setFloat64:function(e,t){j(this,8,e,R,t,arguments.length>2?arguments[2]:undefined)}});N(x,"ArrayBuffer"),N(_,"DataView"),e.exports={ArrayBuffer:x,DataView:_}},function(e,t,n){"use strict";var o=n(4),r=n(7),i=n(65),a=n(24),c=n(55),l=n(72),d=n(58),u=n(8),s=n(5),p=n(78),m=n(47),f=n(82);e.exports=function(e,t,n){var h=-1!==e.indexOf("Map"),C=-1!==e.indexOf("Weak"),g=h?"set":"add",b=r[e],N=b&&b.prototype,v=b,V={},y=function(e){var t=N[e];a(N,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(C&&!u(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return C&&!u(e)?undefined:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(C&&!u(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(i(e,"function"!=typeof b||!(C||N.forEach&&!s((function(){(new b).entries().next()})))))v=n.getConstructor(t,e,h,g),c.REQUIRED=!0;else if(i(e,!0)){var k=new v,x=k[g](C?{}:-0,1)!=k,_=s((function(){k.has(1)})),w=p((function(e){new b(e)})),B=!C&&s((function(){for(var e=new b,t=5;t--;)e[g](t,t);return!e.has(-0)}));w||((v=t((function(t,n){d(t,v,e);var o=f(new b,t,v);return n!=undefined&&l(n,o[g],o,h),o}))).prototype=N,N.constructor=v),(_||B)&&(y("delete"),y("has"),h&&y("get")),(B||x)&&y(g),C&&N.clear&&delete N.clear}return V[e]=v,o({global:!0,forced:v!=b},V),m(v,e),C||n.setStrong(v,e,h),v}},function(e,t,n){"use strict";var o=n(8),r=n(54);e.exports=function(e,t,n){var i,a;return r&&"function"==typeof(i=t.constructor)&&i!==n&&o(a=i.prototype)&&a!==n.prototype&&r(e,a),e}},function(e,t,n){"use strict";var o=Math.expm1,r=Math.exp;e.exports=!o||o(10)>22025.465794806718||o(10)<22025.465794806718||-2e-17!=o(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:r(e)-1}:o},function(e,t,n){"use strict";e.exports="\t\n\x0B\f\r \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff"},function(e,t,n){"use strict";var o=n(41),r=n(7),i=n(5);e.exports=o||!i((function(){var e=Math.random();__defineSetter__.call(null,e,(function(){})),delete r[e]}))},function(e,t,n){"use strict";var o=n(10);e.exports=function(){var e=o(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},function(e,t,n){"use strict";var o,r,i=n(86),a=n(112),c=RegExp.prototype.exec,l=String.prototype.replace,d=c,u=(o=/a/,r=/b*/g,c.call(o,"a"),c.call(r,"a"),0!==o.lastIndex||0!==r.lastIndex),s=a.UNSUPPORTED_Y||a.BROKEN_CARET,p=/()??/.exec("")[1]!==undefined;(u||p||s)&&(d=function(e){var t,n,o,r,a=this,d=s&&a.sticky,m=i.call(a),f=a.source,h=0,C=e;return d&&(-1===(m=m.replace("y","")).indexOf("g")&&(m+="g"),C=String(e).slice(a.lastIndex),a.lastIndex>0&&(!a.multiline||a.multiline&&"\n"!==e[a.lastIndex-1])&&(f="(?: "+f+")",C=" "+C,h++),n=new RegExp("^(?:"+f+")",m)),p&&(n=new RegExp("^"+f+"$(?!\\s)",m)),u&&(t=a.lastIndex),o=c.call(d?n:a,C),d?o?(o.input=o.input.slice(h),o[0]=o[0].slice(h),o.index=a.lastIndex,a.lastIndex+=o[0].length):a.lastIndex=0:u&&o&&(a.lastIndex=a.global?o.index+o[0].length:t),p&&o&&o.length>1&&l.call(o[0],n,(function(){for(r=1;r")})),u="$0"==="a".replace(/./,"$0"),s=i("replace"),p=!!/./[s]&&""===/./[s]("a","$0"),m=!r((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));e.exports=function(e,t,n,s){var f=i(e),h=!r((function(){var t={};return t[f]=function(){return 7},7!=""[e](t)})),C=h&&!r((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[f]=/./[f]),n.exec=function(){return t=!0,null},n[f](""),!t}));if(!h||!C||"replace"===e&&(!d||!u||p)||"split"===e&&!m){var g=/./[f],b=n(f,""[e],(function(e,t,n,o,r){return t.exec===a?h&&!r?{done:!0,value:g.call(t,n,o)}:{done:!0,value:e.call(n,t,o)}:{done:!1}}),{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:p}),N=b[0],v=b[1];o(String.prototype,e,N),o(RegExp.prototype,f,2==t?function(e,t){return v.call(e,this,t)}:function(e){return v.call(e,this)})}s&&c(RegExp.prototype[f],"sham",!0)}},function(e,t,n){"use strict";var o=n(34),r=n(87);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var i=n.call(e,t);if("object"!=typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==o(e))throw TypeError("RegExp#exec called on incompatible receiver");return r.call(e,t)}},function(e,t,n){"use strict";function o(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n=48&&o<=90?String.fromCharCode(o):o>=112&&o<=123?"F"+(o-111):"["+o+"]"},u=function(e){var t=window.event?e.which:e.keyCode,n=e.ctrlKey,o=e.altKey,r=e.shiftKey;return{keyCode:t,ctrlKey:n,altKey:o,shiftKey:r,hasModifierKeys:n||o||r,keyString:d(n,o,r,t)}},s=function(){for(var e=0,t=Object.keys(l);e=112&&c<=123){i.log(d);for(var s,m=o(p);!(s=m()).done;)(0,s.value)(n,r)}}}(t,n,e)},document.addEventListener("keydown",(function(e){var n=window.event?e.which:e.keyCode;t(e,"keydown"),l[n]=!0})),document.addEventListener("keyup",(function(e){var n=window.event?e.which:e.keyCode;t(e,"keyup"),l[n]=!1})),Byond.IS_LTE_IE8||function(e){var t;document.addEventListener("focusout",(function(){t=setTimeout(e)})),document.addEventListener("focusin",(function(){clearTimeout(t)})),window.addEventListener("beforeunload",e)}((function(){s()})),function(e){return function(t){return e(t)}}}},function(e,t,n){"use strict";var o=n(7),r=n(8),i=o.document,a=r(i)&&r(i.createElement);e.exports=function(e){return a?i.createElement(e):{}}},function(e,t,n){"use strict";var o=n(7),r=n(30);e.exports=function(e,t){try{r(o,e,t)}catch(n){o[e]=t}return t}},function(e,t,n){"use strict";var o=n(130),r=Function.toString;"function"!=typeof o.inspectSource&&(o.inspectSource=function(e){return r.call(e)}),e.exports=o.inspectSource},function(e,t,n){"use strict";var o=n(41),r=n(130);(e.exports=function(e,t){return r[e]||(r[e]=t!==undefined?t:{})})("versions",[]).push({version:"3.6.5",mode:o?"pure":"global",copyright:"\xa9 2020 Denis Pushkarev (zloirock.ru)"})},function(e,t,n){"use strict";var o=n(39),r=n(51),i=n(97),a=n(10);e.exports=o("Reflect","ownKeys")||function(e){var t=r.f(a(e)),n=i.f;return n?t.concat(n(e)):t}},function(e,t,n){"use strict";e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(e,t,n){"use strict";t.f=Object.getOwnPropertySymbols},function(e,t,n){"use strict";var o=n(5);e.exports=!!Object.getOwnPropertySymbols&&!o((function(){return!String(Symbol())}))},function(e,t,n){"use strict";var o,r,i=n(7),a=n(76),c=i.process,l=c&&c.versions,d=l&&l.v8;d?r=(o=d.split("."))[0]+o[1]:a&&(!(o=a.match(/Edge\/(\d+)/))||o[1]>=74)&&(o=a.match(/Chrome\/(\d+)/))&&(r=o[1]),e.exports=r&&+r},function(e,t,n){"use strict";var o=n(18),r=n(45),i=n(12);e.exports=function(e){for(var t=o(this),n=i(t.length),a=arguments.length,c=r(a>1?arguments[1]:undefined,n),l=a>2?arguments[2]:undefined,d=l===undefined?n:r(l,n);d>c;)t[c++]=e;return t}},function(e,t,n){"use strict";var o=n(13),r=n(69),i=o("iterator"),a=Array.prototype;e.exports=function(e){return e!==undefined&&(r.Array===e||a[i]===e)}},function(e,t,n){"use strict";var o=n(77),r=n(69),i=n(13)("iterator");e.exports=function(e){if(e!=undefined)return e[i]||e["@@iterator"]||r[o(e)]}},function(e,t,n){"use strict";var o={};o[n(13)("toStringTag")]="z",e.exports="[object z]"===String(o)},function(e,t,n){"use strict";var o=n(4),r=n(218),i=n(37),a=n(54),c=n(47),l=n(30),d=n(24),u=n(13),s=n(41),p=n(69),m=n(144),f=m.IteratorPrototype,h=m.BUGGY_SAFARI_ITERATORS,C=u("iterator"),g=function(){return this};e.exports=function(e,t,n,u,m,b,N){r(n,t,u);var v,V,y,k=function(e){if(e===m&&S)return S;if(!h&&e in w)return w[e];switch(e){case"keys":case"values":case"entries":return function(){return new n(this,e)}}return function(){return new n(this)}},x=t+" Iterator",_=!1,w=e.prototype,B=w[C]||w["@@iterator"]||m&&w[m],S=!h&&B||k(m),L="Array"==t&&w.entries||B;if(L&&(v=i(L.call(new e)),f!==Object.prototype&&v.next&&(s||i(v)===f||(a?a(v,f):"function"!=typeof v[C]&&l(v,C,g)),c(v,x,!0,!0),s&&(p[x]=g))),"values"==m&&B&&"values"!==B.name&&(_=!0,S=function(){return B.call(this)}),s&&!N||w[C]===S||l(w,C,S),p[t]=S,m)if(V={values:k("values"),keys:b?S:k("keys"),entries:k("entries")},N)for(y in V)(h||_||!(y in w))&&d(w,y,V[y]);else o({target:t,proto:!0,forced:h||_},V);return V}},function(e,t,n){"use strict";var o=n(5);e.exports=!o((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},function(e,t,n){"use strict";e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},function(e,t,n){"use strict";var o=n(12),r=n(108),i=n(23),a=Math.ceil,c=function(e){return function(t,n,c){var l,d,u=String(i(t)),s=u.length,p=c===undefined?" ":String(c),m=o(n);return m<=s||""==p?u:(l=m-s,(d=r.call(p,a(l/p.length))).length>l&&(d=d.slice(0,l)),e?u+d:d+u)}};e.exports={start:c(!1),end:c(!0)}},function(e,t,n){"use strict";var o=n(31),r=n(23);e.exports="".repeat||function(e){var t=String(r(this)),n="",i=o(e);if(i<0||i==Infinity)throw RangeError("Wrong number of repetitions");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n}},function(e,t,n){"use strict";e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},function(e,t,n){"use strict";var o,r,i,a=n(7),c=n(5),l=n(34),d=n(52),u=n(137),s=n(91),p=n(156),m=a.location,f=a.setImmediate,h=a.clearImmediate,C=a.process,g=a.MessageChannel,b=a.Dispatch,N=0,v={},V=function(e){if(v.hasOwnProperty(e)){var t=v[e];delete v[e],t()}},y=function(e){return function(){V(e)}},k=function(e){V(e.data)},x=function(e){a.postMessage(e+"",m.protocol+"//"+m.host)};f&&h||(f=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return v[++N]=function(){("function"==typeof e?e:Function(e)).apply(undefined,t)},o(N),N},h=function(e){delete v[e]},"process"==l(C)?o=function(e){C.nextTick(y(e))}:b&&b.now?o=function(e){b.now(y(e))}:g&&!p?(i=(r=new g).port2,r.port1.onmessage=k,o=d(i.postMessage,i,1)):!a.addEventListener||"function"!=typeof postMessage||a.importScripts||c(x)||"file:"===m.protocol?o="onreadystatechange"in s("script")?function(e){u.appendChild(s("script")).onreadystatechange=function(){u.removeChild(this),V(e)}}:function(e){setTimeout(y(e),0)}:(o=x,a.addEventListener("message",k,!1))),e.exports={set:f,clear:h}},function(e,t,n){"use strict";var o=n(8),r=n(34),i=n(13)("match");e.exports=function(e){var t;return o(e)&&((t=e[i])!==undefined?!!t:"RegExp"==r(e))}},function(e,t,n){"use strict";var o=n(5);function r(e,t){return RegExp(e,t)}t.UNSUPPORTED_Y=o((function(){var e=r("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),t.BROKEN_CARET=o((function(){var e=r("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},function(e,t,n){"use strict";var o=n(31),r=n(23),i=function(e){return function(t,n){var i,a,c=String(r(t)),l=o(n),d=c.length;return l<0||l>=d?e?"":undefined:(i=c.charCodeAt(l))<55296||i>56319||l+1===d||(a=c.charCodeAt(l+1))<56320||a>57343?e?c.charAt(l):i:e?c.slice(l,l+2):a-56320+(i-55296<<10)+65536}};e.exports={codeAt:i(!1),charAt:i(!0)}},function(e,t,n){"use strict";var o=n(111);e.exports=function(e){if(o(e))throw TypeError("The method doesn't accept regular expressions");return e}},function(e,t,n){"use strict";var o=n(13)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[o]=!1,"/./"[e](t)}catch(r){}}return!1}},function(e,t,n){"use strict";var o=n(113).charAt;e.exports=function(e,t,n){return t+(n?o(e,t).length:1)}},function(e,t,n){"use strict";var o=n(5),r=n(84);e.exports=function(e){return o((function(){return!!r[e]()||"\u200b\x85\u180e"!="\u200b\x85\u180e"[e]()||r[e].name!==e}))}},function(e,t,n){"use strict";var o=n(7),r=n(5),i=n(78),a=n(11).NATIVE_ARRAY_BUFFER_VIEWS,c=o.ArrayBuffer,l=o.Int8Array;e.exports=!a||!r((function(){l(1)}))||!r((function(){new l(-1)}))||!i((function(e){new l,new l(null),new l(1.5),new l(e)}),!0)||r((function(){return 1!==new l(new c(2),1,undefined).length}))},function(e,t,n){"use strict";t.__esModule=!0,t.vecNormalize=t.vecLength=t.vecInverse=t.vecScale=t.vecDivide=t.vecMultiply=t.vecSubtract=t.vecAdd=void 0;var o=n(16),r=function(e,t){return e+t},i=function(e,t){return e-t},a=function(e,t){return e*t},c=function(e,t){return e/t};t.vecAdd=function(){for(var e=arguments.length,t=new Array(e),n=0;n=0||(r[n]=e[n]);return r}(e,["className","scrollable","children"]);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Layout__content",n&&"Layout__content--scrollable",t].concat((0,i.computeBoxClassName)(c))),a,0,Object.assign({id:"Layout__content"},(0,i.computeBoxProps)(c))))}},function(e,t,n){"use strict";t.__esModule=!0,t.AnimatedNumber=void 0;var o=n(15),r=n(0);var i=function(e){return"number"==typeof e&&Number.isFinite(e)&&!Number.isNaN(e)},a=function(e){var t,n;function r(t){var n;return(n=e.call(this,t)||this).timer=null,n.state={value:0},i(t.initial)?n.state.value=t.initial:i(t.value)&&(n.state.value=Number(t.value)),n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var a=r.prototype;return a.tick=function(){var e=this.props,t=this.state,n=Number(t.value),o=Number(e.value);if(i(o)){var r=.5*n+.5*o;this.setState({value:r})}},a.componentDidMount=function(){var e=this;this.timer=setInterval((function(){return e.tick()}),50)},a.componentWillUnmount=function(){clearTimeout(this.timer)},a.render=function(){var e=this.props,t=this.state,n=e.format,r=e.children,a=t.value,c=e.value;if(!i(c))return c||null;var l=a;if(n)l=n(a);else{var d=String(c).split(".")[1],u=d?d.length:0;l=(0,o.toFixed)(a,(0,o.clamp)(u,0,8))}return"function"==typeof r?r(l,a):l},r}(r.Component);t.AnimatedNumber=a},function(e,t,n){"use strict";t.__esModule=!0,t.ButtonInput=t.ButtonConfirm=t.ButtonCheckbox=t.Button=void 0;var o=n(0),r=n(6),i=n(90),a=n(2),c=n(44),l=n(17),d=n(124),u=n(169);function s(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function p(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}var m=(0,c.createLogger)("Button"),f=function(e){var t=e.className,n=e.fluid,c=e.icon,s=e.color,f=e.disabled,h=e.selected,C=e.tooltip,g=e.tooltipPosition,b=e.ellipsis,N=e.content,v=e.iconRotation,V=e.iconSpin,y=e.children,k=e.onclick,x=e.onClick,_=p(e,["className","fluid","icon","color","disabled","selected","tooltip","tooltipPosition","ellipsis","content","iconRotation","iconSpin","children","onclick","onClick"]),w=!(!N&&!y);return k&&m.warn("Lowercase 'onclick' is not supported on Button and lowercase prop names are discouraged in general. Please use a camelCase'onClick' instead and read: https://infernojs.org/docs/guides/event-handling"),(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.Box,Object.assign({className:(0,r.classes)(["Button",n&&"Button--fluid",f&&"Button--disabled",h&&"Button--selected",w&&"Button--hasContent",b&&"Button--ellipsis",s&&"string"==typeof s?"Button--color--"+s:"Button--color--default",t]),tabIndex:!f&&"0",unselectable:Byond.IS_LTE_IE8,onclick:function(e){(0,a.refocusLayout)(),!f&&x&&x(e)},onKeyDown:function(e){var t=window.event?e.which:e.keyCode;return t===i.KEY_SPACE||t===i.KEY_ENTER?(e.preventDefault(),void(!f&&x&&x(e))):t===i.KEY_ESCAPE?(e.preventDefault(),void(0,a.refocusLayout)()):void 0}},_,{children:[c&&(0,o.createComponentVNode)(2,d.Icon,{name:c,rotation:v,spin:V}),N,y,C&&(0,o.createComponentVNode)(2,u.Tooltip,{content:C,position:g})]})))};t.Button=f,f.defaultHooks=r.pureComponentHooks;var h=function(e){var t=e.checked,n=p(e,["checked"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,f,Object.assign({color:"transparent",icon:t?"check-square-o":"square-o",selected:t},n)))};t.ButtonCheckbox=h,f.Checkbox=h;var C=function(e){function t(){var t;return(t=e.call(this)||this).state={clickedOnce:!1},t.handleClick=function(){t.state.clickedOnce&&t.setClickedOnce(!1)},t}s(t,e);var n=t.prototype;return n.setClickedOnce=function(e){var t=this;this.setState({clickedOnce:e}),e?setTimeout((function(){return window.addEventListener("click",t.handleClick)})):window.removeEventListener("click",this.handleClick)},n.render=function(){var e=this,t=this.props,n=t.confirmContent,r=void 0===n?"Confirm?":n,i=t.confirmColor,a=void 0===i?"bad":i,c=t.confirmIcon,l=t.icon,d=t.color,u=t.content,s=t.onClick,m=p(t,["confirmContent","confirmColor","confirmIcon","icon","color","content","onClick"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,f,Object.assign({content:this.state.clickedOnce?r:u,icon:this.state.clickedOnce?c:l,color:this.state.clickedOnce?a:d,onClick:function(){return e.state.clickedOnce?s():e.setClickedOnce(!0)}},m)))},t}(o.Component);t.ButtonConfirm=C,f.Confirm=C;var g=function(e){function t(){var t;return(t=e.call(this)||this).inputRef=(0,o.createRef)(),t.state={inInput:!1},t}s(t,e);var n=t.prototype;return n.setInInput=function(e){if(this.setState({inInput:e}),this.inputRef){var t=this.inputRef.current;if(e){t.value=this.props.currentValue||"";try{t.focus(),t.select()}catch(n){}}}},n.commitResult=function(e){if(this.inputRef){var t=this.inputRef.current;if(""!==t.value)return void this.props.onCommit(e,t.value);if(!this.props.defaultValue)return;this.props.onCommit(e,this.props.defaultValue)}},n.render=function(){var e=this,t=this.props,n=t.fluid,a=t.content,c=t.icon,s=t.iconRotation,m=t.iconSpin,f=t.tooltip,h=t.tooltipPosition,C=t.color,g=void 0===C?"default":C,b=(t.placeholder,t.maxLength,p(t,["fluid","content","icon","iconRotation","iconSpin","tooltip","tooltipPosition","color","placeholder","maxLength"]));return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.Box,Object.assign({className:(0,r.classes)(["Button",n&&"Button--fluid","Button--color--"+g])},b,{onClick:function(){return e.setInInput(!0)},children:[c&&(0,o.createComponentVNode)(2,d.Icon,{name:c,rotation:s,spin:m}),(0,o.createVNode)(1,"div",null,a,0),(0,o.createVNode)(64,"input","NumberInput__input",null,1,{style:{display:this.state.inInput?undefined:"none","text-align":"left"},onBlur:function(t){e.state.inInput&&(e.setInInput(!1),e.commitResult(t))},onKeyDown:function(t){if(t.keyCode===i.KEY_ENTER)return e.setInInput(!1),void e.commitResult(t);t.keyCode===i.KEY_ESCAPE&&e.setInInput(!1)}},null,this.inputRef),f&&(0,o.createComponentVNode)(2,u.Tooltip,{content:f,position:h})]})))},t}(o.Component);t.ButtonInput=g,f.Input=g},function(e,t,n){"use strict";t.__esModule=!0,t.Icon=void 0;var o=n(0),r=n(6),i=n(17);var a=/-o$/,c=function(e){var t=e.name,n=e.size,c=e.spin,l=e.className,d=e.style,u=void 0===d?{}:d,s=e.rotation,p=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}(e,["name","size","spin","className","style","rotation"]);n&&(u["font-size"]=100*n+"%"),"number"==typeof s&&(u.transform="rotate("+s+"deg)");var m=a.test(t),f=t.replace(a,"");return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({as:"i",className:(0,r.classes)([l,m?"far":"fas","fa-"+f,c&&"fa-spin"]),style:u},p)))};t.Icon=c,c.defaultHooks=r.pureComponentHooks},function(e,t,n){"use strict";t.__esModule=!0,t.DraggableControl=void 0;var o=n(0),r=n(15),i=n(6),a=n(122);var c=function(e,t){return e.screenX*t[0]+e.screenY*t[1]},l=function(e){var t,n;function i(t){var n;return(n=e.call(this,t)||this).inputRef=(0,o.createRef)(),n.state={value:t.value,dragging:!1,editing:!1,internalValue:null,origin:null,suppressingFlicker:!1},n.flickerTimer=null,n.suppressFlicker=function(){var e=n.props.suppressFlicker;e>0&&(n.setState({suppressingFlicker:!0}),clearTimeout(n.flickerTimer),n.flickerTimer=setTimeout((function(){return n.setState({suppressingFlicker:!1})}),e))},n.handleDragStart=function(e){var t=n.props,o=t.value,r=t.dragMatrix;n.state.editing||(document.body.style["pointer-events"]="none",n.ref=e.target,n.setState({dragging:!1,origin:c(e,r),value:o,internalValue:o}),n.timer=setTimeout((function(){n.setState({dragging:!0})}),250),n.dragInterval=setInterval((function(){var t=n.state,o=t.dragging,r=t.value,i=n.props.onDrag;o&&i&&i(e,r)}),500),document.addEventListener("mousemove",n.handleDragMove),document.addEventListener("mouseup",n.handleDragEnd))},n.handleDragMove=function(e){var t=n.props,o=t.minValue,i=t.maxValue,a=t.step,l=t.stepPixelSize,d=t.dragMatrix;n.setState((function(t){var n=Object.assign({},t),u=c(e,d)-n.origin;if(t.dragging){var s=Number.isFinite(o)?o%a:0;n.internalValue=(0,r.clamp)(n.internalValue+u*a/l,o-a,i+a),n.value=(0,r.clamp)(n.internalValue-n.internalValue%a+s,o,i),n.origin=c(e,d)}else Math.abs(u)>4&&(n.dragging=!0);return n}))},n.handleDragEnd=function(e){var t=n.props,o=t.onChange,r=t.onDrag,i=n.state,a=i.dragging,c=i.value,l=i.internalValue;if(document.body.style["pointer-events"]="auto",clearTimeout(n.timer),clearInterval(n.dragInterval),n.setState({dragging:!1,editing:!a,origin:null}),document.removeEventListener("mousemove",n.handleDragMove),document.removeEventListener("mouseup",n.handleDragEnd),a)n.suppressFlicker(),o&&o(e,c),r&&r(e,c);else if(n.inputRef){var d=n.inputRef.current;d.value=l;try{d.focus(),d.select()}catch(u){}}},n}return n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n,i.prototype.render=function(){var e=this,t=this.state,n=t.dragging,i=t.editing,c=t.value,l=t.suppressingFlicker,d=this.props,u=d.animated,s=d.value,p=d.unit,m=d.minValue,f=d.maxValue,h=d.format,C=d.onChange,g=d.onDrag,b=d.children,N=d.height,v=d.lineHeight,V=d.fontSize,y=s;(n||l)&&(y=c);var k=function(e){return e+(p?" "+p:"")},x=u&&!n&&!l&&(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:y,format:h,children:k})||k(h?h(y):y),_=(0,o.createVNode)(64,"input","NumberInput__input",null,1,{style:{display:i?undefined:"none",height:N,"line-height":v,"font-size":V},onBlur:function(t){if(i){var n=(0,r.clamp)(t.target.value,m,f);e.setState({editing:!1,value:n}),e.suppressFlicker(),C&&C(t,n),g&&g(t,n)}},onKeyDown:function(t){if(13===t.keyCode){var n=(0,r.clamp)(t.target.value,m,f);return e.setState({editing:!1,value:n}),e.suppressFlicker(),C&&C(t,n),void(g&&g(t,n))}27!==t.keyCode||e.setState({editing:!1})}},null,this.inputRef);return b({dragging:n,editing:i,value:s,displayValue:y,displayElement:x,inputElement:_,handleDragStart:this.handleDragStart})},i}(o.Component);t.DraggableControl=l,l.defaultHooks=i.pureComponentHooks,l.defaultProps={minValue:-Infinity,maxValue:+Infinity,step:1,stepPixelSize:1,suppressFlicker:50,dragMatrix:[1,0]}},function(e,t,n){"use strict";t.__esModule=!0,t.NumberInput=void 0;var o=n(0),r=n(15),i=n(6),a=n(122),c=n(17);var l=function(e){var t,n;function l(t){var n;n=e.call(this,t)||this;var i=t.value;return n.inputRef=(0,o.createRef)(),n.state={value:i,dragging:!1,editing:!1,internalValue:null,origin:null,suppressingFlicker:!1},n.flickerTimer=null,n.suppressFlicker=function(){var e=n.props.suppressFlicker;e>0&&(n.setState({suppressingFlicker:!0}),clearTimeout(n.flickerTimer),n.flickerTimer=setTimeout((function(){return n.setState({suppressingFlicker:!1})}),e))},n.handleDragStart=function(e){var t=n.props.value;n.state.editing||(document.body.style["pointer-events"]="none",n.ref=e.target,n.setState({dragging:!1,origin:e.screenY,value:t,internalValue:t}),n.timer=setTimeout((function(){n.setState({dragging:!0})}),250),n.dragInterval=setInterval((function(){var t=n.state,o=t.dragging,r=t.value,i=n.props.onDrag;o&&i&&i(e,r)}),500),document.addEventListener("mousemove",n.handleDragMove),document.addEventListener("mouseup",n.handleDragEnd))},n.handleDragMove=function(e){var t=n.props,o=t.minValue,i=t.maxValue,a=t.step,c=t.stepPixelSize;n.setState((function(t){var n=Object.assign({},t),l=n.origin-e.screenY;if(t.dragging){var d=Number.isFinite(o)?o%a:0;n.internalValue=(0,r.clamp)(n.internalValue+l*a/c,o-a,i+a),n.value=(0,r.clamp)(n.internalValue-n.internalValue%a+d,o,i),n.origin=e.screenY}else Math.abs(l)>4&&(n.dragging=!0);return n}))},n.handleDragEnd=function(e){var t=n.props,o=t.onChange,r=t.onDrag,i=n.state,a=i.dragging,c=i.value,l=i.internalValue;if(document.body.style["pointer-events"]="auto",clearTimeout(n.timer),clearInterval(n.dragInterval),n.setState({dragging:!1,editing:!a,origin:null}),document.removeEventListener("mousemove",n.handleDragMove),document.removeEventListener("mouseup",n.handleDragEnd),a)n.suppressFlicker(),o&&o(e,c),r&&r(e,c);else if(n.inputRef){var d=n.inputRef.current;d.value=l;try{d.focus(),d.select()}catch(u){}}},n}return n=e,(t=l).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n,l.prototype.render=function(){var e=this,t=this.state,n=t.dragging,l=t.editing,d=t.value,u=t.suppressingFlicker,s=this.props,p=s.className,m=s.fluid,f=s.animated,h=s.value,C=s.unit,g=s.minValue,b=s.maxValue,N=s.height,v=s.width,V=s.lineHeight,y=s.fontSize,k=s.format,x=s.onChange,_=s.onDrag,w=h;(n||u)&&(w=d);var B=function(e){return(0,o.createVNode)(1,"div","NumberInput__content",e+(C?" "+C:""),0,{unselectable:Byond.IS_LTE_IE8})},S=f&&!n&&!u&&(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:w,format:k,children:B})||B(k?k(w):w);return(0,o.createComponentVNode)(2,c.Box,{className:(0,i.classes)(["NumberInput",m&&"NumberInput--fluid",p]),minWidth:v,minHeight:N,lineHeight:V,fontSize:y,onMouseDown:this.handleDragStart,children:[(0,o.createVNode)(1,"div","NumberInput__barContainer",(0,o.createVNode)(1,"div","NumberInput__bar",null,1,{style:{height:(0,r.clamp)((w-g)/(b-g)*100,0,100)+"%"}}),2),S,(0,o.createVNode)(64,"input","NumberInput__input",null,1,{style:{display:l?undefined:"none",height:N,"line-height":V,"font-size":y},onBlur:function(t){if(l){var n=(0,r.clamp)(t.target.value,g,b);e.setState({editing:!1,value:n}),e.suppressFlicker(),x&&x(t,n),_&&_(t,n)}},onKeyDown:function(t){if(13===t.keyCode){var n=(0,r.clamp)(t.target.value,g,b);return e.setState({editing:!1,value:n}),e.suppressFlicker(),x&&x(t,n),void(_&&_(t,n))}27!==t.keyCode||e.setState({editing:!1})}},null,this.inputRef)]})},l}(o.Component);t.NumberInput=l,l.defaultHooks=i.pureComponentHooks,l.defaultProps={minValue:-Infinity,maxValue:+Infinity,step:1,stepPixelSize:1,suppressFlicker:50}},function(e,t,n){"use strict";t.__esModule=!0,t.GenericUplink=t.Uplink=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(40),l=n(2);t.Uplink=function(e,t){var n=(0,i.useBackend)(t).data.telecrystals;return(0,o.createComponentVNode)(2,l.Window,{width:620,height:580,theme:"syndicate",resizable:!0,children:(0,o.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,d,{currencyAmount:n,currencySymbol:"TC"})})})};var d=function(e,t){var n,l,d=e.currencyAmount,s=void 0===d?0:d,p=e.currencySymbol,m=void 0===p?"cr":p,f=(0,i.useBackend)(t),h=f.act,C=f.data,g=C.compactMode,b=C.lockable,N=C.categories,v=void 0===N?[]:N,V=(0,i.useLocalState)(t,"searchText",""),y=V[0],k=V[1],x=(0,i.useLocalState)(t,"category",null==(n=v[0])?void 0:n.name),_=x[0],w=x[1],B=(0,r.createSearch)(y,(function(e){return e.name+e.desc})),S=y.length>0&&v.flatMap((function(e){return e.items||[]})).filter(B).filter((function(e,t){return t<25}))||(null==(l=v.find((function(e){return e.name===_})))?void 0:l.items)||[];return(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:s>0?"good":"bad",children:[(0,c.formatMoney)(s)," ",m]}),buttons:(0,o.createFragment)([(0,o.createTextVNode)("Search"),(0,o.createComponentVNode)(2,a.Input,{autoFocus:!0,value:y,onInput:function(e,t){return k(t)},mx:1}),(0,o.createComponentVNode)(2,a.Button,{icon:g?"list":"info",content:g?"Compact":"Detailed",onClick:function(){return h("compact_toggle")}}),!!b&&(0,o.createComponentVNode)(2,a.Button,{icon:"lock",content:"Lock",onClick:function(){return h("lock")}})],0),children:(0,o.createComponentVNode)(2,a.Flex,{children:[0===y.length&&(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Tabs,{vertical:!0,children:v.map((function(e){var t;return(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:e.name===_,onClick:function(){return w(e.name)},children:[e.name," (",(null==(t=e.items)?void 0:t.length)||0,")"]},e.name)}))})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,basis:0,children:[0===S.length&&(0,o.createComponentVNode)(2,a.NoticeBox,{children:0===y.length?"No items in this category.":"No results found."}),(0,o.createComponentVNode)(2,u,{compactMode:y.length>0||g,currencyAmount:s,currencySymbol:m,items:S})]})]})})};t.GenericUplink=d;var u=function(e,t){var n=e.compactMode,l=e.currencyAmount,d=e.currencySymbol,u=(0,i.useBackend)(t).act,s=(0,i.useLocalState)(t,"hoveredItem",{}),p=s[0],m=s[1],f=p&&p.cost||0,h=e.items.map((function(e){var t=p&&p.name!==e.name,n=l-f50?"battery-half":"battery-quarter")||1===t&&"bolt"||2===t&&"battery-full",color:0===t&&(n>50?"yellow":"red")||1===t&&"yellow"||2===t&&"green"}),(0,o.createComponentVNode)(2,d.Box,{inline:!0,width:"36px",textAlign:"right",children:(0,a.toFixed)(n)+"%"})],4)};t.AreaCharge=f,f.defaultHooks=c.pureComponentHooks;var h=function(e){var t=e.status,n=Boolean(2&t),r=Boolean(1&t),i=(n?"On":"Off")+" ["+(r?"auto":"manual")+"]";return(0,o.createComponentVNode)(2,d.ColorBox,{color:n?"good":"bad",content:r?undefined:"M",title:i})};h.defaultHooks=c.pureComponentHooks},function(e,t,n){"use strict";var o=n(9),r=n(5),i=n(91);e.exports=!o&&!r((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(e,t,n){"use strict";var o=n(7),r=n(92),i=o["__core-js_shared__"]||r("__core-js_shared__",{});e.exports=i},function(e,t,n){"use strict";var o=n(7),r=n(93),i=o.WeakMap;e.exports="function"==typeof i&&/native code/.test(r(i))},function(e,t,n){"use strict";var o=n(20),r=n(95),i=n(22),a=n(14);e.exports=function(e,t){for(var n=r(t),c=a.f,l=i.f,d=0;dl;)o(c,n=t[l++])&&(~i(d,n)||d.push(n));return d}},function(e,t,n){"use strict";var o=n(98);e.exports=o&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(e,t,n){"use strict";var o=n(9),r=n(14),i=n(10),a=n(66);e.exports=o?Object.defineProperties:function(e,t){i(e);for(var n,o=a(t),c=o.length,l=0;c>l;)r.f(e,n=o[l++],t[n]);return e}},function(e,t,n){"use strict";var o=n(39);e.exports=o("document","documentElement")},function(e,t,n){"use strict";var o=n(26),r=n(51).f,i={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return a&&"[object Window]"==i.call(e)?function(e){try{return r(e)}catch(t){return a.slice()}}(e):r(o(e))}},function(e,t,n){"use strict";var o=n(13);t.f=o},function(e,t,n){"use strict";var o=n(18),r=n(45),i=n(12),a=Math.min;e.exports=[].copyWithin||function(e,t){var n=o(this),c=i(n.length),l=r(e,c),d=r(t,c),u=arguments.length>2?arguments[2]:undefined,s=a((u===undefined?c:r(u,c))-d,c-l),p=1;for(d0;)d in n?n[l]=n[d]:delete n[l],l+=p,d+=p;return n}},function(e,t,n){"use strict";var o=n(56),r=n(12),i=n(52);e.exports=function a(e,t,n,c,l,d,u,s){for(var p,m=l,f=0,h=!!u&&i(u,s,3);f0&&o(p))m=a(e,t,p,r(p.length),m,d-1)-1;else{if(m>=9007199254740991)throw TypeError("Exceed the acceptable array length");e[m]=p}m++}f++}return m}},function(e,t,n){"use strict";var o=n(10);e.exports=function(e,t,n,r){try{return r?t(o(n)[0],n[1]):t(n)}catch(a){var i=e["return"];throw i!==undefined&&o(i.call(e)),a}}},function(e,t,n){"use strict";var o=n(26),r=n(48),i=n(69),a=n(36),c=n(104),l=a.set,d=a.getterFor("Array Iterator");e.exports=c(Array,"Array",(function(e,t){l(this,{type:"Array Iterator",target:o(e),index:0,kind:t})}),(function(){var e=d(this),t=e.target,n=e.kind,o=e.index++;return!t||o>=t.length?(e.target=undefined,{value:undefined,done:!0}):"keys"==n?{value:o,done:!1}:"values"==n?{value:t[o],done:!1}:{value:[o,t[o]],done:!1}}),"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(e,t,n){"use strict";var o,r,i,a=n(37),c=n(30),l=n(20),d=n(13),u=n(41),s=d("iterator"),p=!1;[].keys&&("next"in(i=[].keys())?(r=a(a(i)))!==Object.prototype&&(o=r):p=!0),o==undefined&&(o={}),u||l(o,s)||c(o,s,(function(){return this})),e.exports={IteratorPrototype:o,BUGGY_SAFARI_ITERATORS:p}},function(e,t,n){"use strict";var o=n(8);e.exports=function(e){if(!o(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},function(e,t,n){"use strict";var o=n(26),r=n(31),i=n(12),a=n(42),c=n(25),l=Math.min,d=[].lastIndexOf,u=!!d&&1/[1].lastIndexOf(1,-0)<0,s=a("lastIndexOf"),p=c("indexOf",{ACCESSORS:!0,1:0}),m=u||!s||!p;e.exports=m?function(e){if(u)return d.apply(this,arguments)||0;var t=o(this),n=i(t.length),a=n-1;for(arguments.length>1&&(a=l(a,r(arguments[1]))),a<0&&(a=n+a);a>=0;a--)if(a in t&&t[a]===e)return a||0;return-1}:d},function(e,t,n){"use strict";var o=n(31),r=n(12);e.exports=function(e){if(e===undefined)return 0;var t=o(e),n=r(t);if(t!==n)throw RangeError("Wrong length or index");return n}},function(e,t,n){"use strict";var o=n(32),r=n(8),i=[].slice,a={},c=function(e,t,n){if(!(t in a)){for(var o=[],r=0;r1?arguments[1]:undefined,3);t=t?t.next:n.first;)for(o(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!g(this,e)}}),i(u.prototype,n?{get:function(e){var t=g(this,e);return t&&t.value},set:function(e,t){return C(this,0===e?0:e,t)}}:{add:function(e){return C(this,e=0===e?0:e,e)}}),s&&o(u.prototype,"size",{get:function(){return m(this).size}}),u},setStrong:function(e,t,n){var o=t+" Iterator",r=h(t),i=h(o);d(e,t,(function(e,t){f(this,{type:o,target:e,state:r(e),kind:t,last:undefined})}),(function(){for(var e=i(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?"keys"==t?{value:n.key,done:!1}:"values"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=undefined,{value:undefined,done:!0})}),n?"entries":"values",!n,!0),u(t)}}},function(e,t,n){"use strict";var o=Math.log;e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:o(1+e)}},function(e,t,n){"use strict";var o=n(8),r=Math.floor;e.exports=function(e){return!o(e)&&isFinite(e)&&r(e)===e}},function(e,t,n){"use strict";var o=n(7),r=n(59).trim,i=n(84),a=o.parseInt,c=/^[+-]?0[Xx]/,l=8!==a(i+"08")||22!==a(i+"0x16");e.exports=l?function(e,t){var n=r(String(e));return a(n,t>>>0||(c.test(n)?16:10))}:a},function(e,t,n){"use strict";var o=n(9),r=n(66),i=n(26),a=n(74).f,c=function(e){return function(t){for(var n,c=i(t),l=r(c),d=l.length,u=0,s=[];d>u;)n=l[u++],o&&!a.call(c,n)||s.push(e?[n,c[n]]:c[n]);return s}};e.exports={entries:c(!0),values:c(!1)}},function(e,t,n){"use strict";e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},function(e,t,n){"use strict";var o=n(7);e.exports=o.Promise},function(e,t,n){"use strict";var o=n(76);e.exports=/(iphone|ipod|ipad).*applewebkit/i.test(o)},function(e,t,n){"use strict";var o,r,i,a,c,l,d,u,s=n(7),p=n(22).f,m=n(34),f=n(110).set,h=n(156),C=s.MutationObserver||s.WebKitMutationObserver,g=s.process,b=s.Promise,N="process"==m(g),v=p(s,"queueMicrotask"),V=v&&v.value;V||(o=function(){var e,t;for(N&&(e=g.domain)&&e.exit();r;){t=r.fn,r=r.next;try{t()}catch(n){throw r?a():i=undefined,n}}i=undefined,e&&e.enter()},N?a=function(){g.nextTick(o)}:C&&!h?(c=!0,l=document.createTextNode(""),new C(o).observe(l,{characterData:!0}),a=function(){l.data=c=!c}):b&&b.resolve?(d=b.resolve(undefined),u=d.then,a=function(){u.call(d,o)}):a=function(){f.call(s,o)}),e.exports=V||function(e){var t={fn:e,next:undefined};i&&(i.next=t),r||(r=t,a()),i=t}},function(e,t,n){"use strict";var o=n(10),r=n(8),i=n(159);e.exports=function(e,t){if(o(e),r(t)&&t.constructor===e)return t;var n=i.f(e);return(0,n.resolve)(t),n.promise}},function(e,t,n){"use strict";var o=n(32),r=function(e){var t,n;this.promise=new e((function(e,o){if(t!==undefined||n!==undefined)throw TypeError("Bad Promise constructor");t=e,n=o})),this.resolve=o(t),this.reject=o(n)};e.exports.f=function(e){return new r(e)}},function(e,t,n){"use strict";var o=n(4),r=n(87);o({target:"RegExp",proto:!0,forced:/./.exec!==r},{exec:r})},function(e,t,n){"use strict";var o=n(76);e.exports=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(o)},function(e,t,n){"use strict";var o=n(362);e.exports=function(e,t){var n=o(e);if(n%t)throw RangeError("Wrong offset");return n}},function(e,t,n){"use strict";var o=n(18),r=n(12),i=n(102),a=n(101),c=n(52),l=n(11).aTypedArrayConstructor;e.exports=function(e){var t,n,d,u,s,p,m=o(e),f=arguments.length,h=f>1?arguments[1]:undefined,C=h!==undefined,g=i(m);if(g!=undefined&&!a(g))for(p=(s=g.call(m)).next,m=[];!(u=p.call(s)).done;)m.push(u.value);for(C&&f>2&&(h=c(h,arguments[2],2)),n=r(m.length),d=new(l(this))(n),t=0;n>t;t++)d[t]=C?h(m[t],t):m[t];return d}},function(e,t,n){"use strict";var o=n(70),r=n(55).getWeakData,i=n(10),a=n(8),c=n(58),l=n(72),d=n(21),u=n(20),s=n(36),p=s.set,m=s.getterFor,f=d.find,h=d.findIndex,C=0,g=function(e){return e.frozen||(e.frozen=new b)},b=function(){this.entries=[]},N=function(e,t){return f(e.entries,(function(e){return e[0]===t}))};b.prototype={get:function(e){var t=N(this,e);if(t)return t[1]},has:function(e){return!!N(this,e)},set:function(e,t){var n=N(this,e);n?n[1]=t:this.entries.push([e,t])},"delete":function(e){var t=h(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,d){var s=e((function(e,o){c(e,s,t),p(e,{type:t,id:C++,frozen:undefined}),o!=undefined&&l(o,e[d],e,n)})),f=m(t),h=function(e,t,n){var o=f(e),a=r(i(t),!0);return!0===a?g(o).set(t,n):a[o.id]=n,e};return o(s.prototype,{"delete":function(e){var t=f(this);if(!a(e))return!1;var n=r(e);return!0===n?g(t)["delete"](e):n&&u(n,t.id)&&delete n[t.id]},has:function(e){var t=f(this);if(!a(e))return!1;var n=r(e);return!0===n?g(t).has(e):n&&u(n,t.id)}}),o(s.prototype,n?{get:function(e){var t=f(this);if(a(e)){var n=r(e);return!0===n?g(t).get(e):n?n[t.id]:undefined}},set:function(e,t){return h(this,e,t)}}:{add:function(e){return h(this,e,!0)}}),s}}},function(e,t,n){"use strict";t.__esModule=!0,t.perf=void 0;var o={mark:function(e,t){0},measure:function(e,t){0}};t.perf=o},function(e,t,n){"use strict";t.__esModule=!0,t.setupHotReloading=t.sendLogEntry=void 0;t.sendLogEntry=function(e,t){};t.setupHotReloading=function(){0}},function(e,t,n){"use strict";t.__esModule=!0,t.resizeStartHandler=t.dragStartHandler=t.setupDrag=t.recallWindowGeometry=t.storeWindowGeometry=t.getScreenSize=t.getScreenPosition=t.setWindowSize=t.setWindowPosition=t.getWindowSize=t.getWindowPosition=t.setWindowKey=void 0;var o=n(422),r=n(119);function i(e,t,n,o,r,i,a){try{var c=e[i](a),l=c.value}catch(d){return void n(d)}c.done?t(l):Promise.resolve(l).then(o,r)}function a(e){return function(){var t=this,n=arguments;return new Promise((function(o,r){var a=e.apply(t,n);function c(e){i(a,o,r,c,l,"next",e)}function l(e){i(a,o,r,c,l,"throw",e)}c(undefined)}))}}var c,l,d,u,s,p=(0,n(44).createLogger)("drag"),m=window.__windowId__,f=!1,h=!1,C=[0,0];t.setWindowKey=function(e){m=e};var g=function(){return[window.screenLeft,window.screenTop]};t.getWindowPosition=g;var b=function(){return[window.innerWidth,window.innerHeight]};t.getWindowSize=b;var N=function(e){var t=(0,r.vecAdd)(e,C);return Byond.winset(window.__windowId__,{pos:t[0]+","+t[1]})};t.setWindowPosition=N;var v=function(e){return Byond.winset(window.__windowId__,{size:e[0]+"x"+e[1]})};t.setWindowSize=v;var V=function(){return[0-C[0],0-C[1]]};t.getScreenPosition=V;var y=function(){return[window.screen.availWidth,window.screen.availHeight]};t.getScreenSize=y;var k=function(e){p.log("storing geometry");var t={pos:g(),size:b()};o.storage.set(e,t);var n=function(e,t,n){void 0===n&&(n=50);for(var o,r=[t],i=0;il&&(r[a]=l-t[a],i=!0)}return[i,r]};t.dragStartHandler=function(e){p.log("drag start"),f=!0,l=[window.screenLeft-e.screenX,window.screenTop-e.screenY],document.addEventListener("mousemove",S),document.addEventListener("mouseup",B),S(e)};var B=function T(e){p.log("drag end"),S(e),document.removeEventListener("mousemove",S),document.removeEventListener("mouseup",T),f=!1,k(m)},S=function(e){f&&(e.preventDefault(),N((0,r.vecAdd)([e.screenX,e.screenY],l)))};t.resizeStartHandler=function(e,t){return function(n){d=[e,t],p.log("resize start",d),h=!0,l=[window.screenLeft-n.screenX,window.screenTop-n.screenY],u=[window.innerWidth,window.innerHeight],document.addEventListener("mousemove",I),document.addEventListener("mouseup",L),I(n)}};var L=function A(e){p.log("resize end",s),I(e),document.removeEventListener("mousemove",I),document.removeEventListener("mouseup",A),h=!1,k(m)},I=function(e){h&&(e.preventDefault(),(s=(0,r.vecAdd)(u,(0,r.vecMultiply)(d,(0,r.vecAdd)([e.screenX,e.screenY],(0,r.vecInverse)([window.screenLeft,window.screenTop]),l,[1,1]))))[0]=Math.max(s[0],150),s[1]=Math.max(s[1],50),v(s))}},function(e,t,n){"use strict";t.__esModule=!0,t.useDispatch=t.StoreProvider=t.createStore=void 0;var o=n(33),r=n(423),i=n(0),a=n(1),c=n(120),l=n(90);(0,n(44).createLogger)("store");t.createStore=function(){var e=(0,o.flow)([function(e,t){return void 0===e&&(e={}),e},(0,r.combineReducers)({debug:c.debugReducer,backend:a.backendReducer})]),t=[l.hotKeyMiddleware,a.backendMiddleware];return(0,r.createStore)(e,r.applyMiddleware.apply(void 0,t))};var d=function(e){var t,n;function o(){return e.apply(this,arguments)||this}n=e,(t=o).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var r=o.prototype;return r.getChildContext=function(){return{store:this.props.store}},r.render=function(){return this.props.children},o}(i.Component);t.StoreProvider=d;t.useDispatch=function(e){return e.store.dispatch}},function(e,t,n){"use strict";t.__esModule=!0,t.Tooltip=void 0;var o=n(0),r=n(6);t.Tooltip=function(e){var t=e.content,n=e.position,i=void 0===n?"bottom":n,a="string"==typeof t&&t.length>35;return(0,o.createVNode)(1,"div",(0,r.classes)(["Tooltip",a&&"Tooltip--long",i&&"Tooltip--"+i]),null,1,{"data-tooltip":t})}},function(e,t,n){"use strict";t.__esModule=!0,t.Dimmer=void 0;var o=n(0),r=n(6),i=n(17);t.Dimmer=function(e){var t=e.className,n=e.children,a=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}(e,["className","children"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({className:(0,r.classes)(["Dimmer"].concat(t))},a,{children:(0,o.createVNode)(1,"div","Dimmer__inner",n,0)})))}},function(e,t,n){"use strict";t.__esModule=!0,t.Divider=void 0;var o=n(0),r=n(6);t.Divider=function(e){var t=e.vertical,n=e.hidden;return(0,o.createVNode)(1,"div",(0,r.classes)(["Divider",n&&"Divider--hidden",t?"Divider--vertical":"Divider--horizontal"]))}},function(e,t,n){"use strict";t.__esModule=!0,t.FlexItem=t.computeFlexItemProps=t.Flex=t.computeFlexProps=void 0;var o=n(0),r=n(6),i=n(17);function a(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}var c=function(e){var t=e.className,n=e.direction,o=e.wrap,i=e.align,c=e.justify,l=e.inline,d=e.spacing,u=void 0===d?0:d,s=a(e,["className","direction","wrap","align","justify","inline","spacing"]);return Object.assign({className:(0,r.classes)(["Flex",Byond.IS_LTE_IE10&&("column"===n?"Flex--iefix--column":"Flex--iefix"),l&&"Flex--inline",u>0&&"Flex--spacing--"+u,t]),style:Object.assign({},s.style,{"flex-direction":n,"flex-wrap":o,"align-items":i,"justify-content":c})},s)};t.computeFlexProps=c;var l=function(e){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({},c(e))))};t.Flex=l,l.defaultHooks=r.pureComponentHooks;var d=function(e){var t=e.className,n=e.grow,o=e.order,c=e.shrink,l=e.basis,d=void 0===l?e.width:l,u=e.align,s=a(e,["className","grow","order","shrink","basis","align"]);return Object.assign({className:(0,r.classes)(["Flex__item",Byond.IS_LTE_IE10&&"Flex__item--iefix",t]),style:Object.assign({},s.style,{"flex-grow":n,"flex-shrink":c,"flex-basis":(0,i.unit)(d),order:o,"align-self":u})},s)};t.computeFlexItemProps=d;var u=function(e){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({},d(e))))};t.FlexItem=u,u.defaultHooks=r.pureComponentHooks,l.Item=u},function(e,t,n){"use strict";t.__esModule=!0,t.TableCell=t.TableRow=t.Table=void 0;var o=n(0),r=n(6),i=n(17);function a(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}var c=function(e){var t=e.className,n=e.collapsing,c=e.children,l=a(e,["className","collapsing","children"]);return(0,o.normalizeProps)((0,o.createVNode)(1,"table",(0,r.classes)(["Table",n&&"Table--collapsing",t,(0,i.computeBoxClassName)(l)]),(0,o.createVNode)(1,"tbody",null,c,0),2,Object.assign({},(0,i.computeBoxProps)(l))))};t.Table=c,c.defaultHooks=r.pureComponentHooks;var l=function(e){var t=e.className,n=e.header,c=a(e,["className","header"]);return(0,o.normalizeProps)((0,o.createVNode)(1,"tr",(0,r.classes)(["Table__row",n&&"Table__row--header",t,(0,i.computeBoxClassName)(e)]),null,1,Object.assign({},(0,i.computeBoxProps)(c))))};t.TableRow=l,l.defaultHooks=r.pureComponentHooks;var d=function(e){var t=e.className,n=e.collapsing,c=e.header,l=a(e,["className","collapsing","header"]);return(0,o.normalizeProps)((0,o.createVNode)(1,"td",(0,r.classes)(["Table__cell",n&&"Table__cell--collapsing",c&&"Table__cell--header",t,(0,i.computeBoxClassName)(e)]),null,1,Object.assign({},(0,i.computeBoxProps)(l))))};t.TableCell=d,d.defaultHooks=r.pureComponentHooks,c.Row=l,c.Cell=d},function(e,t,n){"use strict";t.__esModule=!0,t.LabeledListDivider=t.LabeledListItem=t.LabeledList=void 0;var o=n(0),r=n(6),i=n(17),a=n(171),c=function(e){var t=e.children;return(0,o.createVNode)(1,"table","LabeledList",t,0)};t.LabeledList=c,c.defaultHooks=r.pureComponentHooks;var l=function(e){var t=e.className,n=e.label,a=e.labelColor,c=void 0===a?"label":a,l=e.color,d=e.textAlign,u=e.buttons,s=e.content,p=e.children;return(0,o.createVNode)(1,"tr",(0,r.classes)(["LabeledList__row",t]),[(0,o.createComponentVNode)(2,i.Box,{as:"td",color:c,className:(0,r.classes)(["LabeledList__cell","LabeledList__label"]),children:n?n+":":null}),(0,o.createComponentVNode)(2,i.Box,{as:"td",color:l,textAlign:d,className:(0,r.classes)(["LabeledList__cell","LabeledList__content"]),colSpan:u?undefined:2,children:[s,p]}),u&&(0,o.createVNode)(1,"td","LabeledList__cell LabeledList__buttons",u,0)],0)};t.LabeledListItem=l,l.defaultHooks=r.pureComponentHooks;var d=function(e){var t=e.size?(0,i.unit)(Math.max(0,e.size-1)):0;return(0,o.createVNode)(1,"tr","LabeledList__row",(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,a.Divider),2,{colSpan:3,style:{"padding-top":t,"padding-bottom":t}}),2)};t.LabeledListDivider=d,d.defaultHooks=r.pureComponentHooks,c.Item=l,c.Divider=d},function(e,t,n){"use strict";t.__esModule=!0,t.Window=void 0;var o=n(0),r=n(6),i=n(19),a=n(1),c=n(3),l=n(38),d=n(120),u=n(167),s=n(44),p=n(168),m=n(121);var f=(0,s.createLogger)("Window"),h=[400,600],C=function(e){var t,n;function c(){return e.apply(this,arguments)||this}n=e,(t=c).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var s=c.prototype;return s.componentDidMount=function(){var e=(0,a.useBackend)(this.context),t=e.config;if(!e.suspended){f.log("mounting");var n=Object.assign({size:h},t.window);this.props.width&&this.props.height&&(n.size=[this.props.width,this.props.height]),(0,u.setWindowKey)(t.window.key),(0,u.recallWindowGeometry)(t.window.key,n),(0,m.refocusLayout)()}},s.render=function(){var e,t=this.props,n=t.resizable,c=t.theme,s=t.title,h=t.children,C=(0,a.useBackend)(this.context),g=C.config,N=C.suspended,v=(0,d.useDebug)(this.context).debugLayout,V=(0,p.useDispatch)(this.context),y=null==(e=g.window)?void 0:e.fancy,k=g.user.observer?g.status=0||(r[n]=e[n]);return r}(e,["className","fitted","children"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,m.Layout.Content,Object.assign({className:(0,r.classes)(["Window__content",t])},a,{children:n&&i||(0,o.createVNode)(1,"div","Window__contentPadding",i,0)})))};var g=function(e){switch(e){case l.UI_INTERACTIVE:return"good";case l.UI_UPDATE:return"average";case l.UI_DISABLED:default:return"bad"}},b=function(e,t){var n=e.className,a=e.title,l=e.status,d=e.fancy,u=e.onDragStart,s=e.onClose;(0,p.useDispatch)(t);return(0,o.createVNode)(1,"div",(0,r.classes)(["TitleBar",n]),[(0,o.createComponentVNode)(2,c.Icon,{className:"TitleBar__statusIcon",color:g(l),name:"eye"}),(0,o.createVNode)(1,"div","TitleBar__title","string"==typeof a&&a===a.toLowerCase()&&(0,i.toTitleCase)(a)||a,0),(0,o.createVNode)(1,"div","TitleBar__dragZone",null,1,{onMousedown:function(e){return d&&u(e)}}),!1,!!d&&(0,o.createVNode)(1,"div","TitleBar__close TitleBar__clickable",Byond.IS_LTE_IE8?"x":"\xd7",0,{onclick:s})],0)}},function(e,t,n){"use strict";t.__esModule=!0,t.AiRestorerContent=t.AiRestorer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.AiRestorer=function(){return(0,o.createComponentVNode)(2,a.Window,{width:370,height:360,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.AI_present,d=c.error,u=c.name,s=c.laws,p=c.isDead,m=c.restoring,f=c.health,h=c.ejectable;return(0,o.createFragment)([d&&(0,o.createComponentVNode)(2,i.NoticeBox,{textAlign:"center",children:d}),!!h&&(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"eject",content:l?u:"----------",disabled:!l,onClick:function(){return a("PRG_eject")}}),!!l&&(0,o.createComponentVNode)(2,i.Section,{title:h?"System Status":u,buttons:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,color:p?"bad":"good",children:p?"Nonfunctional":"Functional"}),children:[(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Integrity",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:f,minValue:0,maxValue:100,ranges:{good:[70,Infinity],average:[50,70],bad:[-Infinity,50]}})})}),!!m&&(0,o.createComponentVNode)(2,i.Box,{bold:!0,textAlign:"center",fontSize:"20px",color:"good",mt:1,children:"RECONSTRUCTION IN PROGRESS"}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"plus",content:"Begin Reconstruction",disabled:m,mt:1,onClick:function(){return a("PRG_beginReconstruction")}}),(0,o.createComponentVNode)(2,i.Section,{title:"Laws",level:2,children:s.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{className:"candystripe",children:e},e)}))})]})],0)};t.AiRestorerContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.AccessList=void 0;var o=n(0),r=n(16),i=n(1),a=n(3);function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return l(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return l(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n0&&"yellow",selected:"requests"===p,onClick:function(){return f("requests")},children:["Requests (",g.length,")"]}),!h&&(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"shopping-cart",textColor:"cart"!==p&&C.length>0&&"yellow",selected:"cart"===p,onClick:function(){return f("cart")},children:["Checkout (",C.length,")"]})]}),"catalog"===p&&(0,o.createComponentVNode)(2,u),"requests"===p&&(0,o.createComponentVNode)(2,s),"cart"===p&&(0,o.createComponentVNode)(2,m)]})})};var d=function(e,t){var n=(0,i.useBackend)(t),r=n.act,l=n.data,d=l.away,u=l.docked,s=l.loan,p=l.loan_dispatched,m=l.location,f=l.message,h=l.points,C=l.requestonly;return(0,o.createComponentVNode)(2,a.Section,{title:"Cargo",buttons:(0,o.createComponentVNode)(2,a.Box,{inline:!0,bold:!0,children:[(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:h,format:function(e){return(0,c.formatMoney)(e)}})," credits"]}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Shuttle",children:u&&!C&&(0,o.createComponentVNode)(2,a.Button,{content:m,onClick:function(){return r("send")}})||m}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"CentCom Message",children:f}),!!s&&!C&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Loan",children:!p&&(0,o.createComponentVNode)(2,a.Button,{content:"Loan Shuttle",disabled:!(d&&u),onClick:function(){return r("loan")}})||(0,o.createComponentVNode)(2,a.Box,{color:"bad",children:"Loaned to Centcom"})})]})})},u=function(e,t){var n,l=e.express,d=(0,i.useBackend)(t),u=d.act,s=d.data,m=s.self_paid,f=(0,r.toArray)(s.supplies),h=(0,i.useSharedState)(t,"supply",null==(n=f[0])?void 0:n.name),C=h[0],g=h[1],b=f.find((function(e){return e.name===C}));return(0,o.createComponentVNode)(2,a.Section,{title:"Catalog",buttons:!l&&(0,o.createFragment)([(0,o.createComponentVNode)(2,p),(0,o.createComponentVNode)(2,a.Button.Checkbox,{ml:2,content:"Buy Privately",checked:m,onClick:function(){return u("toggleprivate")}})],4),children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Tabs,{vertical:!0,children:f.map((function(e){return(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:e.name===C,onClick:function(){return g(e.name)},children:[e.name," (",e.packs.length,")"]},e.name)}))})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,a.Table,{children:null==b?void 0:b.packs.map((function(e){var t=[];return e.small_item&&t.push("Small"),e.access&&t.push("Restricted"),(0,o.createComponentVNode)(2,a.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.name}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,color:"label",textAlign:"right",children:t.join(", ")}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,tooltip:e.desc,tooltipPosition:"left",onClick:function(){return u("add",{id:e.id})},children:[(0,c.formatMoney)(m&&!e.goody?Math.round(1.1*e.cost):e.cost)," cr"]})})]},e.name)}))})})]})})};t.CargoCatalog=u;var s=function(e,t){var n=(0,i.useBackend)(t),r=n.act,l=n.data,d=l.requestonly,u=l.requests||[];return(0,o.createComponentVNode)(2,a.Section,{title:"Active Requests",buttons:!d&&(0,o.createComponentVNode)(2,a.Button,{icon:"times",content:"Clear",color:"transparent",onClick:function(){return r("denyall")}}),children:[0===u.length&&(0,o.createComponentVNode)(2,a.Box,{color:"good",children:"No Requests"}),u.length>0&&(0,o.createComponentVNode)(2,a.Table,{children:u.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,color:"label",children:["#",e.id]}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.object}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createVNode)(1,"b",null,e.orderer,0)}),(0,o.createComponentVNode)(2,a.Table.Cell,{width:"25%",children:(0,o.createVNode)(1,"i",null,e.reason,0)}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:[(0,c.formatMoney)(e.cost)," cr"]}),!d&&(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,children:[(0,o.createComponentVNode)(2,a.Button,{icon:"check",color:"good",onClick:function(){return r("approve",{id:e.id})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"times",color:"bad",onClick:function(){return r("deny",{id:e.id})}})]})]},e.id)}))})]})},p=function(e,t){var n=(0,i.useBackend)(t),r=n.act,l=n.data,d=l.requestonly,u=l.cart||[],s=u.reduce((function(e,t){return e+t.cost}),0);return d?null:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{inline:!0,mx:1,children:[0===u.length&&"Cart is empty",1===u.length&&"1 item",u.length>=2&&u.length+" items"," ",s>0&&"("+(0,c.formatMoney)(s)+" cr)"]}),(0,o.createComponentVNode)(2,a.Button,{icon:"times",color:"transparent",content:"Clear",onClick:function(){return r("clear")}})],4)},m=function(e,t){var n=(0,i.useBackend)(t),r=n.act,l=n.data,d=l.requestonly,u=l.away,s=l.docked,m=l.location,f=l.cart||[];return(0,o.createComponentVNode)(2,a.Section,{title:"Current Cart",buttons:(0,o.createComponentVNode)(2,p),children:[0===f.length&&(0,o.createComponentVNode)(2,a.Box,{color:"label",children:"Nothing in cart"}),f.length>0&&(0,o.createComponentVNode)(2,a.Table,{children:f.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,color:"label",children:["#",e.id]}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.object}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,children:!!e.paid&&(0,o.createVNode)(1,"b",null,"[Paid Privately]",16)}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:[(0,c.formatMoney)(e.cost)," cr"]}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,children:(0,o.createComponentVNode)(2,a.Button,{icon:"minus",onClick:function(){return r("remove",{id:e.id})}})})]},e.id)}))}),f.length>0&&!d&&(0,o.createComponentVNode)(2,a.Box,{mt:2,children:1===u&&1===s&&(0,o.createComponentVNode)(2,a.Button,{color:"green",style:{"line-height":"28px",padding:"0 12px"},content:"Confirm the order",onClick:function(){return r("send")}})||(0,o.createComponentVNode)(2,a.Box,{opacity:.5,children:["Shuttle in ",m,"."]})})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.BeakerContents=void 0;var o=n(0),r=n(3);t.BeakerContents=function(e){var t=e.beakerLoaded,n=e.beakerContents;return(0,o.createComponentVNode)(2,r.Box,{children:[!t&&(0,o.createComponentVNode)(2,r.Box,{color:"label",children:"No beaker loaded."})||0===n.length&&(0,o.createComponentVNode)(2,r.Box,{color:"label",children:"Beaker is empty."}),n.map((function(e){return(0,o.createComponentVNode)(2,r.Box,{color:"label",children:[e.volume," units of ",e.name]},e.name)}))]})}},function(e,t,n){"use strict";t.__esModule=!0,t.LaunchpadConsole=t.LaunchpadControl=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=function(e,t){var n=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,i.Grid,{width:"1px",children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:[(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-left",iconRotation:45,mb:1,onClick:function(){return n("move_pos",{x:-1,y:1})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-left",mb:1,onClick:function(){return n("move_pos",{x:-1})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-down",iconRotation:45,mb:1,onClick:function(){return n("move_pos",{x:-1,y:-1})}})]}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:[(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-up",mb:1,onClick:function(){return n("move_pos",{y:1})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"R",mb:1,onClick:function(){return n("set_pos",{x:0,y:0})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-down",mb:1,onClick:function(){return n("move_pos",{y:-1})}})]}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:[(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-up",iconRotation:45,mb:1,onClick:function(){return n("move_pos",{x:1,y:1})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-right",mb:1,onClick:function(){return n("move_pos",{x:1})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-right",iconRotation:45,mb:1,onClick:function(){return n("move_pos",{x:1,y:-1})}})]})]})},l=function(e,t){var n=e.topLevel,a=(0,r.useBackend)(t),l=a.act,d=a.data,u=d.x,s=d.y,p=d.pad_name,m=d.range;return(0,o.createComponentVNode)(2,i.Section,{title:(0,o.createComponentVNode)(2,i.Input,{value:p,width:"170px",onChange:function(e,t){return l("rename",{name:t})}}),level:n?1:2,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"times",content:"Remove",color:"bad",onClick:function(){return l("remove")}}),children:[(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Controls",level:2,children:(0,o.createComponentVNode)(2,c)})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Target",level:2,children:(0,o.createComponentVNode)(2,i.Box,{fontSize:"26px",children:[(0,o.createComponentVNode)(2,i.Box,{mb:1,children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,mr:1,children:"X:"}),(0,o.createComponentVNode)(2,i.NumberInput,{value:u,minValue:-m,maxValue:m,lineHeight:"30px",fontSize:"26px",width:"90px",height:"30px",stepPixelSize:10,onChange:function(e,t){return l("set_pos",{x:t})}})]}),(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,mr:1,children:"Y:"}),(0,o.createComponentVNode)(2,i.NumberInput,{value:s,minValue:-m,maxValue:m,stepPixelSize:10,lineHeight:"30px",fontSize:"26px",width:"90px",height:"30px",onChange:function(e,t){return l("set_pos",{y:t})}})]})]})})})]}),(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"upload",content:"Launch",textAlign:"center",onClick:function(){return l("launch")}})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"download",content:"Pull",textAlign:"center",onClick:function(){return l("pull")}})})]})]})};t.LaunchpadControl=l;t.LaunchpadConsole=function(e,t){var n=(0,r.useBackend)(t),c=n.act,d=n.data,u=d.launchpads,s=void 0===u?[]:u,p=d.selected_id;return(0,o.createComponentVNode)(2,a.Window,{width:475,height:260,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:0===s.length&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No Pads Connected"})||(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Flex,{minHeight:"190px",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{width:"140px",minHeight:"190px",children:s.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{fluid:!0,ellipsis:!0,content:e.name,selected:p===e.id,color:"transparent",onClick:function(){return c("select_pad",{id:e.id})}},e.name)}))}),(0,o.createComponentVNode)(2,i.Flex.Item,{minHeight:"100%",children:(0,o.createComponentVNode)(2,i.Divider,{vertical:!0})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,minHeight:"100%",children:p&&(0,o.createComponentVNode)(2,l)||(0,o.createComponentVNode)(2,i.Box,{children:"Please select a pad"})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosCyborgRemoteMonitorContent=t.NtosCyborgRemoteMonitor=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosCyborgRemoteMonitor=function(e,t){return(0,o.createComponentVNode)(2,a.NtosWindow,{width:600,height:800,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.card,d=c.cyborgs,u=void 0===d?[]:d;return u.length?(0,o.createFragment)([!l&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Certain features require an ID card login."}),u.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"terminal",content:"Send Message",color:"blue",disabled:!l,onClick:function(){return a("messagebot",{ref:e.ref})}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:(0,o.createComponentVNode)(2,i.Box,{color:e.status?"bad":e.locked_down?"average":"good",children:e.status?"Not Responding":e.locked_down?"Locked Down":e.shell_discon?"Nominal/Disconnected":"Nominal"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Charge",children:(0,o.createComponentVNode)(2,i.Box,{color:e.charge<=30?"bad":e.charge<=70?"average":"good",children:"number"==typeof e.charge?e.charge+"%":"Not Found"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Module",children:e.module}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Upgrades",children:e.upgrades})]})},e.ref)}))],0):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No cyborg units detected."})};t.NtosCyborgRemoteMonitorContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.NtosRadarContent=t.NtosRadar=void 0;var o=n(0),r=n(6),i=n(1),a=n(3),c=n(2);t.NtosRadar=function(e,t){return(0,o.createComponentVNode)(2,c.NtosWindow,{width:800,height:600,theme:"ntos",children:(0,o.createComponentVNode)(2,l)})};var l=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.selected,s=d.object,p=void 0===s?[]:s,m=d.target,f=void 0===m?[]:m,h=d.scanning;return(0,o.createComponentVNode)(2,a.Flex,{direction:"row",hight:"100%",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{position:"relative",width:20.5,hight:"100%",children:(0,o.createComponentVNode)(2,c.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"redo-alt",content:h?"Scanning...":"Scan",color:"blue",disabled:h,onClick:function(){return l("scan")}}),!p.length&&!h&&(0,o.createVNode)(1,"div",null,"No trackable signals found",16),!h&&p.map((function(e){return(0,o.createVNode)(1,"div",(0,r.classes)(["Button","Button--fluid","Button--color--transparent","Button--ellipsis",e.ref===u&&"Button--selected"]),e.name,0,{title:e.name,onClick:function(){l("selecttarget",{ref:e.ref})}},e.dev)}))]})})}),(0,o.createComponentVNode)(2,a.Flex.Item,{style:{"background-image":'url("ntosradarbackground.png")',"background-position":"center","background-repeat":"no-repeat",top:"20px"},position:"relative",m:1.5,width:45,height:45,children:0===Object.keys(f).length?!!u&&(0,o.createComponentVNode)(2,a.NoticeBox,{position:"absolute",top:20.6,left:1.35,width:42,fontSize:"30px",textAlign:"center",children:"Signal Lost"}):!!f.userot&&(0,o.createComponentVNode)(2,a.Box,{as:"img",src:f.arrowstyle,position:"absolute",top:"20px",left:"243px",style:{transform:"rotate("+f.rot+"deg)"}})||(0,o.createComponentVNode)(2,a.Icon,{name:f.pointer,position:"absolute",size:2,color:f.color,top:10*f.locy+19+"px",left:10*f.locx+16+"px"})})]})};t.NtosRadarContent=l},function(e,t,n){"use strict";t.__esModule=!0,t.RequestKioskContent=t.RequestKiosk=void 0;var o=n(0),r=n(1),i=n(3),a=n(40),c=n(2);t.RequestKiosk=function(e,t){return(0,o.createComponentVNode)(2,c.Window,{width:550,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,l)})})};var l=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.accountName,u=l.requests,s=void 0===u?[]:u,p=l.applicants,m=void 0===p?[]:p,f=l.bountyValue;l.bountyText;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Account",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",content:"Log out",onClick:function(){return c("clear")}}),children:d||"N/A"})})}),(0,o.createComponentVNode)(2,i.Flex,{mb:1,children:[(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:null==s?void 0:s.map((function(e){return(0,o.createComponentVNode)(2,i.Collapsible,{title:e.owner,width:"300px",children:(0,o.createComponentVNode)(2,i.Section,{width:"300px",children:[(0,o.createComponentVNode)(2,i.Flex,{spacing:1,align:"baseline",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{bold:!0,width:"310px",children:e.owner}),(0,o.createComponentVNode)(2,i.Flex.Item,{width:"100px",children:(0,a.formatMoney)(e.value)+" cr"}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"pen-fancy",content:"Apply",onClick:function(){return c("apply",{request:e.acc_number})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"trash-alt",content:"Delete",color:"red",onClick:function(){return c("deleteRequest",{request:e.acc_number})}})]})]}),(0,o.createComponentVNode)(2,i.Section,{align:"center",children:(0,o.createVNode)(1,"i",null,[(0,o.createTextVNode)('"'),e.description,(0,o.createTextVNode)('"')],0)}),(0,o.createComponentVNode)(2,i.Section,{title:"Request Applicants",children:null==m?void 0:m.map((function(t){return t.request_id===e.acc_number&&(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,p:.5,backgroundColor:"rgba(0, 0, 69, 0.5)",width:"510px",style:{border:"2px solid rgba(13, 13, 213, 0.7)"},children:t.name}),(0,o.createComponentVNode)(2,i.Flex.Item,{align:"end",children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"cash-register",onClick:function(){return c("payApplicant",{applicant:t.requestee_id,request:e.acc_number})}})})]})}))})]},e.name)},e.name)}))}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Collapsible,{title:"New Bounty",width:"220px",color:"green",children:(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.TextArea,{fluid:!0,height:"250px",width:"200px",backgroundColor:"black",textColor:"white",onChange:function(e,t){return c("bountyText",{bountytext:t})}}),(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.NumberInput,{animate:!0,unit:"cr",minValue:1,maxValue:1e3,value:f,width:"80px",onChange:function(e,t){return c("bountyVal",{bountyval:t})}})}),(0,o.createComponentVNode)(2,i.Button,{icon:"print",content:"Submit bounty",onClick:function(){return c("createBounty")}})]})})})]})],4)};t.RequestKioskContent=l},function(e,t,n){"use strict";t.__esModule=!0,t.StationAlertConsoleContent=t.StationAlertConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.StationAlertConsole=function(){return(0,o.createComponentVNode)(2,a.Window,{width:325,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t).data.alarms||[],a=n.Fire||[],c=n.Atmosphere||[],l=n.Power||[];return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Fire Alarms",children:(0,o.createVNode)(1,"ul",null,[0===a.length&&(0,o.createVNode)(1,"li","color-good","Systems Nominal",16),a.map((function(e){return(0,o.createVNode)(1,"li","color-average",e,0,null,e)}))],0)}),(0,o.createComponentVNode)(2,i.Section,{title:"Atmospherics Alarms",children:(0,o.createVNode)(1,"ul",null,[0===c.length&&(0,o.createVNode)(1,"li","color-good","Systems Nominal",16),c.map((function(e){return(0,o.createVNode)(1,"li","color-average",e,0,null,e)}))],0)}),(0,o.createComponentVNode)(2,i.Section,{title:"Power Alarms",children:(0,o.createVNode)(1,"ul",null,[0===l.length&&(0,o.createVNode)(1,"li","color-good","Systems Nominal",16),l.map((function(e){return(0,o.createVNode)(1,"li","color-average",e,0,null,e)}))],0)})],4)};t.StationAlertConsoleContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.PortableBasicInfo=void 0;var o=n(0),r=n(1),i=n(3);t.PortableBasicInfo=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.connected,d=c.holding,u=c.on,s=c.pressure;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Status",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u?"power-off":"times",content:u?"On":"Off",selected:u,onClick:function(){return a("power")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Pressure",children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:s})," kPa"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Port",color:l?"good":"average",children:l?"Connected":"Not Connected"})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Holding Tank",minHeight:"82px",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",disabled:!d,onClick:function(){return a("eject")}}),children:d?(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Label",children:d.name}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Pressure",children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:d.pressure})," kPa"]})]}):(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"No holding tank"})})],4)}},function(e,t,n){e.exports=n(187)},function(e,t,n){"use strict";n(188),n(189),n(190),n(191),n(192),n(193),n(194),n(195),n(196),n(197),n(198),n(199),n(200),n(201),n(202),n(203),n(204),n(205),n(206),n(207),n(208),n(209),n(210),n(211),n(213),n(215),n(216),n(217),n(143),n(219),n(220),n(221),n(222),n(223),n(224),n(225),n(226),n(227),n(228),n(229),n(230),n(231),n(232),n(234),n(235),n(236),n(237),n(238),n(240),n(241),n(243),n(244),n(245),n(246),n(247),n(248),n(249),n(250),n(251),n(252),n(253),n(254),n(255),n(256),n(258),n(259),n(260),n(261),n(262),n(263),n(264),n(265),n(266),n(267),n(268),n(269),n(270),n(272),n(273),n(274),n(275),n(276),n(277),n(279),n(280),n(282),n(284),n(285),n(286),n(287),n(288),n(289),n(290),n(291),n(292),n(293),n(294),n(295),n(296),n(297),n(298),n(299),n(300),n(301),n(302),n(303),n(304),n(305),n(306),n(308),n(309),n(310),n(313),n(314),n(315),n(316),n(317),n(318),n(319),n(320),n(321),n(322),n(323),n(324),n(325),n(326),n(327),n(160),n(328),n(329),n(330),n(331),n(332),n(333),n(334),n(335),n(336),n(337),n(338),n(339),n(340),n(341),n(342),n(343),n(344),n(345),n(346),n(347),n(348),n(349),n(350),n(351),n(352),n(353),n(354),n(355),n(356),n(357),n(358),n(359),n(360),n(361),n(363),n(364),n(365),n(366),n(367),n(368),n(369),n(370),n(371),n(372),n(373),n(374),n(375),n(376),n(377),n(378),n(379),n(380),n(381),n(382),n(383),n(384),n(385),n(386),n(387),n(388),n(389),n(390),n(391),n(392),n(393),n(394),n(395),n(396),n(397),n(398),n(399),n(400);var o=n(0);n(402),n(403),n(404),n(405),n(406),n(407),n(408),n(409),n(410),n(411),n(412),n(413),n(414),n(415),n(416);var r=n(165),i=(n(166),n(417)),a=n(1),c=n(167),l=n(44),d=n(168);r.perf.mark("inception",window.__inception__),r.perf.mark("init");var u,s=(0,d.createStore)(),p=!0,m=function(){for(s.subscribe((function(){!function(){var e;r.perf.mark("render/start");var t=s.getState(),m=(0,a.selectBackend)(t),f=m.suspended,h=m.assets;p&&(l.logger.log("initial render",t),"recycled"!==p&&(0,c.setupDrag)());var C=(0,n(424).getRoutedComponent)(t),g=(0,o.createComponentVNode)(2,d.StoreProvider,{store:s,children:(0,o.createComponentVNode)(2,C)});u||(u=document.getElementById("react-root")),(0,o.render)(g,u),f||(r.perf.mark("render/finish"),p&&(p=!1),null==h||null==(e=h.styles)||e.forEach((function(e){return(0,i.loadCSS)(e)})))}()})),window.update=function(e){var t=(0,a.selectBackend)(s.getState()).suspended,n="string"==typeof e?function(e){var t=function(e,t){return"object"==typeof t&&null!==t&&t.__number__?parseFloat(t.__number__):t};Byond.IS_LTE_IE8&&(t=undefined);try{return JSON.parse(e,t)}catch(o){l.logger.log(o),l.logger.log("What we got:",e);var n=o&&o.message;throw new Error("JSON parsing error: "+n)}}(e):e;l.logger.debug("received message '"+(null==n?void 0:n.type)+"'");var o=n.type,r=n.payload;if("update"===o)return window.__ref__=r.config.ref,t&&(l.logger.log("reinitializing to:",r.config.ref),p="recycled"),void s.dispatch((0,a.backendUpdate)(r));"suspend"!==o?"ping"!==o?l.logger.log("unhandled message",n):(0,a.sendMessage)({type:"pingReply"}):s.dispatch((0,a.backendSuspendSuccess)())};;){var e=window.__updateQueue__.shift();if(!e)break;window.update(e)}(0,i.loadCSS)("font-awesome.css")};window.__logger__={fatal:function(e,t){var n=(0,a.selectBackend)(s.getState()),o={config:n.config,suspended:n.suspended,suspending:n.suspending};return l.logger.log("FatalError:",e||t),l.logger.log("State:",o),t+="\nState: "+JSON.stringify(o)}},"loading"===document.readyState?document.addEventListener("DOMContentLoaded",m):m()},function(e,t,n){"use strict";var o=n(4),r=n(7),i=n(39),a=n(41),c=n(9),l=n(98),d=n(135),u=n(5),s=n(20),p=n(56),m=n(8),f=n(10),h=n(18),C=n(26),g=n(35),b=n(50),N=n(46),v=n(66),V=n(51),y=n(138),k=n(97),x=n(22),_=n(14),w=n(74),B=n(30),S=n(24),L=n(94),I=n(75),T=n(63),A=n(62),E=n(13),M=n(139),P=n(27),R=n(47),O=n(36),F=n(21).forEach,j=I("hidden"),D=E("toPrimitive"),z=O.set,W=O.getterFor("Symbol"),H=Object.prototype,U=r.Symbol,G=i("JSON","stringify"),K=x.f,q=_.f,Y=y.f,$=w.f,X=L("symbols"),Q=L("op-symbols"),J=L("string-to-symbol-registry"),Z=L("symbol-to-string-registry"),ee=L("wks"),te=r.QObject,ne=!te||!te.prototype||!te.prototype.findChild,oe=c&&u((function(){return 7!=N(q({},"a",{get:function(){return q(this,"a",{value:7}).a}})).a}))?function(e,t,n){var o=K(H,t);o&&delete H[t],q(e,t,n),o&&e!==H&&q(H,t,o)}:q,re=function(e,t){var n=X[e]=N(U.prototype);return z(n,{type:"Symbol",tag:e,description:t}),c||(n.description=t),n},ie=d?function(e){return"symbol"==typeof e}:function(e){return Object(e)instanceof U},ae=function(e,t,n){e===H&&ae(Q,t,n),f(e);var o=g(t,!0);return f(n),s(X,o)?(n.enumerable?(s(e,j)&&e[j][o]&&(e[j][o]=!1),n=N(n,{enumerable:b(0,!1)})):(s(e,j)||q(e,j,b(1,{})),e[j][o]=!0),oe(e,o,n)):q(e,o,n)},ce=function(e,t){f(e);var n=C(t),o=v(n).concat(pe(n));return F(o,(function(t){c&&!de.call(n,t)||ae(e,t,n[t])})),e},le=function(e,t){return t===undefined?N(e):ce(N(e),t)},de=function(e){var t=g(e,!0),n=$.call(this,t);return!(this===H&&s(X,t)&&!s(Q,t))&&(!(n||!s(this,t)||!s(X,t)||s(this,j)&&this[j][t])||n)},ue=function(e,t){var n=C(e),o=g(t,!0);if(n!==H||!s(X,o)||s(Q,o)){var r=K(n,o);return!r||!s(X,o)||s(n,j)&&n[j][o]||(r.enumerable=!0),r}},se=function(e){var t=Y(C(e)),n=[];return F(t,(function(e){s(X,e)||s(T,e)||n.push(e)})),n},pe=function(e){var t=e===H,n=Y(t?Q:C(e)),o=[];return F(n,(function(e){!s(X,e)||t&&!s(H,e)||o.push(X[e])})),o};(l||(S((U=function(){if(this instanceof U)throw TypeError("Symbol is not a constructor");var e=arguments.length&&arguments[0]!==undefined?String(arguments[0]):undefined,t=A(e),n=function o(e){this===H&&o.call(Q,e),s(this,j)&&s(this[j],t)&&(this[j][t]=!1),oe(this,t,b(1,e))};return c&&ne&&oe(H,t,{configurable:!0,set:n}),re(t,e)}).prototype,"toString",(function(){return W(this).tag})),S(U,"withoutSetter",(function(e){return re(A(e),e)})),w.f=de,_.f=ae,x.f=ue,V.f=y.f=se,k.f=pe,M.f=function(e){return re(E(e),e)},c&&(q(U.prototype,"description",{configurable:!0,get:function(){return W(this).description}}),a||S(H,"propertyIsEnumerable",de,{unsafe:!0}))),o({global:!0,wrap:!0,forced:!l,sham:!l},{Symbol:U}),F(v(ee),(function(e){P(e)})),o({target:"Symbol",stat:!0,forced:!l},{"for":function(e){var t=String(e);if(s(J,t))return J[t];var n=U(t);return J[t]=n,Z[n]=t,n},keyFor:function(e){if(!ie(e))throw TypeError(e+" is not a symbol");if(s(Z,e))return Z[e]},useSetter:function(){ne=!0},useSimple:function(){ne=!1}}),o({target:"Object",stat:!0,forced:!l,sham:!c},{create:le,defineProperty:ae,defineProperties:ce,getOwnPropertyDescriptor:ue}),o({target:"Object",stat:!0,forced:!l},{getOwnPropertyNames:se,getOwnPropertySymbols:pe}),o({target:"Object",stat:!0,forced:u((function(){k.f(1)}))},{getOwnPropertySymbols:function(e){return k.f(h(e))}}),G)&&o({target:"JSON",stat:!0,forced:!l||u((function(){var e=U();return"[null]"!=G([e])||"{}"!=G({a:e})||"{}"!=G(Object(e))}))},{stringify:function(e,t,n){for(var o,r=[e],i=1;arguments.length>i;)r.push(arguments[i++]);if(o=t,(m(t)||e!==undefined)&&!ie(e))return p(t)||(t=function(e,t){if("function"==typeof o&&(t=o.call(this,e,t)),!ie(t))return t}),r[1]=t,G.apply(null,r)}});U.prototype[D]||B(U.prototype,D,U.prototype.valueOf),R(U,"Symbol"),T[j]=!0},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(7),a=n(20),c=n(8),l=n(14).f,d=n(132),u=i.Symbol;if(r&&"function"==typeof u&&(!("description"in u.prototype)||u().description!==undefined)){var s={},p=function(){var e=arguments.length<1||arguments[0]===undefined?undefined:String(arguments[0]),t=this instanceof p?new u(e):e===undefined?u():u(e);return""===e&&(s[t]=!0),t};d(p,u);var m=p.prototype=u.prototype;m.constructor=p;var f=m.toString,h="Symbol(test)"==String(u("test")),C=/^Symbol\((.*)\)[^)]+$/;l(m,"description",{configurable:!0,get:function(){var e=c(this)?this.valueOf():this,t=f.call(e);if(a(s,e))return"";var n=h?t.slice(7,-1):t.replace(C,"$1");return""===n?undefined:n}}),o({global:!0,forced:!0},{Symbol:p})}},function(e,t,n){"use strict";n(27)("asyncIterator")},function(e,t,n){"use strict";n(27)("hasInstance")},function(e,t,n){"use strict";n(27)("isConcatSpreadable")},function(e,t,n){"use strict";n(27)("iterator")},function(e,t,n){"use strict";n(27)("match")},function(e,t,n){"use strict";n(27)("replace")},function(e,t,n){"use strict";n(27)("search")},function(e,t,n){"use strict";n(27)("species")},function(e,t,n){"use strict";n(27)("split")},function(e,t,n){"use strict";n(27)("toPrimitive")},function(e,t,n){"use strict";n(27)("toStringTag")},function(e,t,n){"use strict";n(27)("unscopables")},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(56),a=n(8),c=n(18),l=n(12),d=n(53),u=n(67),s=n(68),p=n(13),m=n(99),f=p("isConcatSpreadable"),h=m>=51||!r((function(){var e=[];return e[f]=!1,e.concat()[0]!==e})),C=s("concat"),g=function(e){if(!a(e))return!1;var t=e[f];return t!==undefined?!!t:i(e)};o({target:"Array",proto:!0,forced:!h||!C},{concat:function(e){var t,n,o,r,i,a=c(this),s=u(a,0),p=0;for(t=-1,o=arguments.length;t9007199254740991)throw TypeError("Maximum allowed index exceeded");for(n=0;n=9007199254740991)throw TypeError("Maximum allowed index exceeded");d(s,p++,i)}return s.length=p,s}})},function(e,t,n){"use strict";var o=n(4),r=n(140),i=n(48);o({target:"Array",proto:!0},{copyWithin:r}),i("copyWithin")},function(e,t,n){"use strict";var o=n(4),r=n(21).every,i=n(42),a=n(25),c=i("every"),l=a("every");o({target:"Array",proto:!0,forced:!c||!l},{every:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(100),i=n(48);o({target:"Array",proto:!0},{fill:r}),i("fill")},function(e,t,n){"use strict";var o=n(4),r=n(21).filter,i=n(68),a=n(25),c=i("filter"),l=a("filter");o({target:"Array",proto:!0,forced:!c||!l},{filter:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(21).find,i=n(48),a=n(25),c=!0,l=a("find");"find"in[]&&Array(1).find((function(){c=!1})),o({target:"Array",proto:!0,forced:c||!l},{find:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}}),i("find")},function(e,t,n){"use strict";var o=n(4),r=n(21).findIndex,i=n(48),a=n(25),c=!0,l=a("findIndex");"findIndex"in[]&&Array(1).findIndex((function(){c=!1})),o({target:"Array",proto:!0,forced:c||!l},{findIndex:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}}),i("findIndex")},function(e,t,n){"use strict";var o=n(4),r=n(141),i=n(18),a=n(12),c=n(31),l=n(67);o({target:"Array",proto:!0},{flat:function(){var e=arguments.length?arguments[0]:undefined,t=i(this),n=a(t.length),o=l(t,0);return o.length=r(o,t,t,n,0,e===undefined?1:c(e)),o}})},function(e,t,n){"use strict";var o=n(4),r=n(141),i=n(18),a=n(12),c=n(32),l=n(67);o({target:"Array",proto:!0},{flatMap:function(e){var t,n=i(this),o=a(n.length);return c(e),(t=l(n,0)).length=r(t,n,n,o,0,1,e,arguments.length>1?arguments[1]:undefined),t}})},function(e,t,n){"use strict";var o=n(4),r=n(212);o({target:"Array",proto:!0,forced:[].forEach!=r},{forEach:r})},function(e,t,n){"use strict";var o=n(21).forEach,r=n(42),i=n(25),a=r("forEach"),c=i("forEach");e.exports=a&&c?[].forEach:function(e){return o(this,e,arguments.length>1?arguments[1]:undefined)}},function(e,t,n){"use strict";var o=n(4),r=n(214);o({target:"Array",stat:!0,forced:!n(78)((function(e){Array.from(e)}))},{from:r})},function(e,t,n){"use strict";var o=n(52),r=n(18),i=n(142),a=n(101),c=n(12),l=n(53),d=n(102);e.exports=function(e){var t,n,u,s,p,m,f=r(e),h="function"==typeof this?this:Array,C=arguments.length,g=C>1?arguments[1]:undefined,b=g!==undefined,N=d(f),v=0;if(b&&(g=o(g,C>2?arguments[2]:undefined,2)),N==undefined||h==Array&&a(N))for(n=new h(t=c(f.length));t>v;v++)m=b?g(f[v],v):f[v],l(n,v,m);else for(p=(s=N.call(f)).next,n=new h;!(u=p.call(s)).done;v++)m=b?i(s,g,[u.value,v],!0):u.value,l(n,v,m);return n.length=v,n}},function(e,t,n){"use strict";var o=n(4),r=n(64).includes,i=n(48);o({target:"Array",proto:!0,forced:!n(25)("indexOf",{ACCESSORS:!0,1:0})},{includes:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}}),i("includes")},function(e,t,n){"use strict";var o=n(4),r=n(64).indexOf,i=n(42),a=n(25),c=[].indexOf,l=!!c&&1/[1].indexOf(1,-0)<0,d=i("indexOf"),u=a("indexOf",{ACCESSORS:!0,1:0});o({target:"Array",proto:!0,forced:l||!d||!u},{indexOf:function(e){return l?c.apply(this,arguments)||0:r(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";n(4)({target:"Array",stat:!0},{isArray:n(56)})},function(e,t,n){"use strict";var o=n(144).IteratorPrototype,r=n(46),i=n(50),a=n(47),c=n(69),l=function(){return this};e.exports=function(e,t,n){var d=t+" Iterator";return e.prototype=r(o,{next:i(1,n)}),a(e,d,!1,!0),c[d]=l,e}},function(e,t,n){"use strict";var o=n(4),r=n(61),i=n(26),a=n(42),c=[].join,l=r!=Object,d=a("join",",");o({target:"Array",proto:!0,forced:l||!d},{join:function(e){return c.call(i(this),e===undefined?",":e)}})},function(e,t,n){"use strict";var o=n(4),r=n(146);o({target:"Array",proto:!0,forced:r!==[].lastIndexOf},{lastIndexOf:r})},function(e,t,n){"use strict";var o=n(4),r=n(21).map,i=n(68),a=n(25),c=i("map"),l=a("map");o({target:"Array",proto:!0,forced:!c||!l},{map:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(53);o({target:"Array",stat:!0,forced:r((function(){function e(){}return!(Array.of.call(e)instanceof e)}))},{of:function(){for(var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);t>e;)i(n,e,arguments[e++]);return n.length=t,n}})},function(e,t,n){"use strict";var o=n(4),r=n(79).left,i=n(42),a=n(25),c=i("reduce"),l=a("reduce",{1:0});o({target:"Array",proto:!0,forced:!c||!l},{reduce:function(e){return r(this,e,arguments.length,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(79).right,i=n(42),a=n(25),c=i("reduceRight"),l=a("reduce",{1:0});o({target:"Array",proto:!0,forced:!c||!l},{reduceRight:function(e){return r(this,e,arguments.length,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(8),i=n(56),a=n(45),c=n(12),l=n(26),d=n(53),u=n(13),s=n(68),p=n(25),m=s("slice"),f=p("slice",{ACCESSORS:!0,0:0,1:2}),h=u("species"),C=[].slice,g=Math.max;o({target:"Array",proto:!0,forced:!m||!f},{slice:function(e,t){var n,o,u,s=l(this),p=c(s.length),m=a(e,p),f=a(t===undefined?p:t,p);if(i(s)&&("function"!=typeof(n=s.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[h])&&(n=undefined):n=undefined,n===Array||n===undefined))return C.call(s,m,f);for(o=new(n===undefined?Array:n)(g(f-m,0)),u=0;m1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(32),i=n(18),a=n(5),c=n(42),l=[],d=l.sort,u=a((function(){l.sort(undefined)})),s=a((function(){l.sort(null)})),p=c("sort");o({target:"Array",proto:!0,forced:u||!s||!p},{sort:function(e){return e===undefined?d.call(i(this)):d.call(i(this),r(e))}})},function(e,t,n){"use strict";n(57)("Array")},function(e,t,n){"use strict";var o=n(4),r=n(45),i=n(31),a=n(12),c=n(18),l=n(67),d=n(53),u=n(68),s=n(25),p=u("splice"),m=s("splice",{ACCESSORS:!0,0:0,1:2}),f=Math.max,h=Math.min;o({target:"Array",proto:!0,forced:!p||!m},{splice:function(e,t){var n,o,u,s,p,m,C=c(this),g=a(C.length),b=r(e,g),N=arguments.length;if(0===N?n=o=0:1===N?(n=0,o=g-b):(n=N-2,o=h(f(i(t),0),g-b)),g+n-o>9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=l(C,o),s=0;sg-o+n;s--)delete C[s-1]}else if(n>o)for(s=g-o;s>b;s--)m=s+n-1,(p=s+o-1)in C?C[m]=C[p]:delete C[m];for(s=0;s>1,h=23===t?r(2,-24)-r(2,-77):0,C=e<0||0===e&&1/e<0?1:0,g=0;for((e=o(e))!=e||e===1/0?(d=e!=e?1:0,l=m):(l=i(a(e)/c),e*(u=r(2,-l))<1&&(l--,u*=2),(e+=l+f>=1?h/u:h*r(2,1-f))*u>=2&&(l++,u/=2),l+f>=m?(d=0,l=m):l+f>=1?(d=(e*u-1)*r(2,t),l+=f):(d=e*r(2,f-1)*r(2,t),l=0));t>=8;s[g++]=255&d,d/=256,t-=8);for(l=l<0;s[g++]=255&l,l/=256,p-=8);return s[--g]|=128*C,s},unpack:function(e,t){var n,o=e.length,i=8*o-t-1,a=(1<>1,l=i-7,d=o-1,u=e[d--],s=127&u;for(u>>=7;l>0;s=256*s+e[d],d--,l-=8);for(n=s&(1<<-l)-1,s>>=-l,l+=t;l>0;n=256*n+e[d],d--,l-=8);if(0===s)s=1-c;else{if(s===a)return n?NaN:u?-1/0:1/0;n+=r(2,t),s-=c}return(u?-1:1)*n*r(2,s-t)}}},function(e,t,n){"use strict";var o=n(4),r=n(11);o({target:"ArrayBuffer",stat:!0,forced:!r.NATIVE_ARRAY_BUFFER_VIEWS},{isView:r.isView})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(80),a=n(10),c=n(45),l=n(12),d=n(49),u=i.ArrayBuffer,s=i.DataView,p=u.prototype.slice;o({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:r((function(){return!new u(2).slice(1,undefined).byteLength}))},{slice:function(e,t){if(p!==undefined&&t===undefined)return p.call(a(this),e);for(var n=a(this).byteLength,o=c(e,n),r=c(t===undefined?n:t,n),i=new(d(this,u))(l(r-o)),m=new s(this),f=new s(i),h=0;o9999?"+":"";return n+r(i(e),n?6:4,0)+"-"+r(this.getUTCMonth()+1,2,0)+"-"+r(this.getUTCDate(),2,0)+"T"+r(this.getUTCHours(),2,0)+":"+r(this.getUTCMinutes(),2,0)+":"+r(this.getUTCSeconds(),2,0)+"."+r(t,3,0)+"Z"}:l},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(18),a=n(35);o({target:"Date",proto:!0,forced:r((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}))},{toJSON:function(e){var t=i(this),n=a(t);return"number"!=typeof n||isFinite(n)?t.toISOString():null}})},function(e,t,n){"use strict";var o=n(30),r=n(242),i=n(13)("toPrimitive"),a=Date.prototype;i in a||o(a,i,r)},function(e,t,n){"use strict";var o=n(10),r=n(35);e.exports=function(e){if("string"!==e&&"number"!==e&&"default"!==e)throw TypeError("Incorrect hint");return r(o(this),"number"!==e)}},function(e,t,n){"use strict";var o=n(24),r=Date.prototype,i=r.toString,a=r.getTime;new Date(NaN)+""!="Invalid Date"&&o(r,"toString",(function(){var e=a.call(this);return e==e?i.call(this):"Invalid Date"}))},function(e,t,n){"use strict";n(4)({target:"Function",proto:!0},{bind:n(148)})},function(e,t,n){"use strict";var o=n(8),r=n(14),i=n(37),a=n(13)("hasInstance"),c=Function.prototype;a in c||r.f(c,a,{value:function(e){if("function"!=typeof this||!o(e))return!1;if(!o(this.prototype))return e instanceof this;for(;e=i(e);)if(this.prototype===e)return!0;return!1}})},function(e,t,n){"use strict";var o=n(9),r=n(14).f,i=Function.prototype,a=i.toString,c=/^\s*function ([^ (]*)/;o&&!("name"in i)&&r(i,"name",{configurable:!0,get:function(){try{return a.call(this).match(c)[1]}catch(e){return""}}})},function(e,t,n){"use strict";var o=n(7);n(47)(o.JSON,"JSON",!0)},function(e,t,n){"use strict";var o=n(81),r=n(149);e.exports=o("Map",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),r)},function(e,t,n){"use strict";var o=n(4),r=n(150),i=Math.acosh,a=Math.log,c=Math.sqrt,l=Math.LN2;o({target:"Math",stat:!0,forced:!i||710!=Math.floor(i(Number.MAX_VALUE))||i(Infinity)!=Infinity},{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?a(e)+l:r(e-1+c(e-1)*c(e+1))}})},function(e,t,n){"use strict";var o=n(4),r=Math.asinh,i=Math.log,a=Math.sqrt;o({target:"Math",stat:!0,forced:!(r&&1/r(0)>0)},{asinh:function c(e){return isFinite(e=+e)&&0!=e?e<0?-c(-e):i(e+a(e*e+1)):e}})},function(e,t,n){"use strict";var o=n(4),r=Math.atanh,i=Math.log;o({target:"Math",stat:!0,forced:!(r&&1/r(-0)<0)},{atanh:function(e){return 0==(e=+e)?e:i((1+e)/(1-e))/2}})},function(e,t,n){"use strict";var o=n(4),r=n(109),i=Math.abs,a=Math.pow;o({target:"Math",stat:!0},{cbrt:function(e){return r(e=+e)*a(i(e),1/3)}})},function(e,t,n){"use strict";var o=n(4),r=Math.floor,i=Math.log,a=Math.LOG2E;o({target:"Math",stat:!0},{clz32:function(e){return(e>>>=0)?31-r(i(e+.5)*a):32}})},function(e,t,n){"use strict";var o=n(4),r=n(83),i=Math.cosh,a=Math.abs,c=Math.E;o({target:"Math",stat:!0,forced:!i||i(710)===Infinity},{cosh:function(e){var t=r(a(e)-1)+1;return(t+1/(t*c*c))*(c/2)}})},function(e,t,n){"use strict";var o=n(4),r=n(83);o({target:"Math",stat:!0,forced:r!=Math.expm1},{expm1:r})},function(e,t,n){"use strict";n(4)({target:"Math",stat:!0},{fround:n(257)})},function(e,t,n){"use strict";var o=n(109),r=Math.abs,i=Math.pow,a=i(2,-52),c=i(2,-23),l=i(2,127)*(2-c),d=i(2,-126);e.exports=Math.fround||function(e){var t,n,i=r(e),u=o(e);return il||n!=n?u*Infinity:u*n}},function(e,t,n){"use strict";var o=n(4),r=Math.hypot,i=Math.abs,a=Math.sqrt;o({target:"Math",stat:!0,forced:!!r&&r(Infinity,NaN)!==Infinity},{hypot:function(e,t){for(var n,o,r=0,c=0,l=arguments.length,d=0;c0?(o=n/d)*o:n;return d===Infinity?Infinity:d*a(r)}})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=Math.imul;o({target:"Math",stat:!0,forced:r((function(){return-5!=i(4294967295,5)||2!=i.length}))},{imul:function(e,t){var n=+e,o=+t,r=65535&n,i=65535&o;return 0|r*i+((65535&n>>>16)*i+r*(65535&o>>>16)<<16>>>0)}})},function(e,t,n){"use strict";var o=n(4),r=Math.log,i=Math.LOG10E;o({target:"Math",stat:!0},{log10:function(e){return r(e)*i}})},function(e,t,n){"use strict";n(4)({target:"Math",stat:!0},{log1p:n(150)})},function(e,t,n){"use strict";var o=n(4),r=Math.log,i=Math.LN2;o({target:"Math",stat:!0},{log2:function(e){return r(e)/i}})},function(e,t,n){"use strict";n(4)({target:"Math",stat:!0},{sign:n(109)})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(83),a=Math.abs,c=Math.exp,l=Math.E;o({target:"Math",stat:!0,forced:r((function(){return-2e-17!=Math.sinh(-2e-17)}))},{sinh:function(e){return a(e=+e)<1?(i(e)-i(-e))/2:(c(e-1)-c(-e-1))*(l/2)}})},function(e,t,n){"use strict";var o=n(4),r=n(83),i=Math.exp;o({target:"Math",stat:!0},{tanh:function(e){var t=r(e=+e),n=r(-e);return t==Infinity?1:n==Infinity?-1:(t-n)/(i(e)+i(-e))}})},function(e,t,n){"use strict";n(47)(Math,"Math",!0)},function(e,t,n){"use strict";var o=n(4),r=Math.ceil,i=Math.floor;o({target:"Math",stat:!0},{trunc:function(e){return(e>0?i:r)(e)}})},function(e,t,n){"use strict";var o=n(9),r=n(7),i=n(65),a=n(24),c=n(20),l=n(34),d=n(82),u=n(35),s=n(5),p=n(46),m=n(51).f,f=n(22).f,h=n(14).f,C=n(59).trim,g=r.Number,b=g.prototype,N="Number"==l(p(b)),v=function(e){var t,n,o,r,i,a,c,l,d=u(e,!1);if("string"==typeof d&&d.length>2)if(43===(t=(d=C(d)).charCodeAt(0))||45===t){if(88===(n=d.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(d.charCodeAt(1)){case 66:case 98:o=2,r=49;break;case 79:case 111:o=8,r=55;break;default:return+d}for(a=(i=d.slice(2)).length,c=0;cr)return NaN;return parseInt(i,o)}return+d};if(i("Number",!g(" 0o1")||!g("0b1")||g("+0x1"))){for(var V,y=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof y&&(N?s((function(){b.valueOf.call(n)})):"Number"!=l(n))?d(new g(v(t)),n,y):v(t)},k=o?m(g):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),x=0;k.length>x;x++)c(g,V=k[x])&&!c(y,V)&&h(y,V,f(g,V));y.prototype=b,b.constructor=y,a(r,"Number",y)}},function(e,t,n){"use strict";n(4)({target:"Number",stat:!0},{EPSILON:Math.pow(2,-52)})},function(e,t,n){"use strict";n(4)({target:"Number",stat:!0},{isFinite:n(271)})},function(e,t,n){"use strict";var o=n(7).isFinite;e.exports=Number.isFinite||function(e){return"number"==typeof e&&o(e)}},function(e,t,n){"use strict";n(4)({target:"Number",stat:!0},{isInteger:n(151)})},function(e,t,n){"use strict";n(4)({target:"Number",stat:!0},{isNaN:function(e){return e!=e}})},function(e,t,n){"use strict";var o=n(4),r=n(151),i=Math.abs;o({target:"Number",stat:!0},{isSafeInteger:function(e){return r(e)&&i(e)<=9007199254740991}})},function(e,t,n){"use strict";n(4)({target:"Number",stat:!0},{MAX_SAFE_INTEGER:9007199254740991})},function(e,t,n){"use strict";n(4)({target:"Number",stat:!0},{MIN_SAFE_INTEGER:-9007199254740991})},function(e,t,n){"use strict";var o=n(4),r=n(278);o({target:"Number",stat:!0,forced:Number.parseFloat!=r},{parseFloat:r})},function(e,t,n){"use strict";var o=n(7),r=n(59).trim,i=n(84),a=o.parseFloat,c=1/a(i+"-0")!=-Infinity;e.exports=c?function(e){var t=r(String(e)),n=a(t);return 0===n&&"-"==t.charAt(0)?-0:n}:a},function(e,t,n){"use strict";var o=n(4),r=n(152);o({target:"Number",stat:!0,forced:Number.parseInt!=r},{parseInt:r})},function(e,t,n){"use strict";var o=n(4),r=n(31),i=n(281),a=n(108),c=n(5),l=1..toFixed,d=Math.floor,u=function s(e,t,n){return 0===t?n:t%2==1?s(e,t-1,n*e):s(e*e,t/2,n)};o({target:"Number",proto:!0,forced:l&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!c((function(){l.call({})}))},{toFixed:function(e){var t,n,o,c,l=i(this),s=r(e),p=[0,0,0,0,0,0],m="",f="0",h=function(e,t){for(var n=-1,o=t;++n<6;)o+=e*p[n],p[n]=o%1e7,o=d(o/1e7)},C=function(e){for(var t=6,n=0;--t>=0;)n+=p[t],p[t]=d(n/e),n=n%e*1e7},g=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==p[e]){var n=String(p[e]);t=""===t?n:t+a.call("0",7-n.length)+n}return t};if(s<0||s>20)throw RangeError("Incorrect fraction digits");if(l!=l)return"NaN";if(l<=-1e21||l>=1e21)return String(l);if(l<0&&(m="-",l=-l),l>1e-21)if(n=(t=function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t}(l*u(2,69,1))-69)<0?l*u(2,-t,1):l/u(2,t,1),n*=4503599627370496,(t=52-t)>0){for(h(0,n),o=s;o>=7;)h(1e7,0),o-=7;for(h(u(10,o,1),0),o=t-1;o>=23;)C(1<<23),o-=23;C(1<0?m+((c=f.length)<=s?"0."+a.call("0",s-c)+f:f.slice(0,c-s)+"."+f.slice(c-s)):m+f}})},function(e,t,n){"use strict";var o=n(34);e.exports=function(e){if("number"!=typeof e&&"Number"!=o(e))throw TypeError("Incorrect invocation");return+e}},function(e,t,n){"use strict";var o=n(4),r=n(283);o({target:"Object",stat:!0,forced:Object.assign!==r},{assign:r})},function(e,t,n){"use strict";var o=n(9),r=n(5),i=n(66),a=n(97),c=n(74),l=n(18),d=n(61),u=Object.assign,s=Object.defineProperty;e.exports=!u||r((function(){if(o&&1!==u({b:1},u(s({},"a",{enumerable:!0,get:function(){s(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol();return e[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(e){t[e]=e})),7!=u({},e)[n]||"abcdefghijklmnopqrst"!=i(u({},t)).join("")}))?function(e,t){for(var n=l(e),r=arguments.length,u=1,s=a.f,p=c.f;r>u;)for(var m,f=d(arguments[u++]),h=s?i(f).concat(s(f)):i(f),C=h.length,g=0;C>g;)m=h[g++],o&&!p.call(f,m)||(n[m]=f[m]);return n}:u},function(e,t,n){"use strict";n(4)({target:"Object",stat:!0,sham:!n(9)},{create:n(46)})},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(85),a=n(18),c=n(32),l=n(14);r&&o({target:"Object",proto:!0,forced:i},{__defineGetter__:function(e,t){l.f(a(this),e,{get:c(t),enumerable:!0,configurable:!0})}})},function(e,t,n){"use strict";var o=n(4),r=n(9);o({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperties:n(136)})},function(e,t,n){"use strict";var o=n(4),r=n(9);o({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperty:n(14).f})},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(85),a=n(18),c=n(32),l=n(14);r&&o({target:"Object",proto:!0,forced:i},{__defineSetter__:function(e,t){l.f(a(this),e,{set:c(t),enumerable:!0,configurable:!0})}})},function(e,t,n){"use strict";var o=n(4),r=n(153).entries;o({target:"Object",stat:!0},{entries:function(e){return r(e)}})},function(e,t,n){"use strict";var o=n(4),r=n(71),i=n(5),a=n(8),c=n(55).onFreeze,l=Object.freeze;o({target:"Object",stat:!0,forced:i((function(){l(1)})),sham:!r},{freeze:function(e){return l&&a(e)?l(c(e)):e}})},function(e,t,n){"use strict";var o=n(4),r=n(72),i=n(53);o({target:"Object",stat:!0},{fromEntries:function(e){var t={};return r(e,(function(e,n){i(t,e,n)}),undefined,!0),t}})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(26),a=n(22).f,c=n(9),l=r((function(){a(1)}));o({target:"Object",stat:!0,forced:!c||l,sham:!c},{getOwnPropertyDescriptor:function(e,t){return a(i(e),t)}})},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(95),a=n(26),c=n(22),l=n(53);o({target:"Object",stat:!0,sham:!r},{getOwnPropertyDescriptors:function(e){for(var t,n,o=a(e),r=c.f,d=i(o),u={},s=0;d.length>s;)(n=r(o,t=d[s++]))!==undefined&&l(u,t,n);return u}})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(138).f;o({target:"Object",stat:!0,forced:r((function(){return!Object.getOwnPropertyNames(1)}))},{getOwnPropertyNames:i})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(18),a=n(37),c=n(105);o({target:"Object",stat:!0,forced:r((function(){a(1)})),sham:!c},{getPrototypeOf:function(e){return a(i(e))}})},function(e,t,n){"use strict";n(4)({target:"Object",stat:!0},{is:n(154)})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(8),a=Object.isExtensible;o({target:"Object",stat:!0,forced:r((function(){a(1)}))},{isExtensible:function(e){return!!i(e)&&(!a||a(e))}})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(8),a=Object.isFrozen;o({target:"Object",stat:!0,forced:r((function(){a(1)}))},{isFrozen:function(e){return!i(e)||!!a&&a(e)}})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(8),a=Object.isSealed;o({target:"Object",stat:!0,forced:r((function(){a(1)}))},{isSealed:function(e){return!i(e)||!!a&&a(e)}})},function(e,t,n){"use strict";var o=n(4),r=n(18),i=n(66);o({target:"Object",stat:!0,forced:n(5)((function(){i(1)}))},{keys:function(e){return i(r(e))}})},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(85),a=n(18),c=n(35),l=n(37),d=n(22).f;r&&o({target:"Object",proto:!0,forced:i},{__lookupGetter__:function(e){var t,n=a(this),o=c(e,!0);do{if(t=d(n,o))return t.get}while(n=l(n))}})},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(85),a=n(18),c=n(35),l=n(37),d=n(22).f;r&&o({target:"Object",proto:!0,forced:i},{__lookupSetter__:function(e){var t,n=a(this),o=c(e,!0);do{if(t=d(n,o))return t.set}while(n=l(n))}})},function(e,t,n){"use strict";var o=n(4),r=n(8),i=n(55).onFreeze,a=n(71),c=n(5),l=Object.preventExtensions;o({target:"Object",stat:!0,forced:c((function(){l(1)})),sham:!a},{preventExtensions:function(e){return l&&r(e)?l(i(e)):e}})},function(e,t,n){"use strict";var o=n(4),r=n(8),i=n(55).onFreeze,a=n(71),c=n(5),l=Object.seal;o({target:"Object",stat:!0,forced:c((function(){l(1)})),sham:!a},{seal:function(e){return l&&r(e)?l(i(e)):e}})},function(e,t,n){"use strict";n(4)({target:"Object",stat:!0},{setPrototypeOf:n(54)})},function(e,t,n){"use strict";var o=n(103),r=n(24),i=n(307);o||r(Object.prototype,"toString",i,{unsafe:!0})},function(e,t,n){"use strict";var o=n(103),r=n(77);e.exports=o?{}.toString:function(){return"[object "+r(this)+"]"}},function(e,t,n){"use strict";var o=n(4),r=n(153).values;o({target:"Object",stat:!0},{values:function(e){return r(e)}})},function(e,t,n){"use strict";var o=n(4),r=n(152);o({global:!0,forced:parseInt!=r},{parseInt:r})},function(e,t,n){"use strict";var o,r,i,a,c=n(4),l=n(41),d=n(7),u=n(39),s=n(155),p=n(24),m=n(70),f=n(47),h=n(57),C=n(8),g=n(32),b=n(58),N=n(34),v=n(93),V=n(72),y=n(78),k=n(49),x=n(110).set,_=n(157),w=n(158),B=n(311),S=n(159),L=n(312),I=n(36),T=n(65),A=n(13),E=n(99),M=A("species"),P="Promise",R=I.get,O=I.set,F=I.getterFor(P),j=s,D=d.TypeError,z=d.document,W=d.process,H=u("fetch"),U=S.f,G=U,K="process"==N(W),q=!!(z&&z.createEvent&&d.dispatchEvent),Y=T(P,(function(){if(!(v(j)!==String(j))){if(66===E)return!0;if(!K&&"function"!=typeof PromiseRejectionEvent)return!0}if(l&&!j.prototype["finally"])return!0;if(E>=51&&/native code/.test(j))return!1;var e=j.resolve(1),t=function(e){e((function(){}),(function(){}))};return(e.constructor={})[M]=t,!(e.then((function(){}))instanceof t)})),$=Y||!y((function(e){j.all(e)["catch"]((function(){}))})),X=function(e){var t;return!(!C(e)||"function"!=typeof(t=e.then))&&t},Q=function(e,t,n){if(!t.notified){t.notified=!0;var o=t.reactions;_((function(){for(var r=t.value,i=1==t.state,a=0;o.length>a;){var c,l,d,u=o[a++],s=i?u.ok:u.fail,p=u.resolve,m=u.reject,f=u.domain;try{s?(i||(2===t.rejection&&te(e,t),t.rejection=1),!0===s?c=r:(f&&f.enter(),c=s(r),f&&(f.exit(),d=!0)),c===u.promise?m(D("Promise-chain cycle")):(l=X(c))?l.call(c,p,m):p(c)):m(r)}catch(h){f&&!d&&f.exit(),m(h)}}t.reactions=[],t.notified=!1,n&&!t.rejection&&Z(e,t)}))}},J=function(e,t,n){var o,r;q?((o=z.createEvent("Event")).promise=t,o.reason=n,o.initEvent(e,!1,!0),d.dispatchEvent(o)):o={promise:t,reason:n},(r=d["on"+e])?r(o):"unhandledrejection"===e&&B("Unhandled promise rejection",n)},Z=function(e,t){x.call(d,(function(){var n,o=t.value;if(ee(t)&&(n=L((function(){K?W.emit("unhandledRejection",o,e):J("unhandledrejection",e,o)})),t.rejection=K||ee(t)?2:1,n.error))throw n.value}))},ee=function(e){return 1!==e.rejection&&!e.parent},te=function(e,t){x.call(d,(function(){K?W.emit("rejectionHandled",e):J("rejectionhandled",e,t.value)}))},ne=function(e,t,n,o){return function(r){e(t,n,r,o)}},oe=function(e,t,n,o){t.done||(t.done=!0,o&&(t=o),t.value=n,t.state=2,Q(e,t,!0))},re=function ie(e,t,n,o){if(!t.done){t.done=!0,o&&(t=o);try{if(e===n)throw D("Promise can't be resolved itself");var r=X(n);r?_((function(){var o={done:!1};try{r.call(n,ne(ie,e,o,t),ne(oe,e,o,t))}catch(i){oe(e,o,i,t)}})):(t.value=n,t.state=1,Q(e,t,!1))}catch(i){oe(e,{done:!1},i,t)}}};Y&&(j=function(e){b(this,j,P),g(e),o.call(this);var t=R(this);try{e(ne(re,this,t),ne(oe,this,t))}catch(n){oe(this,t,n)}},(o=function(e){O(this,{type:P,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:undefined})}).prototype=m(j.prototype,{then:function(e,t){var n=F(this),o=U(k(this,j));return o.ok="function"!=typeof e||e,o.fail="function"==typeof t&&t,o.domain=K?W.domain:undefined,n.parent=!0,n.reactions.push(o),0!=n.state&&Q(this,n,!1),o.promise},"catch":function(e){return this.then(undefined,e)}}),r=function(){var e=new o,t=R(e);this.promise=e,this.resolve=ne(re,e,t),this.reject=ne(oe,e,t)},S.f=U=function(e){return e===j||e===i?new r(e):G(e)},l||"function"!=typeof s||(a=s.prototype.then,p(s.prototype,"then",(function(e,t){var n=this;return new j((function(e,t){a.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof H&&c({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return w(j,H.apply(d,arguments))}}))),c({global:!0,wrap:!0,forced:Y},{Promise:j}),f(j,P,!1,!0),h(P),i=u(P),c({target:P,stat:!0,forced:Y},{reject:function(e){var t=U(this);return t.reject.call(undefined,e),t.promise}}),c({target:P,stat:!0,forced:l||Y},{resolve:function(e){return w(l&&this===i?j:this,e)}}),c({target:P,stat:!0,forced:$},{all:function(e){var t=this,n=U(t),o=n.resolve,r=n.reject,i=L((function(){var n=g(t.resolve),i=[],a=0,c=1;V(e,(function(e){var l=a++,d=!1;i.push(undefined),c++,n.call(t,e).then((function(e){d||(d=!0,i[l]=e,--c||o(i))}),r)})),--c||o(i)}));return i.error&&r(i.value),n.promise},race:function(e){var t=this,n=U(t),o=n.reject,r=L((function(){var r=g(t.resolve);V(e,(function(e){r.call(t,e).then(n.resolve,o)}))}));return r.error&&o(r.value),n.promise}})},function(e,t,n){"use strict";var o=n(7);e.exports=function(e,t){var n=o.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},function(e,t,n){"use strict";e.exports=function(e){try{return{error:!1,value:e()}}catch(t){return{error:!0,value:t}}}},function(e,t,n){"use strict";var o=n(4),r=n(41),i=n(155),a=n(5),c=n(39),l=n(49),d=n(158),u=n(24);o({target:"Promise",proto:!0,real:!0,forced:!!i&&a((function(){i.prototype["finally"].call({then:function(){}},(function(){}))}))},{"finally":function(e){var t=l(this,c("Promise")),n="function"==typeof e;return this.then(n?function(n){return d(t,e()).then((function(){return n}))}:e,n?function(n){return d(t,e()).then((function(){throw n}))}:e)}}),r||"function"!=typeof i||i.prototype["finally"]||u(i.prototype,"finally",c("Promise").prototype["finally"])},function(e,t,n){"use strict";var o=n(4),r=n(39),i=n(32),a=n(10),c=n(5),l=r("Reflect","apply"),d=Function.apply;o({target:"Reflect",stat:!0,forced:!c((function(){l((function(){}))}))},{apply:function(e,t,n){return i(e),a(n),l?l(e,t,n):d.call(e,t,n)}})},function(e,t,n){"use strict";var o=n(4),r=n(39),i=n(32),a=n(10),c=n(8),l=n(46),d=n(148),u=n(5),s=r("Reflect","construct"),p=u((function(){function e(){}return!(s((function(){}),[],e)instanceof e)})),m=!u((function(){s((function(){}))})),f=p||m;o({target:"Reflect",stat:!0,forced:f,sham:f},{construct:function(e,t){i(e),a(t);var n=arguments.length<3?e:i(arguments[2]);if(m&&!p)return s(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var o=[null];return o.push.apply(o,t),new(d.apply(e,o))}var r=n.prototype,u=l(c(r)?r:Object.prototype),f=Function.apply.call(e,u,t);return c(f)?f:u}})},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(10),a=n(35),c=n(14);o({target:"Reflect",stat:!0,forced:n(5)((function(){Reflect.defineProperty(c.f({},1,{value:1}),1,{value:2})})),sham:!r},{defineProperty:function(e,t,n){i(e);var o=a(t,!0);i(n);try{return c.f(e,o,n),!0}catch(r){return!1}}})},function(e,t,n){"use strict";var o=n(4),r=n(10),i=n(22).f;o({target:"Reflect",stat:!0},{deleteProperty:function(e,t){var n=i(r(e),t);return!(n&&!n.configurable)&&delete e[t]}})},function(e,t,n){"use strict";var o=n(4),r=n(8),i=n(10),a=n(20),c=n(22),l=n(37);o({target:"Reflect",stat:!0},{get:function d(e,t){var n,o,u=arguments.length<3?e:arguments[2];return i(e)===u?e[t]:(n=c.f(e,t))?a(n,"value")?n.value:n.get===undefined?undefined:n.get.call(u):r(o=l(e))?d(o,t,u):void 0}})},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(10),a=n(22);o({target:"Reflect",stat:!0,sham:!r},{getOwnPropertyDescriptor:function(e,t){return a.f(i(e),t)}})},function(e,t,n){"use strict";var o=n(4),r=n(10),i=n(37);o({target:"Reflect",stat:!0,sham:!n(105)},{getPrototypeOf:function(e){return i(r(e))}})},function(e,t,n){"use strict";n(4)({target:"Reflect",stat:!0},{has:function(e,t){return t in e}})},function(e,t,n){"use strict";var o=n(4),r=n(10),i=Object.isExtensible;o({target:"Reflect",stat:!0},{isExtensible:function(e){return r(e),!i||i(e)}})},function(e,t,n){"use strict";n(4)({target:"Reflect",stat:!0},{ownKeys:n(95)})},function(e,t,n){"use strict";var o=n(4),r=n(39),i=n(10);o({target:"Reflect",stat:!0,sham:!n(71)},{preventExtensions:function(e){i(e);try{var t=r("Object","preventExtensions");return t&&t(e),!0}catch(n){return!1}}})},function(e,t,n){"use strict";var o=n(4),r=n(10),i=n(8),a=n(20),c=n(5),l=n(14),d=n(22),u=n(37),s=n(50);o({target:"Reflect",stat:!0,forced:c((function(){var e=l.f({},"a",{configurable:!0});return!1!==Reflect.set(u(e),"a",1,e)}))},{set:function p(e,t,n){var o,c,m=arguments.length<4?e:arguments[3],f=d.f(r(e),t);if(!f){if(i(c=u(e)))return p(c,t,n,m);f=s(0)}if(a(f,"value")){if(!1===f.writable||!i(m))return!1;if(o=d.f(m,t)){if(o.get||o.set||!1===o.writable)return!1;o.value=n,l.f(m,t,o)}else l.f(m,t,s(0,n));return!0}return f.set!==undefined&&(f.set.call(m,n),!0)}})},function(e,t,n){"use strict";var o=n(4),r=n(10),i=n(145),a=n(54);a&&o({target:"Reflect",stat:!0},{setPrototypeOf:function(e,t){r(e),i(t);try{return a(e,t),!0}catch(n){return!1}}})},function(e,t,n){"use strict";var o=n(9),r=n(7),i=n(65),a=n(82),c=n(14).f,l=n(51).f,d=n(111),u=n(86),s=n(112),p=n(24),m=n(5),f=n(36).set,h=n(57),C=n(13)("match"),g=r.RegExp,b=g.prototype,N=/a/g,v=/a/g,V=new g(N)!==N,y=s.UNSUPPORTED_Y;if(o&&i("RegExp",!V||y||m((function(){return v[C]=!1,g(N)!=N||g(v)==v||"/a/i"!=g(N,"i")})))){for(var k=function(e,t){var n,o=this instanceof k,r=d(e),i=t===undefined;if(!o&&r&&e.constructor===k&&i)return e;V?r&&!i&&(e=e.source):e instanceof k&&(i&&(t=u.call(e)),e=e.source),y&&(n=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var c=a(V?new g(e,t):g(e,t),o?this:b,k);return y&&n&&f(c,{sticky:n}),c},x=function(e){e in k||c(k,e,{configurable:!0,get:function(){return g[e]},set:function(t){g[e]=t}})},_=l(g),w=0;_.length>w;)x(_[w++]);b.constructor=k,k.prototype=b,p(r,"RegExp",k)}h("RegExp")},function(e,t,n){"use strict";var o=n(9),r=n(14),i=n(86),a=n(112).UNSUPPORTED_Y;o&&("g"!=/./g.flags||a)&&r.f(RegExp.prototype,"flags",{configurable:!0,get:i})},function(e,t,n){"use strict";var o=n(24),r=n(10),i=n(5),a=n(86),c=RegExp.prototype,l=c.toString,d=i((function(){return"/a/b"!=l.call({source:"a",flags:"b"})})),u="toString"!=l.name;(d||u)&&o(RegExp.prototype,"toString",(function(){var e=r(this),t=String(e.source),n=e.flags;return"/"+t+"/"+String(n===undefined&&e instanceof RegExp&&!("flags"in c)?a.call(e):n)}),{unsafe:!0})},function(e,t,n){"use strict";var o=n(81),r=n(149);e.exports=o("Set",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),r)},function(e,t,n){"use strict";var o=n(4),r=n(113).codeAt;o({target:"String",proto:!0},{codePointAt:function(e){return r(this,e)}})},function(e,t,n){"use strict";var o,r=n(4),i=n(22).f,a=n(12),c=n(114),l=n(23),d=n(115),u=n(41),s="".endsWith,p=Math.min,m=d("endsWith");r({target:"String",proto:!0,forced:!!(u||m||(o=i(String.prototype,"endsWith"),!o||o.writable))&&!m},{endsWith:function(e){var t=String(l(this));c(e);var n=arguments.length>1?arguments[1]:undefined,o=a(t.length),r=n===undefined?o:p(a(n),o),i=String(e);return s?s.call(t,i,r):t.slice(r-i.length,r)===i}})},function(e,t,n){"use strict";var o=n(4),r=n(45),i=String.fromCharCode,a=String.fromCodePoint;o({target:"String",stat:!0,forced:!!a&&1!=a.length},{fromCodePoint:function(e){for(var t,n=[],o=arguments.length,a=0;o>a;){if(t=+arguments[a++],r(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?i(t):i(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}})},function(e,t,n){"use strict";var o=n(4),r=n(114),i=n(23);o({target:"String",proto:!0,forced:!n(115)("includes")},{includes:function(e){return!!~String(i(this)).indexOf(r(e),arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(113).charAt,r=n(36),i=n(104),a=r.set,c=r.getterFor("String Iterator");i(String,"String",(function(e){a(this,{type:"String Iterator",string:String(e),index:0})}),(function(){var e,t=c(this),n=t.string,r=t.index;return r>=n.length?{value:undefined,done:!0}:(e=o(n,r),t.index+=e.length,{value:e,done:!1})}))},function(e,t,n){"use strict";var o=n(88),r=n(10),i=n(12),a=n(23),c=n(116),l=n(89);o("match",1,(function(e,t,n){return[function(t){var n=a(this),o=t==undefined?undefined:t[e];return o!==undefined?o.call(t,n):new RegExp(t)[e](String(n))},function(e){var o=n(t,e,this);if(o.done)return o.value;var a=r(e),d=String(this);if(!a.global)return l(a,d);var u=a.unicode;a.lastIndex=0;for(var s,p=[],m=0;null!==(s=l(a,d));){var f=String(s[0]);p[m]=f,""===f&&(a.lastIndex=c(d,i(a.lastIndex),u)),m++}return 0===m?null:p}]}))},function(e,t,n){"use strict";var o=n(4),r=n(107).end;o({target:"String",proto:!0,forced:n(161)},{padEnd:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(107).start;o({target:"String",proto:!0,forced:n(161)},{padStart:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(26),i=n(12);o({target:"String",stat:!0},{raw:function(e){for(var t=r(e.raw),n=i(t.length),o=arguments.length,a=[],c=0;n>c;)a.push(String(t[c++])),c]*>)/g,h=/\$([$&'`]|\d\d?)/g;o("replace",2,(function(e,t,n,o){var C=o.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,g=o.REPLACE_KEEPS_$0,b=C?"$":"$0";return[function(n,o){var r=l(this),i=n==undefined?undefined:n[e];return i!==undefined?i.call(n,r,o):t.call(String(r),n,o)},function(e,o){if(!C&&g||"string"==typeof o&&-1===o.indexOf(b)){var i=n(t,e,this,o);if(i.done)return i.value}var l=r(e),m=String(this),f="function"==typeof o;f||(o=String(o));var h=l.global;if(h){var v=l.unicode;l.lastIndex=0}for(var V=[];;){var y=u(l,m);if(null===y)break;if(V.push(y),!h)break;""===String(y[0])&&(l.lastIndex=d(m,a(l.lastIndex),v))}for(var k,x="",_=0,w=0;w=_&&(x+=m.slice(_,S)+E,_=S+B.length)}return x+m.slice(_)}];function N(e,n,o,r,a,c){var l=o+e.length,d=r.length,u=h;return a!==undefined&&(a=i(a),u=f),t.call(c,u,(function(t,i){var c;switch(i.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,o);case"'":return n.slice(l);case"<":c=a[i.slice(1,-1)];break;default:var u=+i;if(0===u)return t;if(u>d){var s=m(u/10);return 0===s?t:s<=d?r[s-1]===undefined?i.charAt(1):r[s-1]+i.charAt(1):t}c=r[u-1]}return c===undefined?"":c}))}}))},function(e,t,n){"use strict";var o=n(88),r=n(10),i=n(23),a=n(154),c=n(89);o("search",1,(function(e,t,n){return[function(t){var n=i(this),o=t==undefined?undefined:t[e];return o!==undefined?o.call(t,n):new RegExp(t)[e](String(n))},function(e){var o=n(t,e,this);if(o.done)return o.value;var i=r(e),l=String(this),d=i.lastIndex;a(d,0)||(i.lastIndex=0);var u=c(i,l);return a(i.lastIndex,d)||(i.lastIndex=d),null===u?-1:u.index}]}))},function(e,t,n){"use strict";var o=n(88),r=n(111),i=n(10),a=n(23),c=n(49),l=n(116),d=n(12),u=n(89),s=n(87),p=n(5),m=[].push,f=Math.min,h=!p((function(){return!RegExp(4294967295,"y")}));o("split",2,(function(e,t,n){var o;return o="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var o=String(a(this)),i=n===undefined?4294967295:n>>>0;if(0===i)return[];if(e===undefined)return[o];if(!r(e))return t.call(o,e,i);for(var c,l,d,u=[],p=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),f=0,h=new RegExp(e.source,p+"g");(c=s.call(h,o))&&!((l=h.lastIndex)>f&&(u.push(o.slice(f,c.index)),c.length>1&&c.index=i));)h.lastIndex===c.index&&h.lastIndex++;return f===o.length?!d&&h.test("")||u.push(""):u.push(o.slice(f)),u.length>i?u.slice(0,i):u}:"0".split(undefined,0).length?function(e,n){return e===undefined&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var r=a(this),i=t==undefined?undefined:t[e];return i!==undefined?i.call(t,r,n):o.call(String(r),t,n)},function(e,r){var a=n(o,e,this,r,o!==t);if(a.done)return a.value;var s=i(e),p=String(this),m=c(s,RegExp),C=s.unicode,g=(s.ignoreCase?"i":"")+(s.multiline?"m":"")+(s.unicode?"u":"")+(h?"y":"g"),b=new m(h?s:"^(?:"+s.source+")",g),N=r===undefined?4294967295:r>>>0;if(0===N)return[];if(0===p.length)return null===u(b,p)?[p]:[];for(var v=0,V=0,y=[];V1?arguments[1]:undefined,t.length)),o=String(e);return s?s.call(t,o,n):t.slice(n,n+o.length)===o}})},function(e,t,n){"use strict";var o=n(4),r=n(59).trim;o({target:"String",proto:!0,forced:n(117)("trim")},{trim:function(){return r(this)}})},function(e,t,n){"use strict";var o=n(4),r=n(59).end,i=n(117)("trimEnd"),a=i?function(){return r(this)}:"".trimEnd;o({target:"String",proto:!0,forced:i},{trimEnd:a,trimRight:a})},function(e,t,n){"use strict";var o=n(4),r=n(59).start,i=n(117)("trimStart"),a=i?function(){return r(this)}:"".trimStart;o({target:"String",proto:!0,forced:i},{trimStart:a,trimLeft:a})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("anchor")},{anchor:function(e){return r(this,"a","name",e)}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("big")},{big:function(){return r(this,"big","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("blink")},{blink:function(){return r(this,"blink","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("bold")},{bold:function(){return r(this,"b","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("fixed")},{fixed:function(){return r(this,"tt","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("fontcolor")},{fontcolor:function(e){return r(this,"font","color",e)}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("fontsize")},{fontsize:function(e){return r(this,"font","size",e)}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("italics")},{italics:function(){return r(this,"i","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("link")},{link:function(e){return r(this,"a","href",e)}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("small")},{small:function(){return r(this,"small","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("strike")},{strike:function(){return r(this,"strike","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("sub")},{sub:function(){return r(this,"sub","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("sup")},{sup:function(){return r(this,"sup","","")}})},function(e,t,n){"use strict";n(43)("Float32",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";var o=n(31);e.exports=function(e){var t=o(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},function(e,t,n){"use strict";n(43)("Float64",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";n(43)("Int8",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";n(43)("Int16",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";n(43)("Int32",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";n(43)("Uint8",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";n(43)("Uint8",(function(e){return function(t,n,o){return e(this,t,n,o)}}),!0)},function(e,t,n){"use strict";n(43)("Uint16",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";n(43)("Uint32",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";var o=n(11),r=n(140),i=o.aTypedArray;(0,o.exportTypedArrayMethod)("copyWithin",(function(e,t){return r.call(i(this),e,t,arguments.length>2?arguments[2]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=n(21).every,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("every",(function(e){return r(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=n(100),i=o.aTypedArray;(0,o.exportTypedArrayMethod)("fill",(function(e){return r.apply(i(this),arguments)}))},function(e,t,n){"use strict";var o=n(11),r=n(21).filter,i=n(49),a=o.aTypedArray,c=o.aTypedArrayConstructor;(0,o.exportTypedArrayMethod)("filter",(function(e){for(var t=r(a(this),e,arguments.length>1?arguments[1]:undefined),n=i(this,this.constructor),o=0,l=t.length,d=new(c(n))(l);l>o;)d[o]=t[o++];return d}))},function(e,t,n){"use strict";var o=n(11),r=n(21).find,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("find",(function(e){return r(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=n(21).findIndex,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("findIndex",(function(e){return r(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=n(21).forEach,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("forEach",(function(e){r(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(118);(0,n(11).exportTypedArrayStaticMethod)("from",n(163),o)},function(e,t,n){"use strict";var o=n(11),r=n(64).includes,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("includes",(function(e){return r(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=n(64).indexOf,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("indexOf",(function(e){return r(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(7),r=n(11),i=n(143),a=n(13)("iterator"),c=o.Uint8Array,l=i.values,d=i.keys,u=i.entries,s=r.aTypedArray,p=r.exportTypedArrayMethod,m=c&&c.prototype[a],f=!!m&&("values"==m.name||m.name==undefined),h=function(){return l.call(s(this))};p("entries",(function(){return u.call(s(this))})),p("keys",(function(){return d.call(s(this))})),p("values",h,!f),p(a,h,!f)},function(e,t,n){"use strict";var o=n(11),r=o.aTypedArray,i=o.exportTypedArrayMethod,a=[].join;i("join",(function(e){return a.apply(r(this),arguments)}))},function(e,t,n){"use strict";var o=n(11),r=n(146),i=o.aTypedArray;(0,o.exportTypedArrayMethod)("lastIndexOf",(function(e){return r.apply(i(this),arguments)}))},function(e,t,n){"use strict";var o=n(11),r=n(21).map,i=n(49),a=o.aTypedArray,c=o.aTypedArrayConstructor;(0,o.exportTypedArrayMethod)("map",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:undefined,(function(e,t){return new(c(i(e,e.constructor)))(t)}))}))},function(e,t,n){"use strict";var o=n(11),r=n(118),i=o.aTypedArrayConstructor;(0,o.exportTypedArrayStaticMethod)("of",(function(){for(var e=0,t=arguments.length,n=new(i(this))(t);t>e;)n[e]=arguments[e++];return n}),r)},function(e,t,n){"use strict";var o=n(11),r=n(79).left,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("reduce",(function(e){return r(i(this),e,arguments.length,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=n(79).right,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("reduceRight",(function(e){return r(i(this),e,arguments.length,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=o.aTypedArray,i=o.exportTypedArrayMethod,a=Math.floor;i("reverse",(function(){for(var e,t=r(this).length,n=a(t/2),o=0;o1?arguments[1]:undefined,1),n=this.length,o=a(e),c=r(o.length),d=0;if(c+t>n)throw RangeError("Wrong length");for(;di;)u[i]=n[i++];return u}),i((function(){new Int8Array(1).slice()})))},function(e,t,n){"use strict";var o=n(11),r=n(21).some,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("some",(function(e){return r(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=o.aTypedArray,i=o.exportTypedArrayMethod,a=[].sort;i("sort",(function(e){return a.call(r(this),e)}))},function(e,t,n){"use strict";var o=n(11),r=n(12),i=n(45),a=n(49),c=o.aTypedArray;(0,o.exportTypedArrayMethod)("subarray",(function(e,t){var n=c(this),o=n.length,l=i(e,o);return new(a(n,n.constructor))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,r((t===undefined?o:i(t,o))-l))}))},function(e,t,n){"use strict";var o=n(7),r=n(11),i=n(5),a=o.Int8Array,c=r.aTypedArray,l=r.exportTypedArrayMethod,d=[].toLocaleString,u=[].slice,s=!!a&&i((function(){d.call(new a(1))}));l("toLocaleString",(function(){return d.apply(s?u.call(c(this)):c(this),arguments)}),i((function(){return[1,2].toLocaleString()!=new a([1,2]).toLocaleString()}))||!i((function(){a.prototype.toLocaleString.call([1,2])})))},function(e,t,n){"use strict";var o=n(11).exportTypedArrayMethod,r=n(5),i=n(7).Uint8Array,a=i&&i.prototype||{},c=[].toString,l=[].join;r((function(){c.call({})}))&&(c=function(){return l.call(this)});var d=a.toString!=c;o("toString",c,d)},function(e,t,n){"use strict";var o,r=n(7),i=n(70),a=n(55),c=n(81),l=n(164),d=n(8),u=n(36).enforce,s=n(131),p=!r.ActiveXObject&&"ActiveXObject"in r,m=Object.isExtensible,f=function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}},h=e.exports=c("WeakMap",f,l);if(s&&p){o=l.getConstructor(f,"WeakMap",!0),a.REQUIRED=!0;var C=h.prototype,g=C["delete"],b=C.has,N=C.get,v=C.set;i(C,{"delete":function(e){if(d(e)&&!m(e)){var t=u(this);return t.frozen||(t.frozen=new o),g.call(this,e)||t.frozen["delete"](e)}return g.call(this,e)},has:function(e){if(d(e)&&!m(e)){var t=u(this);return t.frozen||(t.frozen=new o),b.call(this,e)||t.frozen.has(e)}return b.call(this,e)},get:function(e){if(d(e)&&!m(e)){var t=u(this);return t.frozen||(t.frozen=new o),b.call(this,e)?N.call(this,e):t.frozen.get(e)}return N.call(this,e)},set:function(e,t){if(d(e)&&!m(e)){var n=u(this);n.frozen||(n.frozen=new o),b.call(this,e)?v.call(this,e,t):n.frozen.set(e,t)}else v.call(this,e,t);return this}})}},function(e,t,n){"use strict";n(81)("WeakSet",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),n(164))},function(e,t,n){"use strict";var o=n(4),r=n(7),i=n(110);o({global:!0,bind:!0,enumerable:!0,forced:!r.setImmediate||!r.clearImmediate},{setImmediate:i.set,clearImmediate:i.clear})},function(e,t,n){"use strict";var o=n(4),r=n(7),i=n(157),a=n(34),c=r.process,l="process"==a(c);o({global:!0,enumerable:!0,noTargetGet:!0},{queueMicrotask:function(e){var t=l&&c.domain;i(t?t.bind(e):e)}})},function(e,t,n){"use strict";var o=n(4),r=n(7),i=n(76),a=[].slice,c=function(e){return function(t,n){var o=arguments.length>2,r=o?a.call(arguments,2):undefined;return e(o?function(){("function"==typeof t?t:Function(t)).apply(this,r)}:t,n)}};o({global:!0,bind:!0,forced:/MSIE .\./.test(i)},{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},function(e,t,n){"use strict";t.__esModule=!0,t._CI=Se,t._HI=O,t._M=Le,t._MCCC=Ee,t._ME=Te,t._MFCC=Me,t._MP=we,t._MR=be,t.__render=je,t.createComponentVNode=function(e,t,n,o,r){var a=new L(1,null,null,e=function(e,t){if(12&e)return e;if(t.prototype&&t.prototype.render)return 4;if(t.render)return 32776;return 8}(e,t),o,function(e,t,n){var o=(32768&e?t.render:t).defaultProps;if(i(o))return n;if(i(n))return u(o,null);return B(n,o)}(e,t,n),function(e,t,n){if(4&e)return n;var o=(32768&e?t.render:t).defaultHooks;if(i(o))return n;if(i(n))return o;return B(n,o)}(e,t,r),t);x.createVNode&&x.createVNode(a);return a},t.createFragment=A,t.createPortal=function(e,t){var n=O(e);return I(1024,1024,null,n,0,null,n.key,t)},t.createRef=function(){return{current:null}},t.createRenderer=function(e){return function(t,n,o,r){e||(e=t),De(n,e,o,r)}},t.createTextVNode=T,t.createVNode=I,t.directClone=E,t.findDOMfromVNode=N,t.forwardRef=function(e){return{render:e}},t.getFlagsForElementVnode=function(e){switch(e){case"svg":return 32;case"input":return 64;case"select":return 256;case"textarea":return 128;case"$F":return 8192;default:return 1}},t.linkEvent=function(e,t){if(c(t))return{data:e,event:t};return null},t.normalizeProps=function(e){var t=e.props;if(t){var n=e.flags;481&n&&(void 0!==t.children&&i(e.children)&&R(e,t.children),void 0!==t.className&&(e.className=t.className||null,t.className=undefined)),void 0!==t.key&&(e.key=t.key,t.key=undefined),void 0!==t.ref&&(e.ref=8&n?u(e.ref,t.ref):t.ref,t.ref=undefined)}return e},t.render=De,t.rerender=Ke,t.version=t.options=t.Fragment=t.EMPTY_OBJ=t.Component=void 0;var o=Array.isArray;function r(e){var t=typeof e;return"string"===t||"number"===t}function i(e){return null==e}function a(e){return null===e||!1===e||!0===e||void 0===e}function c(e){return"function"==typeof e}function l(e){return"string"==typeof e}function d(e){return null===e}function u(e,t){var n={};if(e)for(var o in e)n[o]=e[o];if(t)for(var r in t)n[r]=t[r];return n}function s(e){return!d(e)&&"object"==typeof e}var p={};t.EMPTY_OBJ=p;function m(e){return e.substr(2).toLowerCase()}function f(e,t){e.appendChild(t)}function h(e,t,n){d(n)?f(e,t):e.insertBefore(t,n)}function C(e,t){e.removeChild(t)}function g(e){for(var t=0;t0,f=d(p),h=l(p)&&"$"===p[0];m||f||h?(n=n||t.slice(0,u),(m||h)&&(s=E(s)),(f||h)&&(s.key="$"+u),n.push(s)):n&&n.push(s),s.flags|=65536}}i=0===(n=n||t).length?1:8}else(n=t).flags|=65536,81920&t.flags&&(n=E(t)),i=2;return e.children=n,e.childFlags=i,e}function O(e){return a(e)||r(e)?T(e,null):o(e)?A(e,0,null):16384&e.flags?E(e):e}var F="http://www.w3.org/1999/xlink",j="http://www.w3.org/XML/1998/namespace",D={"xlink:actuate":F,"xlink:arcrole":F,"xlink:href":F,"xlink:role":F,"xlink:show":F,"xlink:title":F,"xlink:type":F,"xml:base":j,"xml:lang":j,"xml:space":j};function z(e){return{onClick:e,onDblClick:e,onFocusIn:e,onFocusOut:e,onKeyDown:e,onKeyPress:e,onKeyUp:e,onMouseDown:e,onMouseMove:e,onMouseUp:e,onTouchEnd:e,onTouchMove:e,onTouchStart:e}}var W=z(0),H=z(null),U=z(!0);function G(e,t){var n=t.$EV;return n||(n=t.$EV=z(null)),n[e]||1==++W[e]&&(H[e]=function(e){var t="onClick"===e||"onDblClick"===e?function(e){return function(t){0===t.button?q(t,!0,e,Q(t)):t.stopPropagation()}}(e):function(e){return function(t){q(t,!1,e,Q(t))}}(e);return document.addEventListener(m(e),t),t}(e)),n}function K(e,t){var n=t.$EV;n&&n[e]&&(0==--W[e]&&(document.removeEventListener(m(e),H[e]),H[e]=null),n[e]=null)}function q(e,t,n,o){var r=function(e){return c(e.composedPath)?e.composedPath()[0]:e.target}(e);do{if(t&&r.disabled)return;var i=r.$EV;if(i){var a=i[n];if(a&&(o.dom=r,a.event?a.event(a.data,e):a(e),e.cancelBubble))return}r=r.parentNode}while(!d(r))}function Y(){this.cancelBubble=!0,this.immediatePropagationStopped||this.stopImmediatePropagation()}function $(){return this.defaultPrevented}function X(){return this.cancelBubble}function Q(e){var t={dom:document};return e.isDefaultPrevented=$,e.isPropagationStopped=X,e.stopPropagation=Y,Object.defineProperty(e,"currentTarget",{configurable:!0,get:function(){return t.dom}}),t}function J(e,t,n){if(e[t]){var o=e[t];o.event?o.event(o.data,n):o(n)}else{var r=t.toLowerCase();e[r]&&e[r](n)}}function Z(e,t){var n=function(n){var o=this.$V;if(o){var r=o.props||p,i=o.dom;if(l(e))J(r,e,n);else for(var a=0;a-1&&t.options[a]&&(c=t.options[a].value),n&&i(c)&&(c=e.defaultValue),ae(o,c)}}var de,ue,se=Z("onInput",me),pe=Z("onChange");function me(e,t,n){var o=e.value,r=t.value;if(i(o)){if(n){var a=e.defaultValue;i(a)||a===r||(t.defaultValue=a,t.value=a)}}else r!==o&&(t.defaultValue=o,t.value=o)}function fe(e,t,n,o,r,i){64&e?ie(o,n):256&e?le(o,n,r,t):128&e&&me(o,n,r),i&&(n.$V=t)}function he(e,t,n){64&e?function(e,t){te(t.type)?(ee(e,"change",oe),ee(e,"click",re)):ee(e,"input",ne)}(t,n):256&e?function(e){ee(e,"change",ce)}(t):128&e&&function(e,t){ee(e,"input",se),t.onChange&&ee(e,"change",pe)}(t,n)}function Ce(e){return e.type&&te(e.type)?!i(e.checked):!i(e.value)}function ge(e){e&&!S(e,null)&&e.current&&(e.current=null)}function be(e,t,n){e&&(c(e)||void 0!==e.current)&&n.push((function(){S(e,t)||void 0===e.current||(e.current=t)}))}function Ne(e,t){ve(e),v(e,t)}function ve(e){var t,n=e.flags,o=e.children;if(481&n){t=e.ref;var r=e.props;ge(t);var a=e.childFlags;if(!d(r))for(var l=Object.keys(r),u=0,s=l.length;u0;for(var c in a&&(i=Ce(n))&&he(t,o,n),n)_e(c,null,n[c],o,r,i,null);a&&fe(t,e,o,n,!0,i)}function Be(e,t,n){var o=O(e.render(t,e.state,n)),r=n;return c(e.getChildContext)&&(r=u(n,e.getChildContext())),e.$CX=r,o}function Se(e,t,n,o,r,i){var a=new t(n,o),l=a.$N=Boolean(t.getDerivedStateFromProps||a.getSnapshotBeforeUpdate);if(a.$SVG=r,a.$L=i,e.children=a,a.$BS=!1,a.context=o,a.props===p&&(a.props=n),l)a.state=y(a,n,a.state);else if(c(a.componentWillMount)){a.$BR=!0,a.componentWillMount();var u=a.$PS;if(!d(u)){var s=a.state;if(d(s))a.state=u;else for(var m in u)s[m]=u[m];a.$PS=null}a.$BR=!1}return a.$LI=Be(a,n,o),a}function Le(e,t,n,o,r,i){var a=e.flags|=16384;481&a?Te(e,t,n,o,r,i):4&a?function(e,t,n,o,r,i){var a=Se(e,e.type,e.props||p,n,o,i);Le(a.$LI,t,a.$CX,o,r,i),Ee(e.ref,a,i)}(e,t,n,o,r,i):8&a?(!function(e,t,n,o,r,i){Le(e.children=O(function(e,t){return 32768&e.flags?e.type.render(e.props||p,e.ref,t):e.type(e.props||p,t)}(e,n)),t,n,o,r,i)}(e,t,n,o,r,i),Me(e,i)):512&a||16&a?Ie(e,t,r):8192&a?function(e,t,n,o,r,i){var a=e.children,c=e.childFlags;12&c&&0===a.length&&(c=e.childFlags=2,a=e.children=M());2===c?Le(a,n,r,o,r,i):Ae(a,n,t,o,r,i)}(e,n,t,o,r,i):1024&a&&function(e,t,n,o,r){Le(e.children,e.ref,t,!1,null,r);var i=M();Ie(i,n,o),e.dom=i.dom}(e,n,t,r,i)}function Ie(e,t,n){var o=e.dom=document.createTextNode(e.children);d(t)||h(t,o,n)}function Te(e,t,n,o,r,a){var c=e.flags,l=e.props,u=e.className,s=e.children,p=e.childFlags,m=e.dom=function(e,t){return t?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e)}(e.type,o=o||(32&c)>0);if(i(u)||""===u||(o?m.setAttribute("class",u):m.className=u),16===p)_(m,s);else if(1!==p){var f=o&&"foreignObject"!==e.type;2===p?(16384&s.flags&&(e.children=s=E(s)),Le(s,m,n,f,null,a)):8!==p&&4!==p||Ae(s,m,n,f,null,a)}d(t)||h(t,m,r),d(l)||we(e,c,l,m,o),be(e.ref,m,a)}function Ae(e,t,n,o,r,i){for(var a=0;a0,d!==u){var f=d||p;if((c=u||p)!==p)for(var h in(s=(448&r)>0)&&(m=Ce(c)),c){var C=f[h],g=c[h];C!==g&&_e(h,C,g,l,o,m,e)}if(f!==p)for(var b in f)i(c[b])&&!i(f[b])&&_e(b,f[b],null,l,o,m,e)}var N=t.children,v=t.className;e.className!==v&&(i(v)?l.removeAttribute("class"):o?l.setAttribute("class",v):l.className=v);4096&r?function(e,t){e.textContent!==t&&(e.textContent=t)}(l,N):Re(e.childFlags,t.childFlags,e.children,N,l,n,o&&"foreignObject"!==t.type,null,e,a);s&&fe(r,t,l,c,!1,m);var V=t.ref,y=e.ref;y!==V&&(ge(y),be(V,l,a))}(e,t,o,r,m,s):4&m?function(e,t,n,o,r,i,a){var l=t.children=e.children;if(d(l))return;l.$L=a;var s=t.props||p,m=t.ref,f=e.ref,h=l.state;if(!l.$N){if(c(l.componentWillReceiveProps)){if(l.$BR=!0,l.componentWillReceiveProps(s,o),l.$UN)return;l.$BR=!1}d(l.$PS)||(h=u(h,l.$PS),l.$PS=null)}Oe(l,h,s,n,o,r,!1,i,a),f!==m&&(ge(f),be(m,l,a))}(e,t,n,o,r,l,s):8&m?function(e,t,n,o,r,a,l){var d=!0,u=t.props||p,s=t.ref,m=e.props,f=!i(s),h=e.children;f&&c(s.onComponentShouldUpdate)&&(d=s.onComponentShouldUpdate(m,u));if(!1!==d){f&&c(s.onComponentWillUpdate)&&s.onComponentWillUpdate(m,u);var C=t.type,g=O(32768&t.flags?C.render(u,s,o):C(u,o));Pe(h,g,n,o,r,a,l),t.children=g,f&&c(s.onComponentDidUpdate)&&s.onComponentDidUpdate(m,u)}else t.children=h}(e,t,n,o,r,l,s):16&m?function(e,t){var n=t.children,o=t.dom=e.dom;n!==e.children&&(o.nodeValue=n)}(e,t):512&m?t.dom=e.dom:8192&m?function(e,t,n,o,r,i){var a=e.children,c=t.children,l=e.childFlags,d=t.childFlags,u=null;12&d&&0===c.length&&(d=t.childFlags=2,c=t.children=M());var s=0!=(2&d);if(12&l){var p=a.length;(8&l&&8&d||s||!s&&c.length>p)&&(u=N(a[p-1],!1).nextSibling)}Re(l,d,a,c,n,o,r,u,e,i)}(e,t,n,o,r,s):function(e,t,n,o){var r=e.ref,i=t.ref,c=t.children;if(Re(e.childFlags,t.childFlags,e.children,c,r,n,!1,null,e,o),t.dom=e.dom,r!==i&&!a(c)){var l=c.dom;C(r,l),f(i,l)}}(e,t,o,s)}function Re(e,t,n,o,r,i,a,c,l,d){switch(e){case 2:switch(t){case 2:Pe(n,o,r,i,a,c,d);break;case 1:Ne(n,r);break;case 16:ve(n),_(r,o);break;default:!function(e,t,n,o,r,i){ve(e),Ae(t,n,o,r,N(e,!0),i),v(e,n)}(n,o,r,i,a,d)}break;case 1:switch(t){case 2:Le(o,r,i,a,c,d);break;case 1:break;case 16:_(r,o);break;default:Ae(o,r,i,a,c,d)}break;case 16:switch(t){case 16:!function(e,t,n){e!==t&&(""!==e?n.firstChild.nodeValue=t:_(n,t))}(n,o,r);break;case 2:ye(r),Le(o,r,i,a,c,d);break;case 1:ye(r);break;default:ye(r),Ae(o,r,i,a,c,d)}break;default:switch(t){case 16:Ve(n),_(r,o);break;case 2:ke(r,l,n),Le(o,r,i,a,c,d);break;case 1:ke(r,l,n);break;default:var u=0|n.length,s=0|o.length;0===u?s>0&&Ae(o,r,i,a,c,d):0===s?ke(r,l,n):8===t&&8===e?function(e,t,n,o,r,i,a,c,l,d){var u,s,p=i-1,m=a-1,f=0,h=e[f],C=t[f];e:{for(;h.key===C.key;){if(16384&C.flags&&(t[f]=C=E(C)),Pe(h,C,n,o,r,c,d),e[f]=C,++f>p||f>m)break e;h=e[f],C=t[f]}for(h=e[p],C=t[m];h.key===C.key;){if(16384&C.flags&&(t[m]=C=E(C)),Pe(h,C,n,o,r,c,d),e[p]=C,p--,m--,f>p||f>m)break e;h=e[p],C=t[m]}}if(f>p){if(f<=m)for(s=(u=m+1)m)for(;f<=p;)Ne(e[f++],n);else!function(e,t,n,o,r,i,a,c,l,d,u,s,p){var m,f,h,C=0,g=c,b=c,v=i-c+1,y=a-c+1,k=new Int32Array(y+1),x=v===o,_=!1,w=0,B=0;if(r<4||(v|y)<32)for(C=g;C<=i;++C)if(m=e[C],Bc?_=!0:w=c,16384&f.flags&&(t[c]=f=E(f)),Pe(m,f,l,n,d,u,p),++B;break}!x&&c>a&&Ne(m,l)}else x||Ne(m,l);else{var S={};for(C=b;C<=a;++C)S[t[C].key]=C;for(C=g;C<=i;++C)if(m=e[C],Bg;)Ne(e[g++],l);k[c-b]=C+1,w>c?_=!0:w=c,16384&(f=t[c]).flags&&(t[c]=f=E(f)),Pe(m,f,l,n,d,u,p),++B}else x||Ne(m,l);else x||Ne(m,l)}if(x)ke(l,s,e),Ae(t,l,n,d,u,p);else if(_){var L=function(e){var t=0,n=0,o=0,r=0,i=0,a=0,c=0,l=e.length;l>Fe&&(Fe=l,de=new Int32Array(l),ue=new Int32Array(l));for(;n>1]]0&&(ue[n]=de[i-1]),de[i]=n)}i=r+1;var d=new Int32Array(i);a=de[i-1];for(;i-- >0;)d[i]=a,a=ue[a],de[i]=0;return d}(k);for(c=L.length-1,C=y-1;C>=0;C--)0===k[C]?(16384&(f=t[w=C+b]).flags&&(t[w]=f=E(f)),Le(f,l,n,d,(h=w+1)=0;C--)0===k[C]&&(16384&(f=t[w=C+b]).flags&&(t[w]=f=E(f)),Le(f,l,n,d,(h=w+1)a?a:i,p=0;pa)for(p=s;p=0;--r){var i=this.tryEntries[r],a=i.completion;if("root"===i.tryLoc)return o("end");if(i.tryLoc<=this.prev){var c=n.call(i,"catchLoc"),l=n.call(i,"finallyLoc");if(c&&l){if(this.prev=0;--o){var r=this.tryEntries[o];if(r.tryLoc<=this.prev&&n.call(r,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),V(n),d}},"catch":function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var o=n.completion;if("throw"===o.type){var r=o.arg;V(n)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:k(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),d}},e}(e.exports);try{regeneratorRuntime=o}catch(r){Function("r","regeneratorRuntime = r")(o)}},function(e,t,n){"use strict";!function(t,n){var o,r,i=t.html5||{},a=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,c=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,l=0,d={};function u(){var e=f.elements;return"string"==typeof e?e.split(" "):e}function s(e){var t=d[e._html5shiv];return t||(t={},l++,e._html5shiv=l,d[l]=t),t}function p(e,t,o){return t||(t=n),r?t.createElement(e):(o||(o=s(t)),!(i=o.cache[e]?o.cache[e].cloneNode():c.test(e)?(o.cache[e]=o.createElem(e)).cloneNode():o.createElem(e)).canHaveChildren||a.test(e)||i.tagUrn?i:o.frag.appendChild(i));var i}function m(e){e||(e=n);var t=s(e);return!f.shivCSS||o||t.hasCSS||(t.hasCSS=!!function(e,t){var n=e.createElement("p"),o=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x",o.insertBefore(n.lastChild,o.firstChild)}(e,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),r||function(e,t){t.cache||(t.cache={},t.createElem=e.createElement,t.createFrag=e.createDocumentFragment,t.frag=t.createFrag()),e.createElement=function(n){return f.shivMethods?p(n,e,t):t.createElem(n)},e.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+u().join().replace(/[\w\-:]+/g,(function(e){return t.createElem(e),t.frag.createElement(e),'c("'+e+'")'}))+");return n}")(f,t.frag)}(e,t),e}!function(){try{var e=n.createElement("a");e.innerHTML="",o="hidden"in e,r=1==e.childNodes.length||function(){n.createElement("a");var e=n.createDocumentFragment();return"undefined"==typeof e.cloneNode||"undefined"==typeof e.createDocumentFragment||"undefined"==typeof e.createElement}()}catch(t){o=!0,r=!0}}();var f={elements:i.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:"3.7.3",shivCSS:!1!==i.shivCSS,supportsUnknownElements:r,shivMethods:!1!==i.shivMethods,type:"default",shivDocument:m,createElement:p,createDocumentFragment:function(e,t){if(e||(e=n),r)return e.createDocumentFragment();for(var o=(t=t||s(e)).frag.cloneNode(),i=0,a=u(),c=a.length;i3?c(a):null,N=String(a.key),v=String(a.char),V=a.location,y=a.keyCode||(a.keyCode=N)&&N.charCodeAt(0)||0,k=a.charCode||(a.charCode=v)&&v.charCodeAt(0)||0,x=a.bubbles,_=a.cancelable,w=a.repeat,B=a.locale,S=a.view||e;if(a.which||(a.which=a.keyCode),"initKeyEvent"in p)p.initKeyEvent(t,x,_,S,m,h,f,C,y,k);else if(0>>0),t=Element.prototype,n=t.querySelector,o=t.querySelectorAll;function r(t,n,o){t.setAttribute(e,null);var r=n.call(t,String(o).replace(/(^|,\s*)(:scope([ >]|$))/g,(function(t,n,o,r){return n+"["+e+"]"+(r||" ")})));return t.removeAttribute(e),r}t.querySelector=function(e){return r(this,n,e)},t.querySelectorAll=function(e){return r(this,o,e)}}()}}(window),function(e){var t=e.WeakMap||function(){var e,t=0,n=!1,o=!1;function r(t,r,i){o=i,n=!1,e=undefined,t.dispatchEvent(r)}function i(e){this.value=e}function c(){t++,this.__ce__=new a("@DOMMap:"+t+Math.random())}return i.prototype.handleEvent=function(t){n=!0,o?t.currentTarget.removeEventListener(t.type,this,!1):e=this.value},c.prototype={constructor:c,"delete":function(e){return r(e,this.__ce__,!0),n},get:function(t){r(t,this.__ce__,!1);var n=e;return e=undefined,n},has:function(e){return r(e,this.__ce__,!1),n},set:function(e,t){return r(e,this.__ce__,!0),e.addEventListener(this.__ce__.type,new i(t),!1),this}},c}();function n(){}function o(e,t,n){function r(e){r.once&&(e.currentTarget.removeEventListener(e.type,t,r),r.removed=!0),r.passive&&(e.preventDefault=o.preventDefault),"function"==typeof r.callback?r.callback.call(this,e):r.callback&&r.callback.handleEvent(e),r.passive&&delete e.preventDefault}return r.type=e,r.callback=t,r.capture=!!n.capture,r.passive=!!n.passive,r.once=!!n.once,r.removed=!1,r}n.prototype=(Object.create||Object)(null),o.preventDefault=function(){};var r,i,a=e.CustomEvent,c=e.dispatchEvent,l=e.addEventListener,d=e.removeEventListener,u=0,s=function(){u++},p=[].indexOf||function(e){for(var t=this.length;t--&&this[t]!==e;);return t},m=function(e){return"".concat(e.capture?"1":"0",e.passive?"1":"0",e.once?"1":"0")};try{l("_",s,{once:!0}),c(new a("_")),c(new a("_")),d("_",s,{once:!0})}catch(f){}1!==u&&(i=new t,r=function(e){if(e){var t=e.prototype;t.addEventListener=function(e){return function(t,r,a){if(a&&"boolean"!=typeof a){var c,l,d,u=i.get(this),s=m(a);u||i.set(this,u=new n),t in u||(u[t]={handler:[],wrap:[]}),l=u[t],(c=p.call(l.handler,r))<0?(c=l.handler.push(r)-1,l.wrap[c]=d=new n):d=l.wrap[c],s in d||(d[s]=o(t,r,a),e.call(this,t,d[s],d[s].capture))}else e.call(this,t,r,a)}}(t.addEventListener),t.removeEventListener=function(e){return function(t,n,o){if(o&&"boolean"!=typeof o){var r,a,c,l,d=i.get(this);if(d&&t in d&&(c=d[t],-1<(a=p.call(c.handler,n))&&(r=m(o))in(l=c.wrap[a]))){for(r in e.call(this,t,l[r],l[r].capture),delete l[r],l)return;c.handler.splice(a,1),c.wrap.splice(a,1),0===c.handler.length&&delete d[t]}}else e.call(this,t,n,o)}}(t.removeEventListener)}},e.EventTarget?r(EventTarget):(r(e.Text),r(e.Element||e.HTMLElement),r(e.HTMLDocument),r(e.Window||{prototype:e}),r(e.XMLHttpRequest)))}(window)},function(e,t,n){"use strict";!function(e){if("undefined"!=typeof e.setAttribute){var t=function(e){return e.replace(/-[a-z]/g,(function(e){return e[1].toUpperCase()}))};e.setProperty=function(e,n){var o=t(e);if(!n)return this.removeAttribute(o);var r=String(n);return this.setAttribute(o,r)},e.getPropertyValue=function(e){var n=t(e);return this.getAttribute(n)||null},e.removeProperty=function(e){var n=t(e),o=this.getAttribute(n);return this.removeAttribute(n),o}}}(CSSStyleDeclaration.prototype)},function(e,t,n){"use strict";window.Int32Array||(window.Int32Array=Array)},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";t.__esModule=!0,t.loadCSS=void 0;var o=n(418),r=(0,n(44).createLogger)("assets"),i={styles:[]};t.loadCSS=function(e){i.styles.includes(e)||(i.styles.push(e),r.log("loading stylesheet '"+e+"'"),(0,o.loadCSS)(e))}},function(e,t,n){"use strict";(function(e){var n;n=void 0!==e?e:void 0,t.loadCSS=function(e,t,o,r){var i,a=n.document,c=a.createElement("link");if(t)i=t;else{var l=(a.body||a.getElementsByTagName("head")[0]).childNodes;i=l[l.length-1]}var d=a.styleSheets;if(r)for(var u in r)r.hasOwnProperty(u)&&c.setAttribute(u,r[u]);c.rel="stylesheet",c.href=e,c.media="only x",function m(e){if(a.body)return e();setTimeout((function(){m(e)}))}((function(){i.parentNode.insertBefore(c,t?i:i.nextSibling)}));var s=function f(e){for(var t=c.href,n=d.length;n--;)if(d[n].href===t)return e();setTimeout((function(){f(e)}))};function p(){c.addEventListener&&c.removeEventListener("load",p),c.media=o||"all"}return c.addEventListener&&c.addEventListener("load",p),c.onloadcssdefined=s,s(p),c}}).call(this,n(73))},function(e,t,n){"use strict";(function(e){var o=void 0!==e&&e||"undefined"!=typeof self&&self||window,r=Function.prototype.apply;function i(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new i(r.call(setTimeout,o,arguments),clearTimeout)},t.setInterval=function(){return new i(r.call(setInterval,o,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(o,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(420),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||void 0,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||void 0}).call(this,n(73))},function(e,t,n){"use strict";(function(e,t){!function(e,n){if(!e.setImmediate){var o,r,i,a,c,l=1,d={},u=!1,s=e.document,p=Object.getPrototypeOf&&Object.getPrototypeOf(e);p=p&&p.setTimeout?p:e,"[object process]"==={}.toString.call(e.process)?o=function(e){t.nextTick((function(){f(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((i=new MessageChannel).port1.onmessage=function(e){f(e.data)},o=function(e){i.port2.postMessage(e)}):s&&"onreadystatechange"in s.createElement("script")?(r=s.documentElement,o=function(e){var t=s.createElement("script");t.onreadystatechange=function(){f(e),t.onreadystatechange=null,r.removeChild(t),t=null},r.appendChild(t)}):o=function(e){setTimeout(f,0,e)}:(a="setImmediate$"+Math.random()+"$",c=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(a)&&f(+t.data.slice(a.length))},e.addEventListener?e.addEventListener("message",c,!1):e.attachEvent("onmessage",c),o=function(t){e.postMessage(a+t,"*")}),p.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n1)for(var n=1;n=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n1?r-1:0),a=1;a1?t-1:0),o=1;o=0||(r[n]=e[n]);return r}(e,["className"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({className:(0,r.classes)(["BlockQuote",t])},n)))}},function(e,t,n){"use strict";t.__esModule=!0,t.ByondUi=void 0;var o=n(0),r=n(6),i=n(429),a=n(44),c=n(17);function l(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}var d=(0,a.createLogger)("ByondUi"),u=[];window.addEventListener("beforeunload",(function(){for(var e=0;e=0||(r[n]=e[n]);return r}(t,["data","rangeX","rangeY","fillColor","strokeColor","strokeWidth"]),C=this.state.viewBox,g=function(e,t,n,o){if(0===e.length)return[];var i=(0,r.zipWith)(Math.min).apply(void 0,e),a=(0,r.zipWith)(Math.max).apply(void 0,e);return n!==undefined&&(i[0]=n[0],a[0]=n[1]),o!==undefined&&(i[1]=o[0],a[1]=o[1]),(0,r.map)((function(e){return(0,r.zipWith)((function(e,t,n,o){return(e-t)/(n-t)*o}))(e,i,a,t)}))(e)}(i,C,c,l);if(g.length>0){var b=g[0],N=g[g.length-1];g.push([C[0]+f,N[1]]),g.push([C[0]+f,-f]),g.push([-f,-f]),g.push([-f,b[1]])}var v=function(e){for(var t="",n=0;n=0||(r[n]=e[n]);return r}(t,["children","color","title","buttons"]);return(0,o.createComponentVNode)(2,r.Box,{mb:1,children:[(0,o.createVNode)(1,"div","Table",[(0,o.createVNode)(1,"div","Table__cell",(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Button,Object.assign({fluid:!0,color:l,icon:n?"chevron-down":"chevron-right",onClick:function(){return e.setState({open:!n})}},s,{children:d}))),2),u&&(0,o.createVNode)(1,"div","Table__cell Table__cell--collapsing",u,0)],0),n&&(0,o.createComponentVNode)(2,r.Box,{mt:1,children:a})]})},a}(o.Component);t.Collapsible=a},function(e,t,n){"use strict";t.__esModule=!0,t.ColorBox=void 0;var o=n(0),r=n(6),i=n(17);var a=function(e){var t=e.content,n=(e.children,e.className),a=e.color,c=e.backgroundColor,l=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}(e,["content","children","className","color","backgroundColor"]);return l.color=t?null:"transparent",l.backgroundColor=a||c,(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["ColorBox",n,(0,i.computeBoxClassName)(l)]),t||".",0,Object.assign({},(0,i.computeBoxProps)(l))))};t.ColorBox=a,a.defaultHooks=r.pureComponentHooks},function(e,t,n){"use strict";t.__esModule=!0,t.Dropdown=void 0;var o=n(0),r=n(6),i=n(17),a=n(124);function c(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}var l=function(e){var t,n;function l(t){var n;return(n=e.call(this,t)||this).state={selected:t.selected,open:!1},n.handleClick=function(){n.state.open&&n.setOpen(!1)},n}n=e,(t=l).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var d=l.prototype;return d.componentWillUnmount=function(){window.removeEventListener("click",this.handleClick)},d.setOpen=function(e){var t=this;this.setState({open:e}),e?(setTimeout((function(){return window.addEventListener("click",t.handleClick)})),this.menuRef.focus()):window.removeEventListener("click",this.handleClick)},d.setSelected=function(e){this.setState({selected:e}),this.setOpen(!1),this.props.onSelected(e)},d.buildMenu=function(){var e=this,t=this.props.options,n=(void 0===t?[]:t).map((function(t){return(0,o.createVNode)(1,"div","Dropdown__menuentry",t,0,{onClick:function(){e.setSelected(t)}},t)}));return n.length?n:"No Options Found"},d.render=function(){var e=this,t=this.props,n=t.color,l=void 0===n?"default":n,d=t.over,u=t.noscroll,s=t.nochevron,p=t.width,m=(t.onClick,t.selected,t.disabled),f=c(t,["color","over","noscroll","nochevron","width","onClick","selected","disabled"]),h=f.className,C=c(f,["className"]),g=d?!this.state.open:this.state.open,b=this.state.open?(0,o.createVNode)(1,"div",(0,r.classes)([u?"Dropdown__menu-noscroll":"Dropdown__menu",d&&"Dropdown__over"]),this.buildMenu(),0,{tabIndex:"-1",style:{width:p}},null,(function(t){e.menuRef=t})):null;return(0,o.createVNode)(1,"div","Dropdown",[(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({width:p,className:(0,r.classes)(["Dropdown__control","Button","Button--color--"+l,m&&"Button--disabled",h])},C,{onClick:function(){m&&!e.state.open||e.setOpen(!e.state.open)},children:[(0,o.createVNode)(1,"span","Dropdown__selected-text",this.state.selected,0),!!s||(0,o.createVNode)(1,"span","Dropdown__arrow-button",(0,o.createComponentVNode)(2,a.Icon,{name:g?"chevron-up":"chevron-down"}),2)]}))),b],0)},l}(o.Component);t.Dropdown=l},function(e,t,n){"use strict";t.__esModule=!0,t.GridColumn=t.Grid=void 0;var o=n(0),r=n(173),i=n(6);function a(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}var c=function(e){var t=e.children,n=a(e,["children"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Table,Object.assign({},n,{children:(0,o.createComponentVNode)(2,r.Table.Row,{children:t})})))};t.Grid=c,c.defaultHooks=i.pureComponentHooks;var l=function(e){var t=e.size,n=void 0===t?1:t,i=e.style,c=a(e,["size","style"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Table.Cell,Object.assign({style:Object.assign({width:n+"%"},i)},c)))};t.GridColumn=l,c.defaultHooks=i.pureComponentHooks,c.Column=l},function(e,t,n){"use strict";t.__esModule=!0,t.Input=void 0;var o=n(0),r=n(6),i=n(17);function a(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}var c=function(e){return(0,r.isFalsy)(e)?"":e},l=function(e){var t,n;function l(){var t;return(t=e.call(this)||this).inputRef=(0,o.createRef)(),t.state={editing:!1},t.handleInput=function(e){var n=t.state.editing,o=t.props.onInput;n||t.setEditing(!0),o&&o(e,e.target.value)},t.handleFocus=function(e){t.state.editing||t.setEditing(!0)},t.handleBlur=function(e){var n=t.state.editing,o=t.props.onChange;n&&(t.setEditing(!1),o&&o(e,e.target.value))},t.handleKeyDown=function(e){var n=t.props,o=n.onInput,r=n.onChange,i=n.onEnter;return 13===e.keyCode?(t.setEditing(!1),r&&r(e,e.target.value),o&&o(e,e.target.value),i&&i(e,e.target.value),void(t.props.selfClear?e.target.value="":e.target.blur())):27===e.keyCode?(t.setEditing(!1),e.target.value=c(t.props.value),void e.target.blur()):void 0},t}n=e,(t=l).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var d=l.prototype;return d.componentDidMount=function(){var e=this.props.value,t=this.inputRef.current;t&&(t.value=c(e)),this.props.autoFocus&&setTimeout((function(){return t.focus()}),1)},d.componentDidUpdate=function(e,t){var n=this.state.editing,o=e.value,r=this.props.value,i=this.inputRef.current;i&&!n&&o!==r&&(i.value=c(r))},d.setEditing=function(e){this.setState({editing:e})},d.render=function(){var e=this.props,t=(e.selfClear,e.onInput,e.onChange,e.onEnter,e.value,e.maxLength),n=e.placeholder,c=a(e,["selfClear","onInput","onChange","onEnter","value","maxLength","placeholder"]),l=c.className,d=c.fluid,u=a(c,["className","fluid"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({className:(0,r.classes)(["Input",d&&"Input--fluid",l])},u,{children:[(0,o.createVNode)(1,"div","Input__baseline",".",16),(0,o.createVNode)(64,"input","Input__input",null,1,{placeholder:n,onInput:this.handleInput,onFocus:this.handleFocus,onBlur:this.handleBlur,onKeyDown:this.handleKeyDown,maxLength:t},null,this.inputRef)]})))},l}(o.Component);t.Input=l},function(e,t,n){"use strict";t.__esModule=!0,t.Knob=void 0;var o=n(0),r=n(15),i=n(6),a=n(17),c=n(125),l=n(126);t.Knob=function(e){if(Byond.IS_LTE_IE8)return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.NumberInput,Object.assign({},e)));var t=e.animated,n=e.format,d=e.maxValue,u=e.minValue,s=e.onChange,p=e.onDrag,m=e.step,f=e.stepPixelSize,h=e.suppressFlicker,C=e.unit,g=e.value,b=e.className,N=e.style,v=e.fillValue,V=e.color,y=e.ranges,k=void 0===y?{}:y,x=e.size,_=e.bipolar,w=(e.children,function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}(e,["animated","format","maxValue","minValue","onChange","onDrag","step","stepPixelSize","suppressFlicker","unit","value","className","style","fillValue","color","ranges","size","bipolar","children"]));return(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.DraggableControl,Object.assign({dragMatrix:[0,-1]},{animated:t,format:n,maxValue:d,minValue:u,onChange:s,onDrag:p,step:m,stepPixelSize:f,suppressFlicker:h,unit:C,value:g},{children:function(e){var t=e.dragging,n=(e.editing,e.value),c=e.displayValue,l=e.displayElement,s=e.inputElement,p=e.handleDragStart,m=(0,r.scale)(null!=v?v:c,u,d),f=(0,r.scale)(c,u,d),h=V||(0,r.keyOfMatchingRange)(null!=v?v:n,k)||"default",C=270*(f-.5);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,i.classes)(["Knob","Knob--color--"+h,_&&"Knob--bipolar",b,(0,a.computeBoxClassName)(w)]),[(0,o.createVNode)(1,"div","Knob__circle",(0,o.createVNode)(1,"div","Knob__cursorBox",(0,o.createVNode)(1,"div","Knob__cursor"),2,{style:{transform:"rotate("+C+"deg)"}}),2),t&&(0,o.createVNode)(1,"div","Knob__popupValue",l,0),(0,o.createVNode)(32,"svg","Knob__ring Knob__ringTrackPivot",(0,o.createVNode)(32,"circle","Knob__ringTrack",null,1,{cx:"50",cy:"50",r:"50"}),2,{viewBox:"0 0 100 100"}),(0,o.createVNode)(32,"svg","Knob__ring Knob__ringFillPivot",(0,o.createVNode)(32,"circle","Knob__ringFill",null,1,{style:{"stroke-dashoffset":((_?2.75:2)-1.5*m)*Math.PI*50},cx:"50",cy:"50",r:"50"}),2,{viewBox:"0 0 100 100"}),s],0,Object.assign({},(0,a.computeBoxProps)(Object.assign({style:Object.assign({"font-size":x+"rem"},N)},w)),{onMouseDown:p})))}})))}},function(e,t,n){"use strict";t.__esModule=!0,t.LabeledControls=void 0;var o=n(0),r=n(172);function i(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}var a=function(e){var t=e.children,n=i(e,["children"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Flex,Object.assign({mx:-.5,align:"stretch",justify:"space-between"},n,{children:t})))};t.LabeledControls=a;a.Item=function(e){var t=e.label,n=e.children,a=i(e,["label","children"]);return(0,o.createComponentVNode)(2,r.Flex.Item,{mx:1,children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Flex,Object.assign({minWidth:"52px",height:"100%",direction:"column",align:"center",textAlign:"center",justify:"space-between"},a,{children:[(0,o.createComponentVNode)(2,r.Flex.Item),(0,o.createComponentVNode)(2,r.Flex.Item,{children:n}),(0,o.createComponentVNode)(2,r.Flex.Item,{color:"label",children:t})]})))})}},function(e,t,n){"use strict";t.__esModule=!0,t.Modal=void 0;var o=n(0),r=n(6),i=n(17),a=n(170);t.Modal=function(e){var t=e.className,n=e.children,c=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}(e,["className","children"]);return(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Modal",t,(0,i.computeBoxClassName)(c)]),n,0,Object.assign({},(0,i.computeBoxProps)(c))))})}},function(e,t,n){"use strict";t.__esModule=!0,t.NoticeBox=void 0;var o=n(0),r=n(6),i=n(17);var a=function(e){var t=e.className,n=e.color,a=e.info,c=(e.warning,e.success),l=e.danger,d=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}(e,["className","color","info","warning","success","danger"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({className:(0,r.classes)(["NoticeBox",n&&"NoticeBox--color--"+n,a&&"NoticeBox--type--info",c&&"NoticeBox--type--success",l&&"NoticeBox--type--danger",t])},d)))};t.NoticeBox=a,a.defaultHooks=r.pureComponentHooks},function(e,t,n){"use strict";t.__esModule=!0,t.ProgressBar=void 0;var o=n(0),r=n(15),i=n(6),a=n(17);var c=function(e){var t=e.className,n=e.value,c=e.minValue,l=void 0===c?0:c,d=e.maxValue,u=void 0===d?1:d,s=e.color,p=e.ranges,m=void 0===p?{}:p,f=e.children,h=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}(e,["className","value","minValue","maxValue","color","ranges","children"]),C=(0,r.scale)(n,l,u),g=f!==undefined,b=s||(0,r.keyOfMatchingRange)(n,m)||"default";return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,i.classes)(["ProgressBar","ProgressBar--color--"+b,t,(0,a.computeBoxClassName)(h)]),[(0,o.createVNode)(1,"div","ProgressBar__fill ProgressBar__fill--animated",null,1,{style:{width:100*(0,r.clamp01)(C)+"%"}}),(0,o.createVNode)(1,"div","ProgressBar__content",g?f:(0,r.toFixed)(100*C)+"%",0)],4,Object.assign({},(0,a.computeBoxProps)(h))))};t.ProgressBar=c,c.defaultHooks=i.pureComponentHooks},function(e,t,n){"use strict";t.__esModule=!0,t.Section=void 0;var o=n(0),r=n(6),i=n(17);var a=function(e){var t=e.className,n=e.title,a=e.level,c=void 0===a?1:a,l=e.buttons,d=e.fill,u=e.children,s=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}(e,["className","title","level","buttons","fill","children"]),p=!(0,r.isFalsy)(n)||!(0,r.isFalsy)(l),m=!(0,r.isFalsy)(u);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Section","Section--level--"+c,d&&"Section--fill",t].concat((0,i.computeBoxClassName)(s))),[p&&(0,o.createVNode)(1,"div","Section__title",[(0,o.createVNode)(1,"span","Section__titleText",n,0),(0,o.createVNode)(1,"div","Section__buttons",l,0)],4),m&&(0,o.createVNode)(1,"div","Section__content",u,0)],0,Object.assign({},(0,i.computeBoxProps)(s))))};t.Section=a,a.defaultHooks=r.pureComponentHooks},function(e,t,n){"use strict";t.__esModule=!0,t.Slider=void 0;var o=n(0),r=n(15),i=n(6),a=n(17),c=n(125),l=n(126);t.Slider=function(e){if(Byond.IS_LTE_IE8)return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.NumberInput,Object.assign({},e)));var t=e.animated,n=e.format,d=e.maxValue,u=e.minValue,s=e.onChange,p=e.onDrag,m=e.step,f=e.stepPixelSize,h=e.suppressFlicker,C=e.unit,g=e.value,b=e.className,N=e.fillValue,v=e.color,V=e.ranges,y=void 0===V?{}:V,k=e.children,x=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}(e,["animated","format","maxValue","minValue","onChange","onDrag","step","stepPixelSize","suppressFlicker","unit","value","className","fillValue","color","ranges","children"]),_=k!==undefined;return(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.DraggableControl,Object.assign({dragMatrix:[1,0]},{animated:t,format:n,maxValue:d,minValue:u,onChange:s,onDrag:p,step:m,stepPixelSize:f,suppressFlicker:h,unit:C,value:g},{children:function(e){var t=e.dragging,n=(e.editing,e.value),c=e.displayValue,l=e.displayElement,s=e.inputElement,p=e.handleDragStart,m=N!==undefined&&null!==N,f=((0,r.scale)(n,u,d),(0,r.scale)(null!=N?N:c,u,d)),h=(0,r.scale)(c,u,d),C=v||(0,r.keyOfMatchingRange)(null!=N?N:n,y)||"default";return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,i.classes)(["Slider","ProgressBar","ProgressBar--color--"+C,b,(0,a.computeBoxClassName)(x)]),[(0,o.createVNode)(1,"div",(0,i.classes)(["ProgressBar__fill",m&&"ProgressBar__fill--animated"]),null,1,{style:{width:100*(0,r.clamp01)(f)+"%",opacity:.4}}),(0,o.createVNode)(1,"div","ProgressBar__fill",null,1,{style:{width:100*(0,r.clamp01)(Math.min(f,h))+"%"}}),(0,o.createVNode)(1,"div","Slider__cursorOffset",[(0,o.createVNode)(1,"div","Slider__cursor"),(0,o.createVNode)(1,"div","Slider__pointer"),t&&(0,o.createVNode)(1,"div","Slider__popupValue",l,0)],0,{style:{width:100*(0,r.clamp01)(h)+"%"}}),(0,o.createVNode)(1,"div","ProgressBar__content",_?k:l,0),s],0,Object.assign({},(0,a.computeBoxProps)(x),{onMouseDown:p})))}})))}},function(e,t,n){"use strict";t.__esModule=!0,t.TextArea=void 0;var o=n(0),r=n(6),i=n(17);function a(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}var c=function(e){return(0,r.isFalsy)(e)?"":e},l=function(e){var t,n;function l(t,n){var r;(r=e.call(this,t,n)||this).textareaRef=(0,o.createRef)(),r.fillerRef=(0,o.createRef)(),r.state={editing:!1};var i=t.dontUseTabForIndent,a=void 0!==i&&i;return r.autoresize=function(){r.fillerRef&&r.textareaRef},r.handleOnInput=function(e){var t=r.state.editing,n=r.props.onInput;t||r.setEditing(!0),n&&n(e,e.target.value),r.autoresize()},r.handleOnChange=function(e){var t=r.state.editing,n=r.props.onChange;t&&r.setEditing(!1),n&&n(e,e.target.value),r.autoresize()},r.handleKeyPress=function(e){var t=r.state.editing,n=r.props.onKeyPress;t||r.setEditing(!0),n&&n(e,e.target.value),r.autoresize()},r.handleKeyDown=function(e){var t=r.state.editing,n=r.props.onKeyDown;if((t||r.setEditing(!0),!a)&&9===(e.keyCode||e.which)){e.preventDefault();var o=e.target.selectionStart;e.target.value=e.target.value.substring(0,e.target.selectionStart)+"\t"+e.target.value.substring(e.target.selectionEnd),e.target.selectionEnd=o+1}n&&n(e,e.target.value),r.autoresize()},r.handleFocus=function(e){r.state.editing||r.setEditing(!0)},r.handleBlur=function(e){var t=r.state.editing,n=r.props.onChange;t&&(r.setEditing(!1),n&&n(e,e.target.value))},r}n=e,(t=l).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var d=l.prototype;return d.componentDidMount=function(){var e=this.props.value,t=this.textareaRef.current;t&&(t.value=c(e),this.autoresize())},d.componentDidUpdate=function(e,t){var n=this.state.editing,o=e.value,r=this.props.value,i=this.textareaRef.current;i&&!n&&o!==r&&(i.value=c(r),this.autoresize())},d.setEditing=function(e){this.setState({editing:e})},d.getValue=function(){return this.textareaRef.current&&this.textareaRef.current.value},d.render=function(){this.props;var e=this.props,t=(e.onChange,e.onKeyDown,e.onKeyPress,e.onInput,e.onFocus,e.onBlur,e.onEnter,e.value),n=e.placeholder,c=a(e,["onChange","onKeyDown","onKeyPress","onInput","onFocus","onBlur","onEnter","value","placeholder"]),l=c.className,d=c.fluid,u=a(c,["className","fluid"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({className:(0,r.classes)(["TextArea",d&&"TextArea--fluid",l])},u,{children:(0,o.createVNode)(128,"textarea","TextArea__textarea",null,1,{value:t,placeholder:n,onChange:this.handleOnChange,onKeyDown:this.handleKeyDown,onKeyPress:this.handleKeyPress,onInput:this.handleOnInput,onFocus:this.handleFocus,onBlur:this.handleBlur},null,this.textareaRef)})))},l}(o.Component);t.TextArea=l},function(e,t,n){"use strict";t.__esModule=!0,t.Tabs=void 0;var o=n(0),r=n(6),i=n(17),a=n(123);function c(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}var l=function(e){var t=e.className,n=e.vertical,a=e.children,l=c(e,["className","vertical","children"]);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Tabs",n?"Tabs--vertical":"Tabs--horizontal",t,(0,i.computeBoxClassName)(l)]),(0,o.createVNode)(1,"div","Tabs__tabBox",a,0),2,Object.assign({},(0,i.computeBoxProps)(l))))};t.Tabs=l;l.Tab=function(e){var t=e.className,n=e.selected,i=e.altSelection,l=c(e,["className","selected","altSelection"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Button,Object.assign({className:(0,r.classes)(["Tabs__tab",n&&"Tabs__tab--selected",i&&n&&"Tabs__tab--altSelection",t]),selected:!i&&n,color:"transparent"},l)))}},function(e,t,n){"use strict";t.__esModule=!0,t.TimeDisplay=void 0;var o=n(15),r=n(0);var i=function(e){return"number"==typeof e&&Number.isFinite(e)&&!Number.isNaN(e)},a=function(e){var t,n;function r(t){var n;return(n=e.call(this,t)||this).timer=null,n.last_seen_value=undefined,n.state={value:0},i(t.value)&&(n.state.value=Number(t.value),n.last_seen_value=Number(t.value)),n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var a=r.prototype;return a.componentDidUpdate=function(){var e=this;this.props.auto!==undefined&&(clearInterval(this.timer),this.timer=setInterval((function(){return e.tick()}),1e3))},a.tick=function(){var e=Number(this.state.value);this.props.value!==this.last_seen_value&&(this.last_seen_value=this.props.value,e=this.props.value);var t="up"===this.props.auto?10:-10,n=Math.max(0,e+t);this.setState({value:n})},a.componentDidMount=function(){var e=this;this.props.auto!==undefined&&(this.timer=setInterval((function(){return e.tick()}),1e3))},a.componentWillUnmount=function(){clearInterval(this.timer)},a.render=function(){var e=this.state.value;if(!i(e))return this.state.value||null;var t=(0,o.toFixed)(Math.floor(e/10%60)).padStart(2,"0"),n=(0,o.toFixed)(Math.floor(e/600%60)).padStart(2,"0");return(0,o.toFixed)(Math.floor(e/36e3%24)).padStart(2,"0")+":"+n+":"+t},r}(r.Component);t.TimeDisplay=a},function(e,t,n){var o={"./AbductorConsole.js":447,"./Achievements.js":448,"./AiAirlock.js":449,"./AiRestorer.js":176,"./AirAlarm.js":450,"./AirlockElectronics.js":452,"./Apc.js":453,"./ApcControl.js":454,"./AtmosAlertConsole.js":455,"./AtmosControlConsole.js":456,"./AtmosFilter.js":457,"./AtmosMixer.js":458,"./AtmosPump.js":459,"./AutomatedAnnouncement.js":460,"./BankMachine.js":461,"./Bepis.js":462,"./Biogenerator.js":463,"./BlackMarketUplink.js":464,"./BluespaceArtillery.js":465,"./BluespaceLocator.js":466,"./BorgPanel.js":467,"./BrigTimer.js":468,"./CameraConsole.js":469,"./Canister.js":470,"./Canvas.js":471,"./Cargo.js":178,"./CargoBountyConsole.js":472,"./CargoExpress.js":473,"./CargoHoldTerminal.js":474,"./CellularEmporium.js":475,"./CentcomPodLauncher.js":476,"./ChemAcclimator.js":477,"./ChemDebugSynthesizer.js":478,"./ChemDispenser.js":479,"./ChemFilter.js":480,"./ChemHeater.js":481,"./ChemMaster.js":482,"./ChemPress.js":483,"./ChemReactionChamber.js":484,"./ChemSplitter.js":485,"./ChemSynthesizer.js":486,"./CodexGigas.js":487,"./ComputerFabricator.js":488,"./Crayon.js":489,"./CrewConsole.js":490,"./Cryo.js":491,"./DecalPainter.js":492,"./DisposalUnit.js":493,"./DnaConsole.js":494,"./DnaVault.js":495,"./EightBallVote.js":496,"./Electrolyzer.js":497,"./Electropack.js":498,"./EmergencyShuttleConsole.js":499,"./EngravedMessage.js":500,"./ExosuitControlConsole.js":501,"./ExosuitFabricator.js":502,"./ForbiddenLore.js":503,"./Gateway.js":504,"./GlandDispenser.js":505,"./Gps.js":506,"./GravityGenerator.js":507,"./GulagItemReclaimer.js":508,"./GulagTeleporterConsole.js":509,"./Holodeck.js":510,"./Holopad.js":511,"./HypnoChair.js":512,"./ImplantChair.js":513,"./InfraredEmitter.js":514,"./Intellicard.js":515,"./Jukebox.js":516,"./KeycardAuth.js":517,"./LaborClaimConsole.js":518,"./LanguageMenu.js":519,"./LaunchpadConsole.js":180,"./LaunchpadRemote.js":520,"./MafiaPanel.js":521,"./MalfunctionModulePicker.js":522,"./MechBayPowerConsole.js":523,"./MedicalKiosk.js":524,"./MiningVendor.js":525,"./Mint.js":526,"./Mule.js":527,"./NaniteChamberControl.js":528,"./NaniteCloudControl.js":529,"./NaniteProgramHub.js":530,"./NaniteProgrammer.js":531,"./NaniteRemote.js":532,"./NotificationPreferences.js":533,"./NtnetRelay.js":534,"./NtosAiRestorer.js":535,"./NtosArcade.js":536,"./NtosAtmos.js":537,"./NtosBountyConsole.js":538,"./NtosCard.js":539,"./NtosConfiguration.js":540,"./NtosCrewManifest.js":541,"./NtosCyborgRemoteMonitor.js":181,"./NtosCyborgRemoteMonitorSyndicate.js":542,"./NtosFileManager.js":543,"./NtosJobManager.js":544,"./NtosMain.js":545,"./NtosNetChat.js":546,"./NtosNetDos.js":547,"./NtosNetDownloader.js":548,"./NtosNetMonitor.js":549,"./NtosPowerMonitor.js":550,"./NtosRadar.js":182,"./NtosRadarSyndicate.js":551,"./NtosRequestKiosk.js":552,"./NtosRevelation.js":553,"./NtosRoboControl.js":554,"./NtosShipping.js":555,"./NtosStationAlertConsole.js":556,"./NtosSupermatterMonitor.js":557,"./NuclearBomb.js":558,"./OperatingComputer.js":559,"./Orbit.js":560,"./OreBox.js":561,"./OreRedemptionMachine.js":562,"./Pandemic.js":563,"./PaperSheet.js":564,"./ParticleAccelerator.js":567,"./PersonalCrafting.js":568,"./PortableChemMixer.js":569,"./PortableGenerator.js":570,"./PortablePump.js":571,"./PortableScrubber.js":572,"./PortableTurret.js":573,"./PowerMonitor.js":128,"./ProbingConsole.js":574,"./ProximitySensor.js":575,"./Radio.js":576,"./RadioactiveMicrolaser.js":577,"./RapidPipeDispenser.js":578,"./RemoteRobotControl.js":579,"./RequestKiosk.js":183,"./RoboticsControlConsole.js":580,"./Roulette.js":581,"./SatelliteControl.js":582,"./ScannerGate.js":583,"./SeedExtractor.js":584,"./ShuttleManipulator.js":585,"./Signaler.js":586,"./SkillPanel.js":587,"./Sleeper.js":588,"./SlimeBodySwapper.js":589,"./SmartVend.js":590,"./Smes.js":591,"./SmokeMachine.js":592,"./SolarControl.js":593,"./SpaceHeater.js":594,"./SpawnersMenu.js":595,"./StationAlertConsole.js":184,"./SuitStorageUnit.js":596,"./SyndContractor.js":597,"./TachyonArray.js":598,"./Tank.js":599,"./TankDispenser.js":600,"./Teleporter.js":601,"./ThermoMachine.js":602,"./Timer.js":603,"./TransferValve.js":604,"./TurbineComputer.js":605,"./TurretControl.js":606,"./Uplink.js":127,"./VaultController.js":607,"./Vendatray.js":608,"./Vending.js":609,"./Wires.js":610};function r(e){var t=i(e);return n(t)}function i(e){if(!n.o(o,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return o[e]}r.keys=function(){return Object.keys(o)},r.resolve=i,e.exports=r,r.id=446},function(e,t,n){"use strict";t.__esModule=!0,t.AbductorConsole=void 0;var o=n(0),r=n(127),i=n(1),a=n(3),c=n(2);t.AbductorConsole=function(e,t){var n=(0,i.useSharedState)(t,"tab",1),r=n[0],s=n[1];return(0,o.createComponentVNode)(2,c.Window,{theme:"abductor",width:600,height:532,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"list",lineHeight:"23px",selected:1===r,onClick:function(){return s(1)},children:"Abductsoft 3000"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"list",lineHeight:"23px",selected:2===r,onClick:function(){return s(2)},children:"Mission Settings"})]}),1===r&&(0,o.createComponentVNode)(2,l),2===r&&(0,o.createFragment)([(0,o.createComponentVNode)(2,d),(0,o.createComponentVNode)(2,u)],4)]})})};var l=function(e,t){var n=(0,i.useBackend)(t),c=(n.act,n.data),l=c.experiment,d=c.points,u=c.credits;return l?(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Collected Samples",children:d})})}),(0,o.createComponentVNode)(2,r.GenericUplink,{currencyAmount:u,currencySymbol:"Credits"})],4):(0,o.createComponentVNode)(2,a.NoticeBox,{danger:!0,children:"No Experiment Machine Detected"})},d=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data,l=c.pad,d=c.gizmo;return l?(0,o.createComponentVNode)(2,a.Section,{title:"Emergency Teleport",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"exclamation-circle",content:"Activate",color:"bad",onClick:function(){return r("teleporter_send")}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Mark Retrieval",children:(0,o.createComponentVNode)(2,a.Button,{icon:d?"user-plus":"user-slash",content:d?"Retrieve":"No Mark",disabled:!d,onClick:function(){return r("teleporter_retrieve")}})})})}):(0,o.createComponentVNode)(2,a.NoticeBox,{danger:!0,children:"No Telepad Detected"})},u=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data,l=c.vest,d=c.vest_mode,u=c.vest_lock;return l?(0,o.createComponentVNode)(2,a.Section,{title:"Agent Vest Settings",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:u?"lock":"unlock",content:u?"Locked":"Unlocked",onClick:function(){return r("toggle_vest")}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Mode",children:(0,o.createComponentVNode)(2,a.Button,{icon:1===d?"eye-slash":"fist-raised",content:1===d?"Stealth":"Combat",onClick:function(){return r("flip_vest")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Disguise",children:(0,o.createComponentVNode)(2,a.Button,{icon:"user-secret",content:"Select",onClick:function(){return r("select_disguise")}})})]})}):(0,o.createComponentVNode)(2,a.NoticeBox,{danger:!0,children:"No Agent Vest Detected"})}},function(e,t,n){"use strict";t.__esModule=!0,t.Achievements=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Achievements=function(e,t){var n=(0,r.useBackend)(t).data,l=n.categories,u=(0,r.useLocalState)(t,"category",l[0]),s=u[0],p=u[1],m=n.achievements.filter((function(e){return e.category===s}));return(0,o.createComponentVNode)(2,a.Window,{title:"Achievements",width:540,height:680,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Tabs,{children:[l.map((function(e){return(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:s===e,onClick:function(){return p(e)},children:e},e)})),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:"High Scores"===s,onClick:function(){return p("High Scores")},children:"High Scores"})]}),"High Scores"===s&&(0,o.createComponentVNode)(2,d)||(0,o.createComponentVNode)(2,c,{achievements:m})]})})};var c=function(e,t){var n=e.achievements;return(0,o.createComponentVNode)(2,i.Table,{children:n.map((function(e){return(0,o.createComponentVNode)(2,l,{achievement:e},e.name)}))})},l=function(e){var t=e.achievement,n=t.name,r=t.desc,a=t.icon_class,c=t.value,l=t.score;return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:(0,o.createComponentVNode)(2,i.Box,{m:1,className:a})}),(0,o.createComponentVNode)(2,i.Table.Cell,{verticalAlign:"top",children:[(0,o.createVNode)(1,"h1",null,n,0),r,l&&(0,o.createComponentVNode)(2,i.Box,{color:c>0?"good":"bad",children:c>0?"Earned "+c+" times":"Locked"})||(0,o.createComponentVNode)(2,i.Box,{color:c?"good":"bad",children:c?"Unlocked":"Locked"})]})]},n)},d=function(e,t){var n=(0,r.useBackend)(t).data,a=n.highscore,c=n.user_ckey,l=(0,r.useLocalState)(t,"highscore",0),d=l[0],u=l[1],s=a[d];if(!s)return null;var p=Object.keys(s.scores).map((function(e){return{ckey:e,value:s.scores[e]}}));return(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Tabs,{vertical:!0,children:a.map((function(e,t){return(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:d===t,onClick:function(){return u(t)},children:e.name},e.name)}))})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{textAlign:"center",children:"#"}),(0,o.createComponentVNode)(2,i.Table.Cell,{textAlign:"center",children:"Key"}),(0,o.createComponentVNode)(2,i.Table.Cell,{textAlign:"center",children:"Score"})]}),p.map((function(e,t){return(0,o.createComponentVNode)(2,i.Table.Row,{className:"candystripe",m:2,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{color:"label",textAlign:"center",children:t+1}),(0,o.createComponentVNode)(2,i.Table.Cell,{color:e.ckey===c&&"green",textAlign:"center",children:[0===t&&(0,o.createComponentVNode)(2,i.Icon,{name:"crown",color:"yellow",mr:2}),e.ckey,0===t&&(0,o.createComponentVNode)(2,i.Icon,{name:"crown",color:"yellow",ml:2})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{textAlign:"center",children:e.value})]},e.ckey)}))]})})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.AiAirlock=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c={2:{color:"good",localStatusText:"Offline"},1:{color:"average",localStatusText:"Caution"},0:{color:"bad",localStatusText:"Optimal"}};t.AiAirlock=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=c[d.power.main]||c[0],s=c[d.power.backup]||c[0],p=c[d.shock]||c[0];return(0,o.createComponentVNode)(2,a.Window,{width:500,height:390,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Power Status",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Main",color:u.color,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"lightbulb-o",disabled:!d.power.main,content:"Disrupt",onClick:function(){return l("disrupt-main")}}),children:[d.power.main?"Online":"Offline"," ",d.wires.main_1&&d.wires.main_2?d.power.main_timeleft>0&&"["+d.power.main_timeleft+"s]":"[Wires have been cut!]"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Backup",color:s.color,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"lightbulb-o",disabled:!d.power.backup,content:"Disrupt",onClick:function(){return l("disrupt-backup")}}),children:[d.power.backup?"Online":"Offline"," ",d.wires.backup_1&&d.wires.backup_2?d.power.backup_timeleft>0&&"["+d.power.backup_timeleft+"s]":"[Wires have been cut!]"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Electrify",color:p.color,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"wrench",disabled:!(d.wires.shock&&0===d.shock),content:"Restore",onClick:function(){return l("shock-restore")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"bolt",disabled:!d.wires.shock,content:"Temporary",onClick:function(){return l("shock-temp")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"bolt",disabled:!d.wires.shock,content:"Permanent",onClick:function(){return l("shock-perm")}})],4),children:[2===d.shock?"Safe":"Electrified"," ",(d.wires.shock?d.shock_timeleft>0&&"["+d.shock_timeleft+"s]":"[Wires have been cut!]")||-1===d.shock_timeleft&&"[Permanent]"]})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Access and Door Control",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"ID Scan",color:"bad",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.id_scanner?"power-off":"times",content:d.id_scanner?"Enabled":"Disabled",selected:d.id_scanner,disabled:!d.wires.id_scanner,onClick:function(){return l("idscan-toggle")}}),children:!d.wires.id_scanner&&"[Wires have been cut!]"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Emergency Access",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.emergency?"power-off":"times",content:d.emergency?"Enabled":"Disabled",selected:d.emergency,onClick:function(){return l("emergency-toggle")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Divider),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door Bolts",color:"bad",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.locked?"lock":"unlock",content:d.locked?"Lowered":"Raised",selected:d.locked,disabled:!d.wires.bolts,onClick:function(){return l("bolt-toggle")}}),children:!d.wires.bolts&&"[Wires have been cut!]"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door Bolt Lights",color:"bad",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.lights?"power-off":"times",content:d.lights?"Enabled":"Disabled",selected:d.lights,disabled:!d.wires.lights,onClick:function(){return l("light-toggle")}}),children:!d.wires.lights&&"[Wires have been cut!]"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door Force Sensors",color:"bad",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.safe?"power-off":"times",content:d.safe?"Enabled":"Disabled",selected:d.safe,disabled:!d.wires.safe,onClick:function(){return l("safe-toggle")}}),children:!d.wires.safe&&"[Wires have been cut!]"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door Timing Safety",color:"bad",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.speed?"power-off":"times",content:d.speed?"Enabled":"Disabled",selected:d.speed,disabled:!d.wires.timing,onClick:function(){return l("speed-toggle")}}),children:!d.wires.timing&&"[Wires have been cut!]"}),(0,o.createComponentVNode)(2,i.LabeledList.Divider),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door Control",color:"bad",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.opened?"sign-out-alt":"sign-in-alt",content:d.opened?"Open":"Closed",selected:d.opened,disabled:d.locked||d.welded,onClick:function(){return l("open-close")}}),children:!(!d.locked&&!d.welded)&&(0,o.createVNode)(1,"span",null,[(0,o.createTextVNode)("[Door is "),d.locked?"bolted":"",d.locked&&d.welded?" and ":"",d.welded?"welded":"",(0,o.createTextVNode)("!]")],0)})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.AirAlarm=void 0;var o=n(0),r=n(15),i=(n(19),n(1)),a=n(3),c=(n(38),n(2)),l=n(60),d=n(451);t.AirAlarm=function(e,t){var n=(0,i.useBackend)(t),r=(n.act,n.data),a=r.locked&&!r.siliconUser;return(0,o.createComponentVNode)(2,c.Window,{width:440,height:650,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,l.InterfaceLockNoticeBox),(0,o.createComponentVNode)(2,u),!a&&(0,o.createComponentVNode)(2,p)]})})};var u=function(e,t){var n=(0,i.useBackend)(t).data,c=(n.environment_data||[]).filter((function(e){return e.value>=.01})),l={0:{color:"good",localStatusText:"Optimal"},1:{color:"average",localStatusText:"Caution"},2:{color:"bad",localStatusText:"Danger (Internals Required)"}},d=l[n.danger_level]||l[0];return(0,o.createComponentVNode)(2,a.Section,{title:"Air Status",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[c.length>0&&(0,o.createFragment)([c.map((function(e){var t=l[e.danger_level]||l[0];return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:e.name,color:t.color,children:[(0,r.toFixed)(e.value,2),e.unit]},e.name)})),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Local status",color:d.color,children:d.localStatusText}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Area status",color:n.atmos_alarm||n.fire_alarm?"bad":"good",children:(n.atmos_alarm?"Atmosphere Alarm":n.fire_alarm&&"Fire Alarm")||"Nominal"})],0)||(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Warning",color:"bad",children:"Cannot obtain air sample for analysis."}),!!n.emagged&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Warning",color:"bad",children:"Safety measures offline. Device may exhibit abnormal behavior."})]})})},s={home:{title:"Air Controls",component:function(){return m}},vents:{title:"Vent Controls",component:function(){return f}},scrubbers:{title:"Scrubber Controls",component:function(){return h}},modes:{title:"Operating Mode",component:function(){return C}},thresholds:{title:"Alarm Thresholds",component:function(){return g}}},p=function(e,t){var n=(0,i.useLocalState)(t,"screen"),r=n[0],c=n[1],l=s[r]||s.home,d=l.component();return(0,o.createComponentVNode)(2,a.Section,{title:l.title,buttons:r&&(0,o.createComponentVNode)(2,a.Button,{icon:"arrow-left",content:"Back",onClick:function(){return c()}}),children:(0,o.createComponentVNode)(2,d)})},m=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data,l=(0,i.useLocalState)(t,"screen"),d=(l[0],l[1]),u=c.mode,s=c.atmos_alarm;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:s?"exclamation-triangle":"exclamation",color:s&&"caution",content:"Area Atmosphere Alarm",onClick:function(){return r(s?"reset":"alarm")}}),(0,o.createComponentVNode)(2,a.Box,{mt:1}),(0,o.createComponentVNode)(2,a.Button,{icon:3===u?"exclamation-triangle":"exclamation",color:3===u&&"danger",content:"Panic Siphon",onClick:function(){return r("mode",{mode:3===u?1:3})}}),(0,o.createComponentVNode)(2,a.Box,{mt:2}),(0,o.createComponentVNode)(2,a.Button,{icon:"sign-out-alt",content:"Vent Controls",onClick:function(){return d("vents")}}),(0,o.createComponentVNode)(2,a.Box,{mt:1}),(0,o.createComponentVNode)(2,a.Button,{icon:"filter",content:"Scrubber Controls",onClick:function(){return d("scrubbers")}}),(0,o.createComponentVNode)(2,a.Box,{mt:1}),(0,o.createComponentVNode)(2,a.Button,{icon:"cog",content:"Operating Mode",onClick:function(){return d("modes")}}),(0,o.createComponentVNode)(2,a.Box,{mt:1}),(0,o.createComponentVNode)(2,a.Button,{icon:"chart-bar",content:"Alarm Thresholds",onClick:function(){return d("thresholds")}})],4)},f=function(e,t){var n=(0,i.useBackend)(t).data.vents;return n&&0!==n.length?n.map((function(e){return(0,o.createComponentVNode)(2,d.Vent,{vent:e},e.id_tag)})):"Nothing to show"},h=function(e,t){var n=(0,i.useBackend)(t).data.scrubbers;return n&&0!==n.length?n.map((function(e){return(0,o.createComponentVNode)(2,d.Scrubber,{scrubber:e},e.id_tag)})):"Nothing to show"},C=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data.modes;return c&&0!==c.length?c.map((function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:e.selected?"check-square-o":"square-o",selected:e.selected,color:e.selected&&e.danger&&"danger",content:e.name,onClick:function(){return r("mode",{mode:e.mode})}}),(0,o.createComponentVNode)(2,a.Box,{mt:1})],4,e.mode)})):"Nothing to show"},g=function(e,t){var n=(0,i.useBackend)(t),c=n.act,l=n.data.thresholds;return(0,o.createVNode)(1,"table","LabeledList",[(0,o.createVNode)(1,"thead",null,(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td"),(0,o.createVNode)(1,"td","color-bad","min2",16),(0,o.createVNode)(1,"td","color-average","min1",16),(0,o.createVNode)(1,"td","color-average","max1",16),(0,o.createVNode)(1,"td","color-bad","max2",16)],4),2),(0,o.createVNode)(1,"tbody",null,l.map((function(e){return(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td","LabeledList__label",e.name,0),e.settings.map((function(e){return(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,a.Button,{content:(0,r.toFixed)(e.selected,2),onClick:function(){return c("threshold",{env:e.env,"var":e.val})}}),2,null,e.val)}))],0,null,e.name)})),0)],4,{style:{width:"100%"}})}},function(e,t,n){"use strict";t.__esModule=!0,t.Scrubber=t.Vent=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(38);t.Vent=function(e,t){var n=e.vent,c=(0,i.useBackend)(t).act,l=n.id_tag,d=n.long_name,u=n.power,s=n.checks,p=n.excheck,m=n.incheck,f=n.direction,h=n.external,C=n.internal,g=n.extdefault,b=n.intdefault;return(0,o.createComponentVNode)(2,a.Section,{level:2,title:(0,r.decodeHtmlEntities)(d),buttons:(0,o.createComponentVNode)(2,a.Button,{icon:u?"power-off":"times",selected:u,content:u?"On":"Off",onClick:function(){return c("power",{id_tag:l,val:Number(!u)})}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Mode",children:(0,o.createComponentVNode)(2,a.Button,{icon:"sign-in-alt",content:f?"Pressurizing":"Scrubbing",color:!f&&"danger",onClick:function(){return c("direction",{id_tag:l,val:Number(!f)})}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pressure Regulator",children:[(0,o.createComponentVNode)(2,a.Button,{icon:"sign-in-alt",content:"Internal",selected:m,onClick:function(){return c("incheck",{id_tag:l,val:s})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"sign-out-alt",content:"External",selected:p,onClick:function(){return c("excheck",{id_tag:l,val:s})}})]}),!!m&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Internal Target",children:[(0,o.createComponentVNode)(2,a.NumberInput,{value:Math.round(C),unit:"kPa",width:"75px",minValue:0,step:10,maxValue:5066,onChange:function(e,t){return c("set_internal_pressure",{id_tag:l,value:t})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"undo",disabled:b,content:"Reset",onClick:function(){return c("reset_internal_pressure",{id_tag:l})}})]}),!!p&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"External Target",children:[(0,o.createComponentVNode)(2,a.NumberInput,{value:Math.round(h),unit:"kPa",width:"75px",minValue:0,step:10,maxValue:5066,onChange:function(e,t){return c("set_external_pressure",{id_tag:l,value:t})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"undo",disabled:g,content:"Reset",onClick:function(){return c("reset_external_pressure",{id_tag:l})}})]})]})})};t.Scrubber=function(e,t){var n=e.scrubber,l=(0,i.useBackend)(t).act,d=n.long_name,u=n.power,s=n.scrubbing,p=n.id_tag,m=n.widenet,f=n.filter_types;return(0,o.createComponentVNode)(2,a.Section,{level:2,title:(0,r.decodeHtmlEntities)(d),buttons:(0,o.createComponentVNode)(2,a.Button,{icon:u?"power-off":"times",content:u?"On":"Off",selected:u,onClick:function(){return l("power",{id_tag:p,val:Number(!u)})}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Mode",children:[(0,o.createComponentVNode)(2,a.Button,{icon:s?"filter":"sign-in-alt",color:s||"danger",content:s?"Scrubbing":"Siphoning",onClick:function(){return l("scrubbing",{id_tag:p,val:Number(!s)})}}),(0,o.createComponentVNode)(2,a.Button,{icon:m?"expand":"compress",selected:m,content:m?"Expanded range":"Normal range",onClick:function(){return l("widenet",{id_tag:p,val:Number(!m)})}})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Filters",children:s&&f.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{icon:e.enabled?"check-square-o":"square-o",content:(0,c.getGasLabel)(e.gas_id,e.gas_name),title:e.gas_name,selected:e.enabled,onClick:function(){return l("toggle_filter",{id_tag:p,val:e.gas_id})}},e.gas_id)}))||"N/A"})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.AirlockElectronics=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(177);t.AirlockElectronics=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.oneAccess,s=d.unres_direction,p=d.regions||[],m=d.accesses||[];return(0,o.createComponentVNode)(2,a.Window,{width:420,height:485,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Main",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Access Required",children:(0,o.createComponentVNode)(2,i.Button,{icon:u?"unlock":"lock",content:u?"One":"All",onClick:function(){return l("one_access")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Unrestricted Access",children:[(0,o.createComponentVNode)(2,i.Button,{icon:1&s?"check-square-o":"square-o",content:"North",selected:1&s,onClick:function(){return l("direc_set",{unres_direction:"1"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:2&s?"check-square-o":"square-o",content:"South",selected:2&s,onClick:function(){return l("direc_set",{unres_direction:"2"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:4&s?"check-square-o":"square-o",content:"East",selected:4&s,onClick:function(){return l("direc_set",{unres_direction:"4"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:8&s?"check-square-o":"square-o",content:"West",selected:8&s,onClick:function(){return l("direc_set",{unres_direction:"8"})}})]})]})}),(0,o.createComponentVNode)(2,c.AccessList,{accesses:p,selectedList:m,accessMod:function(e){return l("set",{access:e})},grantAll:function(){return l("grant_all")},denyAll:function(){return l("clear_all")},grantDep:function(e){return l("grant_region",{region:e})},denyDep:function(e){return l("deny_region",{region:e})}})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Apc=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(60);t.Apc=function(e,t){return(0,o.createComponentVNode)(2,a.Window,{width:450,height:445,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,u)})})};var l={2:{color:"good",externalPowerText:"External Power",chargingText:"Fully Charged"},1:{color:"average",externalPowerText:"Low External Power",chargingText:"Charging"},0:{color:"bad",externalPowerText:"No External Power",chargingText:"Not Charging"}},d={1:{icon:"terminal",content:"Override Programming",action:"hack"},2:{icon:"caret-square-down",content:"Shunt Core Process",action:"occupy"},3:{icon:"caret-square-left",content:"Return to Main Core",action:"deoccupy"},4:{icon:"caret-square-down",content:"Shunt Core Process",action:"occupy"}},u=function(e,t){var n=(0,r.useBackend)(t),a=n.act,u=n.data,s=u.locked&&!u.siliconUser,p=l[u.externalPower]||l[0],m=l[u.chargingStatus]||l[0],f=u.powerChannels||[],h=d[u.malfStatus]||d[0],C=u.powerCellStatus/100;return u.failTime>0?(0,o.createComponentVNode)(2,i.NoticeBox,{children:[(0,o.createVNode)(1,"b",null,(0,o.createVNode)(1,"h3",null,"SYSTEM FAILURE",16),2),(0,o.createVNode)(1,"i",null,"I/O regulators malfunction detected! Waiting for system reboot...",16),(0,o.createVNode)(1,"br"),"Automatic reboot in ",u.failTime," seconds...",(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Reboot Now",onClick:function(){return a("reboot")}})]}):(0,o.createFragment)([(0,o.createComponentVNode)(2,c.InterfaceLockNoticeBox),(0,o.createComponentVNode)(2,i.Section,{title:"Power Status",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Main Breaker",color:p.color,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u.isOperating?"power-off":"times",content:u.isOperating?"On":"Off",selected:u.isOperating&&!s,disabled:s,onClick:function(){return a("breaker")}}),children:["[ ",p.externalPowerText," ]"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power Cell",children:(0,o.createComponentVNode)(2,i.ProgressBar,{color:"good",value:C})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Charge Mode",color:m.color,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u.chargeMode?"sync":"close",content:u.chargeMode?"Auto":"Off",disabled:s,onClick:function(){return a("charge")}}),children:["[ ",m.chargingText," ]"]})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Power Channels",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[f.map((function(e){var t=e.topicParams;return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.title,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{inline:!0,mx:2,color:e.status>=2?"good":"bad",children:e.status>=2?"On":"Off"}),(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Auto",selected:!s&&(1===e.status||3===e.status),disabled:s,onClick:function(){return a("channel",t.auto)}}),(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",content:"On",selected:!s&&2===e.status,disabled:s,onClick:function(){return a("channel",t.on)}}),(0,o.createComponentVNode)(2,i.Button,{icon:"times",content:"Off",selected:!s&&0===e.status,disabled:s,onClick:function(){return a("channel",t.off)}})],4),children:e.powerLoad},e.title)})),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Total Load",children:(0,o.createVNode)(1,"b",null,u.totalLoad,0)})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Misc",buttons:!!u.siliconUser&&(0,o.createFragment)([!!u.malfStatus&&(0,o.createComponentVNode)(2,i.Button,{icon:h.icon,content:h.content,color:"bad",onClick:function(){return a(h.action)}}),(0,o.createComponentVNode)(2,i.Button,{icon:"lightbulb-o",content:"Overload",onClick:function(){return a("overload")}})],0),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cover Lock",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u.coverLocked?"lock":"unlock",content:u.coverLocked?"Engaged":"Disengaged",disabled:s,onClick:function(){return a("cover")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Emergency Lighting",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"lightbulb-o",content:u.emergencyLights?"Enabled":"Disabled",disabled:s,onClick:function(){return a("emergency_lighting")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Night Shift Lighting",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"lightbulb-o",content:u.nightshiftLights?"Enabled":"Disabled",onClick:function(){return a("toggle_nightshift")}})})]})})],4)}},function(e,t,n){"use strict";t.__esModule=!0,t.ApcControl=void 0;var o=n(0),r=n(16),i=n(33),a=n(6),c=n(1),l=n(3),d=n(2),u=n(128);t.ApcControl=function(e,t){var n=(0,c.useBackend)(t).data;return(0,o.createComponentVNode)(2,d.Window,{title:"APC Controller",width:550,height:500,resizable:!0,children:[1===n.authenticated&&(0,o.createComponentVNode)(2,p),0===n.authenticated&&(0,o.createComponentVNode)(2,s)]})};var s=function(e,t){var n=(0,c.useBackend)(t),r=n.act,i=n.data.emagged,a=1===i?"Open":"Log In";return(0,o.createComponentVNode)(2,d.Window.Content,{children:(0,o.createComponentVNode)(2,l.Button,{fluid:!0,color:1===i?"":"good",content:a,onClick:function(){return r("log-in")}})})},p=function(e,t){var n=(0,c.useBackend)(t),r=n.act,i=n.data.restoring,a=(0,c.useLocalState)(t,"tab-index",1),u=a[0],s=a[1];return(0,o.createFragment)([(0,o.createComponentVNode)(2,l.Tabs,{children:[(0,o.createComponentVNode)(2,l.Tabs.Tab,{selected:1===u,onClick:function(){s(1),r("check-apcs")},children:"APC Control Panel"}),(0,o.createComponentVNode)(2,l.Tabs.Tab,{selected:2===u,onClick:function(){s(2),r("check-logs")},children:"Log View Panel"})]}),1===i&&(0,o.createComponentVNode)(2,l.Dimmer,{fontSize:"32px",children:[(0,o.createComponentVNode)(2,l.Icon,{name:"cog",spin:!0})," Resetting..."]}),1===u&&(0,o.createFragment)([(0,o.createComponentVNode)(2,m),(0,o.createComponentVNode)(2,l.Box,{fillPositionedParent:!0,top:"53px",children:(0,o.createComponentVNode)(2,d.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,f)})})],4),2===u&&(0,o.createComponentVNode)(2,l.Box,{fillPositionedParent:!0,top:"20px",children:(0,o.createComponentVNode)(2,d.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,h)})})],0)},m=function(e,t){var n=(0,c.useBackend)(t),r=n.act,i=n.data,a=i.emagged,d=i.logging,u=(0,c.useLocalState)(t,"sortByField",null),s=u[0],p=u[1];return(0,o.createComponentVNode)(2,l.Flex,{children:[(0,o.createComponentVNode)(2,l.Flex.Item,{children:[(0,o.createComponentVNode)(2,l.Box,{inline:!0,mr:2,color:"label",children:"Sort by:"}),(0,o.createComponentVNode)(2,l.Button.Checkbox,{checked:"name"===s,content:"Name",onClick:function(){return p("name"!==s&&"name")}}),(0,o.createComponentVNode)(2,l.Button.Checkbox,{checked:"charge"===s,content:"Charge",onClick:function(){return p("charge"!==s&&"charge")}}),(0,o.createComponentVNode)(2,l.Button.Checkbox,{checked:"draw"===s,content:"Draw",onClick:function(){return p("draw"!==s&&"draw")}})]}),(0,o.createComponentVNode)(2,l.Flex.Item,{grow:1}),(0,o.createComponentVNode)(2,l.Flex.Item,{children:[1===a&&(0,o.createFragment)([(0,o.createComponentVNode)(2,l.Button,{color:1===d?"bad":"good",content:1===d?"Stop Logging":"Restore Logging",onClick:function(){return r("toggle-logs")}}),(0,o.createComponentVNode)(2,l.Button,{content:"Reset Console",onClick:function(){return r("restore-console")}})],4),(0,o.createComponentVNode)(2,l.Button,{color:"bad",content:"Log Out",onClick:function(){return r("log-out")}})]})]})},f=function(e,t){var n=(0,c.useBackend)(t),a=n.data,d=n.act,s=(0,c.useLocalState)(t,"sortByField",null)[0],p=(0,i.flow)([(0,r.map)((function(e,t){return Object.assign({},e,{id:e.name+t})})),"name"===s&&(0,r.sortBy)((function(e){return e.name})),"charge"===s&&(0,r.sortBy)((function(e){return-e.charge})),"draw"===s&&(0,r.sortBy)((function(e){return-(0,u.powerRank)(e.load)}),(function(e){return-parseFloat(e.load)}))])(a.apcs);return(0,o.createComponentVNode)(2,l.Table,{children:[(0,o.createComponentVNode)(2,l.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,l.Table.Cell,{children:"On/Off"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Area"}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,children:"Charge"}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,textAlign:"right",children:"Draw"}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,title:"Equipment",children:"Eqp"}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,title:"Lighting",children:"Lgt"}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,title:"Environment",children:"Env"})]}),p.map((function(e,t){return(0,o.createVNode)(1,"tr","Table__row candystripe",[(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,l.Button,{icon:e.operating?"power-off":"times",color:e.operating?"good":"bad",onClick:function(){return d("breaker",{ref:e.ref})}}),2),(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,l.Button,{onClick:function(){return d("access-apc",{ref:e.ref})},children:e.name}),2),(0,o.createVNode)(1,"td","Table__cell text-right text-nowrap",(0,o.createComponentVNode)(2,u.AreaCharge,{charging:e.charging,charge:e.charge}),2),(0,o.createVNode)(1,"td","Table__cell text-right text-nowrap",e.load,0),(0,o.createVNode)(1,"td","Table__cell text-center text-nowrap",(0,o.createComponentVNode)(2,C,{target:"equipment",status:e.eqp,apc:e,act:d}),2),(0,o.createVNode)(1,"td","Table__cell text-center text-nowrap",(0,o.createComponentVNode)(2,C,{target:"lighting",status:e.lgt,apc:e,act:d}),2),(0,o.createVNode)(1,"td","Table__cell text-center text-nowrap",(0,o.createComponentVNode)(2,C,{target:"environ",status:e.env,apc:e,act:d}),2)],4,null,e.id)}))]})},h=function(e,t){var n=(0,c.useBackend)(t).data,a=(0,i.flow)([(0,r.map)((function(e,t){return Object.assign({},e,{id:e.entry+t})})),function(e){return e.reverse()}])(n.logs);return(0,o.createComponentVNode)(2,l.Box,{m:-.5,children:a.map((function(e){return(0,o.createComponentVNode)(2,l.Box,{p:.5,className:"candystripe",bold:!0,children:e.entry},e.id)}))})},C=function(e){var t=e.target,n=e.status,r=e.apc,i=e.act,a=Boolean(2&n),c=Boolean(1&n);return(0,o.createComponentVNode)(2,l.Button,{icon:c?"sync":"power-off",color:a?"good":"bad",onClick:function(){return i("toggle-minor",{type:t,value:g(n),ref:r.ref})}})},g=function(e){return 0===e?2:2===e?3:0};C.defaultHooks=a.pureComponentHooks},function(e,t,n){"use strict";t.__esModule=!0,t.AtmosAlertConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.AtmosAlertConsole=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.priority||[],u=l.minor||[];return(0,o.createComponentVNode)(2,a.Window,{width:350,height:300,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Alarms",children:(0,o.createVNode)(1,"ul",null,[0===d.length&&(0,o.createVNode)(1,"li","color-good","No Priority Alerts",16),d.map((function(e){return(0,o.createVNode)(1,"li",null,(0,o.createComponentVNode)(2,i.Button,{icon:"times",content:e,color:"bad",onClick:function(){return c("clear",{zone:e})}}),2,null,e)})),0===u.length&&(0,o.createVNode)(1,"li","color-good","No Minor Alerts",16),u.map((function(e){return(0,o.createVNode)(1,"li",null,(0,o.createComponentVNode)(2,i.Button,{icon:"times",content:e,color:"average",onClick:function(){return c("clear",{zone:e})}}),2,null,e)}))],0)})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.AtmosControlConsole=void 0;var o=n(0),r=n(16),i=n(15),a=n(1),c=n(3),l=n(2);t.AtmosControlConsole=function(e,t){var n,d=(0,a.useBackend)(t),u=d.act,s=d.data,p=s.sensors||[];return(0,o.createComponentVNode)(2,l.Window,{width:500,height:315,resizable:!0,children:(0,o.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,c.Section,{title:!!s.tank&&(null==(n=p[0])?void 0:n.long_name),children:p.map((function(e){var t=e.gases||{};return(0,o.createComponentVNode)(2,c.Section,{title:!s.tank&&e.long_name,level:2,children:(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Pressure",children:(0,i.toFixed)(e.pressure,2)+" kPa"}),!!e.temperature&&(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Temperature",children:(0,i.toFixed)(e.temperature,2)+" K"}),(0,r.map)((function(e,t){return(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:t,children:(0,i.toFixed)(e,2)+"%"})}))(t)]})},e.id_tag)}))}),s.tank&&(0,o.createComponentVNode)(2,c.Section,{title:"Controls",buttons:(0,o.createComponentVNode)(2,c.Button,{icon:"undo",content:"Reconnect",onClick:function(){return u("reconnect")}}),children:(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Input Injector",children:(0,o.createComponentVNode)(2,c.Button,{icon:s.inputting?"power-off":"times",content:s.inputting?"Injecting":"Off",selected:s.inputting,onClick:function(){return u("input")}})}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Input Rate",children:(0,o.createComponentVNode)(2,c.NumberInput,{value:s.inputRate,unit:"L/s",width:"63px",minValue:0,maxValue:200,suppressFlicker:2e3,onChange:function(e,t){return u("rate",{rate:t})}})}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Output Regulator",children:(0,o.createComponentVNode)(2,c.Button,{icon:s.outputting?"power-off":"times",content:s.outputting?"Open":"Closed",selected:s.outputting,onClick:function(){return u("output")}})}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Output Pressure",children:(0,o.createComponentVNode)(2,c.NumberInput,{value:parseFloat(s.outputPressure),unit:"kPa",width:"75px",minValue:0,maxValue:4500,step:10,suppressFlicker:2e3,onChange:function(e,t){return u("pressure",{pressure:t})}})})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.AtmosFilter=void 0;var o=n(0),r=n(1),i=n(3),a=n(38),c=n(2);t.AtmosFilter=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.filter_types||[];return(0,o.createComponentVNode)(2,c.Window,{width:390,height:187,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.Button,{icon:d.on?"power-off":"times",content:d.on?"On":"Off",selected:d.on,onClick:function(){return l("power")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Transfer Rate",children:[(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:parseFloat(d.rate),width:"63px",unit:"L/s",minValue:0,maxValue:200,onDrag:function(e,t){return l("rate",{rate:t})}}),(0,o.createComponentVNode)(2,i.Button,{ml:1,icon:"plus",content:"Max",disabled:d.rate===d.max_rate,onClick:function(){return l("rate",{rate:"max"})}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Filter",children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{selected:e.selected,content:(0,a.getGasLabel)(e.id,e.name),onClick:function(){return l("filter",{mode:e.id})}},e.id)}))})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.AtmosMixer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.AtmosMixer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:370,height:165,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.Button,{icon:l.on?"power-off":"times",content:l.on?"On":"Off",selected:l.on,onClick:function(){return c("power")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Output Pressure",children:[(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:parseFloat(l.set_pressure),unit:"kPa",width:"75px",minValue:0,maxValue:4500,step:10,onChange:function(e,t){return c("pressure",{pressure:t})}}),(0,o.createComponentVNode)(2,i.Button,{ml:1,icon:"plus",content:"Max",disabled:l.set_pressure===l.max_pressure,onClick:function(){return c("pressure",{pressure:"max"})}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Node 1",children:(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:l.node1_concentration,unit:"%",width:"60px",minValue:0,maxValue:100,stepPixelSize:2,onDrag:function(e,t){return c("node1",{concentration:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Node 2",children:(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:l.node2_concentration,unit:"%",width:"60px",minValue:0,maxValue:100,stepPixelSize:2,onDrag:function(e,t){return c("node2",{concentration:t})}})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.AtmosPump=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.AtmosPump=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:335,height:115,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.Button,{icon:l.on?"power-off":"times",content:l.on?"On":"Off",selected:l.on,onClick:function(){return c("power")}})}),l.max_rate?(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Transfer Rate",children:[(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:parseFloat(l.rate),width:"63px",unit:"L/s",minValue:0,maxValue:200,onChange:function(e,t){return c("rate",{rate:t})}}),(0,o.createComponentVNode)(2,i.Button,{ml:1,icon:"plus",content:"Max",disabled:l.rate===l.max_rate,onClick:function(){return c("rate",{rate:"max"})}})]}):(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Output Pressure",children:[(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:parseFloat(l.pressure),unit:"kPa",width:"75px",minValue:0,maxValue:4500,step:10,onChange:function(e,t){return c("pressure",{pressure:t})}}),(0,o.createComponentVNode)(2,i.Button,{ml:1,icon:"plus",content:"Max",disabled:l.pressure===l.max_pressure,onClick:function(){return c("pressure",{pressure:"max"})}})]})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.AutomatedAnnouncement=void 0;var o=n(0),r=(n(19),n(1)),i=n(3),a=n(2),c="%PERSON will be replaced with their name.\n%RANK with their job.";t.AutomatedAnnouncement=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.arrivalToggle,s=d.arrival,p=d.newheadToggle,m=d.newhead;return(0,o.createComponentVNode)(2,a.Window,{title:"Automated Announcement System",width:500,height:225,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Arrival Announcement",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u?"power-off":"times",selected:u,content:u?"On":"Off",onClick:function(){return l("ArrivalToggle")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Message",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"info",tooltip:c,tooltipPosition:"left"}),children:(0,o.createComponentVNode)(2,i.Input,{fluid:!0,value:s,onChange:function(e,t){return l("ArrivalText",{newText:t})}})})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Departmental Head Announcement",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:p?"power-off":"times",selected:p,content:p?"On":"Off",onClick:function(){return l("NewheadToggle")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Message",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"info",tooltip:c,tooltipPosition:"left"}),children:(0,o.createComponentVNode)(2,i.Input,{fluid:!0,value:m,onChange:function(e,t){return l("NewheadText",{newText:t})}})})})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.BankMachine=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.BankMachine=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.current_balance,u=l.siphoning,s=l.station_name;return(0,o.createComponentVNode)(2,a.Window,{width:335,height:160,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:s+" Vault",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Balance",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u?"times":"sync",content:u?"Stop Siphoning":"Siphon Credits",selected:u,onClick:function(){return c(u?"halt":"siphon")}}),children:d+" cr"})})}),(0,o.createComponentVNode)(2,i.NoticeBox,{textAlign:"center",children:"Authorized personnel only"})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Bepis=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Bepis=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.amount;return(0,o.createComponentVNode)(2,a.Window,{width:500,height:480,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Business Exploration Protocol Incubation Sink",children:[(0,o.createComponentVNode)(2,i.Section,{title:"Information",backgroundColor:"#450F44",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",content:l.manual_power?"Off":"On",selected:!l.manual_power,onClick:function(){return c("toggle_power")}}),children:"All you need to know about the B.E.P.I.S. and you! The B.E.P.I.S. performs hundreds of tests a second using electrical and financial resources to invent new products, or discover new technologies otherwise overlooked for being too risky or too niche to produce!"}),(0,o.createComponentVNode)(2,i.Section,{title:"Payer's Account",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"redo-alt",content:"Reset Account",onClick:function(){return c("account_reset")}}),children:["Console is currently being operated by ",l.account_owner?l.account_owner:"no one","."]}),(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{size:1.5,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Stored Data and Statistics",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Deposited Credits",children:l.stored_cash}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Investment Variability",children:[l.accuracy_percentage,"%"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Innovation Bonus",children:l.positive_cash_offset}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Risk Offset",color:"bad",children:l.negative_cash_offset}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Deposit Amount",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:d,unit:"Credits",minValue:100,maxValue:3e4,step:100,stepPixelSize:2,onChange:function(e,t){return c("amount",{amount:t})}})})]})}),(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"donate",content:"Deposit Credits",disabled:1===l.manual_power||1===l.silicon_check,onClick:function(){return c("deposit_cash")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Withdraw Credits",disabled:1===l.manual_power,onClick:function(){return c("withdraw_cash")}})]})]}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Market Data and Analysis",children:[(0,o.createComponentVNode)(2,i.Box,{children:["Average technology cost: ",l.mean_value]}),(0,o.createComponentVNode)(2,i.Box,{children:["Current chance of Success: Est. ",l.success_estimate,"%"]}),l.error_name&&(0,o.createComponentVNode)(2,i.Box,{color:"bad",children:"Previous Failure Reason: Deposited cash value too low. Please insert more money for future success."}),(0,o.createComponentVNode)(2,i.Box,{m:1}),(0,o.createComponentVNode)(2,i.Button,{icon:"microscope",disabled:1===l.manual_power,onClick:function(){return c("begin_experiment")},content:"Begin Testing"})]})})]})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.BiogeneratorContent=t.Biogenerator=void 0;var o=n(0),r=n(6),i=n(19),a=n(1),c=n(3),l=n(40),d=n(2);t.Biogenerator=function(e,t){var n=(0,a.useBackend)(t).data,r=n.beaker,i=n.processing;return(0,o.createComponentVNode)(2,d.Window,{width:550,height:380,resizable:!0,children:[!!i&&(0,o.createComponentVNode)(2,c.Dimmer,{fontSize:"32px",children:[(0,o.createComponentVNode)(2,c.Icon,{name:"cog",spin:1})," Processing..."]}),(0,o.createComponentVNode)(2,d.Window.Content,{scrollable:!0,children:[!r&&(0,o.createComponentVNode)(2,c.NoticeBox,{children:"No Container"}),!!r&&(0,o.createComponentVNode)(2,u)]})]})};var u=function(e,t){var n,r,d=(0,a.useBackend)(t),u=d.act,p=d.data,m=p.biomass,f=p.can_process,h=p.categories,C=void 0===h?[]:h,g=(0,a.useLocalState)(t,"searchText",""),b=g[0],N=g[1],v=(0,a.useLocalState)(t,"category",null==(n=C[0])?void 0:n.name),V=v[0],y=v[1],k=(0,i.createSearch)(b,(function(e){return e.name})),x=b.length>0&&C.flatMap((function(e){return e.items||[]})).filter(k).filter((function(e,t){return t<25}))||(null==(r=C.find((function(e){return e.name===V})))?void 0:r.items)||[];return(0,o.createComponentVNode)(2,c.Section,{title:(0,o.createComponentVNode)(2,c.Box,{inline:!0,color:m>0?"good":"bad",children:[(0,l.formatMoney)(m)," Biomass"]}),buttons:(0,o.createFragment)([(0,o.createTextVNode)("Search"),(0,o.createComponentVNode)(2,c.Input,{autoFocus:!0,value:b,onInput:function(e,t){return N(t)},mx:1}),(0,o.createComponentVNode)(2,c.Button,{icon:"eject",content:"Eject",onClick:function(){return u("detach")}}),(0,o.createComponentVNode)(2,c.Button,{icon:"cog",content:"Activate",disabled:!f,onClick:function(){return u("activate")}})],4),children:(0,o.createComponentVNode)(2,c.Flex,{children:[0===b.length&&(0,o.createComponentVNode)(2,c.Flex.Item,{children:(0,o.createComponentVNode)(2,c.Tabs,{vertical:!0,children:C.map((function(e){var t;return(0,o.createComponentVNode)(2,c.Tabs.Tab,{selected:e.name===V,onClick:function(){return y(e.name)},children:[e.name," (",(null==(t=e.items)?void 0:t.length)||0,")"]},e.name)}))})}),(0,o.createComponentVNode)(2,c.Flex.Item,{grow:1,basis:0,children:[0===x.length&&(0,o.createComponentVNode)(2,c.NoticeBox,{children:0===b.length?"No items in this category.":"No results found."}),(0,o.createComponentVNode)(2,c.Table,{children:(0,o.createComponentVNode)(2,s,{biomass:m,items:x})})]})]})})};t.BiogeneratorContent=u;var s=function(e,t){var n=(0,a.useBackend)(t).act,i=(0,a.useLocalState)(t,"hoveredItem",{}),l=i[0],d=i[1],u=l&&l.cost||0;return e.items.map((function(n){var o=(0,a.useLocalState)(t,"amount"+n.name,1),r=o[0],i=o[1],c=l&&l.name!==n.name,d=e.biomass-u*l.amountg,onClick:function(){return d("select",{item:e.id})}})})]}),e.desc]},e.name)}))})]})]})]})};var l=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.buying,u=l.ltsrbt_built,s=l.money;if(!d)return null;var p=l.delivery_methods.map((function(e){var t=l.delivery_method_description[e.name];return Object.assign({},e,{description:t})}));return(0,o.createComponentVNode)(2,i.Modal,{textAlign:"center",children:[(0,o.createComponentVNode)(2,i.Flex,{mb:1,children:p.map((function(e){return"LTSRBT"!==e.name||u?(0,o.createComponentVNode)(2,i.Flex.Item,{mx:1,width:"250px",children:[(0,o.createComponentVNode)(2,i.Box,{fontSize:"30px",children:e.name}),(0,o.createComponentVNode)(2,i.Box,{mt:1,children:e.description}),(0,o.createComponentVNode)(2,i.Button,{mt:2,content:(0,a.formatMoney)(e.price)+" cr",disabled:s=0||(r[n]=e[n]);return r}(t,["res","value"]),i=l(n),a=i[0],c=i[1];return(0,o.normalizeProps)((0,o.createVNode)(1,"canvas",null,"Canvas failed to render.",16,Object.assign({width:28*a||300,height:28*c||300},r,{onClick:function(t){return e.clickwrapper(t)}}),null,this.canvasRef))},r}(o.Component),l=function(e){var t=e.length;return[t,0!==t?e[0].length:0]};t.Canvas=function(e,t){var n=(0,r.useBackend)(t),d=n.act,u=n.data,s=l(u.grid),p=s[0],m=s[1];return(0,o.createComponentVNode)(2,a.Window,{width:Math.min(400,28*p*32+24),height:Math.min(400,28*m*32+24),resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Box,{textAlign:"center",children:[(0,o.createComponentVNode)(2,c,{value:u.grid,onCanvasClick:function(e,t){return d("paint",{x:e,y:t})}}),(0,o.createComponentVNode)(2,i.Box,{children:[!u.finalized&&(0,o.createComponentVNode)(2,i.Button.Confirm,{onClick:function(){return d("finalize")},content:"Finalize"}),u.name]})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.CargoBountyConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(40),c=n(2);t.CargoBountyConsole=function(e,t){var n=(0,r.useBackend)(t),a=n.act,d=n.data.bountydata,u=void 0===d?[]:d;return(0,o.createComponentVNode)(2,c.Window,{width:750,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:(0,o.createComponentVNode)(2,l),buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"print",content:"Print Bounty List",onClick:function(){return a("Print")}}),children:(0,o.createComponentVNode)(2,i.Table,{border:!0,children:[(0,o.createComponentVNode)(2,i.Table.Row,{bold:!0,italic:!0,color:"label",fontSize:1.25,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Bounty Object"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Description"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Progress"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Value"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Claim"})]}),u.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{backgroundColor:1===e.priority?"rgba(252, 152, 3, 0.25)":"",children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,children:e.name}),(0,o.createComponentVNode)(2,i.Table.Cell,{italic:!0,textAlign:"center",p:1,children:e.description}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,textAlign:"center",children:[1===e.priority?(0,o.createComponentVNode)(2,i.Box,{children:"High Priority"}):"",e.completion_string]}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,textAlign:"center",children:e.reward_string}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,textAlign:"center",icon:1===e.claimed?"check":"",content:1===e.claimed?"Claimed":"Claim",disabled:1===e.claimed,color:1===e.can_claim?"green":"red",onClick:function(){return a("ClaimBounty",{bounty:e.bounty_ref})}})})]},e.name)}))]})})})})};var l=function(e,t){var n=(0,r.useBackend)(t),c=(n.act,n.data.stored_cash);return(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:c,format:function(e){return(0,a.formatMoney)(e)}})," credits"]})}},function(e,t,n){"use strict";t.__esModule=!0,t.CargoExpress=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(178),l=n(60);t.CargoExpress=function(e,t){var n=(0,r.useBackend)(t),i=(n.act,n.data);return(0,o.createComponentVNode)(2,a.Window,{width:600,height:700,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,l.InterfaceLockNoticeBox,{accessText:"a QM-level ID card"}),!i.locked&&(0,o.createComponentVNode)(2,d)]})})};var d=function(e,t){var n=(0,r.useBackend)(t),a=n.act,l=n.data;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Cargo Express",buttons:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:Math.round(l.points)})," credits"]}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Landing Location",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Cargo Bay",selected:!l.usingBeacon,onClick:function(){return a("LZCargo")}}),(0,o.createComponentVNode)(2,i.Button,{selected:l.usingBeacon,disabled:!l.hasBeacon,onClick:function(){return a("LZBeacon")},children:[l.beaconzone," (",l.beaconName,")"]}),(0,o.createComponentVNode)(2,i.Button,{content:l.printMsg,disabled:!l.canBuyBeacon,onClick:function(){return a("printBeacon")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Notice",children:l.message})]})}),(0,o.createComponentVNode)(2,c.CargoCatalog,{express:!0})],4)}},function(e,t,n){"use strict";t.__esModule=!0,t.CargoHoldTerminal=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.CargoHoldTerminal=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.points,u=l.pad,s=l.sending,p=l.status_report;return(0,o.createComponentVNode)(2,a.Window,{width:600,height:230,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Cargo Value",children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:Math.round(d)})," credits"]})})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Cargo Pad",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Recalculate Value",disabled:!u,onClick:function(){return c("recalc")}}),(0,o.createComponentVNode)(2,i.Button,{icon:s?"times":"arrow-up",content:s?"Stop Sending":"Send Goods",selected:s,disabled:!u,onClick:function(){return c(s?"stop":"send")}})],4),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",color:u?"good":"bad",children:u?"Online":"Not Found"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cargo Report",children:p})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.CellularEmporium=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.CellularEmporium=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.abilities;return(0,o.createComponentVNode)(2,a.Window,{width:900,height:480,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Genetic Points",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"undo",content:"Readapt",disabled:!l.can_readapt,onClick:function(){return c("readapt")}}),children:l.genetic_points_remaining})})}),(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:d.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{className:"candystripe",label:e.name,buttons:(0,o.createFragment)([e.dna_cost," ",(0,o.createComponentVNode)(2,i.Button,{content:e.owned?"Evolved":"Evolve",selected:e.owned,onClick:function(){return c("evolve",{name:e.name})}})],0),children:[e.desc,(0,o.createComponentVNode)(2,i.Box,{color:"good",children:e.helptext})]},e.name)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.CentcomPodLauncherContent=t.CentcomPodLauncher=void 0;var o=n(0),r=(n(19),n(1)),i=n(3),a=n(2);t.CentcomPodLauncher=function(){return(0,o.createComponentVNode)(2,a.Window,{title:"Config/Launch Supply Pod",width:700,height:700,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.NoticeBox,{children:"To use this, simply spawn the atoms you want in one of the five Centcom Supplypod Bays. Items in the bay will then be launched inside your supplypod, one turf-full at a time! You can optionally use the following buttons to configure how the supplypod acts."}),(0,o.createComponentVNode)(2,i.Section,{title:"Centcom Pod Customization (To be used against Helen Weinstein)",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Supply Bay",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Bay #1",selected:1===c.bayNumber,onClick:function(){return a("bay1")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Bay #2",selected:2===c.bayNumber,onClick:function(){return a("bay2")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Bay #3",selected:3===c.bayNumber,onClick:function(){return a("bay3")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Bay #4",selected:4===c.bayNumber,onClick:function(){return a("bay4")}}),(0,o.createComponentVNode)(2,i.Button,{content:"ERT Bay",selected:5===c.bayNumber,tooltip:"This bay is located on the western edge of CentCom. Its the\nglass room directly west of where ERT spawn, and south of the\nCentCom ferry. Useful for launching ERT/Deathsquads/etc. onto\nthe station via drop pods.",onClick:function(){return a("bay5")}})]}),!!c.effectReverse&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Reverse Drop",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Pick Dropoff Location",selected:c.picking_dropoff_turf,disabled:!c.effectReverse,tooltip:"[NOTE: ONLY WORKS WHEN REVERSE MODE IS ACTIVE]\nThis will allow you to select a dropoff turf. After\nselecting a turf, any pod in 'Reverse Mode' will drop off\nit's newly gotten cargo on this turf. Can be used to\ntransport things or people around the station in a neat,\nIC way. Try doing this with the 'Seethrough Pod' style\nenabled for extra fun!",onClick:function(){return a("pickDropoffTurf")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Clear Dropoff Location",disabled:!c.dropoff_turf,tooltip:"Clears the selected dropoff turf for reverse mode.",onClick:function(){return a("clearDropoffTurf")}}),(0,o.createVNode)(1,"p",null,[(0,o.createTextVNode)("Reverse Drop-off Location:"),c.dropoff_turf?c.dropoff_turf:"None"],0)]}),!c.effectReverse&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Reverse Drop",children:(0,o.createVNode)(1,"p",null,"[Enable Reverse Mode for this feature]",16)}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Teleport to",children:[(0,o.createComponentVNode)(2,i.Button,{content:c.bay,onClick:function(){return a("teleportCentcom")}}),(0,o.createComponentVNode)(2,i.Button,{content:c.oldArea?c.oldArea:"Where you were",disabled:!c.oldArea,onClick:function(){return a("teleportBack")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Item Mode",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Clone Items",selected:c.launchClone,tooltip:"Choosing this will create a duplicate of the item to be\nlaunched in Centcom, allowing you to send one type of item\nmultiple times. Either way, the atoms are forceMoved into\nthe supplypod after it lands (but before it opens).",onClick:function(){return a("launchClone")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Random Items",selected:c.launchRandomItem,tooltip:"Choosing this will pick a random item from the selected turf\ninstead of the entire turfs contents. Best combined with\nsingle/random turf.",onClick:function(){return a("launchRandomItem")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Launch style",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Ordered",selected:1===c.launchChoice,tooltip:'Instead of launching everything in the bay at once, this\nwill "scan" things (one turf-full at a time) in order, left\nto right and top to bottom. undoing will reset the "scanner"\nto the top-leftmost position.',onClick:function(){return a("launchOrdered")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Random Turf",selected:2===c.launchChoice,tooltip:"Instead of launching everything in the bay at once, this\nwill launch one random turf of items at a time.",onClick:function(){return a("launchRandomTurf")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Explosion",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Custom Size",selected:1===c.explosionChoice,tooltip:"This will cause an explosion of whatever size you like\n(including flame range) to occur as soon as the supplypod\nlands. Dont worry, supply-pods are explosion-proof!",onClick:function(){return a("explosionCustom")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Adminbus",selected:2===c.explosionChoice,tooltip:"This will cause a maxcap explosion (dependent on server\nconfig) to occur as soon as the supplypod lands. Dont worry,\nsupply-pods are explosion-proof!",onClick:function(){return a("explosionBus")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Damage",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Custom Damage",selected:1===c.damageChoice,tooltip:"Anyone caught under the pod when it lands will be dealt\nthis amount of brute damage. Sucks to be them!",onClick:function(){return a("damageCustom")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Gib",selected:2===c.damageChoice,tooltip:"This will attempt to gib any mob caught under the pod when\nit lands, as well as dealing a nice 5000 brute damage. Ya\nknow, just to be sure!",onClick:function(){return a("damageGib")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Effects",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Projectile Cloud",selected:c.effectShrapnel,tooltip:"This will create a cloud of shrapnel on landing,\nof any projectile you'd like!",onClick:function(){return a("effectShrapnel")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Stun",selected:c.effectStun,tooltip:"Anyone who is on the turf when the supplypod is launched\nwill be stunned until the supplypod lands. They cant get\naway that easy!",onClick:function(){return a("effectStun")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Delimb",selected:c.effectLimb,tooltip:"This will cause anyone caught under the pod to lose a limb,\nexcluding their head.",onClick:function(){return a("effectLimb")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Yeet Organs",selected:c.effectOrgans,tooltip:"This will cause anyone caught under the pod to lose all\ntheir limbs and organs in a spectacular fashion.",onClick:function(){return a("effectOrgans")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Movement",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Bluespace",selected:c.effectBluespace,tooltip:"Gives the supplypod an advanced Bluespace Recyling Device.\nAfter opening, the supplypod will be warped directly to the\nsurface of a nearby NT-designated trash planet (/r/ss13).",onClick:function(){return a("effectBluespace")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Stealth",selected:c.effectStealth,tooltip:'This hides the red target icon from appearing when you\nlaunch the supplypod. Combos well with the "Invisible"\nstyle. Sneak attack, go!',onClick:function(){return a("effectStealth")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Quiet",selected:c.effectQuiet,tooltip:"This will keep the supplypod from making any sounds, except\nfor those specifically set by admins in the Sound section.",onClick:function(){return a("effectQuiet")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Reverse Mode",selected:c.effectReverse,tooltip:"This pod will not send any items. Instead, after landing,\nthe supplypod will close (similar to a normal closet closing),\nand then launch back to the right centcom bay to drop off any\nnew contents.",onClick:function(){return a("effectReverse")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Missile Mode",selected:c.effectMissile,tooltip:"This pod will not send any items. Instead, it will immediately\ndelete after landing (Similar visually to setting openDelay\n& departDelay to 0, but this looks nicer). Useful if you just\nwanna fuck some shit up. Combos well with the Missile style.",onClick:function(){return a("effectMissile")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Any Descent Angle",selected:c.effectCircle,tooltip:"This will make the supplypod come in from any angle. Im not\nsure why this feature exists, but here it is.",onClick:function(){return a("effectCircle")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Machine Gun Mode",selected:c.effectBurst,tooltip:"This will make each click launch 5 supplypods inaccuratly\naround the target turf (a 3x3 area). Combos well with the\nMissile Mode if you dont want shit lying everywhere after.",onClick:function(){return a("effectBurst")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Specific Target",selected:c.effectTarget,tooltip:"This will make the supplypod target a specific atom, instead\nof the mouses position. Smiting does this automatically!",onClick:function(){return a("effectTarget")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name/Desc",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Custom Name/Desc",selected:c.effectName,tooltip:"Allows you to add a custom name and description.",onClick:function(){return a("effectName")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Alert Ghosts",selected:c.effectAnnounce,tooltip:"Alerts ghosts when a pod is launched. Useful if some dumb\nshit is aboutta come outta the pod.",onClick:function(){return a("effectAnnounce")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Sound",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Custom Falling Sound",selected:c.fallingSound,tooltip:"Choose a sound to play as the pod falls. Note that for this\nto work right you should know the exact length of the sound,\nin seconds.",onClick:function(){return a("fallSound")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Custom Landing Sound",selected:c.landingSound,tooltip:"Choose a sound to play when the pod lands.",onClick:function(){return a("landingSound")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Custom Opening Sound",selected:c.openingSound,tooltip:"Choose a sound to play when the pod opens.",onClick:function(){return a("openingSound")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Custom Leaving Sound",selected:c.leavingSound,tooltip:"Choose a sound to play when the pod departs (whether that be\ndelection in the case of a bluespace pod, or leaving for\ncentcom for a reversing pod).",onClick:function(){return a("leavingSound")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Admin Sound Volume",selected:c.soundVolume,tooltip:"Choose the volume for the sound to play at. Default values\nare between 1 and 100, but hey, do whatever. Im a tooltip,\nnot a cop.",onClick:function(){return a("soundVolume")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Timers",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Custom Falling Duration",selected:4!==c.fallDuration,tooltip:"Set how long the animation for the pod falling lasts. Create\ndramatic, slow falling pods!",onClick:function(){return a("fallDuration")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Custom Landing Time",selected:20!==c.landingDelay,tooltip:"Choose the amount of time it takes for the supplypod to hit\nthe station. By default this value is 0.5 seconds.",onClick:function(){return a("landingDelay")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Custom Opening Time",selected:30!==c.openingDelay,tooltip:"Choose the amount of time it takes for the supplypod to open\nafter landing. Useful for giving whatevers inside the pod a\nnice dramatic entrance! By default this value is 3 seconds.",onClick:function(){return a("openingDelay")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Custom Leaving Time",selected:30!==c.departureDelay,tooltip:"Choose the amount of time it takes for the supplypod to leave\nafter landing. By default this value is 3 seconds.",onClick:function(){return a("departureDelay")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Style",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.styleChoice,tooltip:"Same color scheme as the normal station-used supplypods",onClick:function(){return a("styleStandard")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Advanced",selected:2===c.styleChoice,tooltip:"The same as the stations upgraded blue-and-white\nBluespace Supplypods",onClick:function(){return a("styleBluespace")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Syndicate",selected:4===c.styleChoice,tooltip:"A menacing black and blood-red. Great for sending meme-ops\nin style!",onClick:function(){return a("styleSyndie")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Deathsquad",selected:5===c.styleChoice,tooltip:"A menacing black and dark blue. Great for sending deathsquads\nin style!",onClick:function(){return a("styleBlue")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Cult Pod",selected:6===c.styleChoice,tooltip:"A blood and rune covered cult pod!",onClick:function(){return a("styleCult")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Missile",selected:7===c.styleChoice,tooltip:"A large missile. Combos well with a missile mode, so the\nmissile doesnt stick around after landing.",onClick:function(){return a("styleMissile")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Syndicate Missile",selected:8===c.styleChoice,tooltip:"A large blood-red missile. Combos well with missile mode,\nso the missile doesnt stick around after landing.",onClick:function(){return a("styleSMissile")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Supply Crate",selected:9===c.styleChoice,tooltip:"A large, dark-green military supply crate.",onClick:function(){return a("styleBox")}}),(0,o.createComponentVNode)(2,i.Button,{content:"HONK",selected:10===c.styleChoice,tooltip:"A colorful, clown inspired look.",onClick:function(){return a("styleHONK")}}),(0,o.createComponentVNode)(2,i.Button,{content:"~Fruit",selected:11===c.styleChoice,tooltip:"For when an orange is angry",onClick:function(){return a("styleFruit")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Invisible",selected:12===c.styleChoice,tooltip:'Makes the supplypod invisible! Useful for when you want to\nuse this feature with a gateway or something. Combos well\nwith the "Stealth" and "Quiet Landing" effects.',onClick:function(){return a("styleInvisible")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Gondola",selected:13===c.styleChoice,tooltip:"This gondola can control when he wants to deliver his supplies\nif he has a smart enough mind, so offer up his body to ghosts\nfor maximum enjoyment. (Make sure to turn off bluespace and\nset an arbitrarily high open-time if you do!",onClick:function(){return a("styleGondola")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Show Contents (See Through Pod)",selected:14===c.styleChoice,tooltip:"By selecting this, the pod will instead look like whatevers\ninside it (as if it were the contents falling by themselves,\nwithout a pod). Useful for launching mechs at the station\nand standing tall as they soar in from the heavens.",onClick:function(){return a("styleSeeThrough")}})]})]})}),(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:c.numObjects+" turfs in "+c.bay,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{content:"undo Pod Bay",tooltip:"Manually undoes the possible things to launch in the\npod bay.",onClick:function(){return a("undo")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Enter Launch Mode",selected:c.giveLauncher,tooltip:"THE CODEX ASTARTES CALLS THIS MANEUVER: STEEL RAIN",onClick:function(){return a("giveLauncher")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Clear Selected Bay",color:"bad",tooltip:"This will delete all objs and mobs from the selected bay.",tooltipPosition:"left",onClick:function(){return a("clearBay")}})],4)})})})],4)};t.CentcomPodLauncherContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.ChemAcclimator=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ChemAcclimator=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:320,height:271,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Acclimator",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Temperature",children:[l.chem_temp," K"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Target Temperature",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:l.target_temperature,unit:"K",width:"59px",minValue:0,maxValue:1e3,step:5,stepPixelSize:2,onChange:function(e,t){return c("set_target_temperature",{temperature:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Acceptable Temp. Difference",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:l.allowed_temperature_difference,unit:"K",width:"59px",minValue:1,maxValue:l.target_temperature,stepPixelSize:2,onChange:function(e,t){c("set_allowed_temperature_difference",{temperature:t})}})})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Status",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",content:l.enabled?"On":"Off",selected:l.enabled,onClick:function(){return c("toggle_power")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Volume",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:l.max_volume,unit:"u",width:"50px",minValue:l.reagent_volume,maxValue:200,step:2,stepPixelSize:2,onChange:function(e,t){return c("change_volume",{volume:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Operation",children:l.acclimate_state}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current State",children:l.emptying?"Emptying":"Filling"})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemDebugSynthesizer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ChemDebugSynthesizer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.amount,u=l.beakerCurrentVolume,s=l.beakerMaxVolume,p=l.isBeakerLoaded,m=l.beakerContents,f=void 0===m?[]:m;return(0,o.createComponentVNode)(2,a.Window,{width:390,height:330,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Recipient",buttons:p?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",onClick:function(){return c("ejectBeaker")}}),(0,o.createComponentVNode)(2,i.NumberInput,{value:d,unit:"u",minValue:1,maxValue:s,step:1,stepPixelSize:2,onChange:function(e,t){return c("amount",{amount:t})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"plus",content:"Input",onClick:function(){return c("input")}})],4):(0,o.createComponentVNode)(2,i.Button,{icon:"plus",content:"Create Beaker",onClick:function(){return c("makecup")}}),children:p?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:u})," / "+s+" u"]}),f.length>0?(0,o.createComponentVNode)(2,i.LabeledList,{children:f.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,children:[e.volume," u"]},e.name)}))}):(0,o.createComponentVNode)(2,i.Box,{color:"bad",children:"Recipient Empty"})],0):(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"No Recipient"})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemDispenser=void 0;var o=n(0),r=n(15),i=n(19),a=n(1),c=n(3),l=n(2);t.ChemDispenser=function(e,t){var n=(0,a.useBackend)(t),d=n.act,u=n.data,s=!!u.recordingRecipe,p=Object.keys(u.recipes).map((function(e){return{name:e,contents:u.recipes[e]}})),m=u.beakerTransferAmounts||[],f=s&&Object.keys(u.recordingRecipe).map((function(e){return{id:e,name:(0,i.toTitleCase)(e.replace(/_/," ")),volume:u.recordingRecipe[e]}}))||u.beakerContents||[];return(0,o.createComponentVNode)(2,l.Window,{width:565,height:620,resizable:!0,children:(0,o.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,c.Section,{title:"Status",buttons:s&&(0,o.createComponentVNode)(2,c.Box,{inline:!0,mx:1,color:"red",children:[(0,o.createComponentVNode)(2,c.Icon,{name:"circle",mr:1}),"Recording"]}),children:(0,o.createComponentVNode)(2,c.LabeledList,{children:(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Energy",children:(0,o.createComponentVNode)(2,c.ProgressBar,{value:u.energy/u.maxEnergy,children:(0,r.toFixed)(u.energy)+" units"})})})}),(0,o.createComponentVNode)(2,c.Section,{title:"Recipes",buttons:(0,o.createFragment)([!s&&(0,o.createComponentVNode)(2,c.Box,{inline:!0,mx:1,children:(0,o.createComponentVNode)(2,c.Button,{color:"transparent",content:"Clear recipes",onClick:function(){return d("clear_recipes")}})}),!s&&(0,o.createComponentVNode)(2,c.Button,{icon:"circle",disabled:!u.isBeakerLoaded,content:"Record",onClick:function(){return d("record_recipe")}}),s&&(0,o.createComponentVNode)(2,c.Button,{icon:"ban",color:"transparent",content:"Discard",onClick:function(){return d("cancel_recording")}}),s&&(0,o.createComponentVNode)(2,c.Button,{icon:"save",color:"green",content:"Save",onClick:function(){return d("save_recording")}})],0),children:(0,o.createComponentVNode)(2,c.Box,{mr:-1,children:[p.map((function(e){return(0,o.createComponentVNode)(2,c.Button,{icon:"tint",width:"129.5px",lineHeight:1.75,content:e.name,onClick:function(){return d("dispense_recipe",{recipe:e.name})}},e.name)})),0===p.length&&(0,o.createComponentVNode)(2,c.Box,{color:"light-gray",children:"No recipes."})]})}),(0,o.createComponentVNode)(2,c.Section,{title:"Dispense",buttons:m.map((function(e){return(0,o.createComponentVNode)(2,c.Button,{icon:"plus",selected:e===u.amount,content:e,onClick:function(){return d("amount",{target:e})}},e)})),children:(0,o.createComponentVNode)(2,c.Box,{mr:-1,children:u.chemicals.map((function(e){return(0,o.createComponentVNode)(2,c.Button,{icon:"tint",width:"129.5px",lineHeight:1.75,content:e.title,onClick:function(){return d("dispense",{reagent:e.id})}},e.id)}))})}),(0,o.createComponentVNode)(2,c.Section,{title:"Beaker",buttons:m.map((function(e){return(0,o.createComponentVNode)(2,c.Button,{icon:"minus",disabled:s,content:e,onClick:function(){return d("remove",{amount:e})}},e)})),children:(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Beaker",buttons:!!u.isBeakerLoaded&&(0,o.createComponentVNode)(2,c.Button,{icon:"eject",content:"Eject",disabled:!u.isBeakerLoaded,onClick:function(){return d("eject")}}),children:(s?"Virtual beaker":u.isBeakerLoaded&&(0,o.createFragment)([(0,o.createComponentVNode)(2,c.AnimatedNumber,{initial:0,value:u.beakerCurrentVolume}),(0,o.createTextVNode)("/"),u.beakerMaxVolume,(0,o.createTextVNode)(" units")],0))||"No beaker"}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Contents",children:[(0,o.createComponentVNode)(2,c.Box,{color:"label",children:u.isBeakerLoaded||s?0===f.length&&"Nothing":"N/A"}),f.map((function(e){return(0,o.createComponentVNode)(2,c.Box,{color:"label",children:[(0,o.createComponentVNode)(2,c.AnimatedNumber,{initial:0,value:e.volume})," ","units of ",e.name]},e.name)}))]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemFilter=t.ChemFilterPane=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=function(e,t){var n=(0,r.useBackend)(t).act,a=e.title,c=e.list,l=e.reagentName,d=e.onReagentInput,u=a.toLowerCase();return(0,o.createComponentVNode)(2,i.Section,{title:a,minHeight:"240px",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Input,{placeholder:"Reagent",width:"140px",onInput:function(e,t){return d(t)}}),(0,o.createComponentVNode)(2,i.Button,{ml:1,icon:"plus",onClick:function(){return n("add",{which:u,name:l})}})],4),children:c.map((function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"minus",content:e,onClick:function(){return n("remove",{which:u,reagent:e})}})],4,e)}))})};t.ChemFilterPane=c;t.ChemFilter=function(e,t){var n=(0,r.useBackend)(t),l=(n.act,n.data),d=l.left,u=void 0===d?[]:d,s=l.right,p=void 0===s?[]:s,m=(0,r.useLocalState)(t,"leftName",""),f=m[0],h=m[1],C=(0,r.useLocalState)(t,"rightName",""),g=C[0],b=C[1];return(0,o.createComponentVNode)(2,a.Window,{width:500,height:300,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Flex,{spacing:1,children:[(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,c,{title:"Left",list:u,reagentName:f,onReagentInput:function(e){return h(e)}})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,c,{title:"Right",list:p,reagentName:g,onReagentInput:function(e){return b(e)}})})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemHeater=void 0;var o=n(0),r=n(15),i=n(1),a=n(3),c=n(2),l=n(179);t.ChemHeater=function(e,t){var n=(0,i.useBackend)(t),d=n.act,u=n.data,s=u.targetTemp,p=u.isActive,m=u.isBeakerLoaded,f=u.currentTemp,h=u.beakerCurrentVolume,C=u.beakerMaxVolume,g=u.beakerContents,b=void 0===g?[]:g;return(0,o.createComponentVNode)(2,c.Window,{width:275,height:320,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{title:"Thermostat",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:p?"power-off":"times",selected:p,content:p?"On":"Off",onClick:function(){return d("power")}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Target",children:(0,o.createComponentVNode)(2,a.NumberInput,{width:"65px",unit:"K",step:10,stepPixelSize:3,value:(0,r.round)(s),minValue:0,maxValue:1e3,onDrag:function(e,t){return d("temperature",{target:t})}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Reading",children:(0,o.createComponentVNode)(2,a.Box,{width:"60px",textAlign:"right",children:m&&(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:f,format:function(e){return(0,r.toFixed)(e)+" K"}})||"\u2014"})})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Beaker",buttons:!!m&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"label",mr:2,children:[h," / ",C," units"]}),(0,o.createComponentVNode)(2,a.Button,{icon:"eject",content:"Eject",onClick:function(){return d("eject")}})],4),children:(0,o.createComponentVNode)(2,l.BeakerContents,{beakerLoaded:m,beakerContents:b})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemMaster=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ChemMaster=function(e,t){var n=(0,r.useBackend)(t).data.screen;return(0,o.createComponentVNode)(2,a.Window,{width:465,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:"analyze"===n&&(0,o.createComponentVNode)(2,p)||(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,u=c.screen,m=c.beakerContents,f=void 0===m?[]:m,h=c.bufferContents,C=void 0===h?[]:h,g=c.beakerCurrentVolume,b=c.beakerMaxVolume,N=c.isBeakerLoaded,v=c.isPillBottleLoaded,V=c.pillBottleCurrentAmount,y=c.pillBottleMaxAmount;return"analyze"===u?(0,o.createComponentVNode)(2,p):(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Beaker",buttons:!!c.isBeakerLoaded&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"label",mr:2,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:g,initial:0})," / "+b+" units"]}),(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",onClick:function(){return a("eject")}})],4),children:[!N&&(0,o.createComponentVNode)(2,i.Box,{color:"label",mt:"3px",mb:"5px",children:"No beaker loaded."}),!!N&&0===f.length&&(0,o.createComponentVNode)(2,i.Box,{color:"label",mt:"3px",mb:"5px",children:"Beaker is empty."}),(0,o.createComponentVNode)(2,l,{children:f.map((function(e){return(0,o.createComponentVNode)(2,d,{chemical:e,transferTo:"buffer"},e.id)}))})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Buffer",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"label",mr:1,children:"Mode:"}),(0,o.createComponentVNode)(2,i.Button,{color:c.mode?"good":"bad",icon:c.mode?"exchange-alt":"times",content:c.mode?"Transfer":"Destroy",onClick:function(){return a("toggleMode")}})],4),children:[0===C.length&&(0,o.createComponentVNode)(2,i.Box,{color:"label",mt:"3px",mb:"5px",children:"Buffer is empty."}),(0,o.createComponentVNode)(2,l,{children:C.map((function(e){return(0,o.createComponentVNode)(2,d,{chemical:e,transferTo:"beaker"},e.id)}))})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Packaging",children:(0,o.createComponentVNode)(2,s)}),!!v&&(0,o.createComponentVNode)(2,i.Section,{title:"Pill Bottle",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"label",mr:2,children:[V," / ",y," pills"]}),(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",onClick:function(){return a("ejectPillBottle")}})],4)})],0)},l=i.Table,d=function(e,t){var n=(0,r.useBackend)(t).act,a=e.chemical,c=e.transferTo;return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{color:"label",children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:a.volume,initial:0})," units of "+a.name]}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:[(0,o.createComponentVNode)(2,i.Button,{content:"1",onClick:function(){return n("transfer",{id:a.id,amount:1,to:c})}}),(0,o.createComponentVNode)(2,i.Button,{content:"5",onClick:function(){return n("transfer",{id:a.id,amount:5,to:c})}}),(0,o.createComponentVNode)(2,i.Button,{content:"10",onClick:function(){return n("transfer",{id:a.id,amount:10,to:c})}}),(0,o.createComponentVNode)(2,i.Button,{content:"All",onClick:function(){return n("transfer",{id:a.id,amount:1e3,to:c})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"ellipsis-h",title:"Custom amount",onClick:function(){return n("transfer",{id:a.id,amount:-1,to:c})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"question",title:"Analyze",onClick:function(){return n("analyze",{id:a.id})}})]})]},a.id)},u=function(e){var t=e.label,n=e.amountUnit,r=e.amount,a=e.onChangeAmount,c=e.onCreate,l=e.sideNote;return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:t,children:[(0,o.createComponentVNode)(2,i.NumberInput,{width:"84px",unit:n,step:1,stepPixelSize:15,value:r,minValue:1,maxValue:10,onChange:a}),(0,o.createComponentVNode)(2,i.Button,{ml:1,content:"Create",onClick:c}),(0,o.createComponentVNode)(2,i.Box,{inline:!0,ml:1,color:"label",children:l})]})},s=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=(0,r.useSharedState)(t,"pillAmount",1),d=l[0],s=l[1],p=(0,r.useSharedState)(t,"patchAmount",1),m=p[0],f=p[1],h=(0,r.useSharedState)(t,"bottleAmount",1),C=h[0],g=h[1],b=(0,r.useSharedState)(t,"packAmount",1),N=b[0],v=b[1],V=c.condi,y=c.chosenPillStyle,k=c.pillStyles,x=void 0===k?[]:k;return(0,o.createComponentVNode)(2,i.LabeledList,{children:[!V&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Pill type",children:x.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{width:"30px",selected:e.id===y,textAlign:"center",color:"transparent",onClick:function(){return a("pillStyle",{id:e.id})},children:(0,o.createComponentVNode)(2,i.Box,{mx:-1,className:e.className})},e.id)}))}),!V&&(0,o.createComponentVNode)(2,u,{label:"Pills",amount:d,amountUnit:"pills",sideNote:"max 50u",onChangeAmount:function(e,t){return s(t)},onCreate:function(){return a("create",{type:"pill",amount:d,volume:"auto"})}}),!V&&(0,o.createComponentVNode)(2,u,{label:"Patches",amount:m,amountUnit:"patches",sideNote:"max 40u",onChangeAmount:function(e,t){return f(t)},onCreate:function(){return a("create",{type:"patch",amount:m,volume:"auto"})}}),!V&&(0,o.createComponentVNode)(2,u,{label:"Bottles",amount:C,amountUnit:"bottles",sideNote:"max 30u",onChangeAmount:function(e,t){return g(t)},onCreate:function(){return a("create",{type:"bottle",amount:C,volume:"auto"})}}),!!V&&(0,o.createComponentVNode)(2,u,{label:"Packs",amount:N,amountUnit:"packs",sideNote:"max 10u",onChangeAmount:function(e,t){return v(t)},onCreate:function(){return a("create",{type:"condimentPack",amount:N,volume:"auto"})}}),!!V&&(0,o.createComponentVNode)(2,u,{label:"Bottles",amount:C,amountUnit:"bottles",sideNote:"max 50u",onChangeAmount:function(e,t){return g(t)},onCreate:function(){return a("create",{type:"condimentBottle",amount:C,volume:"auto"})}})]})},p=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data.analyzeVars;return(0,o.createComponentVNode)(2,i.Section,{title:"Analysis Results",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"arrow-left",content:"Back",onClick:function(){return a("goScreen",{screen:"home"})}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",children:c.name}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"State",children:c.state}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Color",children:[(0,o.createComponentVNode)(2,i.ColorBox,{color:c.color,mr:1}),c.color]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Description",children:c.description}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Metabolization Rate",children:[c.metaRate," u/minute"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Overdose Threshold",children:c.overD}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Addiction Threshold",children:c.addicD})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemPress=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ChemPress=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.current_volume,u=l.product_name,s=l.pill_style,p=l.pill_styles,m=void 0===p?[]:p,f=l.product,h=l.min_volume,C=l.max_volume;return(0,o.createComponentVNode)(2,a.Window,{width:300,height:227,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Product",children:[(0,o.createComponentVNode)(2,i.Button.Checkbox,{content:"Pills",checked:"pill"===f,onClick:function(){return c("change_product",{product:"pill"})}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{content:"Patches",checked:"patch"===f,onClick:function(){return c("change_product",{product:"patch"})}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{content:"Bottles",checked:"bottle"===f,onClick:function(){return c("change_product",{product:"bottle"})}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Volume",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:d,unit:"u",width:"43px",minValue:h,maxValue:C,step:1,stepPixelSize:2,onChange:function(e,t){return c("change_current_volume",{volume:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",children:[(0,o.createComponentVNode)(2,i.Input,{value:u,placeholder:u,onChange:function(e,t){return c("change_product_name",{name:t})}}),(0,o.createComponentVNode)(2,i.Box,{as:"span",children:f})]}),"pill"===f&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Style",children:m.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{width:"30px",selected:e.id===s,textAlign:"center",color:"transparent",onClick:function(){return c("change_pill_style",{id:e.id})},children:(0,o.createComponentVNode)(2,i.Box,{mx:-1,className:e.class_name})},e.id)}))})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemReactionChamber=void 0;var o=n(0),r=n(16),i=n(6),a=n(1),c=n(3),l=n(2);t.ChemReactionChamber=function(e,t){var n=(0,a.useBackend)(t),d=n.act,u=n.data,s=(0,a.useLocalState)(t,"reagentName",""),p=s[0],m=s[1],f=(0,a.useLocalState)(t,"reagentQuantity",1),h=f[0],C=f[1],g=u.emptying,b=u.reagents||[];return(0,o.createComponentVNode)(2,l.Window,{width:250,height:225,resizable:!0,children:(0,o.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c.Section,{title:"Reagents",buttons:(0,o.createComponentVNode)(2,c.Box,{inline:!0,bold:!0,color:g?"bad":"good",children:g?"Emptying":"Filling"}),children:(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createVNode)(1,"tr","LabledList__row",[(0,o.createVNode)(1,"td","LabeledList__cell",(0,o.createComponentVNode)(2,c.Input,{fluid:!0,value:"",placeholder:"Reagent Name",onInput:function(e,t){return m(t)}}),2,{colSpan:"2"}),(0,o.createVNode)(1,"td",(0,i.classes)(["LabeledList__buttons","LabeledList__cell"]),[(0,o.createComponentVNode)(2,c.NumberInput,{value:h,minValue:1,maxValue:100,step:1,stepPixelSize:3,width:"39px",onDrag:function(e,t){return C(t)}}),(0,o.createComponentVNode)(2,c.Box,{inline:!0,mr:1}),(0,o.createComponentVNode)(2,c.Button,{icon:"plus",onClick:function(){return d("add",{chem:p,amount:h})}})],4)],4),(0,r.map)((function(e,t){return(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:t,buttons:(0,o.createComponentVNode)(2,c.Button,{icon:"minus",color:"bad",onClick:function(){return d("remove",{chem:t})}}),children:e},t)}))(b)]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemSplitter=void 0;var o=n(0),r=n(15),i=n(1),a=n(3),c=n(2);t.ChemSplitter=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.straight,s=d.side,p=d.max_transfer;return(0,o.createComponentVNode)(2,c.Window,{width:220,height:105,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Straight",children:(0,o.createComponentVNode)(2,a.NumberInput,{value:u,unit:"u",width:"55px",minValue:1,maxValue:p,format:function(e){return(0,r.toFixed)(e,2)},step:.05,stepPixelSize:4,onChange:function(e,t){return l("set_amount",{target:"straight",amount:t})}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Side",children:(0,o.createComponentVNode)(2,a.NumberInput,{value:s,unit:"u",width:"55px",minValue:1,maxValue:p,format:function(e){return(0,r.toFixed)(e,2)},step:.05,stepPixelSize:4,onChange:function(e,t){return l("set_amount",{target:"side",amount:t})}})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemSynthesizer=void 0;var o=n(0),r=n(15),i=n(1),a=n(3),c=n(2);t.ChemSynthesizer=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.amount,s=d.current_reagent,p=d.chemicals,m=void 0===p?[]:p,f=d.possible_amounts,h=void 0===f?[]:f;return(0,o.createComponentVNode)(2,c.Window,{width:300,height:375,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Box,{children:h.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{icon:"plus",content:(0,r.toFixed)(e,0),selected:e===u,onClick:function(){return l("amount",{target:e})}},(0,r.toFixed)(e,0))}))}),(0,o.createComponentVNode)(2,a.Box,{mt:1,children:m.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{icon:"tint",content:e.title,width:"129px",selected:e.id===s,onClick:function(){return l("select",{reagent:e.id})}},e.id)}))})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.CodexGigas=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=["Dark","Hellish","Fallen","Fiery","Sinful","Blood","Fluffy"],l=["Lord","Prelate","Count","Viscount","Vizier","Elder","Adept"],d=["hal","ve","odr","neit","ci","quon","mya","folth","wren","geyr","hil","niet","twou","phi","coa"],u=["the Red","the Soulless","the Master","the Lord of all things","Jr."];t.CodexGigas=function(e,t){var n=(0,r.useBackend)(t),s=n.act,p=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:450,height:450,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:[p.name,(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Prefix",children:c.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e,disabled:1!==p.currentSection,onClick:function(){return s(e+" ")}},e.toLowerCase())}))}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Title",children:l.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e,disabled:p.currentSection>2,onClick:function(){return s(e+" ")}},e.toLowerCase())}))}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",children:d.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e,disabled:p.currentSection>4,onClick:function(){return s(e)}},e.toLowerCase())}))}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Suffix",children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e,disabled:4!==p.currentSection,onClick:function(){return s(" "+e)}},e.toLowerCase())}))}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Submit",children:(0,o.createComponentVNode)(2,i.Button,{content:"Search",disabled:p.currentSection<4,onClick:function(){return s("search")}})})]})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ComputerFabricator=void 0;var o=n(0),r=(n(19),n(1)),i=n(3),a=n(2);t.ComputerFabricator=function(e,t){var n=(0,r.useBackend)(t),s=n.act,p=n.data;return(0,o.createComponentVNode)(2,a.Window,{title:"Personal Computer Vendor",width:500,height:400,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{italic:!0,fontSize:"20px",children:"Your perfect device, only three steps away..."}),0!==p.state&&(0,o.createComponentVNode)(2,i.Button,{fluid:!0,mb:1,icon:"circle",content:"Clear Order",onClick:function(){return s("clean_order")}}),0===p.state&&(0,o.createComponentVNode)(2,c),1===p.state&&(0,o.createComponentVNode)(2,l),2===p.state&&(0,o.createComponentVNode)(2,d),3===p.state&&(0,o.createComponentVNode)(2,u)]})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act;n.data;return(0,o.createComponentVNode)(2,i.Section,{title:"Step 1",minHeight:"306px",children:[(0,o.createComponentVNode)(2,i.Box,{mt:5,bold:!0,textAlign:"center",fontSize:"40px",children:"Choose your Device"}),(0,o.createComponentVNode)(2,i.Box,{mt:3,children:(0,o.createComponentVNode)(2,i.Grid,{width:"100%",children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"laptop",content:"Laptop",textAlign:"center",fontSize:"30px",lineHeight:2,onClick:function(){return a("pick_device",{pick:"1"})}})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"tablet-alt",content:"Tablet",textAlign:"center",fontSize:"30px",lineHeight:2,onClick:function(){return a("pick_device",{pick:"2"})}})})]})})]})},l=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data;return(0,o.createComponentVNode)(2,i.Section,{title:"Step 2: Customize your device",minHeight:"282px",buttons:(0,o.createComponentVNode)(2,i.Box,{bold:!0,color:"good",children:[c.totalprice," cr"]}),children:[(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,position:"relative",children:["Battery:",(0,o.createComponentVNode)(2,i.Tooltip,{content:"Allows your device to operate without external utility power\nsource. Advanced batteries increase battery life.",position:"right"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.hw_battery,onClick:function(){return a("hw_battery",{battery:"1"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Upgraded",selected:2===c.hw_battery,onClick:function(){return a("hw_battery",{battery:"2"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Advanced",selected:3===c.hw_battery,onClick:function(){return a("hw_battery",{battery:"3"})}})})]}),(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,position:"relative",children:["Hard Drive:",(0,o.createComponentVNode)(2,i.Tooltip,{content:"Stores file on your device. Advanced drives can store more\nfiles, but use more power, shortening battery life.",position:"right"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.hw_disk,onClick:function(){return a("hw_disk",{disk:"1"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Upgraded",selected:2===c.hw_disk,onClick:function(){return a("hw_disk",{disk:"2"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Advanced",selected:3===c.hw_disk,onClick:function(){return a("hw_disk",{disk:"3"})}})})]}),(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,position:"relative",children:["Network Card:",(0,o.createComponentVNode)(2,i.Tooltip,{content:"Allows your device to wirelessly connect to stationwide NTNet\nnetwork. Basic cards are limited to on-station use, while\nadvanced cards can operate anywhere near the station, which\nincludes asteroid outposts",position:"right"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"None",selected:0===c.hw_netcard,onClick:function(){return a("hw_netcard",{netcard:"0"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.hw_netcard,onClick:function(){return a("hw_netcard",{netcard:"1"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Advanced",selected:2===c.hw_netcard,onClick:function(){return a("hw_netcard",{netcard:"2"})}})})]}),(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,position:"relative",children:["Nano Printer:",(0,o.createComponentVNode)(2,i.Tooltip,{content:"A device that allows for various paperwork manipulations,\nsuch as, scanning of documents or printing new ones.\nThis device was certified EcoFriendlyPlus and is capable of\nrecycling existing paper for printing purposes.",position:"right"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"None",selected:0===c.hw_nanoprint,onClick:function(){return a("hw_nanoprint",{print:"0"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.hw_nanoprint,onClick:function(){return a("hw_nanoprint",{print:"1"})}})})]}),(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,position:"relative",children:["Card Reader:",(0,o.createComponentVNode)(2,i.Tooltip,{content:"Adds a slot that allows you to manipulate RFID cards.\nPlease note that this is not necessary to allow the device\nto read your identification, it is just necessary to\nmanipulate other cards.",position:"right"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"None",selected:0===c.hw_card,onClick:function(){return a("hw_card",{card:"0"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.hw_card,onClick:function(){return a("hw_card",{card:"1"})}})})]}),2!==c.devtype&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,position:"relative",children:["Processor Unit:",(0,o.createComponentVNode)(2,i.Tooltip,{content:"A component critical for your device's functionality.\nIt allows you to run programs from your hard drive.\nAdvanced CPUs use more power, but allow you to run\nmore programs on background at once.",position:"right"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.hw_cpu,onClick:function(){return a("hw_cpu",{cpu:"1"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Advanced",selected:2===c.hw_cpu,onClick:function(){return a("hw_cpu",{cpu:"2"})}})})]}),(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,position:"relative",children:["Tesla Relay:",(0,o.createComponentVNode)(2,i.Tooltip,{content:"An advanced wireless power relay that allows your device\nto connect to nearby area power controller to provide\nalternative power source. This component is currently\nunavailable on tablet computers due to size restrictions.",position:"right"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"None",selected:0===c.hw_tesla,onClick:function(){return a("hw_tesla",{tesla:"0"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.hw_tesla,onClick:function(){return a("hw_tesla",{tesla:"1"})}})})]})],4)]}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,mt:3,content:"Confirm Order",color:"good",textAlign:"center",fontSize:"18px",lineHeight:2,onClick:function(){return a("confirm_order")}})]})},d=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data;return(0,o.createComponentVNode)(2,i.Section,{title:"Step 3: Payment",minHeight:"282px",children:[(0,o.createComponentVNode)(2,i.Box,{italic:!0,textAlign:"center",fontSize:"20px",children:"Your device is ready for fabrication..."}),(0,o.createComponentVNode)(2,i.Box,{bold:!0,mt:2,textAlign:"center",fontSize:"16px",children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:"Please insert the required"})," ",(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"good",children:[c.totalprice," cr"]})]}),(0,o.createComponentVNode)(2,i.Box,{bold:!0,mt:1,textAlign:"center",fontSize:"18px",children:"Current:"}),(0,o.createComponentVNode)(2,i.Box,{bold:!0,mt:.5,textAlign:"center",fontSize:"18px",color:c.credits>=c.totalprice?"good":"bad",children:[c.credits," cr"]}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Purchase",disabled:c.credits=10&&e<20?a.COLORS.department.security:e>=20&&e<30?a.COLORS.department.medbay:e>=30&&e<40?a.COLORS.department.science:e>=40&&e<50?a.COLORS.department.engineering:e>=50&&e<60?a.COLORS.department.cargo:e>=200&&e<230?a.COLORS.department.centcom:a.COLORS.department.other},u=function(e){var t=e.type,n=e.value;return(0,o.createComponentVNode)(2,i.Box,{inline:!0,width:2,color:a.COLORS.damageType[t],textAlign:"center",children:n})};t.CrewConsole=function(){return(0,o.createComponentVNode)(2,c.Window,{title:"Crew Monitor",width:800,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{minHeight:"540px",children:(0,o.createComponentVNode)(2,s)})})})};var s=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,s=c.sensors||[];return(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,children:"Name"}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,collapsing:!0}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,collapsing:!0,textAlign:"center",children:"Vitals"}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,children:"Position"}),!!c.link_allowed&&(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,collapsing:!0,children:"Tracking"})]}),s.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:(f=e.ijob,f%10==0),color:d(e.ijob),children:[e.name," (",e.assignment,")"]}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,textAlign:"center",children:(0,o.createComponentVNode)(2,i.ColorBox,{color:(t=e.oxydam,n=e.toxdam,r=e.burndam,s=e.brutedam,p=t+n+r+s,m=Math.min(Math.max(Math.ceil(p/25),0),5),l[m])})}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,textAlign:"center",children:null!==e.oxydam?(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:[(0,o.createComponentVNode)(2,u,{type:"oxy",value:e.oxydam}),"/",(0,o.createComponentVNode)(2,u,{type:"toxin",value:e.toxdam}),"/",(0,o.createComponentVNode)(2,u,{type:"burn",value:e.burndam}),"/",(0,o.createComponentVNode)(2,u,{type:"brute",value:e.brutedam})]}):e.life_status?"Alive":"Dead"}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:null!==e.pos_x?e.area:"N/A"}),!!c.link_allowed&&(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:(0,o.createComponentVNode)(2,i.Button,{content:"Track",disabled:!e.can_track,onClick:function(){return a("select_person",{name:e.name})}})})]},e.name);var t,n,r,s,p,m,f}))]})}},function(e,t,n){"use strict";t.__esModule=!0,t.Cryo=void 0;var o=n(0),r=n(1),i=n(3),a=n(179),c=n(2),l=[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}];t.Cryo=function(){return(0,o.createComponentVNode)(2,c.Window,{width:400,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,d)})})};var d=function(e,t){var n=(0,r.useBackend)(t),c=n.act,d=n.data;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Occupant",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Occupant",children:d.occupant.name||"No Occupant"}),!!d.hasOccupant&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"State",color:d.occupant.statstate,children:d.occupant.stat}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Temperature",color:d.occupant.temperaturestatus,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:d.occupant.bodyTemperature})," K"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Health",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:d.occupant.health/d.occupant.maxHealth,color:d.occupant.health>0?"good":"average",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:d.occupant.health})})}),l.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.label,children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:d.occupant[e.type]/100,children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:d.occupant[e.type]})})},e.id)}))],0)]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Cell",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.Button,{icon:d.isOperating?"power-off":"times",disabled:d.isOpen,onClick:function(){return c("power")},color:d.isOperating&&"green",children:d.isOperating?"On":"Off"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Temperature",children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:d.cellTemperature})," K"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door",children:[(0,o.createComponentVNode)(2,i.Button,{icon:d.isOpen?"unlock":"lock",onClick:function(){return c("door")},content:d.isOpen?"Open":"Closed"}),(0,o.createComponentVNode)(2,i.Button,{icon:d.autoEject?"sign-out-alt":"sign-in-alt",onClick:function(){return c("autoeject")},content:d.autoEject?"Auto":"Manual"})]})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Beaker",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",disabled:!d.isBeakerLoaded,onClick:function(){return c("ejectbeaker")},content:"Eject"}),children:(0,o.createComponentVNode)(2,a.BeakerContents,{beakerLoaded:d.isBeakerLoaded,beakerContents:d.beakerContents})})],4)}},function(e,t,n){"use strict";t.__esModule=!0,t.DecalPainter=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.DecalPainter=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.decal_list||[],u=l.color_list||[],s=l.dir_list||[];return(0,o.createComponentVNode)(2,a.Window,{width:500,height:400,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Decal Type",children:d.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e.name,selected:e.decal===l.decal_style,onClick:function(){return c("select decal",{decals:e.decal})}},e.decal)}))}),(0,o.createComponentVNode)(2,i.Section,{title:"Decal Color",children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:"red"===e.colors?"Red":"white"===e.colors?"White":"Yellow",selected:e.colors===l.decal_color,onClick:function(){return c("select color",{colors:e.colors})}},e.colors)}))}),(0,o.createComponentVNode)(2,i.Section,{title:"Decal Direction",children:s.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:1===e.dirs?"North":2===e.dirs?"South":4===e.dirs?"East":"West",selected:e.dirs===l.decal_direction,onClick:function(){return c("selected direction",{dirs:e.dirs})}},e.dirs)}))})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.DisposalUnit=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.DisposalUnit=function(e,t){var n,c,l=(0,r.useBackend)(t),d=l.act,u=l.data;return u.full_pressure?(n="good",c="Ready"):u.panel_open?(n="bad",c="Power Disabled"):u.pressure_charging?(n="average",c="Pressurizing"):(n="bad",c="Off"),(0,o.createComponentVNode)(2,a.Window,{width:300,height:180,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"State",color:n,children:c}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Pressure",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:u.per,color:"good"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Handle",children:(0,o.createComponentVNode)(2,i.Button,{icon:u.flush?"toggle-on":"toggle-off",disabled:u.isai||u.panel_open,content:u.flush?"Disengage":"Engage",onClick:function(){return d(u.flush?"handle-0":"handle-1")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Eject",children:(0,o.createComponentVNode)(2,i.Button,{icon:"sign-out-alt",disabled:u.isai,content:"Eject Contents",onClick:function(){return d("eject")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",disabled:u.panel_open,selected:u.pressure_charging,onClick:function(){return d(u.pressure_charging?"pump-0":"pump-1")}})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.DnaConsoleCommands=t.DnaConsole=void 0;var o=n(0),r=n(16),i=n(33),a=n(6),c=n(19),l=n(1),d=n(3),u=n(2);var s=["A","T","C","G"],p={A:"green",T:"green",G:"blue",C:"blue",X:"grey"},m={1:"good",2:"bad",4:"average"},f=function(e,t){return e.Alias===t.Alias&&e.AppliedChromo===t.AppliedChromo};t.DnaConsole=function(e,t){var n=(0,l.useBackend)(t),r=n.data,i=(n.act,r.isPulsingRads),a=r.radPulseSeconds,c=r.view.consoleMode;return(0,o.createComponentVNode)(2,u.Window,{title:"DNA Console",width:539,height:710,resizable:!0,children:[!!i&&(0,o.createComponentVNode)(2,d.Dimmer,{fontSize:"14px",textAlign:"center",children:[(0,o.createComponentVNode)(2,d.Icon,{mr:1,name:"spinner",spin:!0}),"Radiation pulse in progress...",(0,o.createComponentVNode)(2,d.Box,{mt:1}),a,"s"]}),(0,o.createComponentVNode)(2,u.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,h),(0,o.createComponentVNode)(2,N),"storage"===c&&(0,o.createComponentVNode)(2,V),"sequencer"===c&&(0,o.createComponentVNode)(2,w),"enzymes"===c&&(0,o.createComponentVNode)(2,I)]})]})};var h=function(e,t){return(0,o.createComponentVNode)(2,d.Section,{title:"DNA Scanner",buttons:(0,o.createComponentVNode)(2,C),children:(0,o.createComponentVNode)(2,b)})},C=function(e,t){var n=(0,l.useBackend)(t),r=n.data,i=n.act,a=r.hasDelayedAction,c=r.isPulsingRads,u=r.isScannerConnected,s=r.isScrambleReady,p=r.isViableSubject,m=r.scannerLocked,f=r.scannerOpen,h=r.scrambleSeconds;return u?(0,o.createFragment)([!!a&&(0,o.createComponentVNode)(2,d.Button,{content:"Cancel Delayed Action",onClick:function(){return i("cancel_delay")}}),!!p&&(0,o.createComponentVNode)(2,d.Button,{disabled:!s||c,onClick:function(){return i("scramble_dna")},children:["Scramble DNA",!s&&" ("+h+"s)"]}),(0,o.createComponentVNode)(2,d.Box,{inline:!0,mr:1}),(0,o.createComponentVNode)(2,d.Button,{icon:m?"lock":"lock-open",color:m&&"bad",disabled:f,content:m?"Locked":"Unlocked",onClick:function(){return i("toggle_lock")}}),(0,o.createComponentVNode)(2,d.Button,{disabled:m,content:f?"Close":"Open",onClick:function(){return i("toggle_door")}})],0):(0,o.createComponentVNode)(2,d.Button,{content:"Connect Scanner",onClick:function(){return i("connect_scanner")}})},g=function(e,t){var n=e.status;return 0===n?(0,o.createComponentVNode)(2,d.Box,{inline:!0,color:"good",children:"Conscious"}):2===n?(0,o.createComponentVNode)(2,d.Box,{inline:!0,color:"average",children:"Unconscious"}):1===n?(0,o.createComponentVNode)(2,d.Box,{inline:!0,color:"average",children:"Critical"}):3===n?(0,o.createComponentVNode)(2,d.Box,{inline:!0,color:"bad",children:"Dead"}):4===n?(0,o.createComponentVNode)(2,d.Box,{inline:!0,color:"bad",children:"Transforming"}):(0,o.createComponentVNode)(2,d.Box,{inline:!0,children:"Unknown"})},b=function(e,t){var n=(0,l.useBackend)(t),r=n.data,i=(n.act,r.subjectName),a=r.isScannerConnected,c=r.isViableSubject,u=r.subjectHealth,s=r.subjectRads,p=r.subjectStatus;return a?c?(0,o.createComponentVNode)(2,d.LabeledList,{children:[(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Status",children:[i,(0,o.createComponentVNode)(2,d.Icon,{mx:1,color:"label",name:"long-arrow-alt-right"}),(0,o.createComponentVNode)(2,g,{status:p})]}),(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Health",children:(0,o.createComponentVNode)(2,d.ProgressBar,{value:u,minValue:0,maxValue:100,ranges:{olive:[101,Infinity],good:[70,101],average:[30,70],bad:[-Infinity,30]},children:[u,"%"]})}),(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Radiation",children:(0,o.createComponentVNode)(2,d.ProgressBar,{value:s,minValue:0,maxValue:100,ranges:{bad:[71,Infinity],average:[30,71],good:[0,30],olive:[-Infinity,0]},children:[s,"%"]})})]}):(0,o.createComponentVNode)(2,d.Box,{color:"average",children:"No viable subject found in DNA Scanner."}):(0,o.createComponentVNode)(2,d.Box,{color:"bad",children:"DNA Scanner is not connected."})},N=function(e,t){var n=(0,l.useBackend)(t),r=n.data,i=n.act,a=r.hasDisk,c=r.isInjectorReady,u=r.injectorSeconds,s=r.view.consoleMode;return(0,o.createComponentVNode)(2,d.Section,{title:"DNA Console",buttons:!c&&(0,o.createComponentVNode)(2,d.Box,{lineHeight:"20px",color:"label",children:["Injector on cooldown (",u,"s)"]}),children:(0,o.createComponentVNode)(2,d.LabeledList,{children:[(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Mode",children:[(0,o.createComponentVNode)(2,d.Button,{content:"Storage",selected:"storage"===s,onClick:function(){return i("set_view",{consoleMode:"storage"})}}),(0,o.createComponentVNode)(2,d.Button,{content:"Sequencer",disabled:!r.isViableSubject,selected:"sequencer"===s,onClick:function(){return i("set_view",{consoleMode:"sequencer"})}}),(0,o.createComponentVNode)(2,d.Button,{content:"Enzymes",selected:"enzymes"===s,onClick:function(){return i("set_view",{consoleMode:"enzymes"})}})]}),!!a&&(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Disk",children:(0,o.createComponentVNode)(2,d.Button,{icon:"eject",content:"Eject",onClick:function(){i("eject_disk"),i("set_view",{storageMode:"console"})}})})]})})};t.DnaConsoleCommands=N;var v=function(e,t){var n=(0,l.useBackend)(t),r=n.data,i=n.act,a=r.hasDisk,c=r.view,u=c.storageMode,s=c.storageConsSubMode,p=c.storageDiskSubMode;return(0,o.createFragment)(["console"===u&&(0,o.createFragment)([(0,o.createComponentVNode)(2,d.Button,{selected:"mutations"===s,content:"Mutations",onClick:function(){return i("set_view",{storageConsSubMode:"mutations"})}}),(0,o.createComponentVNode)(2,d.Button,{selected:"chromosomes"===s,content:"Chromosomes",onClick:function(){return i("set_view",{storageConsSubMode:"chromosomes"})}})],4),"disk"===u&&(0,o.createFragment)([(0,o.createComponentVNode)(2,d.Button,{selected:"mutations"===p,content:"Mutations",onClick:function(){return i("set_view",{storageDiskSubMode:"mutations"})}}),(0,o.createComponentVNode)(2,d.Button,{selected:"diskenzymes"===p,content:"Enzymes",onClick:function(){return i("set_view",{storageDiskSubMode:"diskenzymes"})}})],4),(0,o.createComponentVNode)(2,d.Box,{inline:!0,mr:1}),(0,o.createComponentVNode)(2,d.Button,{content:"Console",selected:"console"===u,onClick:function(){return i("set_view",{storageMode:"console",storageConsSubMode:"mutations"})}}),(0,o.createComponentVNode)(2,d.Button,{content:"Disk",disabled:!a,selected:"disk"===u,onClick:function(){return i("set_view",{storageMode:"disk",storageDiskSubMode:"mutations"})}}),(0,o.createComponentVNode)(2,d.Button,{content:"Adv. Injector",selected:"injector"===u,onClick:function(){return i("set_view",{storageMode:"injector"})}})],0)},V=function(e,t){var n=(0,l.useBackend)(t),r=n.data,i=n.act,a=r.view,c=a.storageMode,u=a.storageConsSubMode,s=a.storageDiskSubMode,p=r.diskMakeupBuffer,m=r.diskHasMakeup,f=r.storage[c];return(0,o.createComponentVNode)(2,d.Section,{title:"Storage",buttons:(0,o.createComponentVNode)(2,v),children:["console"===c&&"mutations"===u&&(0,o.createComponentVNode)(2,y,{mutations:f}),"console"===c&&"chromosomes"===u&&(0,o.createComponentVNode)(2,k),"disk"===c&&"mutations"===s&&(0,o.createComponentVNode)(2,y,{mutations:f}),"disk"===c&&"diskenzymes"===s&&(0,o.createFragment)([(0,o.createComponentVNode)(2,P,{makeup:p}),(0,o.createComponentVNode)(2,d.Button,{icon:"times",color:"red",disabled:!m,content:"Delete",onClick:function(){return i("del_makeup_disk")}})],4),"injector"===c&&(0,o.createComponentVNode)(2,O)]})},y=function(e,t){var n=e.customMode,r=void 0===n?"":n,i=(0,l.useBackend)(t),a=i.data,u=i.act,s=e.mutations||[],p=a.view.storageMode+r,m=a.view["storage"+p+"MutationRef"],f=s.find((function(e){return e.ByondRef===m}));return!f&&s.length>0&&(f=s[0],m=f.ByondRef),(0,o.createComponentVNode)(2,d.Flex,{children:[(0,o.createComponentVNode)(2,d.Flex.Item,{width:"140px",children:(0,o.createComponentVNode)(2,d.Section,{title:(0,c.capitalize)(a.view.storageMode)+" Storage",level:2,children:s.map((function(e){return(0,o.createComponentVNode)(2,d.Button,{fluid:!0,ellipsis:!0,color:"transparent",selected:e.ByondRef===m,content:e.Name,onClick:function(){var t;return u("set_view",((t={})["storage"+p+"MutationRef"]=e.ByondRef,t))}},e.ByondRef)}))})}),(0,o.createComponentVNode)(2,d.Flex.Item,{children:(0,o.createComponentVNode)(2,d.Divider,{vertical:!0})}),(0,o.createComponentVNode)(2,d.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,d.Section,{title:"Mutation Info",level:2,children:(0,o.createComponentVNode)(2,x,{mutation:f})})})]})},k=function(e,t){var n,i=(0,l.useBackend)(t),a=i.data,c=i.act,u=null!=(n=a.chromoStorage)?n:[],s=(0,r.uniqBy)((function(e){return e.Name}))(u),p=a.view.storageChromoName,m=u.find((function(e){return e.Name===p}));return(0,o.createComponentVNode)(2,d.Flex,{children:[(0,o.createComponentVNode)(2,d.Flex.Item,{width:"140px",children:(0,o.createComponentVNode)(2,d.Section,{title:"Console Storage",level:2,children:s.map((function(e){return(0,o.createComponentVNode)(2,d.Button,{fluid:!0,ellipsis:!0,color:"transparent",selected:e.Name===p,content:e.Name,onClick:function(){return c("set_view",{storageChromoName:e.Name})}},e.Index)}))})}),(0,o.createComponentVNode)(2,d.Flex.Item,{children:(0,o.createComponentVNode)(2,d.Divider,{vertical:!0})}),(0,o.createComponentVNode)(2,d.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,d.Section,{title:"Chromosome Info",level:2,children:!m&&(0,o.createComponentVNode)(2,d.Box,{color:"label",children:"Nothing to show."})||(0,o.createFragment)([(0,o.createComponentVNode)(2,d.LabeledList,{children:[(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Name",children:m.Name}),(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Description",children:m.Description}),(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Amount",children:u.filter((function(e){return e.Name===m.Name})).length})]}),(0,o.createComponentVNode)(2,d.Button,{mt:2,icon:"eject",content:"Eject Chromosome",onClick:function(){return c("eject_chromo",{chromo:m.Name})}})],4)})})]})},x=function(e,t){var n,a,c,u=e.mutation,s=(0,l.useBackend)(t),p=s.data,h=s.act,C=p.diskCapacity,g=p.diskReadOnly,b=p.hasDisk,N=p.isInjectorReady,v=null!=(n=p.storage.disk)?n:[],V=null!=(a=p.storage.console)?a:[],y=null!=(c=p.storage.injector)?c:[];if(!u)return(0,o.createComponentVNode)(2,d.Box,{color:"label",children:"Nothing to show."});if("occupant"===u.Source&&!u.Discovered)return(0,o.createComponentVNode)(2,d.LabeledList,{children:(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Name",children:u.Alias})});var k=V.find((function(e){return f(e,u)})),x=v.find((function(e){return f(e,u)})),w=(0,i.flow)([(0,r.uniqBy)((function(e){return e.Name})),(0,r.filter)((function(e){return e.Name!==u.Name}))])([].concat(v,V));return(0,o.createFragment)([(0,o.createComponentVNode)(2,d.LabeledList,{children:[(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Name",children:(0,o.createComponentVNode)(2,d.Box,{inline:!0,color:m[u.Quality],children:u.Name})}),(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Description",children:u.Description}),(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Instability",children:u.Instability})]}),(0,o.createComponentVNode)(2,d.Divider),(0,o.createComponentVNode)(2,d.Box,{children:["disk"===u.Source&&(0,o.createComponentVNode)(2,F,{disabled:!b||C<=0||g,mutations:w,source:u}),"console"===u.Source&&(0,o.createComponentVNode)(2,F,{mutations:w,source:u}),["occupant","disk","console"].includes(u.Source)&&(0,o.createFragment)([(0,o.createComponentVNode)(2,d.Dropdown,{width:"240px",options:y.map((function(e){return e.name})),disabled:0===y.length||!u.Active,selected:"Add to advanced injector",onSelected:function(e){return h("add_advinj_mut",{mutref:u.ByondRef,advinj:e,source:u.Source})}}),(0,o.createComponentVNode)(2,d.Button,{icon:"syringe",disabled:!N||!u.Active,content:"Print Activator",onClick:function(){return h("print_injector",{mutref:u.ByondRef,is_activator:1,source:u.Source})}}),(0,o.createComponentVNode)(2,d.Button,{icon:"syringe",disabled:!N||!u.Active,content:"Print Mutator",onClick:function(){return h("print_injector",{mutref:u.ByondRef,is_activator:0,source:u.Source})}})],4)]}),["disk","occupant"].includes(u.Source)&&(0,o.createComponentVNode)(2,d.Button,{icon:"save",disabled:k||!u.Active,content:"Save to Console",onClick:function(){return h("save_console",{mutref:u.ByondRef,source:u.Source})}}),["console","occupant"].includes(u.Source)&&(0,o.createComponentVNode)(2,d.Button,{icon:"save",disabled:x||!b||C<=0||g||!u.Active,content:"Save to Disk",onClick:function(){return h("save_disk",{mutref:u.ByondRef,source:u.Source})}}),["console","disk","injector"].includes(u.Source)&&(0,o.createComponentVNode)(2,d.Button,{icon:"times",color:"red",content:"Delete from "+u.Source,onClick:function(){return h("delete_"+u.Source+"_mut",{mutref:u.ByondRef})}}),(2===u.Class||!!u.Scrambled&&"occupant"===u.Source)&&(0,o.createComponentVNode)(2,d.Button,{content:"Nullify",onClick:function(){return h("nullify",{mutref:u.ByondRef})}}),(0,o.createComponentVNode)(2,d.Divider),(0,o.createComponentVNode)(2,_,{disabled:"occupant"!==u.Source,mutation:u})],0)},_=function(e,t){var n=e.mutation,r=e.disabled,i=(0,l.useBackend)(t),a=(i.data,i.act);return 0===n.CanChromo?(0,o.createComponentVNode)(2,d.Box,{color:"label",children:"No compatible chromosomes"}):1===n.CanChromo?r?(0,o.createComponentVNode)(2,d.Box,{color:"label",children:"No chromosome applied."}):(0,o.createFragment)([(0,o.createComponentVNode)(2,d.Dropdown,{width:"240px",options:n.ValidStoredChromos,disabled:0===n.ValidStoredChromos.length,selected:0===n.ValidStoredChromos.length?"No Suitable Chromosomes":"Select a chromosome",onSelected:function(e){return a("apply_chromo",{chromo:e,mutref:n.ByondRef})}}),(0,o.createComponentVNode)(2,d.Box,{color:"label",mt:1,children:["Compatible with: ",n.ValidChromos]})],4):2===n.CanChromo?(0,o.createComponentVNode)(2,d.Box,{color:"label",children:["Applied chromosome: ",n.AppliedChromo]}):null},w=function(e,t){var n,r,i=(0,l.useBackend)(t),a=i.data,c=i.act,u=null!=(n=null==(r=a.storage)?void 0:r.occupant)?n:[],s=a.isJokerReady,p=a.isMonkey,m=a.jokerSeconds,f=a.subjectStatus,h=a.view,C=h.sequencerMutation,g=h.jokerActive,b=u.find((function(e){return e.Alias===C}));return(0,o.createFragment)([(0,o.createComponentVNode)(2,d.Flex,{spacing:1,mb:1,children:[(0,o.createComponentVNode)(2,d.Flex.Item,{width:u.length<=8?"154px":"174px",children:(0,o.createComponentVNode)(2,d.Section,{title:"Sequences",height:"214px",overflowY:u.length>8&&"scroll",children:u.map((function(e){return(0,o.createComponentVNode)(2,B,{url:e.Image,selected:e.Alias===C,onClick:function(){c("set_view",{sequencerMutation:e.Alias}),c("check_discovery",{alias:e.Alias})}},e.Alias)}))})}),(0,o.createComponentVNode)(2,d.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,d.Section,{title:"Sequence Info",minHeight:"100%",children:(0,o.createComponentVNode)(2,x,{mutation:b})})})]}),3===f&&(0,o.createComponentVNode)(2,d.Section,{color:"bad",children:"Genetic sequence corrupted. Subject diagnostic report: DECEASED."})||p&&"Monkified"!==(null==b?void 0:b.Name)&&(0,o.createComponentVNode)(2,d.Section,{color:"bad",children:"Genetic sequence corrupted. Subject diagnostic report: MONKEY."})||4===f&&(0,o.createComponentVNode)(2,d.Section,{color:"bad",children:"Genetic sequence corrupted. Subject diagnostic report: TRANSFORMING."})||(0,o.createComponentVNode)(2,d.Section,{title:"Genome Sequencer\u2122",buttons:!s&&(0,o.createComponentVNode)(2,d.Box,{lineHeight:"20px",color:"label",children:["Joker on cooldown (",m,"s)"]})||g&&(0,o.createFragment)([(0,o.createComponentVNode)(2,d.Box,{mr:1,inline:!0,color:"label",children:"Click on a gene to reveal it."}),(0,o.createComponentVNode)(2,d.Button,{content:"Cancel Joker",onClick:function(){return c("set_view",{jokerActive:""})}})],4)||(0,o.createComponentVNode)(2,d.Button,{icon:"crown",color:"purple",content:"Use Joker",onClick:function(){return c("set_view",{jokerActive:"1"})}}),children:(0,o.createComponentVNode)(2,L,{mutation:b})})],0)},B=function(e,t){var n,r=e.url,i=e.selected,a=e.onClick;return i&&(n="2px solid #22aa00"),(0,o.createComponentVNode)(2,d.Box,{as:"img",src:r,style:{width:"64px",margin:"2px","margin-left":"4px",outline:n},onClick:a})},S=function(e,t){var n=e.gene,r=e.onChange,i=e.disabled,a=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}(e,["gene","onChange","disabled"]),c=s.length,l=s.indexOf(n),u=i&&p.X||p[n];return(0,o.normalizeProps)((0,o.createComponentVNode)(2,d.Button,Object.assign({},a,{color:u,onClick:function(e){if(e.preventDefault(),r)if(-1!==l){var t=s[(l+1)%c];r(e,t)}else r(e,s[0])},oncontextmenu:function(e){if(e.preventDefault(),r)if(-1!==l){var t=s[(l-1+c)%c];r(e,t)}else r(e,s[c-1])},children:n})))},L=function(e,t){var n=e.mutation,r=(0,l.useBackend)(t),i=r.data,c=r.act,u=i.view.jokerActive;if(!n)return(0,o.createComponentVNode)(2,d.Box,{color:"average",children:"No genome selected for sequencing."});if(n.Scrambled)return(0,o.createComponentVNode)(2,d.Box,{color:"average",children:"Sequence unreadable due to unpredictable mutation."});for(var s=n.Sequence,p=n.DefaultSeq,m=[],f=function(e){var t=s.charAt(e),r=(0,o.createComponentVNode)(2,S,{width:"22px",textAlign:"center",disabled:!!n.Scrambled||1!==n.Class,className:"X"===(null==p?void 0:p.charAt(e))&&!n.Active&&(0,a.classes)(["outline-solid","outline-color-orange"]),gene:t,onChange:function(t,o){if(!t.ctrlKey)return u?(c("pulse_gene",{pos:e+1,gene:"J",alias:n.Alias}),void c("set_view",{jokerActive:""})):void c("pulse_gene",{pos:e+1,gene:o,alias:n.Alias});c("pulse_gene",{pos:e+1,gene:"X",alias:n.Alias})}});m.push(r)},h=0;h=3){var r=(0,o.createComponentVNode)(2,d.Box,{inline:!0,width:"22px",mx:"1px",children:s});u.push(r),s=[]}},m=0;m=c,onCommit:function(e,t){return i("new_adv_inj",{name:t})}})})]})},F=function(e,t){var n=e.mutations,r=void 0===n?[]:n,i=e.source,a=(0,l.useBackend)(t),c=a.act;a.data;return(0,o.createComponentVNode)(2,d.Dropdown,{width:"240px",options:r.map((function(e){return e.Name})),disabled:0===r.length,selected:"Combine mutations",onSelected:function(e){return c("combine_"+i.Source,{firstref:(t=e,null==(n=r.find((function(e){return e.Name===t})))?void 0:n.ByondRef),secondref:i.ByondRef});var t,n}},i.ByondRef)}},function(e,t,n){"use strict";t.__esModule=!0,t.DnaVault=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.DnaVault=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.completed,u=l.used,s=l.choiceA,p=l.choiceB,m=l.dna,f=l.dna_max,h=l.plants,C=l.plants_max,g=l.animals,b=l.animals_max;return(0,o.createComponentVNode)(2,a.Window,{width:350,height:400,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"DNA Vault Database",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Human DNA",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:m/f,children:m+" / "+f+" Samples"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Plant DNA",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:h/C,children:h+" / "+C+" Samples"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Animal DNA",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:g/g,children:g+" / "+b+" Samples"})})]})}),!(!d||u)&&(0,o.createComponentVNode)(2,i.Section,{title:"Personal Gene Therapy",children:[(0,o.createComponentVNode)(2,i.Box,{bold:!0,textAlign:"center",mb:1,children:"Applicable Gene Therapy Treatments"}),(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,bold:!0,content:s,textAlign:"center",onClick:function(){return c("gene",{choice:s})}})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,bold:!0,content:p,textAlign:"center",onClick:function(){return c("gene",{choice:p})}})})]})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.EightBallVote=void 0;var o=n(0),r=n(1),i=n(3),a=n(19),c=n(2);t.EightBallVote=function(e,t){var n=(0,r.useBackend)(t),a=(n.act,n.data.shaking);return(0,o.createComponentVNode)(2,c.Window,{width:400,height:600,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:!a&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No question is currently being asked."})||(0,o.createComponentVNode)(2,l)})})};var l=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.question,u=l.answers,s=void 0===u?[]:u;return(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.Box,{bold:!0,textAlign:"center",fontSize:"16px",m:1,children:['"',d,'"']}),(0,o.createComponentVNode)(2,i.Grid,{children:s.map((function(e){return(0,o.createComponentVNode)(2,i.Grid.Column,{children:[(0,o.createComponentVNode)(2,i.Button,{fluid:!0,bold:!0,content:(0,a.toTitleCase)(e.answer),selected:e.selected,fontSize:"16px",lineHeight:"24px",textAlign:"center",mb:1,onClick:function(){return c("vote",{answer:e.answer})}}),(0,o.createComponentVNode)(2,i.Box,{bold:!0,textAlign:"center",fontSize:"30px",children:e.amount})]},e.answer)}))})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.Electrolyzer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Electrolyzer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:305,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Power",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject Cell",disabled:!l.hasPowercell||!l.open,onClick:function(){return c("eject")}}),(0,o.createComponentVNode)(2,i.Button,{icon:l.on?"power-off":"times",content:l.on?"On":"Off",selected:l.on,disabled:!l.hasPowercell,onClick:function(){return c("power")}})],4),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cell",color:!l.hasPowercell&&"bad",children:l.hasPowercell&&(0,o.createComponentVNode)(2,i.ProgressBar,{value:l.powerLevel/100,content:l.powerLevel+"%",ranges:{good:[.6,Infinity],average:[.3,.6],bad:[-Infinity,.3]}})||"None"})})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Electropack=void 0;var o=n(0),r=n(15),i=n(1),a=n(3),c=n(2);t.Electropack=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.power,s=d.code,p=d.frequency,m=d.minFrequency,f=d.maxFrequency;return(0,o.createComponentVNode)(2,c.Window,{width:260,height:137,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,a.Button,{icon:u?"power-off":"times",content:u?"On":"Off",selected:u,onClick:function(){return l("power")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Frequency",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"sync",content:"Reset",onClick:function(){return l("reset",{reset:"freq"})}}),children:(0,o.createComponentVNode)(2,a.NumberInput,{animate:!0,unit:"kHz",step:.2,stepPixelSize:6,minValue:m/10,maxValue:f/10,value:p/10,format:function(e){return(0,r.toFixed)(e,1)},width:"80px",onDrag:function(e,t){return l("freq",{freq:t})}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Code",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"sync",content:"Reset",onClick:function(){return l("reset",{reset:"code"})}}),children:(0,o.createComponentVNode)(2,a.NumberInput,{animate:!0,step:1,stepPixelSize:6,minValue:1,maxValue:100,value:s,width:"80px",onDrag:function(e,t){return l("code",{code:t})}})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.EmergencyShuttleConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.EmergencyShuttleConsole=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.timer_str,u=l.enabled,s=l.emagged,p=l.engines_started,m=l.authorizations_remaining,f=l.authorizations,h=void 0===f?[]:f;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:350,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.Box,{bold:!0,fontSize:"40px",textAlign:"center",fontFamily:"monospace",children:d}),(0,o.createComponentVNode)(2,i.Box,{textAlign:"center",fontSize:"16px",mb:1,children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,children:"ENGINES:"}),(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:p?"good":"average",ml:1,children:p?"Online":"Idle"})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Early Launch Authorization",level:2,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"times",content:"Repeal All",color:"bad",disabled:!u,onClick:function(){return c("abort")}}),children:[(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"exclamation-triangle",color:"good",content:"AUTHORIZE",disabled:!u,onClick:function(){return c("authorize")}})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"minus",content:"REPEAL",disabled:!u,onClick:function(){return c("repeal")}})})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Authorizations",level:3,minHeight:"150px",buttons:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,color:s?"bad":"good",children:s?"ERROR":"Remaining: "+m}),children:h.length>0?h.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{bold:!0,fontSize:"16px",className:"candystripe",children:[e.name," (",e.job,")"]},e.name)})):(0,o.createComponentVNode)(2,i.Box,{bold:!0,textAlign:"center",fontSize:"16px",color:"average",children:"No Active Authorizations"})})]})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.EngravedMessage=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(2);t.EngravedMessage=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.admin_mode,s=d.creator_key,p=d.creator_name,m=d.has_liked,f=d.has_disliked,h=d.hidden_message,C=d.is_creator,g=d.num_likes,b=d.num_dislikes,N=d.realdate;return(0,o.createComponentVNode)(2,c.Window,{width:600,height:300,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Box,{bold:!0,textAlign:"center",fontSize:"20px",mb:2,children:(0,r.decodeHtmlEntities)(h)}),(0,o.createComponentVNode)(2,a.Grid,{children:[(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,icon:"arrow-up",content:" "+g,disabled:C,selected:m,textAlign:"center",fontSize:"16px",lineHeight:"24px",onClick:function(){return l("like")}})}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,icon:"circle",disabled:C,selected:!f&&!m,textAlign:"center",fontSize:"16px",lineHeight:"24px",onClick:function(){return l("neutral")}})}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,icon:"arrow-down",content:" "+b,disabled:C,selected:f,textAlign:"center",fontSize:"16px",lineHeight:"24px",onClick:function(){return l("dislike")}})})]})]}),(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Created On",children:N})})}),(0,o.createComponentVNode)(2,a.Section),!!u&&(0,o.createComponentVNode)(2,a.Section,{title:"Admin Panel",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"times",content:"Delete",color:"bad",onClick:function(){return l("delete")}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Creator Ckey",children:s}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Creator Character Name",children:p})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ExosuitControlConsole=void 0;var o=n(0),r=n(15),i=n(1),a=n(3),c=n(2);t.ExosuitControlConsole=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data.mechs,u=void 0===d?[]:d;return(0,o.createComponentVNode)(2,c.Window,{width:500,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[0===u.length&&(0,o.createComponentVNode)(2,a.NoticeBox,{children:"No exosuits detected"}),u.map((function(e){return(0,o.createComponentVNode)(2,a.Section,{title:e.name,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"envelope",content:"Send Message",disabled:!e.pilot,onClick:function(){return l("send_message",{tracker_ref:e.tracker_ref})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"wifi",content:e.emp_recharging?"Recharging...":"EMP Burst",color:"bad",disabled:e.emp_recharging,onClick:function(){return l("shock",{tracker_ref:e.tracker_ref})}})],4),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Integrity",children:(0,o.createComponentVNode)(2,a.Box,{color:(e.integrity<=30?"bad":e.integrity<=70&&"average")||"good",children:[e.integrity,"%"]})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Charge",children:(0,o.createComponentVNode)(2,a.Box,{color:(e.charge<=30?"bad":e.charge<=70&&"average")||"good",children:"number"==typeof e.charge&&e.charge+"%"||"Not Found"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Airtank",children:"number"==typeof e.airtank&&(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:e.airtank,format:function(e){return(0,r.toFixed)(e,2)+" kPa"}})||"Not Equipped"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pilot",children:e.pilot||"None"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Location",children:e.location||"Unknown"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Active Equipment",children:e.active_equipment||"None"}),e.cargo_space>=0&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Used Cargo Space",children:(0,o.createComponentVNode)(2,a.Box,{color:(e.cargo_space<=30?"good":e.cargo_space<=70&&"average")||"bad",children:[e.cargo_space,"%"]})})]})},e.tracker_ref)}))]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ExosuitFabricator=void 0;var o,r=n(0),i=n(6),a=n(16),c=n(1),l=n(40),d=n(3),u=n(2),s=n(19);function p(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return m(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return m(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);nn?{color:2,deficit:e-n}:t>n?{color:1,deficit:e}:e+t>n?{color:1,deficit:e+t-n}:{color:0,deficit:0}},g=function(e,t,n){var o={textColor:0};return Object.keys(n.cost).forEach((function(r){o[r]=C(n.cost[r],t[r],e[r]),o[r].color>o.textColor&&(o.textColor=o[r].color)})),o};t.ExosuitFabricator=function(e,t){var n,o,i=(0,c.useBackend)(t),a=i.act,l=i.data,s=l.queue||[],p=(n=l.materials||[],o={},n.forEach((function(e){o[e.name]=e.amount})),o),m=function(e,t){var n={},o={},r={},i={};return t.forEach((function(t,a){i[a]=0,Object.keys(t.cost).forEach((function(c){n[c]=n[c]||0,r[c]=r[c]||0,o[c]=C(t.cost[c],n[c],e[c]),0!==o[c].color?i[a]1&&l=0&&p+"s"||"Dispensing..."})]})})})}}},function(e,t,n){"use strict";t.__esModule=!0,t.ForbiddenLore=void 0;var o=n(0),r=n(16),i=n(33),a=n(1),c=n(3),l=n(2);t.ForbiddenLore=function(e,t){var n=(0,a.useBackend)(t),d=n.act,u=n.data,s=u.charges,p=(0,i.flow)([(0,r.sortBy)((function(e){return"Research"!==e.state}),(function(e){return"Side"===e.path}))])(u.to_know||[]);return(0,o.createComponentVNode)(2,l.Window,{width:500,height:900,resizable:!0,children:(0,o.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c.Section,{title:"Research Eldritch Knowledge",children:["Charges left : ",s,null!==p?p.map((function(e){return(0,o.createComponentVNode)(2,c.Section,{title:e.name,level:2,children:[(0,o.createComponentVNode)(2,c.Box,{bold:!0,my:1,children:[e.path," path"]}),(0,o.createComponentVNode)(2,c.Box,{my:1,children:[(0,o.createComponentVNode)(2,c.Button,{content:e.state,disabled:e.disabled,onClick:function(){return d("research",{name:e.name,cost:e.cost})}})," ","Cost : ",e.cost]}),(0,o.createComponentVNode)(2,c.Box,{italic:!0,my:1,children:e.flavour}),(0,o.createComponentVNode)(2,c.Box,{my:1,children:e.desc})]},e.name)})):(0,o.createComponentVNode)(2,c.Box,{children:"No more knowledge can be found"})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Gateway=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Gateway=function(){return(0,o.createComponentVNode)(2,a.Window,{resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.gateway_present,d=void 0!==l&&l,u=c.gateway_status,s=void 0!==u&&u,p=c.current_target,m=void 0===p?null:p,f=c.destinations,h=void 0===f?[]:f;return d?m?(0,o.createComponentVNode)(2,i.Section,{title:m.name,children:[(0,o.createComponentVNode)(2,i.Icon,{name:"rainbow",size:4,color:"green"}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,onClick:function(){return a("deactivate")},children:"Deactivate"})]}):h.length?(0,o.createFragment)([!s&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Gateway Unpowered"}),h.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name,children:e.availible&&(0,o.createComponentVNode)(2,i.Button,{fluid:!0,onClick:function(){return a("activate",{destination:e.ref})},children:"Activate"})||(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{m:1,textColor:"bad",children:e.reason}),!!e.timeout&&(0,o.createComponentVNode)(2,i.ProgressBar,{value:e.timeout,children:"Calibrating..."})],0)},e.ref)}))],0):(0,o.createComponentVNode)(2,i.Section,{children:"No gateway nodes detected."}):(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No linked gateway"}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,onClick:function(){return a("linkup")},children:"Linkup"})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.GlandDispenser=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.GlandDispenser=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data.glands,d=void 0===l?[]:l;return(0,o.createComponentVNode)(2,a.Window,{width:300,height:338,theme:"abductor",children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:d.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{width:"60px",height:"60px",m:.75,textAlign:"center",lineHeight:"55px",icon:"eject",backgroundColor:e.color,content:e.amount||"0",disabled:!e.amount,onClick:function(){return c("dispense",{gland_id:e.id})}},e.id)}))})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Gps=void 0;var o=n(0),r=n(16),i=n(33),a=n(15),c=n(119),l=n(1),d=n(3),u=n(2),s=function(e){return(0,r.map)(parseFloat)(e.split(", "))};t.Gps=function(e,t){var n=(0,l.useBackend)(t),p=n.act,m=n.data,f=m.currentArea,h=m.currentCoords,C=m.globalmode,g=m.power,b=m.tag,N=m.updating,v=(0,i.flow)([(0,r.map)((function(e,t){var n=e.dist&&Math.round((0,c.vecLength)((0,c.vecSubtract)(s(h),s(e.coords))));return Object.assign({},e,{dist:n,index:t})})),(0,r.sortBy)((function(e){return e.dist===undefined}),(function(e){return e.entrytag}))])(m.signals||[]);return(0,o.createComponentVNode)(2,u.Window,{title:"Global Positioning System",width:470,height:700,resizable:!0,children:(0,o.createComponentVNode)(2,u.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,d.Section,{title:"Control",buttons:(0,o.createComponentVNode)(2,d.Button,{icon:"power-off",content:g?"On":"Off",selected:g,onClick:function(){return p("power")}}),children:(0,o.createComponentVNode)(2,d.LabeledList,{children:[(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Tag",children:(0,o.createComponentVNode)(2,d.Button,{icon:"pencil-alt",content:b,onClick:function(){return p("rename")}})}),(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Scan Mode",children:(0,o.createComponentVNode)(2,d.Button,{icon:N?"unlock":"lock",content:N?"AUTO":"MANUAL",color:!N&&"bad",onClick:function(){return p("updating")}})}),(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Range",children:(0,o.createComponentVNode)(2,d.Button,{icon:"sync",content:C?"MAXIMUM":"LOCAL",selected:!C,onClick:function(){return p("globalmode")}})})]})}),!!g&&(0,o.createFragment)([(0,o.createComponentVNode)(2,d.Section,{title:"Current Location",children:(0,o.createComponentVNode)(2,d.Box,{fontSize:"18px",children:[f," (",h,")"]})}),(0,o.createComponentVNode)(2,d.Section,{title:"Detected Signals",children:(0,o.createComponentVNode)(2,d.Table,{children:[(0,o.createComponentVNode)(2,d.Table.Row,{bold:!0,children:[(0,o.createComponentVNode)(2,d.Table.Cell,{content:"Name"}),(0,o.createComponentVNode)(2,d.Table.Cell,{collapsing:!0,content:"Direction"}),(0,o.createComponentVNode)(2,d.Table.Cell,{collapsing:!0,content:"Coordinates"})]}),v.map((function(e){return(0,o.createComponentVNode)(2,d.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,d.Table.Cell,{bold:!0,color:"label",children:e.entrytag}),(0,o.createComponentVNode)(2,d.Table.Cell,{collapsing:!0,opacity:e.dist!==undefined&&(0,a.clamp)(1.2/Math.log(Math.E+e.dist/20),.4,1),children:[e.degrees!==undefined&&(0,o.createComponentVNode)(2,d.Icon,{mr:1,size:1.2,name:"arrow-up",rotation:e.degrees}),e.dist!==undefined&&e.dist+"m"]}),(0,o.createComponentVNode)(2,d.Table.Cell,{collapsing:!0,children:e.coords})]},e.entrytag+e.coords+e.index)}))]})})],4)]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.GravityGenerator=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.GravityGenerator=function(e,t){var n=(0,r.useBackend)(t),l=(n.act,n.data),d=l.charging_state,u=l.operational;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:165,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[!u&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No data available"}),!!u&&0!==d&&(0,o.createComponentVNode)(2,i.NoticeBox,{danger:!0,children:"WARNING - Radiation detected"}),!!u&&0===d&&(0,o.createComponentVNode)(2,i.NoticeBox,{success:!0,children:"No radiation detected"}),!!u&&(0,o.createComponentVNode)(2,c)]})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.breaker,d=c.charge_count,u=c.charging_state,s=c.on,p=c.operational;return(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.Button,{icon:l?"power-off":"times",content:l?"On":"Off",selected:l,disabled:!p,onClick:function(){return a("gentoggle")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Gravity Charge",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:d/100,ranges:{good:[.7,Infinity],average:[.3,.7],bad:[-Infinity,.3]}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Charge Mode",children:[0===u&&(s&&(0,o.createComponentVNode)(2,i.Box,{color:"good",children:"Fully Charged"})||(0,o.createComponentVNode)(2,i.Box,{color:"bad",children:"Not Charging"})),1===u&&(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"Charging"}),2===u&&(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"Discharging"})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.GulagItemReclaimer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.GulagItemReclaimer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.mobs,u=void 0===d?[]:d;return(0,o.createComponentVNode)(2,a.Window,{width:325,height:400,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[0===u.length&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No stored items"}),u.length>0&&(0,o.createComponentVNode)(2,i.Section,{title:"Stored Items",children:(0,o.createComponentVNode)(2,i.Table,{children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:e.name}),(0,o.createComponentVNode)(2,i.Table.Cell,{textAlign:"right",children:(0,o.createComponentVNode)(2,i.Button,{content:"Retrieve Items",disabled:!l.can_reclaim,onClick:function(){return c("release_items",{mobref:e.mob})}})})]},e.mob)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.GulagTeleporterConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.GulagTeleporterConsole=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.teleporter,u=l.teleporter_lock,s=l.teleporter_state_open,p=l.teleporter_location,m=l.beacon,f=l.beacon_location,h=l.id,C=l.id_name,g=l.can_teleport,b=l.goal,N=void 0===b?0:b,v=l.prisoner,V=void 0===v?{}:v;return(0,o.createComponentVNode)(2,a.Window,{width:350,height:295,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Teleporter Console",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{content:s?"Open":"Closed",disabled:u,selected:s,onClick:function(){return c("toggle_open")}}),(0,o.createComponentVNode)(2,i.Button,{icon:u?"lock":"unlock",content:u?"Locked":"Unlocked",selected:u,disabled:s,onClick:function(){return c("teleporter_lock")}})],4),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Teleporter Unit",color:d?"good":"bad",buttons:!d&&(0,o.createComponentVNode)(2,i.Button,{content:"Reconnect",onClick:function(){return c("scan_teleporter")}}),children:d?p:"Not Connected"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Receiver Beacon",color:m?"good":"bad",buttons:!m&&(0,o.createComponentVNode)(2,i.Button,{content:"Reconnect",onClick:function(){return c("scan_beacon")}}),children:m?f:"Not Connected"})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Prisoner Details",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Prisoner ID",children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:h?C:"No ID",onClick:function(){return c("handle_id")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Point Goal",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:N,width:"48px",minValue:1,maxValue:1e3,onChange:function(e,t){return c("set_goal",{value:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Occupant",children:V.name||"No Occupant"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Criminal Status",children:V.crimstat||"No Status"})]})}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Process Prisoner",disabled:!g,textAlign:"center",color:"bad",onClick:function(){return c("teleport")}})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Holodeck=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Holodeck=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.can_toggle_safety,u=l.default_programs,s=void 0===u?[]:u,p=l.emag_programs,m=void 0===p?[]:p,f=l.emagged,h=l.program;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Default Programs",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:f?"unlock":"lock",content:"Safeties",color:"bad",disabled:!d,selected:!f,onClick:function(){return c("safety")}}),children:s.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:e.name.substring(11),textAlign:"center",selected:e.type===h,onClick:function(){return c("load_program",{type:e.type})}},e.type)}))}),!!f&&(0,o.createComponentVNode)(2,i.Section,{title:"Dangerous Programs",children:m.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:e.name.substring(11),color:"bad",textAlign:"center",selected:e.type===h,onClick:function(){return c("load_program",{type:e.type})}},e.type)}))})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Holopad=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Holopad=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data.calling;return(0,o.createComponentVNode)(2,a.Window,{width:440,height:245,resizable:!0,children:[!!d&&(0,o.createComponentVNode)(2,i.Modal,{fontSize:"36px",fontFamily:"monospace",children:[(0,o.createComponentVNode)(2,i.Flex,{align:"center",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{mr:2,mt:2,children:(0,o.createComponentVNode)(2,i.Icon,{name:"phone-alt",rotation:25})}),(0,o.createComponentVNode)(2,i.Flex.Item,{mr:2,children:"Dialing..."})]}),(0,o.createComponentVNode)(2,i.Box,{mt:2,textAlign:"center",fontSize:"24px",children:(0,o.createComponentVNode)(2,i.Button,{lineHeight:"40px",icon:"times",content:"Hang Up",color:"bad",onClick:function(){return l("hang_up")}})})]}),(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})]})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.on_network,d=c.on_cooldown,u=c.allowed,s=c.disk,p=c.disk_record,m=c.replay_mode,f=c.loop_mode,h=c.record_mode,C=c.holo_calls,g=void 0===C?[]:C;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Holopad",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"bell",content:d?"AI Presence Requested":"Request AI Presence",disabled:!l||d,onClick:function(){return a("AIrequest")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Communicator",children:(0,o.createComponentVNode)(2,i.Button,{icon:"phone-alt",content:u?"Connect To Holopad":"Call Holopad",disabled:!l,onClick:function(){return a("holocall",{headcall:u})}})}),g.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.connected?"Current Call":"Incoming Call",children:(0,o.createComponentVNode)(2,i.Button,{icon:e.connected?"phone-slash":"phone-alt",content:e.connected?"Disconnect call from "+e.caller:"Answer call from "+e.caller,color:e.connected?"bad":"good",disabled:!l,onClick:function(){return a(e.connected?"disconnectcall":"connectcall",{holopad:e.ref})}})},e.ref)}))]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Holodisk",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",disabled:!s||m||h,onClick:function(){return a("disk_eject")}}),children:!s&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No holodisk"})||(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Disk Player",children:[(0,o.createComponentVNode)(2,i.Button,{icon:m?"pause":"play",content:m?"Stop":"Replay",selected:m,disabled:h||!p,onClick:function(){return a("replay_mode")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:f?"Looping":"Loop",selected:f,disabled:h||!p,onClick:function(){return a("loop_mode")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"exchange-alt",content:"Change Offset",disabled:!m,onClick:function(){return a("offset")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Recorder",children:[(0,o.createComponentVNode)(2,i.Button,{icon:h?"pause":"video",content:h?"End Recording":"Record",selected:h,disabled:p&&!h||m,onClick:function(){return a("record_mode")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"trash",content:"Clear Recording",color:"bad",disabled:!p||m||h,onClick:function(){return a("record_clear")}})]})]})})],4)}},function(e,t,n){"use strict";t.__esModule=!0,t.HypnoChair=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.HypnoChair=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:375,height:480,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Information",backgroundColor:"#450F44",children:"The Enhanced Interrogation Chamber is designed to induce a deep-rooted trance trigger into the subject. Once the procedure is complete, by using the implanted trigger phrase, the authorities are able to ensure immediate and complete obedience and truthfulness."}),(0,o.createComponentVNode)(2,i.Section,{title:"Occupant Information",textAlign:"center",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",children:l.occupant.name?l.occupant.name:"No Occupant"}),!!l.occupied&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",color:0===l.occupant.stat?"good":1===l.occupant.stat?"average":"bad",children:0===l.occupant.stat?"Conscious":1===l.occupant.stat?"Unconcious":"Dead"})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Operations",textAlign:"center",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door",children:(0,o.createComponentVNode)(2,i.Button,{icon:l.open?"unlock":"lock",color:l.open?"default":"red",content:l.open?"Open":"Closed",onClick:function(){return c("door")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Phrase",children:(0,o.createComponentVNode)(2,i.Input,{value:l.trigger,onChange:function(e,t){return c("set_phrase",{phrase:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Interrogate Occupant",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"code-branch",content:l.interrogating?"Interrupt Interrogation":"Begin Enhanced Interrogation",onClick:function(){return c("interrogate")}}),1===l.interrogating&&(0,o.createComponentVNode)(2,i.Icon,{name:"cog",color:"orange",spin:!0})]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ImplantChair=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ImplantChair=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:375,height:280,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Occupant Information",textAlign:"center",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",children:l.occupant.name||"No Occupant"}),!!l.occupied&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",color:0===l.occupant.stat?"good":1===l.occupant.stat?"average":"bad",children:0===l.occupant.stat?"Conscious":1===l.occupant.stat?"Unconcious":"Dead"})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Operations",textAlign:"center",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door",children:(0,o.createComponentVNode)(2,i.Button,{icon:l.open?"unlock":"lock",color:l.open?"default":"red",content:l.open?"Open":"Closed",onClick:function(){return c("door")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Implant Occupant",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"code-branch",content:l.ready?l.special_name||"Implant":"Recharging",onClick:function(){return c("implant")}}),0===l.ready&&(0,o.createComponentVNode)(2,i.Icon,{name:"cog",color:"orange",spin:!0})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Implants Remaining",children:[l.ready_implants,1===l.replenishing&&(0,o.createComponentVNode)(2,i.Icon,{name:"sync",color:"red",spin:!0})]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.InfraredEmitter=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.InfraredEmitter=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.on,u=l.visible;return(0,o.createComponentVNode)(2,a.Window,{width:225,height:110,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:(0,o.createComponentVNode)(2,i.Button,{icon:d?"power-off":"times",content:d?"On":"Off",selected:d,onClick:function(){return c("power")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Visibility",children:(0,o.createComponentVNode)(2,i.Button,{icon:u?"eye":"eye-slash",content:u?"Visible":"Invisible",selected:u,onClick:function(){return c("visibility")}})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Intellicard=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Intellicard=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.name,u=l.isDead,s=l.isBraindead,p=l.health,m=l.wireless,f=l.radio,h=l.wiping,C=l.laws,g=void 0===C?[]:C,b=u||s;return(0,o.createComponentVNode)(2,a.Window,{width:500,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:d||"Empty Card",buttons:!!d&&(0,o.createComponentVNode)(2,i.Button,{icon:"trash",content:h?"Stop Wiping":"Wipe",disabled:u,onClick:function(){return c("wipe")}}),children:!!d&&(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",color:b?"bad":"good",children:b?"Offline":"Operation"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Software Integrity",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:p,minValue:0,maxValue:100,ranges:{good:[70,Infinity],average:[50,70],bad:[-Infinity,50]}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Settings",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"signal",content:"Wireless Activity",selected:m,onClick:function(){return c("wireless")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"microphone",content:"Subspace Radio",selected:f,onClick:function(){return c("radio")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Laws",children:g.map((function(e){return(0,o.createComponentVNode)(2,i.BlockQuote,{children:e},e)}))})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Jukebox=void 0;var o=n(0),r=n(16),i=n(33),a=n(1),c=n(3),l=n(2);t.Jukebox=function(e,t){var n=(0,a.useBackend)(t),d=n.act,u=n.data,s=u.active,p=u.track_selected,m=u.track_length,f=u.track_beat,h=u.volume,C=(0,i.flow)([(0,r.sortBy)((function(e){return e.name}))])(u.songs||[]);return(0,o.createComponentVNode)(2,l.Window,{width:370,height:313,children:(0,o.createComponentVNode)(2,l.Window.Content,{children:[(0,o.createComponentVNode)(2,c.Section,{title:"Song Player",buttons:(0,o.createComponentVNode)(2,c.Button,{icon:s?"pause":"play",content:s?"Stop":"Play",selected:s,onClick:function(){return d("toggle")}}),children:(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Track Selected",children:(0,o.createComponentVNode)(2,c.Dropdown,{"overflow-y":"scroll",width:"240px",options:C.map((function(e){return e.name})),disabled:s,selected:p||"Select a Track",onSelected:function(e){return d("select_track",{track:e})}})}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Track Length",children:p?m:"No Track Selected"}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Track Beat",children:[p?f:"No Track Selected",1===f?" beat":" beats"]})]})}),(0,o.createComponentVNode)(2,c.Section,{title:"Machine Settings",children:(0,o.createComponentVNode)(2,c.LabeledControls,{justify:"center",children:(0,o.createComponentVNode)(2,c.LabeledControls.Item,{label:"Volume",children:(0,o.createComponentVNode)(2,c.Box,{position:"relative",children:[(0,o.createComponentVNode)(2,c.Knob,{size:3.2,color:h>=50?"red":"green",value:h,unit:"%",minValue:0,maxValue:100,step:1,stepPixelSize:1,disabled:s,onDrag:function(e,t){return d("set_volume",{volume:t})}}),(0,o.createComponentVNode)(2,c.Button,{fluid:!0,position:"absolute",top:"-2px",right:"-22px",color:"transparent",icon:"fast-backward",onClick:function(){return d("set_volume",{volume:"min"})}}),(0,o.createComponentVNode)(2,c.Button,{fluid:!0,position:"absolute",top:"16px",right:"-22px",color:"transparent",icon:"fast-forward",onClick:function(){return d("set_volume",{volume:"max"})}}),(0,o.createComponentVNode)(2,c.Button,{fluid:!0,position:"absolute",top:"34px",right:"-22px",color:"transparent",icon:"undo",onClick:function(){return d("set_volume",{volume:"reset"})}})]})})})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.KeycardAuth=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.KeycardAuth=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:375,height:125,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.Box,{children:1===l.waiting&&(0,o.createVNode)(1,"span",null,"Waiting for another device to confirm your request...",16)}),(0,o.createComponentVNode)(2,i.Box,{children:0===l.waiting&&(0,o.createFragment)([!!l.auth_required&&(0,o.createComponentVNode)(2,i.Button,{icon:"check-square",color:"red",textAlign:"center",lineHeight:"60px",fluid:!0,onClick:function(){return c("auth_swipe")},content:"Authorize"}),0===l.auth_required&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"exclamation-triangle",fluid:!0,onClick:function(){return c("red_alert")},content:"Red Alert"}),(0,o.createComponentVNode)(2,i.Button,{icon:"wrench",fluid:!0,onClick:function(){return c("emergency_maint")},content:"Emergency Maintenance Access"}),(0,o.createComponentVNode)(2,i.Button,{icon:"meteor",fluid:!0,onClick:function(){return c("bsa_unlock")},content:"Bluespace Artillery Unlock"})],4)],0)})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.LaborClaimConsole=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(2);t.LaborClaimConsole=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.can_go_home,s=d.id_points,p=d.ores,m=d.status_info,f=d.unclaimed_points;return(0,o.createComponentVNode)(2,c.Window,{width:315,height:430,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Status",children:m}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Shuttle controls",children:(0,o.createComponentVNode)(2,a.Button,{content:"Move shuttle",disabled:!u,onClick:function(){return l("move_shuttle")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Points",children:s}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Unclaimed points",buttons:(0,o.createComponentVNode)(2,a.Button,{content:"Claim points",disabled:!f,onClick:function(){return l("claim_points")}}),children:f})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Material values",children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:"Material"}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:"Value"})]}),p.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,r.toTitleCase)(e.ore)}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:(0,o.createComponentVNode)(2,a.Box,{color:"label",inline:!0,children:e.value})})]},e.ore)}))]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.LanguageMenu=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.LanguageMenu=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.admin_mode,u=l.is_living,s=l.omnitongue,p=l.languages,m=void 0===p?[]:p,f=l.unknown_languages,h=void 0===f?[]:f;return(0,o.createComponentVNode)(2,a.Window,{title:"Language Menu",width:700,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Known Languages",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:m.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,buttons:(0,o.createFragment)([!!u&&(0,o.createComponentVNode)(2,i.Button,{content:e.is_default?"Default Language":"Select as Default",disabled:!e.can_speak,selected:e.is_default,onClick:function(){return c("select_default",{language_name:e.name})}}),!!d&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{content:"Grant",onClick:function(){return c("grant_language",{language_name:e.name})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Remove",onClick:function(){return c("remove_language",{language_name:e.name})}})],4)],0),children:[e.desc," ","Key: ,",e.key," ",e.can_understand?"Can understand.":"Cannot understand."," ",e.can_speak?"Can speak.":"Cannot speak."]},e.name)}))})}),!!d&&(0,o.createComponentVNode)(2,i.Section,{title:"Unknown Languages",buttons:(0,o.createComponentVNode)(2,i.Button,{content:"Omnitongue "+(s?"Enabled":"Disabled"),selected:s,onClick:function(){return c("toggle_omnitongue")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:h.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,buttons:(0,o.createComponentVNode)(2,i.Button,{content:"Grant",onClick:function(){return c("grant_language",{language_name:e.name})}}),children:[e.desc," ","Key: ,",e.key," ",!!e.shadow&&"(gained from mob)"," ",e.can_speak?"Can speak.":"Cannot speak."]},e.name)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.LaunchpadRemote=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(180);t.LaunchpadRemote=function(e,t){var n=(0,r.useBackend)(t).data,l=n.has_pad,d=n.pad_closed;return(0,o.createComponentVNode)(2,a.Window,{title:"Briefcase Launchpad Remote",width:300,height:240,theme:"syndicate",children:(0,o.createComponentVNode)(2,a.Window.Content,{children:!l&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No Launchpad Connected"})||d&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Launchpad Closed"})||(0,o.createComponentVNode)(2,c.LaunchpadControl,{topLevel:!0})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.MafiaPanel=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.MafiaPanel=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.players,u=l.actions,s=l.phase,p=l.roleinfo,m=l.role_theme,f=l.admin_controls,h=l.judgement_phase,C=l.timeleft,g=l.all_roles;return(0,o.createComponentVNode)(2,a.Window,{title:"Mafia",theme:m,width:650,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:s,children:!!p&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.TimeDisplay,{auto:"down",value:C})}),(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createVNode)(1,"b",null,[(0,o.createTextVNode)("You are a "),p.role],0)}),(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createVNode)(1,"b",null,p.desc,0)})],4)}),(0,o.createComponentVNode)(2,i.Flex,{children:!!u&&u.map((function(e){return(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return c("mf_action",{atype:e})},children:e})},e)}))}),!!f&&(0,o.createComponentVNode)(2,i.Section,{title:"ADMIN CONTROLS",backgroundColor:"red",children:["THESE ARE DEBUG, THEY WILL BREAK THE GAME, DO NOT TOUCH ",(0,o.createVNode)(1,"br"),"Also because an admin did it: do not gib/delete/etc anyone! It will runtime the game to death! ",(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Button,{icon:"arrow-right",onClick:function(){return c("next_phase")},children:"Next Phase"}),(0,o.createComponentVNode)(2,i.Button,{icon:"home",onClick:function(){return c("players_home")},children:"Send All Players Home"}),(0,o.createComponentVNode)(2,i.Button,{icon:"radiation",onClick:function(){return c("new_game")},children:"New Game"}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Button,{icon:"skull",onClick:function(){return c("nuke")},color:"black",children:"Nuke (delete datum + landmarks, hope it fixes everything!)"})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Players",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:!!d&&d.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{className:"candystripe",label:e.name,children:[!e.alive&&(0,o.createComponentVNode)(2,i.Box,{color:"red",children:"DEAD"}),e.votes!==undefined&&!!e.alive&&(0,o.createFragment)([(0,o.createTextVNode)("Votes : "),e.votes,(0,o.createTextVNode)(" ")],0),!!e.actions&&e.actions.map((function(t){return(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return c("mf_targ_action",{atype:t,target:e.ref})},children:t},t)}))]},e.ref)}))})}),!!h&&(0,o.createComponentVNode)(2,i.Section,{title:"JUDGEMENT",children:(0,o.createComponentVNode)(2,i.Flex,{justify:"space-around",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"smile-beam",color:"good",onClick:function(){return c("vote_innocent")},children:"INNOCENT!"}),"Use these buttons to vote the accused innocent or guilty!",(0,o.createComponentVNode)(2,i.Button,{icon:"angry",color:"bad",onClick:function(){return c("vote_guilty")},children:"GUILTY!"})]})}),(0,o.createComponentVNode)(2,i.Flex,{mt:1,spacing:1,children:[(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Roles",minHeight:10,children:!!g&&g.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.Flex,{justify:"space-between",children:[e,(0,o.createComponentVNode)(2,i.Button,{content:"?",onClick:function(){return c("mf_lookup",{atype:e.slice(0,-3)})}})]})},e)}))})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:2,basis:0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Notes",minHeight:10,children:p!==undefined&&!!p.action_log&&p.action_log.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:e},e)}))})})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.MalfunctionModulePicker=void 0;var o=n(0),r=n(1),i=n(2),a=n(127);t.MalfunctionModulePicker=function(e,t){var n=(0,r.useBackend)(t),c=(n.act,n.data.processingTime);return(0,o.createComponentVNode)(2,i.Window,{width:620,height:525,theme:"malfunction",resizable:!0,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.GenericUplink,{currencyAmount:c,currencySymbol:"PT"})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.MechBayPowerConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.MechBayPowerConsole=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data.recharge_port,d=l&&l.mech,u=d&&d.cell;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:200,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Mech status",textAlign:"center",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Sync",onClick:function(){return c("reconnect")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Integrity",children:!l&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No power port detected. Please re-sync."})||!d&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No mech detected."})||(0,o.createComponentVNode)(2,i.ProgressBar,{value:d.health/d.maxhealth,ranges:{good:[.7,Infinity],average:[.3,.7],bad:[-Infinity,.3]}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:!l&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No power port detected. Please re-sync."})||!d&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No mech detected."})||!u&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No cell is installed."})||(0,o.createComponentVNode)(2,i.ProgressBar,{value:u.charge/u.maxcharge,ranges:{good:[.7,Infinity],average:[.3,.7],bad:[-Infinity,.3]},children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:u.charge})," / "+u.maxcharge]})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.MedicalKiosk=void 0;var o=n(0),r=(n(19),n(1)),i=n(3),a=n(2);t.MedicalKiosk=function(e,t){var n=(0,r.useBackend)(t),m=(n.act,n.data),f=(0,r.useSharedState)(t,"scanIndex")[0],h=m.active_status_1,C=m.active_status_2,g=m.active_status_3,b=m.active_status_4;return(0,o.createComponentVNode)(2,a.Window,{width:575,height:420,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Flex,{mb:1,children:[(0,o.createComponentVNode)(2,i.Flex.Item,{mr:1,children:(0,o.createComponentVNode)(2,i.Section,{minHeight:"100%",children:[(0,o.createComponentVNode)(2,c,{index:1,icon:"procedures",name:"General Health Scan",description:"Reads back exact values of your general health scan."}),(0,o.createComponentVNode)(2,c,{index:2,icon:"heartbeat",name:"Symptom Based Checkup",description:"Provides information based on various non-obvious symptoms,\nlike blood levels or disease status."}),(0,o.createComponentVNode)(2,c,{index:3,icon:"radiation-alt",name:"Neurological/Radiological Scan",description:"Provides information about brain trauma and radiation."}),(0,o.createComponentVNode)(2,c,{index:4,icon:"mortar-pestle",name:"Chemical and Psychoactive Scan",description:"Provides a list of consumed chemicals, as well as potential\nside effects."})]})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,l)})]}),!!h&&1===f&&(0,o.createComponentVNode)(2,d),!!C&&2===f&&(0,o.createComponentVNode)(2,u),!!g&&3===f&&(0,o.createComponentVNode)(2,s),!!b&&4===f&&(0,o.createComponentVNode)(2,p)]})})};var c=function(e,t){var n=e.index,a=e.name,c=e.description,l=e.icon,d=(0,r.useBackend)(t),u=d.act,s=d.data,p=(0,r.useSharedState)(t,"scanIndex"),m=p[0],f=p[1],h=s["active_status_"+n];return(0,o.createComponentVNode)(2,i.Flex,{spacing:1,align:"baseline",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{width:"16px",textAlign:"center",children:(0,o.createComponentVNode)(2,i.Icon,{name:h?"check":"dollar-sign",color:h?"green":"grey"})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:l,selected:h&&m===n,tooltip:c,tooltipPosition:"right",content:a,onClick:function(){h||u("beginScan_"+n),f(n)}})})]})},l=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.kiosk_cost,d=c.patient_name;return(0,o.createComponentVNode)(2,i.Section,{minHeight:"100%",children:[(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:["Greetings Valued Employee! Please select a desired automatic health check procedure. Diagnosis costs ",(0,o.createVNode)(1,"b",null,[l,(0,o.createTextVNode)(" credits.")],0)]}),(0,o.createComponentVNode)(2,i.Box,{mt:1,children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"label",mr:1,children:"Patient:"}),d]}),(0,o.createComponentVNode)(2,i.Button,{mt:1,tooltip:"Resets the current scanning target, cancelling current scans.",icon:"sync",color:"average",onClick:function(){return a("clearTarget")},content:"Reset Scanner"})]})},d=function(e,t){var n=(0,r.useBackend)(t).data,a=n.patient_health,c=n.brute_health,l=n.burn_health,d=n.suffocation_health,u=n.toxin_health;return(0,o.createComponentVNode)(2,i.Section,{title:"Patient Health",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Total Health",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:a/100,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:a}),"%"]})}),(0,o.createComponentVNode)(2,i.LabeledList.Divider),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Brute Damage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:c/100,color:"bad",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:c})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Burn Damage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:l/100,color:"bad",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:l})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Oxygen Damage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:d/100,color:"bad",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:d})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Toxin Damage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:u/100,color:"bad",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:u})})})]})})},u=function(e,t){var n=(0,r.useBackend)(t).data,a=n.patient_status,c=n.patient_illness,l=n.illness_info,d=n.bleed_status,u=n.blood_levels,s=n.blood_status;return(0,o.createComponentVNode)(2,i.Section,{title:"Symptom Based Checkup",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Patient Status",color:"good",children:a}),(0,o.createComponentVNode)(2,i.LabeledList.Divider),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Disease Status",children:c}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Disease information",children:l}),(0,o.createComponentVNode)(2,i.LabeledList.Divider),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Blood Levels",children:[(0,o.createComponentVNode)(2,i.ProgressBar,{value:u/100,color:"bad",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:u})}),(0,o.createComponentVNode)(2,i.Box,{mt:1,color:"label",children:d})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Blood Information",children:s})]})})},s=function(e,t){var n=(0,r.useBackend)(t).data,a=n.clone_health,c=n.brain_damage,l=n.brain_health,d=n.rad_contamination_status,u=n.rad_contamination_value,s=n.rad_sickness_status,p=n.rad_sickness_value,m=n.trauma_status;return(0,o.createComponentVNode)(2,i.Section,{title:"Patient Neurological and Radiological Health",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cellular Damage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:a/100,color:"good",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:a})})}),(0,o.createComponentVNode)(2,i.LabeledList.Divider),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Brain Damage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:c/100,color:"good",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:c})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Brain Status",color:"health-0",children:l}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Brain Trauma Status",children:m}),(0,o.createComponentVNode)(2,i.LabeledList.Divider),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Radiation Sickness Status",children:s}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Radiation Sickness Percentage",children:[p,"%"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Radiation Contamination Status",children:d}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Radiation Contamination Percentage",children:[u,"%"]})]})})},p=function(e,t){var n=(0,r.useBackend)(t).data,a=n.chemical_list,c=void 0===a?[]:a,l=n.overdose_list,d=void 0===l?[]:l,u=n.addict_list,s=void 0===u?[]:u,p=n.hallucinating_status;return(0,o.createComponentVNode)(2,i.Section,{title:"Chemical and Psychoactive Analysis",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Chemical Contents",children:[0===c.length&&(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"No reagents detected."}),c.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{color:"good",children:[e.volume," units of ",e.name]},e.id)}))]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Overdose Status",color:"bad",children:[0===d.length&&(0,o.createComponentVNode)(2,i.Box,{color:"good",children:"Patient is not overdosing."}),d.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:["Overdosing on ",e.name]},e.id)}))]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Addiction Status",color:"bad",children:[0===s.length&&(0,o.createComponentVNode)(2,i.Box,{color:"good",children:"Patient has no addictions."}),s.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:["Addicted to ",e.name]},e.id)}))]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Psychoactive Status",children:p})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.MiningVendor=void 0;var o=n(0),r=n(6),i=n(1),a=n(3),c=n(2);t.MiningVendor=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=[].concat(d.product_records);return(0,o.createComponentVNode)(2,c.Window,{width:425,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{title:"User",children:d.user&&(0,o.createComponentVNode)(2,a.Box,{children:["Welcome, ",(0,o.createVNode)(1,"b",null,d.user.name||"Unknown",0),","," ",(0,o.createVNode)(1,"b",null,d.user.job||"Unemployed",0),"!",(0,o.createVNode)(1,"br"),"Your balance is ",(0,o.createVNode)(1,"b",null,[d.user.points,(0,o.createTextVNode)(" mining points")],0),"."]})||(0,o.createComponentVNode)(2,a.Box,{color:"light-gray",children:["No registered ID card!",(0,o.createVNode)(1,"br"),"Please contact your local HoP!"]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Equipment",children:(0,o.createComponentVNode)(2,a.Table,{children:u.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:[(0,o.createVNode)(1,"span",(0,r.classes)(["vending32x32",e.path]),null,1,{style:{"vertical-align":"middle"}})," ",(0,o.createVNode)(1,"b",null,e.name,0)]}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,a.Button,{style:{"min-width":"95px","text-align":"center"},disabled:!d.user||e.price>d.user.points,content:e.price+" points",onClick:function(){return l("purchase",{ref:e.ref})}})})]},e.name)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Mint=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Mint=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.inserted_materials||[];return(0,o.createComponentVNode)(2,a.Window,{width:300,height:250,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Materials",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:l.processing?"times":"power-off",content:l.processing?"Stop":"Start",selected:l.processing,onClick:function(){return c(l.processing?"stoppress":"startpress")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:d.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.material,buttons:(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:l.chosen_material===e.material,onClick:function(){return c("changematerial",{material_name:e.material})}}),children:[e.amount," cm\xb3"]},e.material)}))})}),(0,o.createComponentVNode)(2,i.Section,{children:["Pressed ",l.produced_coins," coins this cycle."]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Mule=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(60);t.Mule=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.on,s=d.cell,p=d.cellPercent,m=d.load,f=d.mode,h=d.modeStatus,C=d.haspai,g=d.autoReturn,b=d.autoPickup,N=d.reportDelivery,v=d.destination,V=d.home,y=d.id,k=d.destinations,x=void 0===k?[]:k,_=d.locked&&!d.siliconUser;return(0,o.createComponentVNode)(2,a.Window,{width:350,height:425,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,c.InterfaceLockNoticeBox),(0,o.createComponentVNode)(2,i.Section,{title:"Status",minHeight:"110px",buttons:!_&&(0,o.createComponentVNode)(2,i.Button,{icon:u?"power-off":"times",content:u?"On":"Off",selected:u,onClick:function(){return l("power")}}),children:[(0,o.createComponentVNode)(2,i.ProgressBar,{value:s?p/100:0,color:s?"good":"bad"}),(0,o.createComponentVNode)(2,i.Flex,{mt:1,children:[(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Mode",color:h,children:f})})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Load",color:m?"good":"average",children:m||"None"})})})]})]}),!_&&(0,o.createComponentVNode)(2,i.Section,{title:"Controls",buttons:(0,o.createFragment)([!!m&&(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Unload",onClick:function(){return l("unload")}}),!!C&&(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject PAI",onClick:function(){return l("ejectpai")}})],0),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"ID",children:(0,o.createComponentVNode)(2,i.Input,{value:y,onChange:function(e,t){return l("setid",{value:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Destination",children:[(0,o.createComponentVNode)(2,i.Dropdown,{over:!0,selected:v||"None",options:x,width:"150px",onSelected:function(e){return l("destination",{value:e})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"stop",content:"Stop",onClick:function(){return l("stop")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"play",content:"Go",onClick:function(){return l("go")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Home",children:[(0,o.createComponentVNode)(2,i.Dropdown,{over:!0,selected:V,options:x,width:"150px",onSelected:function(e){return l("destination",{value:e})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"home",content:"Go Home",onClick:function(){return l("home")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Settings",children:[(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:g,content:"Auto-Return",onClick:function(){return l("autored")}}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:b,content:"Auto-Pickup",onClick:function(){return l("autopick")}}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:N,content:"Report Delivery",onClick:function(){return l("report")}})]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NaniteChamberControlContent=t.NaniteChamberControl=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NaniteChamberControl=function(e,t){return(0,o.createComponentVNode)(2,a.Window,{width:380,height:570,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.status_msg,d=c.locked,u=c.occupant_name,s=c.has_nanites,p=c.nanite_volume,m=c.regen_rate,f=c.safety_threshold,h=c.cloud_id,C=c.scan_level;if(l)return(0,o.createComponentVNode)(2,i.NoticeBox,{textAlign:"center",children:l});var g=c.mob_programs||[];return(0,o.createComponentVNode)(2,i.Section,{title:"Chamber: "+u,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d?"lock":"lock-open",content:d?"Locked":"Unlocked",color:d?"bad":"default",onClick:function(){return a("toggle_lock")}}),children:s?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Status",level:2,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"exclamation-triangle",content:"Destroy Nanites",color:"bad",onClick:function(){return a("remove_nanites")}}),children:(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Nanite Volume",children:p}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Growth Rate",children:m})]})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Safety Threshold",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:f,minValue:0,maxValue:500,width:"39px",onChange:function(e,t){return a("set_safety",{value:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cloud ID",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:h,minValue:0,maxValue:100,step:1,stepPixelSize:3,width:"39px",onChange:function(e,t){return a("set_cloud",{value:t})}})})]})})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Programs",level:2,children:g.map((function(e){var t=e.extra_settings||[],n=e.rules||[];return(0,o.createComponentVNode)(2,i.Collapsible,{title:e.name,children:(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:e.desc}),C>=2&&(0,o.createComponentVNode)(2,i.Grid.Column,{size:.6,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Activation Status",children:(0,o.createComponentVNode)(2,i.Box,{color:e.activated?"good":"bad",children:e.activated?"Active":"Inactive"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Nanites Consumed",children:[e.use_rate,"/s"]})]})})]}),C>=2&&(0,o.createComponentVNode)(2,i.Grid,{children:[!!e.can_trigger&&(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Triggers",level:2,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Cost",children:e.trigger_cost}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Cooldown",children:e.trigger_cooldown}),!!e.timer_trigger_delay&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Delay",children:[e.timer_trigger_delay," s"]}),!!e.timer_trigger&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Repeat Timer",children:[e.timer_trigger," s"]})]})})}),!(!e.timer_restart&&!e.timer_shutdown)&&(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[e.timer_restart&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Restart Timer",children:[e.timer_restart," s"]}),e.timer_shutdown&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Shutdown Timer",children:[e.timer_shutdown," s"]})]})})})]}),C>=3&&!!e.has_extra_settings&&(0,o.createComponentVNode)(2,i.Section,{title:"Extra Settings",level:2,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:t.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,children:e.value},e.name)}))})}),C>=4&&(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Codes",level:2,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[!!e.activation_code&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Activation",children:e.activation_code}),!!e.deactivation_code&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Deactivation",children:e.deactivation_code}),!!e.kill_code&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Kill",children:e.kill_code}),!!e.can_trigger&&!!e.trigger_code&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger",children:e.trigger_code})]})})}),e.has_rules&&(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Rules",level:2,children:n.map((function(e){return(0,o.createFragment)([e.display,(0,o.createVNode)(1,"br")],0,e.display)}))})})]})]})},e.name)}))})],4):(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{bold:!0,color:"bad",textAlign:"center",fontSize:"30px",mb:1,children:"No Nanites Detected"}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,bold:!0,icon:"syringe",content:" Implant Nanites",color:"green",textAlign:"center",fontSize:"30px",lineHeight:"50px",onClick:function(){return a("nanite_injection")}})],4)})};t.NaniteChamberControlContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.NaniteCloudControl=t.NaniteCloudBackupDetails=t.NaniteCloudBackupList=t.NaniteInfoBox=t.NaniteDiskBox=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=function(e,t){var n=(0,r.useBackend)(t).data,a=n.has_disk,c=n.has_program,d=n.disk;return a?c?(0,o.createComponentVNode)(2,l,{program:d}):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Inserted disk has no program"}):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No disk inserted"})};t.NaniteDiskBox=c;var l=function(e,t){var n=e.program,r=n.name,a=n.desc,c=n.activated,l=n.use_rate,d=n.can_trigger,u=n.trigger_cost,s=n.trigger_cooldown,p=n.activation_code,m=n.deactivation_code,f=n.kill_code,h=n.trigger_code,C=n.timer_restart,g=n.timer_shutdown,b=n.timer_trigger,N=n.timer_trigger_delay,v=n.extra_settings||[];return(0,o.createComponentVNode)(2,i.Section,{title:r,level:2,buttons:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,color:c?"good":"bad",children:c?"Activated":"Deactivated"}),children:[(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{mr:1,children:a}),(0,o.createComponentVNode)(2,i.Grid.Column,{size:.5,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Use Rate",children:l}),!!d&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Cost",children:u}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Cooldown",children:s})],4)]})})]}),(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Codes",level:3,mr:1,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Activation",children:p}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Deactivation",children:m}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Kill",children:f}),!!d&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger",children:h})]})})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Delays",level:3,mr:1,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Restart",children:[C," s"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Shutdown",children:[g," s"]}),!!d&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger",children:[b," s"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Delay",children:[N," s"]})],4)]})})})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Extra Settings",level:3,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:v.map((function(e){var t={number:(0,o.createFragment)([e.value,e.unit],0),text:e.value,type:e.value,boolean:e.value?e.true_text:e.false_text};return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,children:t[e.type]},e.name)}))})})]})};t.NaniteInfoBox=l;var d=function(e,t){var n=(0,r.useBackend)(t),a=n.act;return(n.data.cloud_backups||[]).map((function(e){return(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Backup #"+e.cloud_id,textAlign:"center",onClick:function(){return a("set_view",{view:e.cloud_id})}},e.cloud_id)}))};t.NaniteCloudBackupList=d;var u=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,d=c.current_view,u=c.disk,s=c.has_program,p=c.cloud_backup,m=u&&u.can_rule||!1;if(!p)return(0,o.createComponentVNode)(2,i.NoticeBox,{children:"ERROR: Backup not found"});var f=c.cloud_programs||[];return(0,o.createComponentVNode)(2,i.Section,{title:"Backup #"+d,level:2,buttons:!!s&&(0,o.createComponentVNode)(2,i.Button,{icon:"upload",content:"Upload From Disk",color:"good",onClick:function(){return a("upload_program")}}),children:f.map((function(e){var t=e.rules||[];return(0,o.createComponentVNode)(2,i.Collapsible,{title:e.name,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"minus-circle",color:"bad",onClick:function(){return a("remove_program",{program_id:e.id})}}),children:(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,l,{program:e}),(!!m||!!e.has_rules)&&(0,o.createComponentVNode)(2,i.Section,{mt:-2,title:"Rules",level:2,buttons:!!m&&(0,o.createComponentVNode)(2,i.Button,{icon:"plus",content:"Add Rule from Disk",color:"good",onClick:function(){return a("add_rule",{program_id:e.id})}}),children:e.has_rules?t.map((function(t){return(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"minus-circle",color:"bad",onClick:function(){return a("remove_rule",{program_id:e.id,rule_id:t.id})}})," "+t.display]},t.display)})):(0,o.createComponentVNode)(2,i.Box,{color:"bad",children:"No Active Rules"})})]})},e.name)}))})};t.NaniteCloudBackupDetails=u;t.NaniteCloudControl=function(e,t){var n=(0,r.useBackend)(t),l=n.act,s=n.data,p=s.has_disk,m=s.current_view,f=s.new_backup_id;return(0,o.createComponentVNode)(2,a.Window,{width:375,height:700,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Program Disk",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",disabled:!p,onClick:function(){return l("eject")}}),children:(0,o.createComponentVNode)(2,c)}),(0,o.createComponentVNode)(2,i.Section,{title:"Cloud Storage",buttons:m?(0,o.createComponentVNode)(2,i.Button,{icon:"arrow-left",content:"Return",onClick:function(){return l("set_view",{view:0})}}):(0,o.createFragment)(["New Backup: ",(0,o.createComponentVNode)(2,i.NumberInput,{value:f,minValue:1,maxValue:100,stepPixelSize:4,width:"39px",onChange:function(e,t){return l("update_new_backup_value",{value:t})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"plus",onClick:function(){return l("create_backup")}})],0),children:s.current_view?(0,o.createComponentVNode)(2,u):(0,o.createComponentVNode)(2,d)})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NaniteProgramHub=void 0;var o=n(0),r=n(16),i=n(1),a=n(3),c=n(2);t.NaniteProgramHub=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.detail_view,s=d.disk,p=d.has_disk,m=d.has_program,f=d.programs,h=void 0===f?{}:f,C=(0,i.useSharedState)(t,"category"),g=C[0],b=C[1],N=h&&h[g]||[];return(0,o.createComponentVNode)(2,c.Window,{width:500,height:700,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{title:"Program Disk",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"eject",content:"Eject",onClick:function(){return l("eject")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"minus-circle",content:"Delete Program",onClick:function(){return l("clear")}})],4),children:p?m?(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Program Name",children:s.name}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Description",children:s.desc})]}):(0,o.createComponentVNode)(2,a.NoticeBox,{children:"No Program Installed"}):(0,o.createComponentVNode)(2,a.NoticeBox,{children:"Insert Disk"})}),(0,o.createComponentVNode)(2,a.Section,{title:"Programs",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:u?"info":"list",content:u?"Detailed":"Compact",onClick:function(){return l("toggle_details")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"sync",content:"Sync Research",onClick:function(){return l("refresh")}})],4),children:null!==h?(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{minWidth:"110px",children:(0,o.createComponentVNode)(2,a.Tabs,{vertical:!0,children:(0,r.map)((function(e,t){var n=t.substring(0,t.length-8);return(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:t===g,onClick:function(){return b(t)},children:n},t)}))(h)})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,basis:0,children:u?N.map((function(e){return(0,o.createComponentVNode)(2,a.Section,{title:e.name,level:2,buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"download",content:"Download",disabled:!p,onClick:function(){return l("download",{program_id:e.id})}}),children:e.desc},e.id)})):(0,o.createComponentVNode)(2,a.LabeledList,{children:N.map((function(e){return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:e.name,buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"download",content:"Download",disabled:!p,onClick:function(){return l("download",{program_id:e.id})}})},e.id)}))})})]}):(0,o.createComponentVNode)(2,a.NoticeBox,{children:"No nanite programs are currently researched."})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NaniteProgrammerContent=t.NaniteProgrammer=t.NaniteExtraBoolean=t.NaniteExtraType=t.NaniteExtraText=t.NaniteExtraNumber=t.NaniteExtraEntry=t.NaniteDelays=t.NaniteCodes=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data;return(0,o.createComponentVNode)(2,i.Section,{title:"Codes",level:3,mr:1,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Activation",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.activation_code,width:"47px",minValue:0,maxValue:9999,onChange:function(e,t){return a("set_code",{target_code:"activation",code:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Deactivation",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.deactivation_code,width:"47px",minValue:0,maxValue:9999,onChange:function(e,t){return a("set_code",{target_code:"deactivation",code:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Kill",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.kill_code,width:"47px",minValue:0,maxValue:9999,onChange:function(e,t){return a("set_code",{target_code:"kill",code:t})}})}),!!c.can_trigger&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.trigger_code,width:"47px",minValue:0,maxValue:9999,onChange:function(e,t){return a("set_code",{target_code:"trigger",code:t})}})})]})})};t.NaniteCodes=c;var l=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data;return(0,o.createComponentVNode)(2,i.Section,{title:"Delays",level:3,ml:1,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Restart Timer",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.timer_restart,unit:"s",width:"57px",minValue:0,maxValue:3600,onChange:function(e,t){return a("set_restart_timer",{delay:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Shutdown Timer",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.timer_shutdown,unit:"s",width:"57px",minValue:0,maxValue:3600,onChange:function(e,t){return a("set_shutdown_timer",{delay:t})}})}),!!c.can_trigger&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Repeat Timer",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.timer_trigger,unit:"s",width:"57px",minValue:0,maxValue:3600,onChange:function(e,t){return a("set_trigger_timer",{delay:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Delay",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.timer_trigger_delay,unit:"s",width:"57px",minValue:0,maxValue:3600,onChange:function(e,t){return a("set_timer_trigger_delay",{delay:t})}})})],4)]})})};t.NaniteDelays=l;var d=function(e,t){var n=e.extra_setting,r=n.name,a=n.type,c={number:(0,o.createComponentVNode)(2,u,{extra_setting:n}),text:(0,o.createComponentVNode)(2,s,{extra_setting:n}),type:(0,o.createComponentVNode)(2,p,{extra_setting:n}),boolean:(0,o.createComponentVNode)(2,m,{extra_setting:n})};return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:r,children:c[a]})};t.NaniteExtraEntry=d;var u=function(e,t){var n=e.extra_setting,a=(0,r.useBackend)(t).act,c=n.name,l=n.value,d=n.min,u=n.max,s=n.unit;return(0,o.createComponentVNode)(2,i.NumberInput,{value:l,width:"64px",minValue:d,maxValue:u,unit:s,onChange:function(e,t){return a("set_extra_setting",{target_setting:c,value:t})}})};t.NaniteExtraNumber=u;var s=function(e,t){var n=e.extra_setting,a=(0,r.useBackend)(t).act,c=n.name,l=n.value;return(0,o.createComponentVNode)(2,i.Input,{value:l,width:"200px",onInput:function(e,t){return a("set_extra_setting",{target_setting:c,value:t})}})};t.NaniteExtraText=s;var p=function(e,t){var n=e.extra_setting,a=(0,r.useBackend)(t).act,c=n.name,l=n.value,d=n.types;return(0,o.createComponentVNode)(2,i.Dropdown,{over:!0,selected:l,width:"150px",options:d,onSelected:function(e){return a("set_extra_setting",{target_setting:c,value:e})}})};t.NaniteExtraType=p;var m=function(e,t){var n=e.extra_setting,a=(0,r.useBackend)(t).act,c=n.name,l=n.value,d=n.true_text,u=n.false_text;return(0,o.createComponentVNode)(2,i.Button.Checkbox,{content:l?d:u,checked:l,onClick:function(){return a("set_extra_setting",{target_setting:c})}})};t.NaniteExtraBoolean=m;t.NaniteProgrammer=function(e,t){return(0,o.createComponentVNode)(2,a.Window,{width:420,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,f)})})};var f=function(e,t){var n=(0,r.useBackend)(t),a=n.act,u=n.data,s=u.has_disk,p=u.has_program,m=u.name,f=u.desc,h=u.use_rate,C=u.can_trigger,g=u.trigger_cost,b=u.trigger_cooldown,N=u.activated,v=u.has_extra_settings,V=u.extra_settings,y=void 0===V?{}:V;return s?p?(0,o.createComponentVNode)(2,i.Section,{title:m,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",onClick:function(){return a("eject")}}),children:[(0,o.createComponentVNode)(2,i.Section,{title:"Info",level:2,children:(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:f}),(0,o.createComponentVNode)(2,i.Grid.Column,{size:.7,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Use Rate",children:h}),!!C&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Cost",children:g}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Cooldown",children:b})],4)]})})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Settings",level:2,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:N?"power-off":"times",content:N?"Active":"Inactive",selected:N,color:"bad",bold:!0,onClick:function(){return a("toggle_active")}}),children:[(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,c)}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,l)})]}),!!v&&(0,o.createComponentVNode)(2,i.Section,{title:"Special",level:3,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:y.map((function(e){return(0,o.createComponentVNode)(2,d,{extra_setting:e},e.name)}))})})]})]}):(0,o.createComponentVNode)(2,i.Section,{title:"Blank Disk",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",onClick:function(){return a("eject")}})}):(0,o.createComponentVNode)(2,i.NoticeBox,{textAlign:"center",children:"Insert a nanite program disk"})};t.NaniteProgrammerContent=f},function(e,t,n){"use strict";t.__esModule=!0,t.NaniteRemoteContent=t.NaniteRemote=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NaniteRemote=function(e,t){return(0,o.createComponentVNode)(2,a.Window,{width:420,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.code,d=c.locked,u=c.mode,s=c.program_name,p=c.relay_code,m=c.comms,f=c.message,h=c.saved_settings,C=void 0===h?[]:h;return d?(0,o.createComponentVNode)(2,i.NoticeBox,{children:"This interface is locked."}):(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Nanite Control",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"lock",content:"Lock Interface",onClick:function(){return a("lock")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",children:[(0,o.createComponentVNode)(2,i.Input,{value:s,maxLength:14,width:"130px",onChange:function(e,t){return a("update_name",{name:t})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"save",content:"Save",onClick:function(){return a("save")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:m?"Comm Code":"Signal Code",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:l,minValue:0,maxValue:9999,width:"47px",step:1,stepPixelSize:2,onChange:function(e,t){return a("set_code",{code:t})}})}),!!m&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Message",children:(0,o.createComponentVNode)(2,i.Input,{value:f,width:"270px",onChange:function(e,t){return a("set_message",{value:t})}})}),"Relay"===u&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Relay Code",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:p,minValue:0,maxValue:9999,width:"47px",step:1,stepPixelSize:2,onChange:function(e,t){return a("set_relay_code",{code:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Signal Mode",children:["Off","Local","Targeted","Area","Relay"].map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e,selected:u===e,onClick:function(){return a("select_mode",{mode:e})}},e)}))})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Saved Settings",children:C.length>0?(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{width:"35%",children:"Name"}),(0,o.createComponentVNode)(2,i.Table.Cell,{width:"20%",children:"Mode"}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:"Code"}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:"Relay"})]}),C.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,color:"label",children:[e.name,":"]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:e.mode}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:e.code}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:"Relay"===e.mode&&e.relay_code}),(0,o.createComponentVNode)(2,i.Table.Cell,{textAlign:"right",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"upload",color:"good",onClick:function(){return a("load",{save_id:e.id})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"minus",color:"bad",onClick:function(){return a("remove_save",{save_id:e.id})}})]})]},e.id)}))]}):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No settings currently saved"})})],4)};t.NaniteRemoteContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.NotificationPreferences=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NotificationPreferences=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=(n.data.ignore||[]).sort((function(e,t){var n=e.desc.toLowerCase(),o=t.desc.toLowerCase();return no?1:0}));return(0,o.createComponentVNode)(2,a.Window,{title:"Notification Preferences",width:270,height:360,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Ghost Role Notifications",children:l.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:e.enabled?"times":"check",content:e.desc,color:e.enabled?"bad":"good",onClick:function(){return c("toggle_ignore",{key:e.key})}},e.key)}))})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtnetRelay=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtnetRelay=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.enabled,u=l.dos_capacity,s=l.dos_overload,p=l.dos_crashed;return(0,o.createComponentVNode)(2,a.Window,{title:"NtNet Quantum Relay",width:400,height:300,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Network Buffer",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",selected:d,content:d?"ENABLED":"DISABLED",onClick:function(){return c("toggle")}}),children:p?(0,o.createComponentVNode)(2,i.Box,{fontFamily:"monospace",children:[(0,o.createComponentVNode)(2,i.Box,{fontSize:"20px",children:"NETWORK BUFFER OVERFLOW"}),(0,o.createComponentVNode)(2,i.Box,{fontSize:"16px",children:"OVERLOAD RECOVERY MODE"}),(0,o.createComponentVNode)(2,i.Box,{children:"This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."}),(0,o.createComponentVNode)(2,i.Box,{fontSize:"20px",color:"bad",children:"ADMINISTRATOR OVERRIDE"}),(0,o.createComponentVNode)(2,i.Box,{fontSize:"16px",color:"bad",children:"CAUTION - DATA LOSS MAY OCCUR"}),(0,o.createComponentVNode)(2,i.Button,{icon:"signal",content:"PURGE BUFFER",mt:1,color:"bad",onClick:function(){return c("restart")}})]}):(0,o.createComponentVNode)(2,i.ProgressBar,{value:s,minValue:0,maxValue:u,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:s})," GQ"," / ",u," GQ"]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosAiRestorer=void 0;var o=n(0),r=n(2),i=n(176);t.NtosAiRestorer=function(){return(0,o.createComponentVNode)(2,r.NtosWindow,{width:370,height:400,resizable:!0,children:(0,o.createComponentVNode)(2,r.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.AiRestorerContent)})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosArcade=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosArcade=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.NtosWindow,{width:450,height:350,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Outbomb Cuban Pete Ultra",textAlign:"center",children:[(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{size:2,children:[(0,o.createComponentVNode)(2,i.Box,{m:1}),(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Player Health",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:l.PlayerHitpoints,minValue:0,maxValue:30,ranges:{olive:[31,Infinity],good:[20,31],average:[10,20],bad:[-Infinity,10]},children:[l.PlayerHitpoints,"HP"]})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Player Magic",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:l.PlayerMP,minValue:0,maxValue:10,ranges:{purple:[11,Infinity],violet:[3,11],bad:[-Infinity,3]},children:[l.PlayerMP,"MP"]})})]}),(0,o.createComponentVNode)(2,i.Box,{my:1,mx:4}),(0,o.createComponentVNode)(2,i.Section,{backgroundColor:1===l.PauseState?"#1b3622":"#471915",children:l.Status})]}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:[(0,o.createComponentVNode)(2,i.ProgressBar,{value:l.Hitpoints,minValue:0,maxValue:45,ranges:{good:[30,Infinity],average:[5,30],bad:[-Infinity,5]},children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:l.Hitpoints}),"HP"]}),(0,o.createComponentVNode)(2,i.Box,{m:1}),(0,o.createComponentVNode)(2,i.Section,{inline:!0,width:"156px",textAlign:"center",children:(0,o.createVNode)(1,"img",null,null,1,{src:l.BossID})})]})]}),(0,o.createComponentVNode)(2,i.Box,{my:1,mx:4}),(0,o.createComponentVNode)(2,i.Button,{icon:"fist-raised",tooltip:"Go in for the kill!",tooltipPosition:"top",disabled:0===l.GameActive||1===l.PauseState,onClick:function(){return c("Attack")},content:"Attack!"}),(0,o.createComponentVNode)(2,i.Button,{icon:"band-aid",tooltip:"Heal yourself!",tooltipPosition:"top",disabled:0===l.GameActive||1===l.PauseState,onClick:function(){return c("Heal")},content:"Heal!"}),(0,o.createComponentVNode)(2,i.Button,{icon:"magic",tooltip:"Recharge your magic!",tooltipPosition:"top",disabled:0===l.GameActive||1===l.PauseState,onClick:function(){return c("Recharge_Power")},content:"Recharge!"})]}),(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"sync-alt",tooltip:"One more game couldn't hurt.",tooltipPosition:"top",disabled:1===l.GameActive,onClick:function(){return c("Start_Game")},content:"Begin Game"}),(0,o.createComponentVNode)(2,i.Button,{icon:"ticket-alt",tooltip:"Claim at your local Arcade Computer for Prizes!",tooltipPosition:"top",disabled:1===l.GameActive,onClick:function(){return c("Dispense_Tickets")},content:"Claim Tickets"})]}),(0,o.createComponentVNode)(2,i.Box,{color:l.TicketCount>=1?"good":"normal",children:["Earned Tickets: ",l.TicketCount]})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosAtmos=void 0;var o=n(0),r=n(16),i=n(33),a=n(15),c=n(1),l=n(3),d=n(38),u=n(2);t.NtosAtmos=function(e,t){var n=(0,c.useBackend)(t),s=(n.act,n.data),p=s.AirTemp,m=s.AirPressure,f=(0,i.flow)([(0,r.filter)((function(e){return e.percentage>=.01})),(0,r.sortBy)((function(e){return-e.percentage}))])(s.AirData||[]),h=Math.max.apply(Math,[1].concat(f.map((function(e){return e.percentage}))));return(0,o.createComponentVNode)(2,u.NtosWindow,{width:300,height:350,resizable:!0,children:(0,o.createComponentVNode)(2,u.NtosWindow.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,l.Section,{children:(0,o.createComponentVNode)(2,l.LabeledList,{children:[(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:"Temperature",children:[p,"\xb0C"]}),(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:"Pressure",children:[m," kPa"]})]})}),(0,o.createComponentVNode)(2,l.Section,{children:(0,o.createComponentVNode)(2,l.LabeledList,{children:f.map((function(e){return(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:(0,d.getGasLabel)(e.name),children:(0,o.createComponentVNode)(2,l.ProgressBar,{color:(0,d.getGasColor)(e.name),value:e.percentage,minValue:0,maxValue:h,children:(0,a.toFixed)(e.percentage,2)+"%"})},e.name)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosBountyConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(40),c=n(2);t.NtosBountyConsole=function(e,t){var n=(0,r.useBackend)(t),a=n.act,d=n.data.bountydata,u=void 0===d?[]:d;return(0,o.createComponentVNode)(2,c.NtosWindow,{width:750,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,c.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:(0,o.createComponentVNode)(2,l),buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"print",content:"Print Bounty List",onClick:function(){return a("Print")}}),children:(0,o.createComponentVNode)(2,i.Table,{border:!0,children:[(0,o.createComponentVNode)(2,i.Table.Row,{bold:!0,italic:!0,color:"label",fontSize:1.25,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Bounty Object"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Description"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Progress"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Value"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Claim"})]}),u.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{backgroundColor:1===e.priority?"rgba(252, 152, 3, 0.25)":"",children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,children:e.name}),(0,o.createComponentVNode)(2,i.Table.Cell,{italic:!0,textAlign:"center",p:1,children:e.description}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,textAlign:"center",children:[1===e.priority?(0,o.createComponentVNode)(2,i.Box,{children:"High Priority"}):"",e.completion_string]}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,textAlign:"center",children:e.reward_string}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,textAlign:"center",icon:1===e.claimed?"check":"",content:1===e.claimed?"Claimed":"Claim",disabled:1===e.claimed,color:1===e.can_claim?"green":"red",onClick:function(){return a("ClaimBounty",{bounty:e.bounty_ref})}})})]},e.name)}))]})})})})};var l=function(e,t){var n=(0,r.useBackend)(t),c=(n.act,n.data.stored_cash);return(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:c,format:function(e){return(0,a.formatMoney)(e)}})," credits"]})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosCardContent=t.NtosCard=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(177);t.NtosCard=function(e,t){return(0,o.createComponentVNode)(2,a.NtosWindow,{width:450,height:520,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,l)})})};var l=function(e,t){var n=(0,r.useBackend)(t),a=n.act,l=n.data,d=(0,r.useLocalState)(t,"tab",1),u=d[0],s=d[1],p=l.authenticated,m=l.regions,f=void 0===m?[]:m,h=l.access_on_card,C=void 0===h?[]:h,g=l.jobs,b=void 0===g?{}:g,N=l.id_rank,v=l.id_owner,V=l.has_id,y=l.have_printer,k=l.have_id_slot,x=l.id_name,_=(0,r.useLocalState)(t,"department",Object.keys(b)[0]),w=_[0],B=_[1];if(!k)return(0,o.createComponentVNode)(2,i.NoticeBox,{children:"This program requires an ID slot in order to function"});var S=b[w]||[];return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:V&&p?(0,o.createComponentVNode)(2,i.Input,{value:v,width:"250px",onInput:function(e,t){return a("PRG_edit",{name:t})}}):v||"No Card Inserted",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"print",content:"Print",disabled:!y||!V,onClick:function(){return a("PRG_print")}}),(0,o.createComponentVNode)(2,i.Button,{icon:p?"sign-out-alt":"sign-in-alt",content:p?"Log Out":"Log In",color:p?"bad":"good",onClick:function(){a(p?"PRG_logout":"PRG_authenticate")}})],4),children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"eject",content:x,onClick:function(){return a("PRG_eject")}})}),!!V&&!!p&&(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.Tabs,{children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:1===u,onClick:function(){return s(1)},children:"Access"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:2===u,onClick:function(){return s(2)},children:"Jobs"})]}),1===u&&(0,o.createComponentVNode)(2,c.AccessList,{accesses:f,selectedList:C,accessMod:function(e){return a("PRG_access",{access_target:e})},grantAll:function(){return a("PRG_grantall")},denyAll:function(){return a("PRG_denyall")},grantDep:function(e){return a("PRG_grantregion",{region:e})},denyDep:function(e){return a("PRG_denyregion",{region:e})}}),2===u&&(0,o.createComponentVNode)(2,i.Section,{title:N,buttons:(0,o.createComponentVNode)(2,i.Button.Confirm,{icon:"exclamation-triangle",content:"Terminate",color:"bad",onClick:function(){return a("PRG_terminate")}}),children:[(0,o.createComponentVNode)(2,i.Button.Input,{fluid:!0,content:"Custom...",onCommit:function(e,t){return a("PRG_assign",{assign_target:"Custom",custom_name:t})}}),(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Tabs,{vertical:!0,children:Object.keys(b).map((function(e){return(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:e===w,onClick:function(){return B(e)},children:e},e)}))})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,children:S.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:e.display_name,onClick:function(){return a("PRG_assign",{assign_target:e.job})}},e.job)}))})]})]})]})],0)};t.NtosCardContent=l},function(e,t,n){"use strict";t.__esModule=!0,t.NtosConfiguration=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosConfiguration=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.PC_device_theme,u=l.power_usage,s=l.battery_exists,p=l.battery,m=void 0===p?{}:p,f=l.disk_size,h=l.disk_used,C=l.hardware,g=void 0===C?[]:C;return(0,o.createComponentVNode)(2,a.NtosWindow,{theme:d,width:420,height:630,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Power Supply",buttons:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,mr:1,children:["Power Draw: ",u,"W"]}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Battery Status",color:!s&&"average",children:s?(0,o.createComponentVNode)(2,i.ProgressBar,{value:m.charge,minValue:0,maxValue:m.max,ranges:{good:[m.max/2,Infinity],average:[m.max/4,m.max/2],bad:[-Infinity,m.max/4]},children:[m.charge," / ",m.max]}):"Not Available"})})}),(0,o.createComponentVNode)(2,i.Section,{title:"File System",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:h,minValue:0,maxValue:f,color:"good",children:[h," GQ / ",f," GQ"]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Hardware Components",children:g.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name,level:2,buttons:(0,o.createFragment)([!e.critical&&(0,o.createComponentVNode)(2,i.Button.Checkbox,{content:"Enabled",checked:e.enabled,mr:1,onClick:function(){return c("PC_toggle_component",{name:e.name})}}),(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,mr:1,children:["Power Usage: ",e.powerusage,"W"]})],0),children:e.desc},e.name)}))})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosCrewManifest=void 0;var o=n(0),r=n(16),i=n(1),a=n(3),c=n(2);t.NtosCrewManifest=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.have_printer,s=d.manifest,p=void 0===s?{}:s;return(0,o.createComponentVNode)(2,c.NtosWindow,{width:400,height:480,resizable:!0,children:(0,o.createComponentVNode)(2,c.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:"Crew Manifest",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"print",content:"Print",disabled:!u,onClick:function(){return l("PRG_print")}}),children:(0,r.map)((function(e,t){return(0,o.createComponentVNode)(2,a.Section,{level:2,title:t,children:(0,o.createComponentVNode)(2,a.Table,{children:e.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,a.Table.Cell,{bold:!0,children:e.name}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:["(",e.rank,")"]})]},e.name)}))})},t)}))(p)})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosCyborgRemoteMonitorSyndicate=void 0;var o=n(0),r=n(2),i=n(181);t.NtosCyborgRemoteMonitorSyndicate=function(e,t){return(0,o.createComponentVNode)(2,r.NtosWindow,{width:600,height:800,theme:"syndicate",children:(0,o.createComponentVNode)(2,r.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.NtosCyborgRemoteMonitorContent)})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosFileManager=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosFileManager=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.PC_device_theme,s=d.usbconnected,p=d.files,m=void 0===p?[]:p,f=d.usbfiles,h=void 0===f?[]:f;return(0,o.createComponentVNode)(2,a.NtosWindow,{resizable:!0,theme:u,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,c,{files:m,usbconnected:s,onUpload:function(e){return l("PRG_copytousb",{name:e})},onDelete:function(e){return l("PRG_deletefile",{name:e})},onRename:function(e,t){return l("PRG_rename",{name:e,new_name:t})},onDuplicate:function(e){return l("PRG_clone",{file:e})}})}),s&&(0,o.createComponentVNode)(2,i.Section,{title:"Data Disk",children:(0,o.createComponentVNode)(2,c,{usbmode:!0,files:h,usbconnected:s,onUpload:function(e){return l("PRG_copyfromusb",{name:e})},onDelete:function(e){return l("PRG_deletefile",{name:e})},onRename:function(e,t){return l("PRG_rename",{name:e,new_name:t})},onDuplicate:function(e){return l("PRG_clone",{file:e})}})})]})})};var c=function(e){var t=e.files,n=void 0===t?[]:t,r=e.usbconnected,a=e.usbmode,c=e.onUpload,l=e.onDelete,d=e.onRename;return(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:"File"}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:"Type"}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:"Size"})]}),n.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:e.undeletable?e.name:(0,o.createComponentVNode)(2,i.Button.Input,{fluid:!0,content:e.name,currentValue:e.name,tooltip:"Rename",onCommit:function(t,n){return d(e.name,n)}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:e.type}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:e.size}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:!e.undeletable&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button.Confirm,{icon:"trash",confirmIcon:"times",confirmContent:"",tooltip:"Delete",onClick:function(){return l(e.name)}}),!!r&&(a?(0,o.createComponentVNode)(2,i.Button,{icon:"download",tooltip:"Download",onClick:function(){return c(e.name)}}):(0,o.createComponentVNode)(2,i.Button,{icon:"upload",tooltip:"Upload",onClick:function(){return c(e.name)}}))],0)})]},e.name)}))]})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosJobManagerContent=t.NtosJobManager=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosJobManager=function(e,t){return(0,o.createComponentVNode)(2,a.NtosWindow,{width:400,height:620,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.authed,d=c.cooldown,u=c.slots,s=void 0===u?[]:u,p=c.prioritized,m=void 0===p?[]:p;return l?(0,o.createComponentVNode)(2,i.Section,{children:[d>0&&(0,o.createComponentVNode)(2,i.Dimmer,{children:(0,o.createComponentVNode)(2,i.Box,{bold:!0,textAlign:"center",fontSize:"20px",children:["On Cooldown: ",d,"s"]})}),(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:"Prioritized"}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:"Slots"})]}),s.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,children:(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,content:e.title,disabled:e.total<=0,checked:e.total>0&&m.includes(e.title),onClick:function(){return a("PRG_priority",{target:e.title})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:[e.current," / ",e.total]}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:[(0,o.createComponentVNode)(2,i.Button,{content:"Open",disabled:!e.status_open,onClick:function(){return a("PRG_open_job",{target:e.title})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Close",disabled:!e.status_close,onClick:function(){return a("PRG_close_job",{target:e.title})}})]})]},e.title)}))]})]}):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Current ID does not have access permissions to change job slots."})};t.NtosJobManagerContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.NtosMain=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c={compconfig:"cog",ntndownloader:"download",filemanager:"folder",smmonitor:"radiation",alarmmonitor:"bell",cardmod:"id-card",arcade:"gamepad",ntnrc_client:"comment-alt",nttransfer:"exchange-alt",powermonitor:"plug",job_manage:"address-book",crewmani:"clipboard-list",robocontrol:"robot",atmosscan:"thermometer-half",shipping:"tags"};t.NtosMain=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.device_theme,s=d.programs,p=void 0===s?[]:s,m=d.has_light,f=d.light_on,h=d.comp_light_color;return(0,o.createComponentVNode)(2,a.NtosWindow,{title:"syndicate"===u?"Syndix Main Menu":"NtOS Main Menu",theme:u,width:400,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:[!!m&&(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.Button,{width:"144px",icon:"lightbulb",selected:f,onClick:function(){return l("PC_toggle_light")},children:["Flashlight: ",f?"ON":"OFF"]}),(0,o.createComponentVNode)(2,i.Button,{ml:1,onClick:function(){return l("PC_light_color")},children:["Color:",(0,o.createComponentVNode)(2,i.ColorBox,{ml:1,color:h})]})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Programs",children:(0,o.createComponentVNode)(2,i.Table,{children:p.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,color:"transparent",icon:c[e.name]||"window-maximize-o",content:e.desc,onClick:function(){return l("PC_runprogram",{name:e.name})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,width:"18px",children:!!e.running&&(0,o.createComponentVNode)(2,i.Button,{color:"transparent",icon:"times",tooltip:"Close program",tooltipPosition:"left",onClick:function(){return l("PC_killprogram",{name:e.name})}})})]},e.name)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosNetChat=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosNetChat=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.can_admin,u=l.adminmode,s=l.authed,p=l.username,m=l.active_channel,f=l.is_operator,h=l.all_channels,C=void 0===h?[]:h,g=l.clients,b=void 0===g?[]:g,N=l.messages,v=void 0===N?[]:N,V=null!==m,y=s||u;return(0,o.createComponentVNode)(2,a.NtosWindow,{width:900,height:675,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{children:(0,o.createComponentVNode)(2,i.Section,{height:"600px",children:(0,o.createComponentVNode)(2,i.Table,{height:"580px",children:(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{verticalAlign:"top",style:{width:"200px"},children:[(0,o.createComponentVNode)(2,i.Box,{height:"537px",overflowY:"scroll",children:[(0,o.createComponentVNode)(2,i.Button.Input,{fluid:!0,content:"New Channel...",onCommit:function(e,t){return c("PRG_newchannel",{new_channel_name:t})}}),C.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:e.chan,selected:e.id===m,color:"transparent",onClick:function(){return c("PRG_joinchannel",{id:e.id})}},e.chan)}))]}),(0,o.createComponentVNode)(2,i.Button.Input,{fluid:!0,mt:1,content:p+"...",currentValue:p,onCommit:function(e,t){return c("PRG_changename",{new_name:t})}}),!!d&&(0,o.createComponentVNode)(2,i.Button,{fluid:!0,bold:!0,content:"ADMIN MODE: "+(u?"ON":"OFF"),color:u?"bad":"good",onClick:function(){return c("PRG_toggleadmin")}})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[(0,o.createComponentVNode)(2,i.Box,{height:"560px",overflowY:"scroll",children:V&&(y?v.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:e.msg},e.msg)})):(0,o.createComponentVNode)(2,i.Box,{textAlign:"center",children:[(0,o.createComponentVNode)(2,i.Icon,{name:"exclamation-triangle",mt:4,fontSize:"40px"}),(0,o.createComponentVNode)(2,i.Box,{mt:1,bold:!0,fontSize:"18px",children:"THIS CHANNEL IS PASSWORD PROTECTED"}),(0,o.createComponentVNode)(2,i.Box,{mt:1,children:"INPUT PASSWORD TO ACCESS"})]}))}),(0,o.createComponentVNode)(2,i.Input,{fluid:!0,selfClear:!0,mt:1,onEnter:function(e,t){return c("PRG_speak",{message:t})}})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{verticalAlign:"top",style:{width:"150px"},children:[(0,o.createComponentVNode)(2,i.Box,{height:"477px",overflowY:"scroll",children:b.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:e.name},e.name)}))}),V&&y&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button.Input,{fluid:!0,content:"Save log...",defaultValue:"new_log",onCommit:function(e,t){return c("PRG_savelog",{log_name:t})}}),(0,o.createComponentVNode)(2,i.Button.Confirm,{fluid:!0,content:"Leave Channel",onClick:function(){return c("PRG_leavechannel")}})],4),!!f&&s&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button.Confirm,{fluid:!0,content:"Delete Channel",onClick:function(){return c("PRG_deletechannel")}}),(0,o.createComponentVNode)(2,i.Button.Input,{fluid:!0,content:"Rename Channel...",onCommit:function(e,t){return c("PRG_renamechannel",{new_name:t})}}),(0,o.createComponentVNode)(2,i.Button.Input,{fluid:!0,content:"Set Password...",onCommit:function(e,t){return c("PRG_setpassword",{new_password:t})}})],4)]})]})})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosNetDosContent=t.NtosNetDos=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosNetDos=function(e,t){return(0,o.createComponentVNode)(2,a.NtosWindow,{width:400,height:250,theme:"syndicate",children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.relays,d=void 0===l?[]:l,u=c.focus,s=c.target,p=c.speed,m=c.overload,f=c.capacity,h=c.error;if(h)return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.NoticeBox,{children:h}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Reset",textAlign:"center",onClick:function(){return a("PRG_reset")}})],4);var C=function(e){for(var t="",n=m/f;t.lengthn?t+="0":t+="1";return t};return s?(0,o.createComponentVNode)(2,i.Section,{fontFamily:"monospace",textAlign:"center",children:[(0,o.createComponentVNode)(2,i.Box,{children:["CURRENT SPEED: ",p," GQ/s"]}),(0,o.createComponentVNode)(2,i.Box,{children:C(45)}),(0,o.createComponentVNode)(2,i.Box,{children:C(45)}),(0,o.createComponentVNode)(2,i.Box,{children:C(45)}),(0,o.createComponentVNode)(2,i.Box,{children:C(45)}),(0,o.createComponentVNode)(2,i.Box,{children:C(45)})]}):(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Target",children:d.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e.id,selected:u===e.id,onClick:function(){return a("PRG_target_relay",{targid:e.id})}},e.id)}))})}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,bold:!0,content:"EXECUTE",color:"bad",textAlign:"center",disabled:!u,mt:1,onClick:function(){return a("PRG_execute")}})]})};t.NtosNetDosContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.NtosNetDownloader=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosNetDownloader=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.PC_device_theme,s=d.disk_size,p=d.disk_used,m=d.downloadable_programs,f=void 0===m?[]:m,h=d.error,C=d.hacked_programs,g=void 0===C?[]:C,b=d.hackedavailable;return(0,o.createComponentVNode)(2,a.NtosWindow,{theme:u,width:480,height:735,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:[!!h&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:[(0,o.createComponentVNode)(2,i.Box,{mb:1,children:h}),(0,o.createComponentVNode)(2,i.Button,{content:"Reset",onClick:function(){return l("PRG_reseterror")}})]}),(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Disk usage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:p,minValue:0,maxValue:s,children:p+" GQ / "+s+" GQ"})})})}),(0,o.createComponentVNode)(2,i.Section,{children:f.map((function(e){return(0,o.createComponentVNode)(2,c,{program:e},e.filename)}))}),!!b&&(0,o.createComponentVNode)(2,i.Section,{title:"UNKNOWN Software Repository",children:[(0,o.createComponentVNode)(2,i.NoticeBox,{mb:1,children:"Please note that Nanotrasen does not recommend download of software from non-official servers."}),g.map((function(e){return(0,o.createComponentVNode)(2,c,{program:e},e.filename)}))]})]})})};var c=function(e,t){var n=e.program,a=(0,r.useBackend)(t),c=a.act,l=a.data,d=l.disk_size,u=l.disk_used,s=l.downloadcompletion,p=l.downloading,m=l.downloadname,f=l.downloadsize,h=d-u;return(0,o.createComponentVNode)(2,i.Box,{mb:3,children:[(0,o.createComponentVNode)(2,i.Flex,{align:"baseline",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{bold:!0,grow:1,children:n.filedesc}),(0,o.createComponentVNode)(2,i.Flex.Item,{color:"label",nowrap:!0,children:[n.size," GQ"]}),(0,o.createComponentVNode)(2,i.Flex.Item,{ml:2,width:"94px",textAlign:"center",children:n.filename===m&&(0,o.createComponentVNode)(2,i.ProgressBar,{color:"green",minValue:0,maxValue:f,value:s})||(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"download",content:"Download",disabled:p||n.size>h,onClick:function(){return c("PRG_downloadfile",{filename:n.filename})}})})]}),"Compatible"!==n.compatibility&&(0,o.createComponentVNode)(2,i.Box,{mt:1,italic:!0,fontSize:"12px",position:"relative",children:[(0,o.createComponentVNode)(2,i.Icon,{mx:1,color:"red",name:"times"}),"Incompatible!"]}),n.size>h&&(0,o.createComponentVNode)(2,i.Box,{mt:1,italic:!0,fontSize:"12px",position:"relative",children:[(0,o.createComponentVNode)(2,i.Icon,{mx:1,color:"red",name:"times"}),"Not enough disk space!"]}),(0,o.createComponentVNode)(2,i.Box,{mt:1,italic:!0,color:"label",fontSize:"12px",children:n.fileinfo})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosNetMonitor=void 0;var o=n(0),r=n(3),i=n(1),a=n(2);t.NtosNetMonitor=function(e,t){var n=(0,i.useBackend)(t),c=n.act,l=n.data,d=l.ntnetrelays,u=l.ntnetstatus,s=l.config_softwaredownload,p=l.config_peertopeer,m=l.config_communication,f=l.config_systemcontrol,h=l.idsalarm,C=l.idsstatus,g=l.ntnetmaxlogs,b=l.maxlogs,N=l.minlogs,v=l.ntnetlogs,V=void 0===v?[]:v;return(0,o.createComponentVNode)(2,a.NtosWindow,{resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,r.NoticeBox,{children:"WARNING: Disabling wireless transmitters when using a wireless device may prevent you from reenabling them!"}),(0,o.createComponentVNode)(2,r.Section,{title:"Wireless Connectivity",buttons:(0,o.createComponentVNode)(2,r.Button.Confirm,{icon:u?"power-off":"times",content:u?"ENABLED":"DISABLED",selected:u,onClick:function(){return c("toggleWireless")}}),children:d?(0,o.createComponentVNode)(2,r.LabeledList,{children:(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Active NTNet Relays",children:d})}):"No Relays Connected"}),(0,o.createComponentVNode)(2,r.Section,{title:"Firewall Configuration",children:(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Software Downloads",buttons:(0,o.createComponentVNode)(2,r.Button,{icon:s?"power-off":"times",content:s?"ENABLED":"DISABLED",selected:s,onClick:function(){return c("toggle_function",{id:"1"})}})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Peer to Peer Traffic",buttons:(0,o.createComponentVNode)(2,r.Button,{icon:p?"power-off":"times",content:p?"ENABLED":"DISABLED",selected:p,onClick:function(){return c("toggle_function",{id:"2"})}})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Communication Systems",buttons:(0,o.createComponentVNode)(2,r.Button,{icon:m?"power-off":"times",content:m?"ENABLED":"DISABLED",selected:m,onClick:function(){return c("toggle_function",{id:"3"})}})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Remote System Control",buttons:(0,o.createComponentVNode)(2,r.Button,{icon:f?"power-off":"times",content:f?"ENABLED":"DISABLED",selected:f,onClick:function(){return c("toggle_function",{id:"4"})}})})]})}),(0,o.createComponentVNode)(2,r.Section,{title:"Security Systems",children:[!!h&&(0,o.createFragment)([(0,o.createComponentVNode)(2,r.NoticeBox,{children:"NETWORK INCURSION DETECTED"}),(0,o.createComponentVNode)(2,r.Box,{italics:!0,children:"Abnormal activity has been detected in the network. Check system logs for more information"})],4),(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"IDS Status",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Button,{icon:C?"power-off":"times",content:C?"ENABLED":"DISABLED",selected:C,onClick:function(){return c("toggleIDS")}}),(0,o.createComponentVNode)(2,r.Button,{icon:"sync",content:"Reset",color:"bad",onClick:function(){return c("resetIDS")}})],4)}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Max Log Count",buttons:(0,o.createComponentVNode)(2,r.NumberInput,{value:g,minValue:N,maxValue:b,width:"39px",onChange:function(e,t){return c("updatemaxlogs",{new_number:t})}})})]}),(0,o.createComponentVNode)(2,r.Section,{title:"System Log",level:2,buttons:(0,o.createComponentVNode)(2,r.Button.Confirm,{icon:"trash",content:"Clear Logs",onClick:function(){return c("purgelogs")}}),children:V.map((function(e){return(0,o.createComponentVNode)(2,r.Box,{className:"candystripe",children:e.entry},e.entry)}))})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosPowerMonitor=void 0;var o=n(0),r=n(2),i=n(128);t.NtosPowerMonitor=function(){return(0,o.createComponentVNode)(2,r.NtosWindow,{width:550,height:700,resizable:!0,children:(0,o.createComponentVNode)(2,r.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.PowerMonitorContent)})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosRadarSyndicate=void 0;var o=n(0),r=n(2),i=n(182);t.NtosRadarSyndicate=function(e,t){return(0,o.createComponentVNode)(2,r.NtosWindow,{width:800,height:600,theme:"syndicate",children:(0,o.createComponentVNode)(2,i.NtosRadarContent)})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosRequestKiosk=void 0;var o=n(0),r=n(183),i=n(2);t.NtosRequestKiosk=function(e,t){return(0,o.createComponentVNode)(2,i.NtosWindow,{width:550,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,i.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,r.RequestKioskContent)})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosRevelation=void 0;var o=n(0),r=n(3),i=n(1),a=n(2);t.NtosRevelation=function(e,t){var n=(0,i.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.NtosWindow,{width:400,height:250,theme:"syndicate",children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{children:(0,o.createComponentVNode)(2,r.Section,{children:[(0,o.createComponentVNode)(2,r.Button.Input,{fluid:!0,content:"Obfuscate Name...",onCommit:function(e,t){return c("PRG_obfuscate",{new_name:t})},mb:1}),(0,o.createComponentVNode)(2,r.LabeledList,{children:(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Payload Status",buttons:(0,o.createComponentVNode)(2,r.Button,{content:l.armed?"ARMED":"DISARMED",color:l.armed?"bad":"average",onClick:function(){return c("PRG_arm")}})})}),(0,o.createComponentVNode)(2,r.Button,{fluid:!0,bold:!0,content:"ACTIVATE",textAlign:"center",color:"bad",disabled:!l.armed})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosRoboControl=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosRoboControl=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.bots,s=d.id_owner,p=d.has_id;return(0,o.createComponentVNode)(2,a.NtosWindow,{width:550,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Robot Control Console",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Id Card",children:[s,!!p&&(0,o.createComponentVNode)(2,i.Button,{ml:2,icon:"eject",content:"Eject",onClick:function(){return l("ejectcard")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Bots in range",children:d.botcount})]})}),null==u?void 0:u.map((function(e){return(0,o.createComponentVNode)(2,c,{robot:e},e.bot_ref)}))]})})};var c=function(e,t){var n=e.robot,a=(0,r.useBackend)(t),c=a.act,l=a.data,d=l.mules||[],u=!!n.mule_check&&function(e,t){return null==e?void 0:e.find((function(e){return e.mule_ref===t}))}(d,n.bot_ref),s=1===n.mule_check?"rgba(110, 75, 14, 1)":"rgba(74, 59, 140, 1)";return(0,o.createComponentVNode)(2,i.Section,{title:n.name,style:{border:"4px solid "+s},buttons:u&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"play",tooltip:"Go to Destination.",onClick:function(){return c("go",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"pause",tooltip:"Stop Moving.",onClick:function(){return c("stop",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"home",tooltip:"Travel Home.",tooltipPosition:"bottom-left",onClick:function(){return c("home",{robot:u.mule_ref})}})],4),children:(0,o.createComponentVNode)(2,i.Flex,{spacing:1,children:[(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Model",children:n.model}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Location",children:n.locat}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:n.mode}),u&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Loaded Cargo",children:l.load||"N/A"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Home",children:u.home}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Destination",children:u.dest||"N/A"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:u.power,minValue:0,maxValue:100,ranges:{good:[60,Infinity],average:[20,60],bad:[-Infinity,20]}})})],4)]})}),(0,o.createComponentVNode)(2,i.Flex.Item,{width:"150px",children:[u&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Set Destination",onClick:function(){return c("destination",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Set ID",onClick:function(){return c("setid",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Set Home",onClick:function(){return c("sethome",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Unload Cargo",onClick:function(){return c("unload",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,content:"Auto Return",checked:u.autoReturn,onClick:function(){return c("autoret",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,content:"Auto Pickup",checked:u.autoPickup,onClick:function(){return c("autopick",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,content:"Delivery Report",checked:u.reportDelivery,onClick:function(){return c("report",{robot:u.mule_ref})}})],4),!u&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Stop Patrol",onClick:function(){return c("patroloff",{robot:n.bot_ref})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Start Patrol",onClick:function(){return c("patrolon",{robot:n.bot_ref})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Summon",onClick:function(){return c("summon",{robot:n.bot_ref})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Eject PAi",onClick:function(){return c("ejectpai",{robot:n.bot_ref})}})],4)]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosShipping=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosShipping=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.NtosWindow,{width:450,height:350,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"NTOS Shipping Hub.",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject Id",onClick:function(){return c("ejectid")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current User",children:l.current_user||"N/A"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Inserted Card",children:l.card_owner||"N/A"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Available Paper",children:l.has_printer?l.paperamt:"N/A"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Profit on Sale",children:[l.barcode_split,"%"]})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Shipping Options",children:[(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.Button,{icon:"id-card",tooltip:"The currently ID card will become the current user.",tooltipPosition:"right",disabled:!l.has_id_slot,onClick:function(){return c("selectid")},content:"Set Current ID"})}),(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.Button,{icon:"print",tooltip:"Print a barcode to use on a wrapped package.",tooltipPosition:"right",disabled:!l.has_printer||!l.current_user,onClick:function(){return c("print")},content:"Print Barcode"})}),(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.Button,{icon:"tags",tooltip:"Set how much profit you'd like on your package.",tooltipPosition:"right",onClick:function(){return c("setsplit")},content:"Set Profit Margin"})}),(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.Button,{icon:"sync-alt",content:"Reset ID",onClick:function(){return c("resetid")}})})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosStationAlertConsole=void 0;var o=n(0),r=n(2),i=n(184);t.NtosStationAlertConsole=function(){return(0,o.createComponentVNode)(2,r.NtosWindow,{width:315,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,r.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.StationAlertConsoleContent)})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosSupermatterMonitorContent=t.NtosSupermatterMonitor=void 0;var o=n(0),r=n(16),i=n(33),a=n(15),c=n(1),l=n(3),d=n(38),u=n(2),s=function(e){return Math.log2(16+Math.max(0,e))-4};t.NtosSupermatterMonitor=function(e,t){return(0,o.createComponentVNode)(2,u.NtosWindow,{width:600,height:350,resizable:!0,children:(0,o.createComponentVNode)(2,u.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,p)})})};var p=function(e,t){var n=(0,c.useBackend)(t),u=n.act,p=n.data,f=p.active,h=p.SM_integrity,C=p.SM_power,g=p.SM_ambienttemp,b=p.SM_ambientpressure;if(!f)return(0,o.createComponentVNode)(2,m);var N=(0,i.flow)([function(e){return e.filter((function(e){return e.amount>=.01}))},(0,r.sortBy)((function(e){return-e.amount}))])(p.gases||[]),v=Math.max.apply(Math,[1].concat(N.map((function(e){return e.amount}))));return(0,o.createComponentVNode)(2,l.Flex,{spacing:1,children:[(0,o.createComponentVNode)(2,l.Flex.Item,{width:"270px",children:(0,o.createComponentVNode)(2,l.Section,{title:"Metrics",children:(0,o.createComponentVNode)(2,l.LabeledList,{children:[(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:"Integrity",children:(0,o.createComponentVNode)(2,l.ProgressBar,{value:h/100,ranges:{good:[.9,Infinity],average:[.5,.9],bad:[-Infinity,.5]}})}),(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:"Relative EER",children:(0,o.createComponentVNode)(2,l.ProgressBar,{value:C,minValue:0,maxValue:5e3,ranges:{good:[-Infinity,5e3],average:[5e3,7e3],bad:[7e3,Infinity]},children:(0,a.toFixed)(C)+" MeV/cm3"})}),(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:"Temperature",children:(0,o.createComponentVNode)(2,l.ProgressBar,{value:s(g),minValue:0,maxValue:s(1e4),ranges:{teal:[-Infinity,s(80)],good:[s(80),s(373)],average:[s(373),s(1e3)],bad:[s(1e3),Infinity]},children:(0,a.toFixed)(g)+" K"})}),(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:"Pressure",children:(0,o.createComponentVNode)(2,l.ProgressBar,{value:s(b),minValue:0,maxValue:s(5e4),ranges:{good:[s(1),s(300)],average:[-Infinity,s(1e3)],bad:[s(1e3),+Infinity]},children:(0,a.toFixed)(b)+" kPa"})})]})})}),(0,o.createComponentVNode)(2,l.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,l.Section,{title:"Gases",buttons:(0,o.createComponentVNode)(2,l.Button,{icon:"arrow-left",content:"Back",onClick:function(){return u("PRG_clear")}}),children:(0,o.createComponentVNode)(2,l.LabeledList,{children:N.map((function(e){return(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:(0,d.getGasLabel)(e.name),children:(0,o.createComponentVNode)(2,l.ProgressBar,{color:(0,d.getGasColor)(e.name),value:e.amount,minValue:0,maxValue:v,children:(0,a.toFixed)(e.amount,2)+"%"})},e.name)}))})})})]})};t.NtosSupermatterMonitorContent=p;var m=function(e,t){var n=(0,c.useBackend)(t),r=n.act,i=n.data.supermatters,a=void 0===i?[]:i;return(0,o.createComponentVNode)(2,l.Section,{title:"Detected Supermatters",buttons:(0,o.createComponentVNode)(2,l.Button,{icon:"sync",content:"Refresh",onClick:function(){return r("PRG_refresh")}}),children:(0,o.createComponentVNode)(2,l.Table,{children:a.map((function(e){return(0,o.createComponentVNode)(2,l.Table.Row,{children:[(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.uid+". "+e.area_name}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,color:"label",children:"Integrity:"}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,width:"120px",children:(0,o.createComponentVNode)(2,l.ProgressBar,{value:e.integrity/100,ranges:{good:[.9,Infinity],average:[.5,.9],bad:[-Infinity,.5]}})}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,children:(0,o.createComponentVNode)(2,l.Button,{content:"Details",onClick:function(){return r("PRG_set",{target:e.uid})}})})]},e.uid)}))})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NuclearBomb=void 0;var o=n(0),r=n(6),i=n(1),a=n(3),c=n(2),l=function(e,t){var n=(0,i.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Box,{width:"185px",children:(0,o.createComponentVNode)(2,a.Grid,{width:"1px",children:[["1","4","7","C"],["2","5","8","0"],["3","6","9","E"]].map((function(e){return(0,o.createComponentVNode)(2,a.Grid.Column,{children:e.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,mb:"6px",content:e,textAlign:"center",fontSize:"40px",lineHeight:1.25,width:"55px",className:(0,r.classes)(["NuclearBomb__Button","NuclearBomb__Button--keypad","NuclearBomb__Button--"+e]),onClick:function(){return n("keypad",{digit:e})}},e)}))},e[0])}))})})};t.NuclearBomb=function(e,t){var n=(0,i.useBackend)(t),r=n.act,d=n.data,u=(d.anchored,d.disk_present,d.status1),s=d.status2;return(0,o.createComponentVNode)(2,c.Window,{width:350,height:442,theme:"retro",children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Box,{m:"6px",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"6px",className:"NuclearBomb__displayBox",children:u}),(0,o.createComponentVNode)(2,a.Flex,{mb:1.5,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Box,{className:"NuclearBomb__displayBox",children:s})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",fontSize:"24px",lineHeight:1,textAlign:"center",width:"43px",ml:"6px",mr:"3px",mt:"3px",className:"NuclearBomb__Button NuclearBomb__Button--keypad",onClick:function(){return r("eject_disk")}})})]}),(0,o.createComponentVNode)(2,a.Flex,{ml:"3px",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,l)}),(0,o.createComponentVNode)(2,a.Flex.Item,{ml:"6px",width:"129px",children:(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"ARM",textAlign:"center",fontSize:"28px",lineHeight:1.1,mb:"6px",className:"NuclearBomb__Button NuclearBomb__Button--C",onClick:function(){return r("arm")}}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"ANCHOR",textAlign:"center",fontSize:"28px",lineHeight:1.1,className:"NuclearBomb__Button NuclearBomb__Button--E",onClick:function(){return r("anchor")}}),(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",color:"#9C9987",fontSize:"80px",children:(0,o.createComponentVNode)(2,a.Icon,{name:"radiation"})}),(0,o.createComponentVNode)(2,a.Box,{height:"80px",className:"NuclearBomb__NTIcon"})]})})]})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.OperatingComputer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Respiratory",type:"oxyLoss"}];t.OperatingComputer=function(e,t){var n=(0,r.useSharedState)(t,"tab",1),c=n[0],u=n[1];return(0,o.createComponentVNode)(2,a.Window,{width:350,height:470,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Tabs,{children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:1===c,onClick:function(){return u(1)},children:"Patient State"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:2===c,onClick:function(){return u(2)},children:"Surgery Procedures"})]}),1===c&&(0,o.createComponentVNode)(2,l),2===c&&(0,o.createComponentVNode)(2,d)]})})};var l=function(e,t){var n=(0,r.useBackend)(t),a=(n.act,n.data),l=a.table,d=a.procedures,u=void 0===d?[]:d,s=a.patient,p=void 0===s?{}:s;return l?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Patient State",children:p&&(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"State",color:p.statstate,children:p.stat}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Blood Type",children:p.blood_type}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Health",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:p.health,minValue:p.minHealth,maxValue:p.maxHealth,color:p.health>=0?"good":"average",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:p.health})})}),c.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.label,children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:p[e.type]/p.maxHealth,color:"bad",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:p[e.type]})})},e.type)}))]})||"No Patient Detected"}),0===u.length&&(0,o.createComponentVNode)(2,i.Section,{children:"No Active Procedures"}),u.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Next Step",children:[e.next_step,e.chems_needed&&(0,o.createFragment)([(0,o.createVNode)(1,"b",null,"Required Chemicals:",16),(0,o.createVNode)(1,"br"),e.chems_needed],0)]}),!!a.alternative_step&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Alternative Step",children:[e.alternative_step,e.alt_chems_needed&&(0,o.createFragment)([(0,o.createVNode)(1,"b",null,"Required Chemicals:",16),(0,o.createVNode)(1,"br"),e.alt_chems_needed],0)]})]})},e.name)}))],0):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No Table Detected"})},d=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data.surgeries,l=void 0===c?[]:c;return(0,o.createComponentVNode)(2,i.Section,{title:"Advanced Surgery Procedures",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"download",content:"Sync Research Database",onClick:function(){return a("sync")}}),l.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name,level:2,children:e.desc},e.name)}))]})}},function(e,t,n){"use strict";t.__esModule=!0,t.Orbit=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(2);function l(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return d(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return d(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);nt},f=function(e,t){var n=e.name,o=t.name,r=n.match(s),i=o.match(s);return r&&i&&n.replace(s,"")===o.replace(s,"")?parseInt(r[1],10)-parseInt(i[1],10):m(n,o)},h=function(e,t){var n=(0,i.useBackend)(t).act,r=e.searchText,c=e.source,l=e.title,d=c.filter(p(r));return d.sort(f),c.length>0&&(0,o.createComponentVNode)(2,a.Section,{title:l+" - ("+c.length+")",children:d.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{content:e.name.replace(u,""),onClick:function(){return n("orbit",{ref:e.ref})}},e.name)}))})},C=function(e,t){var n=(0,i.useBackend)(t).act,r=e.color,c=e.thing;return(0,o.createComponentVNode)(2,a.Button,{color:r,onClick:function(){return n("orbit",{ref:c.ref})},children:[c.name,c.orbiters&&(0,o.createComponentVNode)(2,a.Box,{inline:!0,ml:1,children:["(",c.orbiters," ",(0,o.createComponentVNode)(2,a.Box,{as:"img",src:"ghost.png",opacity:.7}),")"]})]})};t.Orbit=function(e,t){for(var n,r=(0,i.useBackend)(t),d=r.act,u=r.data,s=u.alive,g=u.antagonists,b=u.dead,N=u.ghosts,v=u.misc,V=u.npcs,y=(0,i.useLocalState)(t,"searchText",""),k=y[0],x=y[1],_={},w=l(g);!(n=w()).done;){var B=n.value;_[B.antag]===undefined&&(_[B.antag]=[]),_[B.antag].push(B)}var S=Object.entries(_);S.sort((function(e,t){return m(e[0],t[0])}));return(0,o.createComponentVNode)(2,c.Window,{title:"Orbit",width:350,height:700,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Icon,{name:"search",mr:1})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Input,{placeholder:"Search...",autoFocus:!0,fluid:!0,value:k,onInput:function(e,t){return x(t)},onEnter:function(e,t){return function(e){for(var t=0,n=[S.map((function(e){return e[0],e[1]})),s,N,b,V,v];t0&&(0,o.createComponentVNode)(2,a.Section,{title:"Ghost-Visible Antagonists",children:S.map((function(e){var t=e[0],n=e[1];return(0,o.createComponentVNode)(2,a.Section,{title:t,level:2,children:n.filter(p(k)).sort(f).map((function(e){return(0,o.createComponentVNode)(2,C,{color:"bad",thing:e},e.name)}))},t)}))}),(0,o.createComponentVNode)(2,a.Section,{title:"Alive",children:s.filter(p(k)).sort(f).map((function(e){return(0,o.createComponentVNode)(2,C,{color:"good",thing:e},e.name)}))}),(0,o.createComponentVNode)(2,h,{title:"Ghosts",source:N,searchText:k}),(0,o.createComponentVNode)(2,h,{title:"Dead",source:b,searchText:k}),(0,o.createComponentVNode)(2,h,{title:"NPCs",source:V,searchText:k}),(0,o.createComponentVNode)(2,h,{title:"Misc",source:v,searchText:k})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.OreBox=void 0;var o=n(0),r=n(19),i=n(3),a=n(1),c=n(2);t.OreBox=function(e,t){var n=(0,a.useBackend)(t),l=n.act,d=n.data.materials;return(0,o.createComponentVNode)(2,c.Window,{width:335,height:415,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Ores",buttons:(0,o.createComponentVNode)(2,i.Button,{content:"Empty",onClick:function(){return l("removeall")}}),children:(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:"Ore"}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,textAlign:"right",children:"Amount"})]}),d.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,r.toTitleCase)(e.name)}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,textAlign:"right",children:(0,o.createComponentVNode)(2,i.Box,{color:"label",inline:!0,children:e.amount})})]},e.type)}))]})}),(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Box,{children:["All ores will be placed in here when you are wearing a mining stachel on your belt or in a pocket while dragging the ore box.",(0,o.createVNode)(1,"br"),"Gibtonite is not accepted."]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.OreRedemptionMachine=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(2);t.OreRedemptionMachine=function(e,t){var n=(0,i.useBackend)(t),r=n.act,d=n.data,u=d.unclaimedPoints,s=d.materials,p=d.alloys,m=d.diskDesigns,f=d.hasDisk;return(0,o.createComponentVNode)(2,c.Window,{title:"Ore Redemption Machine",width:440,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.BlockQuote,{mb:1,children:["This machine only accepts ore.",(0,o.createVNode)(1,"br"),"Gibtonite and Slag are not accepted."]}),(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"label",mr:1,children:"Unclaimed points:"}),u,(0,o.createComponentVNode)(2,a.Button,{ml:2,content:"Claim",disabled:0===u,onClick:function(){return r("Claim")}})]})]}),(0,o.createComponentVNode)(2,a.Section,{children:f&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{mb:1,children:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",content:"Eject design disk",onClick:function(){return r("diskEject")}})}),(0,o.createComponentVNode)(2,a.Table,{children:m.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:["File ",e.index,": ",e.name]}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,children:(0,o.createComponentVNode)(2,a.Button,{disabled:!e.canupload,content:"Upload",onClick:function(){return r("diskUpload",{design:e.index})}})})]},e.index)}))})],4)||(0,o.createComponentVNode)(2,a.Button,{icon:"save",content:"Insert design disk",onClick:function(){return r("diskInsert")}})}),(0,o.createComponentVNode)(2,a.Section,{title:"Materials",children:(0,o.createComponentVNode)(2,a.Table,{children:s.map((function(e){return(0,o.createComponentVNode)(2,l,{material:e,onRelease:function(t){return r("Release",{id:e.id,sheets:t})}},e.id)}))})}),(0,o.createComponentVNode)(2,a.Section,{title:"Alloys",children:(0,o.createComponentVNode)(2,a.Table,{children:p.map((function(e){return(0,o.createComponentVNode)(2,l,{material:e,onRelease:function(t){return r("Smelt",{id:e.id,sheets:t})}},e.id)}))})})]})})};var l=function(e,t){var n=e.material,c=e.onRelease,l=(0,i.useLocalState)(t,"amount"+n.name,1),d=l[0],u=l[1],s=Math.floor(n.amount);return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,r.toTitleCase)(n.name).replace("Alloy","")}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:(0,o.createComponentVNode)(2,a.Box,{mr:2,color:"label",inline:!0,children:n.value&&n.value+" cr"})}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:(0,o.createComponentVNode)(2,a.Box,{mr:2,color:"label",inline:!0,children:[s," sheets"]})}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,children:[(0,o.createComponentVNode)(2,a.NumberInput,{width:"32px",step:1,stepPixelSize:5,minValue:1,maxValue:50,value:d,onChange:function(e,t){return u(t)}}),(0,o.createComponentVNode)(2,a.Button,{disabled:s<1,content:"Release",onClick:function(){return c(d)}})]})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.Pandemic=t.PandemicAntibodyDisplay=t.PandemicSymptomDisplay=t.PandemicDiseaseDisplay=t.PandemicBeakerDisplay=void 0;var o=n(0),r=n(16),i=n(1),a=n(3),c=n(2),l=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data,l=c.has_beaker,d=c.beaker_empty,u=c.has_blood,s=c.blood,p=!l||d;return(0,o.createComponentVNode)(2,a.Section,{title:"Beaker",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"times",content:"Empty and Eject",color:"bad",disabled:p,onClick:function(){return r("empty_eject_beaker")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"trash",content:"Empty",disabled:p,onClick:function(){return r("empty_beaker")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"eject",content:"Eject",disabled:!l,onClick:function(){return r("eject_beaker")}})],4),children:l?d?(0,o.createComponentVNode)(2,a.Box,{color:"bad",children:"Beaker is empty"}):u?(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Blood DNA",children:s&&s.dna||"Unknown"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Blood Type",children:s&&s.type||"Unknown"})]}):(0,o.createComponentVNode)(2,a.Box,{color:"bad",children:"No blood detected"}):(0,o.createComponentVNode)(2,a.NoticeBox,{children:"No beaker loaded"})})};t.PandemicBeakerDisplay=l;var d=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data,l=c.is_ready;return(c.viruses||[]).map((function(e){var t=e.symptoms||[];return(0,o.createComponentVNode)(2,a.Section,{title:e.can_rename?(0,o.createComponentVNode)(2,a.Input,{value:e.name,onChange:function(t,n){return r("rename_disease",{index:e.index,name:n})}}):e.name,buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"flask",content:"Create culture bottle",disabled:!l,onClick:function(){return r("create_culture_bottle",{index:e.index})}}),children:[(0,o.createComponentVNode)(2,a.Grid,{children:[(0,o.createComponentVNode)(2,a.Grid.Column,{children:e.description}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Agent",children:e.agent}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Spread",children:e.spread}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Possible Cure",children:e.cure})]})})]}),!!e.is_adv&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Statistics",level:2,children:(0,o.createComponentVNode)(2,a.Grid,{children:[(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Resistance",children:e.resistance}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Stealth",children:e.stealth})]})}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Stage speed",children:e.stage_speed}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Transmissibility",children:e.transmission})]})})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Symptoms",level:2,children:t.map((function(e){return(0,o.createComponentVNode)(2,a.Collapsible,{title:e.name,children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,u,{symptom:e})})},e.name)}))})],4)]},e.name)}))};t.PandemicDiseaseDisplay=d;var u=function(e,t){var n=e.symptom,i=n.name,c=n.desc,l=n.stealth,d=n.resistance,u=n.stage_speed,s=n.transmission,p=n.level,m=n.neutered,f=(0,r.map)((function(e,t){return{desc:e,label:t}}))(n.threshold_desc||{});return(0,o.createComponentVNode)(2,a.Section,{title:i,level:2,buttons:!!m&&(0,o.createComponentVNode)(2,a.Box,{bold:!0,color:"bad",children:"Neutered"}),children:[(0,o.createComponentVNode)(2,a.Grid,{children:[(0,o.createComponentVNode)(2,a.Grid.Column,{size:2,children:c}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Level",children:p}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Resistance",children:d}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Stealth",children:l}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Stage Speed",children:u}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Transmission",children:s})]})})]}),f.length>0&&(0,o.createComponentVNode)(2,a.Section,{title:"Thresholds",level:3,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:f.map((function(e){return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:e.label,children:e.desc},e.label)}))})})]})};t.PandemicSymptomDisplay=u;var s=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data,l=c.resistances||[];return(0,o.createComponentVNode)(2,a.Section,{title:"Antibodies",children:l.length>0?(0,o.createComponentVNode)(2,a.LabeledList,{children:l.map((function(e){return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:e.name,children:(0,o.createComponentVNode)(2,a.Button,{icon:"eye-dropper",content:"Create vaccine bottle",disabled:!c.is_ready,onClick:function(){return r("create_vaccine_bottle",{index:e.id})}})},e.name)}))}):(0,o.createComponentVNode)(2,a.Box,{bold:!0,color:"bad",mt:1,children:"No antibodies detected."})})};t.PandemicAntibodyDisplay=s;t.Pandemic=function(e,t){var n=(0,i.useBackend)(t).data;return(0,o.createComponentVNode)(2,c.Window,{width:520,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,l),!!n.has_blood&&(0,o.createFragment)([(0,o.createComponentVNode)(2,d),(0,o.createComponentVNode)(2,s)],4)]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.PaperSheet=void 0;var o=n(0),r=n(6),i=n(119),a=s(n(565)),c=s(n(566)),l=n(1),d=n(3),u=n(2);function s(e){return e&&e.__esModule?e:{"default":e}}function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function m(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}function f(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return h(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return h(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n]+)>/g,(function(e,t){return"$"+n[t]})))}if("function"==typeof t){var i=this;return o[Symbol.replace].call(this,e,(function(){var e=[];return e.push.apply(e,arguments),"object"!=typeof e[e.length-1]&&e.push(a(e,i)),t.apply(this,e)}))}return o[Symbol.replace].call(this,e,t)},C.apply(this,arguments)}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&V(e,t)}function b(e){var t="function"==typeof Map?new Map:undefined;return(b=function(e){if(null===e||(n=e,-1===Function.toString.call(n).indexOf("[native code]")))return e;var n;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,o)}function o(){return N(e,arguments,y(this).constructor)}return o.prototype=Object.create(e.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),V(o,e)})(e)}function N(e,t,n){return(N=v()?Reflect.construct:function(e,t,n){var o=[null];o.push.apply(o,t);var r=new(Function.bind.apply(e,o));return n&&V(r,n.prototype),r}).apply(null,arguments)}function v(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}function V(e,t){return(V=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var k=function(e,t,n,o){return void 0===o&&(o=!1),"'+e+""},x=/\[(_+)\]/g,_=C(/\[\]/gm,{id:2}),w=/%s(?:ign)?(?=\\s|$)/gim,B=function(e,t,n,o,r){var i=e.replace(x,(function(e,i,a,c){var l=function(e,t,n){t=n+"x "+t;var o=document.createElement("canvas").getContext("2d");return o.font=t,o.measureText(e).width}(e,t,n)+"px";return function(e,t,n,o,r,i){return'['+I(n,l)+""};return(0,o.createComponentVNode)(2,d.Box,{position:"relative",backgroundColor:a,width:"100%",height:"100%",children:[(0,o.createComponentVNode)(2,d.Box,{fillPositionedParent:!0,width:"100%",height:"100%",dangerouslySetInnerHTML:s,p:"10px"}),u.map((function(e,t){return(0,o.createComponentVNode)(2,L,{image:{sprite:e[0],x:e[1],y:e[2],rotate:e[3]}},e[0]+t)}))]})},A=function(e){function t(t,n){var o;return(o=e.call(this,t,n)||this).state={x:0,y:0,rotate:0},o}p(t,e);var n=t.prototype;return n.findStampPosition=function(e){for(var t=event.pageX,n=event.pageY,o={left:e.target.offsetLeft,top:e.target.offsetTop},r=e.target.offsetParent;r;)o.left+=r.offsetLeft,o.top+=r.offsetTop,r=r.offsetParent;var a=[t-o.left,n-o.top],c=(0,i.vecScale)([121,51],.5);return(0,i.vecSubtract)(a,c)},n.componentDidMount=function(){document.onwheel=this.handleWheel.bind(this)},n.handleMouseMove=function(e){var t=this.findStampPosition(e);S(e),this.setState({x:t[0],y:t[1]})},n.handleMouseClick=function(e){var t=this.findStampPosition(e),n=(0,l.useBackend)(this.context),o=n.act;n.data,o("stamp",{x:t[0],y:t[1],r:this.state.rotate}),this.setState({x:t[0],y:t[1]})},n.handleWheel=function(e){var t=e.deltaY>0?15:-15;if(e.deltaY<0&&0===this.state.rotate)this.setState({rotate:360+t});else if(e.deltaY>0&&360===this.state.rotate)this.setState({rotate:t});else{var n={rotate:t+this.state.rotate};this.setState((function(){return n}))}S(e)},n.render=function(){var e=this.props,t=e.value,n=e.stamp_class,r=e.stamps,i=m(e,["value","stamp_class","stamps"]),a=r||[],c={sprite:n,x:this.state.x,y:this.state.y,rotate:this.state.rotate};return(0,o.normalizeProps)((0,o.createComponentVNode)(2,d.Box,Object.assign({onClick:this.handleMouseClick.bind(this),onMouseMove:this.handleMouseMove.bind(this),onwheel:this.handleWheel.bind(this)},i,{children:[(0,o.createComponentVNode)(2,T,{readOnly:1,value:t,stamps:a}),(0,o.createComponentVNode)(2,L,{opacity:.5,image:c})]})))},t}(o.Component),E=function(e){function t(t,n){var o;return(o=e.call(this,t,n)||this).state={previewSelected:"Preview",old_text:t.value||"",textarea_text:"",combined_text:t.value||""},o}p(t,e);var n=t.prototype;return n.createPreview=function(e,t){void 0===t&&(t=!1);var n,o,r=(0,l.useBackend)(this.context).data,i=r.text,d=r.pen_color,u=r.pen_font,s=r.is_crayon,p=r.field_counter,m=r.edit_usr,h={text:i};if((e=e.trim()).length>0){var C=function(e){return a["default"].sanitize(e,{FORBID_ATTR:["class","style"],ALLOWED_TAGS:["br","code","li","p","pre","span","table","td","tr","th","ul","ol","menu","font","b","center","table","tr","th"]})}(e+="\n"===e[e.length]?" \n":"\n \n"),g=(n=d,o=m,C.replace(w,(function(){return k(o,"Times New Roman",n,!0)}))),b=B(g,u,12,d,p),N=function(e){return(0,c["default"])(e,{breaks:!0,smartypants:!0,smartLists:!0,walkTokens:function(e){switch(e.type){case"url":case"autolink":case"reflink":case"link":case"image":e.type="text",e.href=""}},baseUrl:"thisshouldbreakhttp"})}(b.text),v=k(N,u,d,s);h.text+=v,h.field_counter=b.counter}if(t){var V=function(e,t,n,o,r){var i;void 0===r&&(r=!1);for(var c={},l=[];null!==(i=_.exec(e));){var d=i[0],u=i.groups.id;if(u){var s=document.getElementById(u);if(0===(s&&s.value?s.value:"").length)continue;var p=a["default"].sanitize(s.value.trim(),{ALLOWED_TAGS:[]});if(0===p.length)continue;var m=s.cloneNode(!0);p.match(w)?(m.style.fontFamily="Times New Roman",r=!0,m.defaultValue=o):(m.style.fontFamily=t,m.defaultValue=p),r&&(m.style.fontWeight="bold"),m.style.color=n,m.disabled=!0;var h=document.createElement("div");h.appendChild(m),c[u]=p,l.push({value:"["+h.innerHTML+"]",raw_text:d})}}if(l.length>0)for(var C,g=f(l);!(C=g()).done;){var b=C.value;e=e.replace(b.raw_text,b.value)}return{text:e,fields:c}}(h.text,u,d,m,s);h.text=V.text,h.form_fields=V.fields}return h},n.onInputHandler=function(e,t){var n=this;if(t!==this.state.textarea_text){var o=this.state.old_text.length+this.state.textarea_text.length;if(o>5e3&&(t=o-5e3>=t.length?"":t.substr(0,t.length-(o-5e3)))===this.state.textarea_text)return;this.setState((function(){return{textarea_text:t,combined_text:n.createPreview(t)}}))}},n.finalUpdate=function(e){var t=(0,l.useBackend)(this.context).act,n=this.createPreview(e,!0);t("save",n),this.setState((function(){return{textarea_text:"",previewSelected:"save",combined_text:n.text}}))},n.render=function(){var e=this,t=this.props,n=(t.value,t.textColor),r=t.fontFamily,i=t.stamps,a=t.backgroundColor;return m(t,["value","textColor","fontFamily","stamps","backgroundColor"]),(0,o.createComponentVNode)(2,d.Flex,{direction:"column",fillPositionedParent:!0,children:[(0,o.createComponentVNode)(2,d.Flex.Item,{children:(0,o.createComponentVNode)(2,d.Tabs,{children:[(0,o.createComponentVNode)(2,d.Tabs.Tab,{textColor:"black",backgroundColor:"Edit"===this.state.previewSelected?"grey":"white",selected:"Edit"===this.state.previewSelected,onClick:function(){return e.setState({previewSelected:"Edit"})},children:"Edit"},"marked_edit"),(0,o.createComponentVNode)(2,d.Tabs.Tab,{textColor:"black",backgroundColor:"Preview"===this.state.previewSelected?"grey":"white",selected:"Preview"===this.state.previewSelected,onClick:function(){return e.setState((function(){return{previewSelected:"Preview",textarea_text:e.state.textarea_text,combined_text:e.createPreview(e.state.textarea_text).text}}))},children:"Preview"},"marked_preview"),(0,o.createComponentVNode)(2,d.Tabs.Tab,{textColor:"black",backgroundColor:"confirm"===this.state.previewSelected?"red":"save"===this.state.previewSelected?"grey":"white",selected:"confirm"===this.state.previewSelected||"save"===this.state.previewSelected,onClick:function(){"confirm"===e.state.previewSelected?e.finalUpdate(e.state.textarea_text):"Edit"===e.state.previewSelected?e.setState((function(){return{previewSelected:"confirm",textarea_text:e.state.textarea_text,combined_text:e.createPreview(e.state.textarea_text).text}})):e.setState({previewSelected:"confirm"})},children:"confirm"===this.state.previewSelected?"confirm":"save"},"marked_done")]})}),(0,o.createComponentVNode)(2,d.Flex.Item,{grow:1,basis:1,children:"Edit"===this.state.previewSelected&&(0,o.createComponentVNode)(2,d.TextArea,{value:this.state.textarea_text,textColor:n,fontFamily:r,height:window.innerHeight-80+"px",backgroundColor:a,onInput:this.onInputHandler.bind(this)})||(0,o.createComponentVNode)(2,T,{value:this.state.combined_text,stamps:i,fontFamily:r,textColor:n})})]})},t}(o.Component);t.PaperSheet=function(e,t){var n=(0,l.useBackend)(t).data,r=n.edit_mode,i=n.text,a=n.paper_color,c=n.pen_color,s=void 0===c?"black":c,p=n.pen_font,m=void 0===p?"Verdana":p,f=n.stamps,h=n.stamp_class,C=(n.stamped,a&&"white"!==a?a:"#FFFFFF"),g=f&&null!==f?f:[];return(0,o.createComponentVNode)(2,u.Window,{theme:"paper",width:400,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,u.Window.Content,{children:(0,o.createComponentVNode)(2,d.Box,{fillPositionedParent:!0,backgroundColor:C,children:function(e){switch(e){case 0:return(0,o.createComponentVNode)(2,T,{value:i,stamps:g,readOnly:1});case 1:return(0,o.createComponentVNode)(2,E,{value:i,textColor:s,fontFamily:m,stamps:g,backgroundColor:C});case 2:return(0,o.createComponentVNode)(2,A,{value:i,stamps:g,stamp_class:h});default:return"ERROR ERROR WE CANNOT BE HERE!!"}}(r)})})})}},function(e,t,n){"use strict";e.exports=function(){var e=Object.hasOwnProperty,t=Object.setPrototypeOf,n=Object.isFrozen,o=Object.keys,r=Object.freeze,i=Object.seal,a="undefined"!=typeof Reflect&&Reflect,c=a.apply,l=a.construct;c||(c=function(e,t,n){return e.apply(t,n)}),r||(r=function(e){return e}),i||(i=function(e){return e}),l||(l=function(e,t){return new(Function.prototype.bind.apply(e,[null].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1?n-1:0),r=1;r/gm),F=i(/^data-[\-\w.\u00B7-\uFFFF]/),j=i(/^aria-[\-\w]+$/),D=i(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),z=i(/^(?:\w+script|data):/i),W=i(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g),H="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function U(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0&&arguments[0]!==undefined?arguments[0]:G(),t=function(e){return q(e)};if(t.version="2.0.12",t.removed=[],!e||!e.document||9!==e.document.nodeType)return t.isSupported=!1,t;var n=e.document,i=!1,a=e.document,c=e.DocumentFragment,l=e.HTMLTemplateElement,k=e.Node,x=e.NodeFilter,Y=e.NamedNodeMap,$=Y===undefined?e.NamedNodeMap||e.MozNamedAttrMap:Y,X=e.Text,Q=e.Comment,J=e.DOMParser,Z=e.trustedTypes;if("function"==typeof l){var ee=a.createElement("template");ee.content&&ee.content.ownerDocument&&(a=ee.content.ownerDocument)}var te=K(Z,n),ne=te&&Me?te.createHTML(""):"",oe=a,re=oe.implementation,ie=oe.createNodeIterator,ae=oe.getElementsByTagName,ce=oe.createDocumentFragment,le=n.importNode,de={};t.isSupported=re&&"undefined"!=typeof re.createHTMLDocument&&9!==a.documentMode;var ue=R,se=O,pe=F,me=j,fe=z,he=W,Ce=D,ge=null,be=_({},[].concat(U(B),U(S),U(L),U(I),U(T))),Ne=null,ve=_({},[].concat(U(A),U(E),U(M),U(P))),Ve=null,ye=null,ke=!0,xe=!0,_e=!1,we=!1,Be=!1,Se=!1,Le=!1,Ie=!1,Te=!1,Ae=!1,Ee=!1,Me=!1,Pe=!0,Re=!0,Oe=!1,Fe={},je=_({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","plaintext","script","style","svg","template","thead","title","video","xmp"]),De=null,ze=_({},["audio","video","img","source","image","track"]),We=null,He=_({},["alt","class","for","id","label","name","pattern","placeholder","summary","title","value","style","xmlns"]),Ue=null,Ge=a.createElement("form"),Ke=function(e){Ue&&Ue===e||(e&&"object"===(void 0===e?"undefined":H(e))||(e={}),ge="ALLOWED_TAGS"in e?_({},e.ALLOWED_TAGS):be,Ne="ALLOWED_ATTR"in e?_({},e.ALLOWED_ATTR):ve,We="ADD_URI_SAFE_ATTR"in e?_(w(He),e.ADD_URI_SAFE_ATTR):He,De="ADD_DATA_URI_TAGS"in e?_(w(ze),e.ADD_DATA_URI_TAGS):ze,Ve="FORBID_TAGS"in e?_({},e.FORBID_TAGS):{},ye="FORBID_ATTR"in e?_({},e.FORBID_ATTR):{},Fe="USE_PROFILES"in e&&e.USE_PROFILES,ke=!1!==e.ALLOW_ARIA_ATTR,xe=!1!==e.ALLOW_DATA_ATTR,_e=e.ALLOW_UNKNOWN_PROTOCOLS||!1,we=e.SAFE_FOR_JQUERY||!1,Be=e.SAFE_FOR_TEMPLATES||!1,Se=e.WHOLE_DOCUMENT||!1,Te=e.RETURN_DOM||!1,Ae=e.RETURN_DOM_FRAGMENT||!1,Ee=e.RETURN_DOM_IMPORT||!1,Me=e.RETURN_TRUSTED_TYPE||!1,Ie=e.FORCE_BODY||!1,Pe=!1!==e.SANITIZE_DOM,Re=!1!==e.KEEP_CONTENT,Oe=e.IN_PLACE||!1,Ce=e.ALLOWED_URI_REGEXP||Ce,Be&&(xe=!1),Ae&&(Te=!0),Fe&&(ge=_({},[].concat(U(T))),Ne=[],!0===Fe.html&&(_(ge,B),_(Ne,A)),!0===Fe.svg&&(_(ge,S),_(Ne,E),_(Ne,P)),!0===Fe.svgFilters&&(_(ge,L),_(Ne,E),_(Ne,P)),!0===Fe.mathMl&&(_(ge,I),_(Ne,M),_(Ne,P))),e.ADD_TAGS&&(ge===be&&(ge=w(ge)),_(ge,e.ADD_TAGS)),e.ADD_ATTR&&(Ne===ve&&(Ne=w(Ne)),_(Ne,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&_(We,e.ADD_URI_SAFE_ATTR),Re&&(ge["#text"]=!0),Se&&_(ge,["html","head","body"]),ge.table&&(_(ge,["tbody"]),delete Ve.tbody),r&&r(e),Ue=e)},qe=function(e){m(t.removed,{element:e});try{e.parentNode.removeChild(e)}catch(n){e.outerHTML=ne}},Ye=function(e,n){try{m(t.removed,{attribute:n.getAttributeNode(e),from:n})}catch(o){m(t.removed,{attribute:null,from:n})}n.removeAttribute(e)},$e=function(e){var t=void 0,n=void 0;if(Ie)e=""+e;else{var o=C(e,/^[\r\n\t ]+/);n=o&&o[0]}var r=te?te.createHTML(e):e;try{t=(new J).parseFromString(r,"text/html")}catch(l){}if(i&&_(Ve,["title"]),!t||!t.documentElement){var c=(t=re.createHTMLDocument("")).body;c.parentNode.removeChild(c.parentNode.firstElementChild),c.outerHTML=r}return e&&n&&t.body.insertBefore(a.createTextNode(n),t.body.childNodes[0]||null),ae.call(t,Se?"html":"body")[0]};t.isSupported&&function(){try{var e=$e("</title><img>");v(/<\/title/,e.querySelector("title").innerHTML)&&(i=!0)}catch(t){}}();var Xe=function(e){return ie.call(e.ownerDocument||e,e,x.SHOW_ELEMENT|x.SHOW_COMMENT|x.SHOW_TEXT,(function(){return x.FILTER_ACCEPT}),!1)},Qe=function(e){return!(e instanceof X||e instanceof Q||"string"==typeof e.nodeName&&"string"==typeof e.textContent&&"function"==typeof e.removeChild&&e.attributes instanceof $&&"function"==typeof e.removeAttribute&&"function"==typeof e.setAttribute&&"string"==typeof e.namespaceURI)},Je=function(e){return"object"===(void 0===k?"undefined":H(k))?e instanceof k:e&&"object"===(void 0===e?"undefined":H(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},Ze=function(e,n,o){de[e]&&d(de[e],(function(e){e.call(t,n,o,Ue)}))},et=function(e){var n=void 0;if(Ze("beforeSanitizeElements",e,null),Qe(e))return qe(e),!0;var o=h(e.nodeName);if(Ze("uponSanitizeElement",e,{tagName:o,allowedTags:ge}),("svg"===o||"math"===o)&&0!==e.querySelectorAll("p, br").length)return qe(e),!0;if(!ge[o]||Ve[o]){if(Re&&!je[o]&&"function"==typeof e.insertAdjacentHTML)try{var r=e.innerHTML;e.insertAdjacentHTML("AfterEnd",te?te.createHTML(r):r)}catch(i){}return qe(e),!0}return"noscript"===o&&v(/<\/noscript/i,e.innerHTML)||"noembed"===o&&v(/<\/noembed/i,e.innerHTML)?(qe(e),!0):(!we||e.firstElementChild||e.content&&e.content.firstElementChild||!v(/</g,e.textContent)||(m(t.removed,{element:e.cloneNode()}),e.innerHTML?e.innerHTML=g(e.innerHTML,/</g,"<"):e.innerHTML=g(e.textContent,/</g,"<")),Be&&3===e.nodeType&&(n=e.textContent,n=g(n,ue," "),n=g(n,se," "),e.textContent!==n&&(m(t.removed,{element:e.cloneNode()}),e.textContent=n)),Ze("afterSanitizeElements",e,null),!1)},tt=function(e,t,n){if(Pe&&("id"===t||"name"===t)&&(n in a||n in Ge))return!1;if(xe&&v(pe,t));else if(ke&&v(me,t));else{if(!Ne[t]||ye[t])return!1;if(We[t]);else if(v(Ce,g(n,he,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==b(n,"data:")||!De[e])if(_e&&!v(fe,g(n,he,"")));else if(n)return!1}return!0},nt=function(e){var n=void 0,r=void 0,i=void 0,a=void 0,c=void 0;Ze("beforeSanitizeAttributes",e,null);var l=e.attributes;if(l){var d={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Ne};for(c=l.length;c--;){var m=n=l[c],C=m.name,b=m.namespaceURI;if(r=N(n.value),i=h(C),d.attrName=i,d.attrValue=r,d.keepAttr=!0,d.forceKeepAttr=undefined,Ze("uponSanitizeAttribute",e,d),r=d.attrValue,!d.forceKeepAttr){if("name"===i&&"IMG"===e.nodeName&&l.id)a=l.id,l=f(l,[]),Ye("id",e),Ye(C,e),u(l,a)>c&&e.setAttribute("id",a.value);else{if("INPUT"===e.nodeName&&"type"===i&&"file"===r&&d.keepAttr&&(Ne[i]||!ye[i]))continue;"id"===C&&e.setAttribute(C,""),Ye(C,e)}if(d.keepAttr)if(we&&v(/\/>/i,r))Ye(C,e);else if(v(/svg|math/i,e.namespaceURI)&&v(V("</("+s(o(je),"|")+")","i"),r))Ye(C,e);else{Be&&(r=g(r,ue," "),r=g(r,se," "));var y=e.nodeName.toLowerCase();if(tt(y,i,r))try{b?e.setAttributeNS(b,C,r):e.setAttribute(C,r),p(t.removed)}catch(k){}}}}Ze("afterSanitizeAttributes",e,null)}},ot=function rt(e){var t=void 0,n=Xe(e);for(Ze("beforeSanitizeShadowDOM",e,null);t=n.nextNode();)Ze("uponSanitizeShadowNode",t,null),et(t)||(t.content instanceof c&&rt(t.content),nt(t));Ze("afterSanitizeShadowDOM",e,null)};return t.sanitize=function(o,r){var i=void 0,a=void 0,l=void 0,d=void 0,u=void 0;if(o||(o="\x3c!--\x3e"),"string"!=typeof o&&!Je(o)){if("function"!=typeof o.toString)throw y("toString is not a function");if("string"!=typeof(o=o.toString()))throw y("dirty is not a string, aborting")}if(!t.isSupported){if("object"===H(e.toStaticHTML)||"function"==typeof e.toStaticHTML){if("string"==typeof o)return e.toStaticHTML(o);if(Je(o))return e.toStaticHTML(o.outerHTML)}return o}if(Le||Ke(r),t.removed=[],"string"==typeof o&&(Oe=!1),Oe);else if(o instanceof k)1===(a=(i=$e("\x3c!--\x3e")).ownerDocument.importNode(o,!0)).nodeType&&"BODY"===a.nodeName||"HTML"===a.nodeName?i=a:i.appendChild(a);else{if(!Te&&!Be&&!Se&&-1===o.indexOf("<"))return te&&Me?te.createHTML(o):o;if(!(i=$e(o)))return Te?null:ne}i&&Ie&&qe(i.firstChild);for(var s=Xe(Oe?o:i);l=s.nextNode();)3===l.nodeType&&l===d||et(l)||(l.content instanceof c&&ot(l.content),nt(l),d=l);if(d=null,Oe)return o;if(Te){if(Ae)for(u=ce.call(i.ownerDocument);i.firstChild;)u.appendChild(i.firstChild);else u=i;return Ee&&(u=le.call(n,u,!0)),u}var p=Se?i.outerHTML:i.innerHTML;return Be&&(p=g(p,ue," "),p=g(p,se," ")),te&&Me?te.createHTML(p):p},t.setConfig=function(e){Ke(e),Le=!0},t.clearConfig=function(){Ue=null,Le=!1},t.isValidAttribute=function(e,t,n){Ue||Ke({});var o=h(e),r=h(t);return tt(o,r,n)},t.addHook=function(e,t){"function"==typeof t&&(de[e]=de[e]||[],m(de[e],t))},t.removeHook=function(e){de[e]&&p(de[e])},t.removeHooks=function(e){de[e]&&(de[e]=[])},t.removeAllHooks=function(){de={}},t}()}()},function(e,t,n){"use strict";e.exports=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}function t(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}function n(e,n){var o;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(o=function(e,n){if(e){if("string"==typeof e)return t(e,n);var o=Object.prototype.toString.call(e).slice(8,-1);return"Object"===o&&e.constructor&&(o=e.constructor.name),"Map"===o||"Set"===o?Array.from(e):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?t(e,n):void 0}}(e))||n&&e&&"number"==typeof e.length){o&&(e=o);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(o=e[Symbol.iterator]()).next.bind(o)}var o=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e){function t(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}e.exports={defaults:{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1},getDefaults:t,changeDefaults:function(t){e.exports.defaults=t}}})),r=(o.defaults,o.getDefaults,o.changeDefaults,/[&<>"']/),i=/[&<>"']/g,a=/[<>"']|&(?!#?\w+;)/,c=/[<>"']|&(?!#?\w+;)/g,l={"&":"&","<":"<",">":">",'"':""","'":"'"},d=function(e){return l[e]},u=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function s(e){return e.replace(u,(function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""}))}var p=/(^|[^\[])\^/g,m=/[^\w:]/g,f=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i,h={},C=/^[^:]+:\/*[^/]*$/,g=/^([^:]+:)[\s\S]*$/,b=/^([^:]+:\/*[^/]*)[\s\S]*$/;function N(e,t){h[" "+e]||(C.test(e)?h[" "+e]=e+"/":h[" "+e]=v(e,"/",!0));var n=-1===(e=h[" "+e]).indexOf(":");return"//"===t.substring(0,2)?n?t:e.replace(g,"$1")+t:"/"===t.charAt(0)?n?t:e.replace(b,"$1")+t:e+t}function v(e,t,n){var o=e.length;if(0===o)return"";for(var r=0;r<o;){var i=e.charAt(o-r-1);if(i!==t||n){if(i===t||!n)break;r++}else r++}return e.substr(0,o-r)}var V={escape:function(e,t){if(t){if(r.test(e))return e.replace(i,d)}else if(a.test(e))return e.replace(c,d);return e},unescape:s,edit:function(e,t){e=e.source||e,t=t||"";var n={replace:function(t,o){return o=(o=o.source||o).replace(p,"$1"),e=e.replace(t,o),n},getRegex:function(){return new RegExp(e,t)}};return n},cleanUrl:function(e,t,n){if(e){var o;try{o=decodeURIComponent(s(n)).replace(m,"").toLowerCase()}catch(r){return null}if(0===o.indexOf("javascript:")||0===o.indexOf("vbscript:")||0===o.indexOf("data:"))return null}t&&!f.test(n)&&(n=N(t,n));try{n=encodeURI(n).replace(/%25/g,"%")}catch(r){return null}return n},resolveUrl:N,noopTest:{exec:function(){}},merge:function(e){for(var t,n,o=1;o<arguments.length;o++)for(n in t=arguments[o])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},splitCells:function(e,t){var n=e.replace(/\|/g,(function(e,t,n){for(var o=!1,r=t;--r>=0&&"\\"===n[r];)o=!o;return o?"|":" |"})).split(/ \|/),o=0;if(n.length>t)n.splice(t);else for(;n.length<t;)n.push("");for(;o<n.length;o++)n[o]=n[o].trim().replace(/\\\|/g,"|");return n},rtrim:v,findClosingBracket:function(e,t){if(-1===e.indexOf(t[1]))return-1;for(var n=e.length,o=0,r=0;r<n;r++)if("\\"===e[r])r++;else if(e[r]===t[0])o++;else if(e[r]===t[1]&&--o<0)return r;return-1},checkSanitizeDeprecation:function(e){e&&e.sanitize&&e.silent}},y=o.defaults,k=V.rtrim,x=V.splitCells,_=V.escape,w=V.findClosingBracket;function B(e,t,n){var o=t.href,r=t.title?_(t.title):null,i=e[1].replace(/\\([\[\]])/g,"$1");return"!"!==e[0].charAt(0)?{type:"link",raw:n,href:o,title:r,text:i}:{type:"image",raw:n,href:o,title:r,text:_(i)}}var S=function(){function e(e){this.options=e||y}var t=e.prototype;return t.space=function(e){var t=this.rules.block.newline.exec(e);if(t)return t[0].length>1?{type:"space",raw:t[0]}:{raw:"\n"}},t.code=function(e,t){var n=this.rules.block.code.exec(e);if(n){var o=t[t.length-1];if(o&&"paragraph"===o.type)return{raw:n[0],text:n[0].trimRight()};var r=n[0].replace(/^ {4}/gm,"");return{type:"code",raw:n[0],codeBlockStyle:"indented",text:this.options.pedantic?r:k(r,"\n")}}},t.fences=function(e){var t=this.rules.block.fences.exec(e);if(t){var n=t[0],o=function(e,t){var n=e.match(/^(\s+)(?:```)/);if(null===n)return t;var o=n[1];return t.split("\n").map((function(e){var t=e.match(/^\s+/);return null===t?e:t[0].length>=o.length?e.slice(o.length):e})).join("\n")}(n,t[3]||"");return{type:"code",raw:n,lang:t[2]?t[2].trim():t[2],text:o}}},t.heading=function(e){var t=this.rules.block.heading.exec(e);if(t)return{type:"heading",raw:t[0],depth:t[1].length,text:t[2]}},t.nptable=function(e){var t=this.rules.block.nptable.exec(e);if(t){var n={type:"table",header:x(t[1].replace(/^ *| *\| *$/g,"")),align:t[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:t[3]?t[3].replace(/\n$/,"").split("\n"):[],raw:t[0]};if(n.header.length===n.align.length){var o,r=n.align.length;for(o=0;o<r;o++)/^ *-+: *$/.test(n.align[o])?n.align[o]="right":/^ *:-+: *$/.test(n.align[o])?n.align[o]="center":/^ *:-+ *$/.test(n.align[o])?n.align[o]="left":n.align[o]=null;for(r=n.cells.length,o=0;o<r;o++)n.cells[o]=x(n.cells[o],n.header.length);return n}}},t.hr=function(e){var t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}},t.blockquote=function(e){var t=this.rules.block.blockquote.exec(e);if(t){var n=t[0].replace(/^ *> ?/gm,"");return{type:"blockquote",raw:t[0],text:n}}},t.list=function(e){var t=this.rules.block.list.exec(e);if(t){for(var n,o,r,i,a,c,l,d=t[0],u=t[2],s=u.length>1,p=")"===u[u.length-1],m={type:"list",raw:d,ordered:s,start:s?+u.slice(0,-1):"",loose:!1,items:[]},f=t[0].match(this.rules.block.item),h=!1,C=f.length,g=0;g<C;g++)d=n=f[g],o=n.length,~(n=n.replace(/^ *([*+-]|\d+[.)]) */,"")).indexOf("\n ")&&(o-=n.length,n=this.options.pedantic?n.replace(/^ {1,4}/gm,""):n.replace(new RegExp("^ {1,"+o+"}","gm"),"")),g!==C-1&&(r=this.rules.block.bullet.exec(f[g+1])[0],(s?1===r.length||!p&&")"===r[r.length-1]:r.length>1||this.options.smartLists&&r!==u)&&(i=f.slice(g+1).join("\n"),m.raw=m.raw.substring(0,m.raw.length-i.length),g=C-1)),a=h||/\n\n(?!\s*$)/.test(n),g!==C-1&&(h="\n"===n.charAt(n.length-1),a||(a=h)),a&&(m.loose=!0),c=/^\[[ xX]\] /.test(n),l=undefined,c&&(l=" "!==n[1],n=n.replace(/^\[[ xX]\] +/,"")),m.items.push({type:"list_item",raw:d,task:c,checked:l,loose:a,text:n});return m}},t.html=function(e){var t=this.rules.block.html.exec(e);if(t)return{type:this.options.sanitize?"paragraph":"html",raw:t[0],pre:!this.options.sanitizer&&("pre"===t[1]||"script"===t[1]||"style"===t[1]),text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(t[0]):_(t[0]):t[0]}},t.def=function(e){var t=this.rules.block.def.exec(e);if(t)return t[3]&&(t[3]=t[3].substring(1,t[3].length-1)),{tag:t[1].toLowerCase().replace(/\s+/g," "),raw:t[0],href:t[2],title:t[3]}},t.table=function(e){var t=this.rules.block.table.exec(e);if(t){var n={type:"table",header:x(t[1].replace(/^ *| *\| *$/g,"")),align:t[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:t[3]?t[3].replace(/\n$/,"").split("\n"):[]};if(n.header.length===n.align.length){n.raw=t[0];var o,r=n.align.length;for(o=0;o<r;o++)/^ *-+: *$/.test(n.align[o])?n.align[o]="right":/^ *:-+: *$/.test(n.align[o])?n.align[o]="center":/^ *:-+ *$/.test(n.align[o])?n.align[o]="left":n.align[o]=null;for(r=n.cells.length,o=0;o<r;o++)n.cells[o]=x(n.cells[o].replace(/^ *\| *| *\| *$/g,""),n.header.length);return n}}},t.lheading=function(e){var t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:"="===t[2].charAt(0)?1:2,text:t[1]}},t.paragraph=function(e){var t=this.rules.block.paragraph.exec(e);if(t)return{type:"paragraph",raw:t[0],text:"\n"===t[1].charAt(t[1].length-1)?t[1].slice(0,-1):t[1]}},t.text=function(e,t){var n=this.rules.block.text.exec(e);if(n){var o=t[t.length-1];return o&&"text"===o.type?{raw:n[0],text:n[0]}:{type:"text",raw:n[0],text:n[0]}}},t.escape=function(e){var t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:_(t[1])}},t.tag=function(e,t,n){var o=this.rules.inline.tag.exec(e);if(o)return!t&&/^<a /i.test(o[0])?t=!0:t&&/^<\/a>/i.test(o[0])&&(t=!1),!n&&/^<(pre|code|kbd|script)(\s|>)/i.test(o[0])?n=!0:n&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(o[0])&&(n=!1),{type:this.options.sanitize?"text":"html",raw:o[0],inLink:t,inRawBlock:n,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(o[0]):_(o[0]):o[0]}},t.link=function(e){var t=this.rules.inline.link.exec(e);if(t){var n=w(t[2],"()");if(n>-1){var o=(0===t[0].indexOf("!")?5:4)+t[1].length+n;t[2]=t[2].substring(0,n),t[0]=t[0].substring(0,o).trim(),t[3]=""}var r=t[2],i="";if(this.options.pedantic){var a=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(r);a?(r=a[1],i=a[3]):i=""}else i=t[3]?t[3].slice(1,-1):"";return B(t,{href:(r=r.trim().replace(/^<([\s\S]*)>$/,"$1"))?r.replace(this.rules.inline._escapes,"$1"):r,title:i?i.replace(this.rules.inline._escapes,"$1"):i},t[0])}},t.reflink=function(e,t){var n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){var o=(n[2]||n[1]).replace(/\s+/g," ");if(!(o=t[o.toLowerCase()])||!o.href){var r=n[0].charAt(0);return{type:"text",raw:r,text:r}}return B(n,o,n[0])}},t.strong=function(e,t,n){void 0===n&&(n="");var o=this.rules.inline.strong.start.exec(e);if(o&&(!o[1]||o[1]&&(""===n||this.rules.inline.punctuation.exec(n)))){t=t.slice(-1*e.length);var r,i="**"===o[0]?this.rules.inline.strong.endAst:this.rules.inline.strong.endUnd;for(i.lastIndex=0;null!=(o=i.exec(t));)if(r=this.rules.inline.strong.middle.exec(t.slice(0,o.index+3)))return{type:"strong",raw:e.slice(0,r[0].length),text:e.slice(2,r[0].length-2)}}},t.em=function(e,t,n){void 0===n&&(n="");var o=this.rules.inline.em.start.exec(e);if(o&&(!o[1]||o[1]&&(""===n||this.rules.inline.punctuation.exec(n)))){t=t.slice(-1*e.length);var r,i="*"===o[0]?this.rules.inline.em.endAst:this.rules.inline.em.endUnd;for(i.lastIndex=0;null!=(o=i.exec(t));)if(r=this.rules.inline.em.middle.exec(t.slice(0,o.index+2)))return{type:"em",raw:e.slice(0,r[0].length),text:e.slice(1,r[0].length-1)}}},t.codespan=function(e){var t=this.rules.inline.code.exec(e);if(t){var n=t[2].replace(/\n/g," "),o=/[^ ]/.test(n),r=n.startsWith(" ")&&n.endsWith(" ");return o&&r&&(n=n.substring(1,n.length-1)),n=_(n,!0),{type:"codespan",raw:t[0],text:n}}},t.br=function(e){var t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}},t.del=function(e){var t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[1]}},t.autolink=function(e,t){var n,o,r=this.rules.inline.autolink.exec(e);if(r)return o="@"===r[2]?"mailto:"+(n=_(this.options.mangle?t(r[1]):r[1])):n=_(r[1]),{type:"link",raw:r[0],text:n,href:o,tokens:[{type:"text",raw:n,text:n}]}},t.url=function(e,t){var n;if(n=this.rules.inline.url.exec(e)){var o,r;if("@"===n[2])r="mailto:"+(o=_(this.options.mangle?t(n[0]):n[0]));else{var i;do{i=n[0],n[0]=this.rules.inline._backpedal.exec(n[0])[0]}while(i!==n[0]);o=_(n[0]),r="www."===n[1]?"http://"+o:o}return{type:"link",raw:n[0],text:o,href:r,tokens:[{type:"text",raw:o,text:o}]}}},t.inlineText=function(e,t,n){var o,r=this.rules.inline.text.exec(e);if(r)return o=t?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(r[0]):_(r[0]):r[0]:_(this.options.smartypants?n(r[0]):r[0]),{type:"text",raw:r[0],text:o}},e}(),L=V.noopTest,I=V.edit,T=V.merge,A={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6}) +([^\n]*?)(?: +#+)? *(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|<![A-Z][\\s\\S]*?>\\n*|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:L,table:L,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};A.def=I(A.def).replace("label",A._label).replace("title",A._title).getRegex(),A.bullet=/(?:[*+-]|\d{1,9}[.)])/,A.item=/^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/,A.item=I(A.item,"gm").replace(/bull/g,A.bullet).getRegex(),A.list=I(A.list).replace(/bull/g,A.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+A.def.source+")").getRegex(),A._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",A._comment=/<!--(?!-?>)[\s\S]*?-->/,A.html=I(A.html,"i").replace("comment",A._comment).replace("tag",A._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),A.paragraph=I(A._paragraph).replace("hr",A.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",A._tag).getRegex(),A.blockquote=I(A.blockquote).replace("paragraph",A.paragraph).getRegex(),A.normal=T({},A),A.gfm=T({},A.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n *([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n *\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),A.gfm.nptable=I(A.gfm.nptable).replace("hr",A.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",A._tag).getRegex(),A.gfm.table=I(A.gfm.table).replace("hr",A.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",A._tag).getRegex(),A.pedantic=T({},A.normal,{html:I("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",A._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,fences:L,paragraph:I(A.normal._paragraph).replace("hr",A.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",A.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var E={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:L,tag:"^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",strong:{start:/^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/,middle:/^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,endAst:/[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation\s]|$))/,endUnd:/[^\s]__(?!_)(?:(?=[punctuation\s])|$)/},em:{start:/^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/,middle:/^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,endAst:/[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation\s]|$))/,endUnd:/[^\s]_(?!_)(?:(?=[punctuation\s])|$)/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:L,text:/^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n))|(?= {2,}\n))/,punctuation:/^([\s*punctuation])/,_punctuation:"!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~"};E.punctuation=I(E.punctuation).replace(/punctuation/g,E._punctuation).getRegex(),E._blockSkip="\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>",E._overlapSkip="__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*",E.em.start=I(E.em.start).replace(/punctuation/g,E._punctuation).getRegex(),E.em.middle=I(E.em.middle).replace(/punctuation/g,E._punctuation).replace(/overlapSkip/g,E._overlapSkip).getRegex(),E.em.endAst=I(E.em.endAst,"g").replace(/punctuation/g,E._punctuation).getRegex(),E.em.endUnd=I(E.em.endUnd,"g").replace(/punctuation/g,E._punctuation).getRegex(),E.strong.start=I(E.strong.start).replace(/punctuation/g,E._punctuation).getRegex(),E.strong.middle=I(E.strong.middle).replace(/punctuation/g,E._punctuation).replace(/blockSkip/g,E._blockSkip).getRegex(),E.strong.endAst=I(E.strong.endAst,"g").replace(/punctuation/g,E._punctuation).getRegex(),E.strong.endUnd=I(E.strong.endUnd,"g").replace(/punctuation/g,E._punctuation).getRegex(),E.blockSkip=I(E._blockSkip,"g").getRegex(),E.overlapSkip=I(E._overlapSkip,"g").getRegex(),E._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,E._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,E._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,E.autolink=I(E.autolink).replace("scheme",E._scheme).replace("email",E._email).getRegex(),E._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,E.tag=I(E.tag).replace("comment",A._comment).replace("attribute",E._attribute).getRegex(),E._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,E._href=/<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*/,E._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,E.link=I(E.link).replace("label",E._label).replace("href",E._href).replace("title",E._title).getRegex(),E.reflink=I(E.reflink).replace("label",E._label).getRegex(),E.reflinkSearch=I(E.reflinkSearch,"g").replace("reflink",E.reflink).replace("nolink",E.nolink).getRegex(),E.normal=T({},E),E.pedantic=T({},E.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:I(/^!?\[(label)\]\((.*?)\)/).replace("label",E._label).getRegex(),reflink:I(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",E._label).getRegex()}),E.gfm=T({},E.normal,{escape:I(E.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~+(?=\S)([\s\S]*?\S)~+/,text:/^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?= {2,}\n|[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/}),E.gfm.url=I(E.gfm.url,"i").replace("email",E.gfm._extended_email).getRegex(),E.breaks=T({},E.gfm,{br:I(E.br).replace("{2,}","*").getRegex(),text:I(E.gfm.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()});var M={block:A,inline:E},P=o.defaults,R=M.block,O=M.inline;function F(e){return e.replace(/---/g,"\u2014").replace(/--/g,"\u2013").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1\u2018").replace(/'/g,"\u2019").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1\u201c").replace(/"/g,"\u201d").replace(/\.{3}/g,"\u2026")}function j(e){var t,n,o="",r=e.length;for(t=0;t<r;t++)n=e.charCodeAt(t),Math.random()>.5&&(n="x"+n.toString(16)),o+="&#"+n+";";return o}var D=function(){function t(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||P,this.options.tokenizer=this.options.tokenizer||new S,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options;var t={block:R.normal,inline:O.normal};this.options.pedantic?(t.block=R.pedantic,t.inline=O.pedantic):this.options.gfm&&(t.block=R.gfm,this.options.breaks?t.inline=O.breaks:t.inline=O.gfm),this.tokenizer.rules=t}t.lex=function(e,n){return new t(n).lex(e)};var n,o,r,i=t.prototype;return i.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," "),this.blockTokens(e,this.tokens,!0),this.inline(this.tokens),this.tokens},i.blockTokens=function(e,t,n){var o,r,i,a;for(void 0===t&&(t=[]),void 0===n&&(n=!0),e=e.replace(/^ +$/gm,"");e;)if(o=this.tokenizer.space(e))e=e.substring(o.raw.length),o.type&&t.push(o);else if(o=this.tokenizer.code(e,t))e=e.substring(o.raw.length),o.type?t.push(o):((a=t[t.length-1]).raw+="\n"+o.raw,a.text+="\n"+o.text);else if(o=this.tokenizer.fences(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.heading(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.nptable(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.hr(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.blockquote(e))e=e.substring(o.raw.length),o.tokens=this.blockTokens(o.text,[],n),t.push(o);else if(o=this.tokenizer.list(e)){for(e=e.substring(o.raw.length),i=o.items.length,r=0;r<i;r++)o.items[r].tokens=this.blockTokens(o.items[r].text,[],!1);t.push(o)}else if(o=this.tokenizer.html(e))e=e.substring(o.raw.length),t.push(o);else if(n&&(o=this.tokenizer.def(e)))e=e.substring(o.raw.length),this.tokens.links[o.tag]||(this.tokens.links[o.tag]={href:o.href,title:o.title});else if(o=this.tokenizer.table(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.lheading(e))e=e.substring(o.raw.length),t.push(o);else if(n&&(o=this.tokenizer.paragraph(e)))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.text(e,t))e=e.substring(o.raw.length),o.type?t.push(o):((a=t[t.length-1]).raw+="\n"+o.raw,a.text+="\n"+o.text);else if(e){var c="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent)break;throw new Error(c)}return t},i.inline=function(e){var t,n,o,r,i,a,c=e.length;for(t=0;t<c;t++)switch((a=e[t]).type){case"paragraph":case"text":case"heading":a.tokens=[],this.inlineTokens(a.text,a.tokens);break;case"table":for(a.tokens={header:[],cells:[]},r=a.header.length,n=0;n<r;n++)a.tokens.header[n]=[],this.inlineTokens(a.header[n],a.tokens.header[n]);for(r=a.cells.length,n=0;n<r;n++)for(i=a.cells[n],a.tokens.cells[n]=[],o=0;o<i.length;o++)a.tokens.cells[n][o]=[],this.inlineTokens(i[o],a.tokens.cells[n][o]);break;case"blockquote":this.inline(a.tokens);break;case"list":for(r=a.items.length,n=0;n<r;n++)this.inline(a.items[n].tokens)}return e},i.inlineTokens=function(e,t,n,o,r){var i;void 0===t&&(t=[]),void 0===n&&(n=!1),void 0===o&&(o=!1),void 0===r&&(r="");var a,c=e;if(this.tokens.links){var l=Object.keys(this.tokens.links);if(l.length>0)for(;null!=(a=this.tokenizer.rules.inline.reflinkSearch.exec(c));)l.includes(a[0].slice(a[0].lastIndexOf("[")+1,-1))&&(c=c.slice(0,a.index)+"["+"a".repeat(a[0].length-2)+"]"+c.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(a=this.tokenizer.rules.inline.blockSkip.exec(c));)c=c.slice(0,a.index)+"["+"a".repeat(a[0].length-2)+"]"+c.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;e;)if(i=this.tokenizer.escape(e))e=e.substring(i.raw.length),t.push(i);else if(i=this.tokenizer.tag(e,n,o))e=e.substring(i.raw.length),n=i.inLink,o=i.inRawBlock,t.push(i);else if(i=this.tokenizer.link(e))e=e.substring(i.raw.length),"link"===i.type&&(i.tokens=this.inlineTokens(i.text,[],!0,o)),t.push(i);else if(i=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(i.raw.length),"link"===i.type&&(i.tokens=this.inlineTokens(i.text,[],!0,o)),t.push(i);else if(i=this.tokenizer.strong(e,c,r))e=e.substring(i.raw.length),i.tokens=this.inlineTokens(i.text,[],n,o),t.push(i);else if(i=this.tokenizer.em(e,c,r))e=e.substring(i.raw.length),i.tokens=this.inlineTokens(i.text,[],n,o),t.push(i);else if(i=this.tokenizer.codespan(e))e=e.substring(i.raw.length),t.push(i);else if(i=this.tokenizer.br(e))e=e.substring(i.raw.length),t.push(i);else if(i=this.tokenizer.del(e))e=e.substring(i.raw.length),i.tokens=this.inlineTokens(i.text,[],n,o),t.push(i);else if(i=this.tokenizer.autolink(e,j))e=e.substring(i.raw.length),t.push(i);else if(n||!(i=this.tokenizer.url(e,j))){if(i=this.tokenizer.inlineText(e,o,F))e=e.substring(i.raw.length),r=i.raw.slice(-1),t.push(i);else if(e){var d="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent)break;throw new Error(d)}}else e=e.substring(i.raw.length),t.push(i);return t},n=t,r=[{key:"rules",get:function(){return{block:R,inline:O}}}],(o=null)&&e(n.prototype,o),r&&e(n,r),t}(),z=o.defaults,W=V.cleanUrl,H=V.escape,U=function(){function e(e){this.options=e||z}var t=e.prototype;return t.code=function(e,t,n){var o=(t||"").match(/\S*/)[0];if(this.options.highlight){var r=this.options.highlight(e,o);null!=r&&r!==e&&(n=!0,e=r)}return o?'<pre><code class="'+this.options.langPrefix+H(o,!0)+'">'+(n?e:H(e,!0))+"</code></pre>\n":"<pre><code>"+(n?e:H(e,!0))+"</code></pre>\n"},t.blockquote=function(e){return"<blockquote>\n"+e+"</blockquote>\n"},t.html=function(e){return e},t.heading=function(e,t,n,o){return this.options.headerIds?"<h"+t+' id="'+this.options.headerPrefix+o.slug(n)+'">'+e+"</h"+t+">\n":"<h"+t+">"+e+"</h"+t+">\n"},t.hr=function(){return this.options.xhtml?"<hr/>\n":"<hr>\n"},t.list=function(e,t,n){var o=t?"ol":"ul";return"<"+o+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"</"+o+">\n"},t.listitem=function(e){return"<li>"+e+"</li>\n"},t.checkbox=function(e){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"'+(this.options.xhtml?" /":"")+"> "},t.paragraph=function(e){return"<p>"+e+"</p>\n"},t.table=function(e,t){return t&&(t="<tbody>"+t+"</tbody>"),"<table>\n<thead>\n"+e+"</thead>\n"+t+"</table>\n"},t.tablerow=function(e){return"<tr>\n"+e+"</tr>\n"},t.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+"</"+n+">\n"},t.strong=function(e){return"<strong>"+e+"</strong>"},t.em=function(e){return"<em>"+e+"</em>"},t.codespan=function(e){return"<code>"+e+"</code>"},t.br=function(){return this.options.xhtml?"<br/>":"<br>"},t.del=function(e){return"<del>"+e+"</del>"},t.link=function(e,t,n){if(null===(e=W(this.options.sanitize,this.options.baseUrl,e)))return n;var o='<a href="'+H(e)+'"';return t&&(o+=' title="'+t+'"'),o+=">"+n+"</a>"},t.image=function(e,t,n){if(null===(e=W(this.options.sanitize,this.options.baseUrl,e)))return n;var o='<img src="'+e+'" alt="'+n+'"';return t&&(o+=' title="'+t+'"'),o+=this.options.xhtml?"/>":">"},t.text=function(e){return e},e}(),G=function(){function e(){}var t=e.prototype;return t.strong=function(e){return e},t.em=function(e){return e},t.codespan=function(e){return e},t.del=function(e){return e},t.html=function(e){return e},t.text=function(e){return e},t.link=function(e,t,n){return""+n},t.image=function(e,t,n){return""+n},t.br=function(){return""},e}(),K=function(){function e(){this.seen={}}return e.prototype.slug=function(e){var t=e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-");if(this.seen.hasOwnProperty(t)){var n=t;do{this.seen[n]++,t=n+"-"+this.seen[n]}while(this.seen.hasOwnProperty(t))}return this.seen[t]=0,t},e}(),q=o.defaults,Y=V.unescape,$=function(){function e(e){this.options=e||q,this.options.renderer=this.options.renderer||new U,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new G,this.slugger=new K}e.parse=function(t,n){return new e(n).parse(t)};var t=e.prototype;return t.parse=function(e,t){void 0===t&&(t=!0);var n,o,r,i,a,c,l,d,u,s,p,m,f,h,C,g,b,N,v="",V=e.length;for(n=0;n<V;n++)switch((s=e[n]).type){case"space":continue;case"hr":v+=this.renderer.hr();continue;case"heading":v+=this.renderer.heading(this.parseInline(s.tokens),s.depth,Y(this.parseInline(s.tokens,this.textRenderer)),this.slugger);continue;case"code":v+=this.renderer.code(s.text,s.lang,s.escaped);continue;case"table":for(d="",l="",i=s.header.length,o=0;o<i;o++)l+=this.renderer.tablecell(this.parseInline(s.tokens.header[o]),{header:!0,align:s.align[o]});for(d+=this.renderer.tablerow(l),u="",i=s.cells.length,o=0;o<i;o++){for(l="",a=(c=s.tokens.cells[o]).length,r=0;r<a;r++)l+=this.renderer.tablecell(this.parseInline(c[r]),{header:!1,align:s.align[r]});u+=this.renderer.tablerow(l)}v+=this.renderer.table(d,u);continue;case"blockquote":u=this.parse(s.tokens),v+=this.renderer.blockquote(u);continue;case"list":for(p=s.ordered,m=s.start,f=s.loose,i=s.items.length,u="",o=0;o<i;o++)g=(C=s.items[o]).checked,b=C.task,h="",C.task&&(N=this.renderer.checkbox(g),f?C.tokens.length>0&&"text"===C.tokens[0].type?(C.tokens[0].text=N+" "+C.tokens[0].text,C.tokens[0].tokens&&C.tokens[0].tokens.length>0&&"text"===C.tokens[0].tokens[0].type&&(C.tokens[0].tokens[0].text=N+" "+C.tokens[0].tokens[0].text)):C.tokens.unshift({type:"text",text:N}):h+=N),h+=this.parse(C.tokens,f),u+=this.renderer.listitem(h,b,g);v+=this.renderer.list(u,p,m);continue;case"html":v+=this.renderer.html(s.text);continue;case"paragraph":v+=this.renderer.paragraph(this.parseInline(s.tokens));continue;case"text":for(u=s.tokens?this.parseInline(s.tokens):s.text;n+1<V&&"text"===e[n+1].type;)u+="\n"+((s=e[++n]).tokens?this.parseInline(s.tokens):s.text);v+=t?this.renderer.paragraph(u):u;continue;default:var y='Token with "'+s.type+'" type was not found.';if(this.options.silent)return;throw new Error(y)}return v},t.parseInline=function(e,t){t=t||this.renderer;var n,o,r="",i=e.length;for(n=0;n<i;n++)switch((o=e[n]).type){case"escape":r+=t.text(o.text);break;case"html":r+=t.html(o.text);break;case"link":r+=t.link(o.href,o.title,this.parseInline(o.tokens,t));break;case"image":r+=t.image(o.href,o.title,o.text);break;case"strong":r+=t.strong(this.parseInline(o.tokens,t));break;case"em":r+=t.em(this.parseInline(o.tokens,t));break;case"codespan":r+=t.codespan(o.text);break;case"br":r+=t.br();break;case"del":r+=t.del(this.parseInline(o.tokens,t));break;case"text":r+=t.text(o.text);break;default:var a='Token with "'+o.type+'" type was not found.';if(this.options.silent)return;throw new Error(a)}return r},e}(),X=V.merge,Q=V.checkSanitizeDeprecation,J=V.escape,Z=o.getDefaults,ee=o.changeDefaults,te=o.defaults;function ne(e,t,n){if(null==e)throw new Error("marked(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");if("function"==typeof t&&(n=t,t=null),t=X({},ne.defaults,t||{}),Q(t),n){var o,r=t.highlight;try{o=D.lex(e,t)}catch(l){return n(l)}var i=function(e){var i;if(!e)try{i=$.parse(o,t)}catch(l){e=l}return t.highlight=r,e?n(e):n(null,i)};if(!r||r.length<3)return i();if(delete t.highlight,!o.length)return i();var a=0;return ne.walkTokens(o,(function(e){"code"===e.type&&(a++,setTimeout((function(){r(e.text,e.lang,(function(t,n){if(t)return i(t);null!=n&&n!==e.text&&(e.text=n,e.escaped=!0),0==--a&&i()}))}),0))})),void(0===a&&i())}try{var c=D.lex(e,t);return t.walkTokens&&ne.walkTokens(c,t.walkTokens),$.parse(c,t)}catch(l){if(l.message+="\nPlease report this to https://github.com/markedjs/marked.",t.silent)return"<p>An error occurred:</p><pre>"+J(l.message+"",!0)+"</pre>";throw l}}return ne.options=ne.setOptions=function(e){return X(ne.defaults,e),ee(ne.defaults),ne},ne.getDefaults=Z,ne.defaults=te,ne.use=function(e){var t=X({},e);if(e.renderer&&function(){var n=ne.defaults.renderer||new U,o=function(t){var o=n[t];n[t]=function(){for(var r=arguments.length,i=new Array(r),a=0;a<r;a++)i[a]=arguments[a];var c=e.renderer[t].apply(n,i);return!1===c&&(c=o.apply(n,i)),c}};for(var r in e.renderer)o(r);t.renderer=n}(),e.tokenizer&&function(){var n=ne.defaults.tokenizer||new S,o=function(t){var o=n[t];n[t]=function(){for(var r=arguments.length,i=new Array(r),a=0;a<r;a++)i[a]=arguments[a];var c=e.tokenizer[t].apply(n,i);return!1===c&&(c=o.apply(n,i)),c}};for(var r in e.tokenizer)o(r);t.tokenizer=n}(),e.walkTokens){var n=ne.defaults.walkTokens;t.walkTokens=function(t){e.walkTokens(t),n&&n(t)}}ne.setOptions(t)},ne.walkTokens=function(e,t){for(var o,r=n(e);!(o=r()).done;){var i=o.value;switch(t(i),i.type){case"table":for(var a,c=n(i.tokens.header);!(a=c()).done;){var l=a.value;ne.walkTokens(l,t)}for(var d,u=n(i.tokens.cells);!(d=u()).done;)for(var s,p=n(d.value);!(s=p()).done;){var m=s.value;ne.walkTokens(m,t)}break;case"list":ne.walkTokens(i.items,t);break;default:i.tokens&&ne.walkTokens(i.tokens,t)}}},ne.Parser=$,ne.parser=$.parse,ne.Renderer=U,ne.TextRenderer=G,ne.Lexer=D,ne.lexer=D.lex,ne.Tokenizer=S,ne.Slugger=K,ne.parse=ne,ne}()},function(e,t,n){"use strict";t.__esModule=!0,t.ParticleAccelerator=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ParticleAccelerator=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.assembled,u=l.power,s=l.strength;return(0,o.createComponentVNode)(2,a.Window,{width:350,height:185,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Run Scan",onClick:function(){return c("scan")}}),children:(0,o.createComponentVNode)(2,i.Box,{color:d?"good":"bad",children:d?"Ready - All parts in place":"Unable to detect all parts"})})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Particle Accelerator Controls",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.Button,{icon:u?"power-off":"times",content:u?"On":"Off",selected:u,disabled:!d,onClick:function(){return c("power")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Particle Strength",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"backward",disabled:!d,onClick:function(){return c("remove_strength")}})," ",String(s).padStart(1,"0")," ",(0,o.createComponentVNode)(2,i.Button,{icon:"forward",disabled:!d,onClick:function(){return c("add_strength")}})]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.PersonalCrafting=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return l(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return l(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}t.PersonalCrafting=function(e,t){for(var n,l=(0,r.useBackend)(t),u=l.act,s=l.data,p=s.busy,m=s.display_craftable_only,f=s.display_compact,h=s.crafting_recipes||{},C=[],g=[],b=0,N=Object.keys(h);b<N.length;b++){var v=N[b],V=h[v];if("has_subcats"in V)for(var y=0,k=Object.keys(V);y<k.length;y++){var x=k[y];if("has_subcats"!==x){C.push({name:x,category:v,subcategory:x});for(var _,w=c(V[x]);!(_=w()).done;){var B=_.value;g.push(Object.assign({},B,{category:x}))}}}else{C.push({name:v,category:v});for(var S,L=c(h[v]);!(S=L()).done;){var I=S.value;g.push(Object.assign({},I,{category:v}))}}}var T=(0,r.useLocalState)(t,"tab",null==(n=C[0])?void 0:n.name),A=T[0],E=T[1],M=g.filter((function(e){return e.category===A}));return(0,o.createComponentVNode)(2,a.Window,{title:"Crafting Menu",width:700,height:800,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[!!p&&(0,o.createComponentVNode)(2,i.Dimmer,{fontSize:"32px",children:[(0,o.createComponentVNode)(2,i.Icon,{name:"cog",spin:1})," Crafting..."]}),(0,o.createComponentVNode)(2,i.Section,{title:"Personal Crafting",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button.Checkbox,{content:"Compact",checked:f,onClick:function(){return u("toggle_compact")}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{content:"Craftable Only",checked:m,onClick:function(){return u("toggle_recipes")}})],4),children:(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Tabs,{vertical:!0,children:C.map((function(e){return(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:e.name===A,onClick:function(){E(e.name),u("set_category",{category:e.category,subcategory:e.subcategory})},children:e.name},e.name)}))})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,d,{craftables:M})})]})})]})})};var d=function(e,t){var n=e.craftables,a=void 0===n?[]:n,c=(0,r.useBackend)(t),l=c.act,d=c.data,u=d.craftability,s=void 0===u?{}:u,p=d.display_compact,m=d.display_craftable_only;return a.map((function(e){return m&&!s[e.ref]?null:p?(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,className:"candystripe",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"cog",content:"Craft",disabled:!s[e.ref],tooltip:e.tool_text&&"Tools needed: "+e.tool_text,tooltipPosition:"left",onClick:function(){return l("make",{recipe:e.ref})}}),children:e.req_text},e.name):(0,o.createComponentVNode)(2,i.Section,{title:e.name,level:2,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"cog",content:"Craft",disabled:!s[e.ref],onClick:function(){return l("make",{recipe:e.ref})}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[!!e.req_text&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Required",children:e.req_text}),!!e.catalyst_text&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Catalyst",children:e.catalyst_text}),!!e.tool_text&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Tools",children:e.tool_text})]})},e.name)}))}},function(e,t,n){"use strict";t.__esModule=!0,t.PortableChemMixer=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(2),l=n(16);t.PortableChemMixer=function(e,t){var n=(0,i.useBackend)(t),d=n.act,u=n.data,s=!!u.recordingRecipe,p=u.beakerTransferAmounts||[],m=s&&Object.keys(u.recordingRecipe).map((function(e){return{id:e,name:(0,r.toTitleCase)(e.replace(/_/," ")),volume:u.recordingRecipe[e]}}))||u.beakerContents||[],f=(0,l.sortBy)((function(e){return e.title}))(u.chemicals);return(0,o.createComponentVNode)(2,c.Window,{width:645,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{title:"Dispense",buttons:p.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{icon:"plus",selected:e===u.amount,content:e,onClick:function(){return d("amount",{target:e})}},e)})),children:(0,o.createComponentVNode)(2,a.Box,{mr:-1,children:f.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{icon:"tint",width:"150px",lineHeight:"21px",content:"("+e.volume+") "+e.title,onClick:function(){return d("dispense",{reagent:e.id})}},e.id)}))})}),(0,o.createComponentVNode)(2,a.Section,{title:"Disposal controls",buttons:p.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{icon:"minus",disabled:s,content:e,onClick:function(){return d("remove",{amount:e})}},e)})),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Beaker",buttons:!!u.isBeakerLoaded&&(0,o.createComponentVNode)(2,a.Button,{icon:"eject",content:"Eject",disabled:!u.isBeakerLoaded,onClick:function(){return d("eject")}}),children:(s?"Virtual beaker":u.isBeakerLoaded&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.AnimatedNumber,{initial:0,value:u.beakerCurrentVolume}),(0,o.createTextVNode)("/"),u.beakerMaxVolume,(0,o.createTextVNode)(" units")],0))||"No beaker"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Contents",children:[(0,o.createComponentVNode)(2,a.Box,{color:"label",children:u.isBeakerLoaded||s?0===m.length&&"Nothing":"N/A"}),m.map((function(e){return(0,o.createComponentVNode)(2,a.Box,{color:"label",children:[(0,o.createComponentVNode)(2,a.AnimatedNumber,{initial:0,value:e.volume})," ","units of ",e.name]},e.name)}))]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.PortableGenerator=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.PortableGenerator=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.stack_percent,u=(d>50?"good":d>15&&"average")||"bad";return(0,o.createComponentVNode)(2,a.Window,{width:450,height:340,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[!l.anchored&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Generator not anchored."}),(0,o.createComponentVNode)(2,i.Section,{title:"Status",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power switch",children:(0,o.createComponentVNode)(2,i.Button,{icon:l.active?"power-off":"times",onClick:function(){return c("toggle_power")},disabled:!l.ready_to_boot,children:l.active?"On":"Off"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:l.sheet_name+" sheets",children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:u,children:l.sheets}),l.sheets>=1&&(0,o.createComponentVNode)(2,i.Button,{ml:1,icon:"eject",disabled:l.active,onClick:function(){return c("eject")},children:"Eject"})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current sheet level",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:l.stack_percent/100,ranges:{good:[.1,Infinity],average:[.01,.1],bad:[-Infinity,.01]}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Heat level",children:l.current_heat<100?(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"good",children:"Nominal"}):l.current_heat<200?(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"average",children:"Caution"}):(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"bad",children:"DANGER"})})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Output",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current output",children:l.power_output}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Adjust output",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"minus",onClick:function(){return c("lower_power")},children:l.power_generated}),(0,o.createComponentVNode)(2,i.Button,{icon:"plus",onClick:function(){return c("higher_power")},children:l.power_generated})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power available",children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:!l.connected&&"bad",children:l.connected?l.power_available:"Unconnected"})})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.PortablePump=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(185);t.PortablePump=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.direction,s=(d.holding,d.target_pressure),p=d.default_pressure,m=d.min_pressure,f=d.max_pressure;return(0,o.createComponentVNode)(2,a.Window,{width:300,height:315,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,c.PortableBasicInfo),(0,o.createComponentVNode)(2,i.Section,{title:"Pump",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u?"sign-in-alt":"sign-out-alt",content:u?"In":"Out",selected:u,onClick:function(){return l("direction")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Output",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:s,unit:"kPa",width:"75px",minValue:m,maxValue:f,step:10,onChange:function(e,t){return l("pressure",{pressure:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Presets",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"minus",disabled:s===m,onClick:function(){return l("pressure",{pressure:"min"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"sync",disabled:s===p,onClick:function(){return l("pressure",{pressure:"reset"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"plus",disabled:s===f,onClick:function(){return l("pressure",{pressure:"max"})}})]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.PortableScrubber=void 0;var o=n(0),r=n(1),i=n(3),a=n(38),c=n(2),l=n(185);t.PortableScrubber=function(e,t){var n=(0,r.useBackend)(t),d=n.act,u=n.data.filter_types||[];return(0,o.createComponentVNode)(2,c.Window,{width:320,height:350,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,l.PortableBasicInfo),(0,o.createComponentVNode)(2,i.Section,{title:"Filters",children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{icon:e.enabled?"check-square-o":"square-o",content:(0,a.getGasLabel)(e.gas_id,e.gas_name),selected:e.enabled,onClick:function(){return d("toggle_filter",{val:e.gas_id})}},e.id)}))})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.PortableTurret=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.PortableTurret=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.silicon_user,u=l.locked,s=l.on,p=l.check_weapons,m=l.neutralize_criminals,f=l.neutralize_all,h=l.neutralize_unidentified,C=l.neutralize_nonmindshielded,g=l.neutralize_cyborgs,b=l.ignore_heads,N=l.manual_control,v=l.allow_manual_control,V=l.lasertag_turret;return(0,o.createComponentVNode)(2,a.Window,{width:305,height:V?110:300,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.NoticeBox,{children:["Swipe an ID card to ",u?"unlock":"lock"," this interface."]}),(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",buttons:!V&&(!!v||!!N&&!!d)&&(0,o.createComponentVNode)(2,i.Button,{icon:N?"wifi":"terminal",content:N?"Remotely Controlled":"Manual Control",disabled:N,color:"bad",onClick:function(){return c("manual")}}),children:(0,o.createComponentVNode)(2,i.Button,{icon:s?"power-off":"times",content:s?"On":"Off",selected:s,disabled:u,onClick:function(){return c("power")}})})})}),!V&&(0,o.createComponentVNode)(2,i.Section,{title:"Target Settings",buttons:(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:b,content:"Ignore Heads",disabled:u,onClick:function(){return c("shootheads")}}),children:[(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,checked:f,content:"Non-Security and Non-Command",disabled:u,onClick:function(){return c("shootall")}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,checked:p,content:"Unauthorized Weapons",disabled:u,onClick:function(){return c("authweapon")}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,checked:h,content:"Unidentified Life Signs",disabled:u,onClick:function(){return c("checkxenos")}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,checked:C,content:"Non-Mindshielded",disabled:u,onClick:function(){return c("checkloyal")}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,checked:m,content:"Wanted Criminals",disabled:u,onClick:function(){return c("shootcriminals")}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,checked:g,content:"Cyborgs",disabled:u,onClick:function(){return c("shootborgs")}})]})],0)]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ProbingConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ProbingConsole=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.open,u=l.feedback,s=l.occupant,p=l.occupant_name,m=l.occupant_status;return(0,o.createComponentVNode)(2,a.Window,{width:330,height:207,theme:"abductor",children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Machine Report",children:u})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Scanner",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d?"sign-out-alt":"sign-in-alt",content:d?"Close":"Open",onClick:function(){return c("door")}}),children:s&&(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",children:p}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",color:3===m?"bad":2===m?"average":"good",children:3===m?"Deceased":2===m?"Unconcious":"Concious"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Experiments",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"thermometer",content:"Probe",onClick:function(){return c("experiment",{experiment_type:1})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"brain",content:"Dissect",onClick:function(){return c("experiment",{experiment_type:2})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"search",content:"Analyze",onClick:function(){return c("experiment",{experiment_type:3})}})]})]})||(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No Subject"})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ProximitySensor=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ProximitySensor=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.minutes,u=l.seconds,s=l.timing,p=l.scanning,m=l.sensitivity;return(0,o.createComponentVNode)(2,a.Window,{width:250,height:185,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:(0,o.createComponentVNode)(2,i.Button,{icon:p?"lock":"unlock",content:p?"Armed":"Not Armed",selected:p,onClick:function(){return c("scanning")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Detection Range",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"backward",disabled:p,onClick:function(){return c("sense",{range:-1})}})," ",String(m).padStart(1,"1")," ",(0,o.createComponentVNode)(2,i.Button,{icon:"forward",disabled:p,onClick:function(){return c("sense",{range:1})}})]})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Auto Arm",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"clock-o",content:s?"Stop":"Start",selected:s,disabled:p,onClick:function(){return c("time")}}),children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",disabled:p||s,onClick:function(){return c("input",{adjust:-30})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"backward",disabled:p||s,onClick:function(){return c("input",{adjust:-1})}})," ",String(d).padStart(2,"0"),":",String(u).padStart(2,"0")," ",(0,o.createComponentVNode)(2,i.Button,{icon:"forward",disabled:p||s,onClick:function(){return c("input",{adjust:1})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",disabled:p||s,onClick:function(){return c("input",{adjust:30})}})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Radio=void 0;var o=n(0),r=n(16),i=n(15),a=n(1),c=n(3),l=n(38),d=n(2);t.Radio=function(e,t){var n=(0,a.useBackend)(t),u=n.act,s=n.data,p=s.freqlock,m=s.frequency,f=s.minFrequency,h=s.maxFrequency,C=s.listening,g=s.broadcasting,b=s.command,N=s.useCommand,v=s.subspace,V=s.subspaceSwitchable,y=l.RADIO_CHANNELS.find((function(e){return e.freq===m})),k=(0,r.map)((function(e,t){return{name:t,status:!!e}}))(s.channels),x=106;return v&&(k.length>0?x+=21*k.length+6:x+=24),(0,o.createComponentVNode)(2,d.Window,{width:360,height:x,children:(0,o.createComponentVNode)(2,d.Window.Content,{children:(0,o.createComponentVNode)(2,c.Section,{children:(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Frequency",children:[p&&(0,o.createComponentVNode)(2,c.Box,{inline:!0,color:"light-gray",children:(0,i.toFixed)(m/10,1)+" kHz"})||(0,o.createComponentVNode)(2,c.NumberInput,{animate:!0,unit:"kHz",step:.2,stepPixelSize:10,minValue:f/10,maxValue:h/10,value:m/10,format:function(e){return(0,i.toFixed)(e,1)},onDrag:function(e,t){return u("frequency",{adjust:t-m/10})}}),y&&(0,o.createComponentVNode)(2,c.Box,{inline:!0,color:y.color,ml:2,children:["[",y.name,"]"]})]}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Audio",children:[(0,o.createComponentVNode)(2,c.Button,{textAlign:"center",width:"37px",icon:C?"volume-up":"volume-mute",selected:C,onClick:function(){return u("listen")}}),(0,o.createComponentVNode)(2,c.Button,{textAlign:"center",width:"37px",icon:g?"microphone":"microphone-slash",selected:g,onClick:function(){return u("broadcast")}}),!!b&&(0,o.createComponentVNode)(2,c.Button,{ml:1,icon:"bullhorn",selected:N,content:"High volume "+(N?"ON":"OFF"),onClick:function(){return u("command")}}),!!V&&(0,o.createComponentVNode)(2,c.Button,{ml:1,icon:"bullhorn",selected:v,content:"Subspace Tx "+(v?"ON":"OFF"),onClick:function(){return u("subspace")}})]}),!!v&&(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Channels",children:[0===k.length&&(0,o.createComponentVNode)(2,c.Box,{inline:!0,color:"bad",children:"No encryption keys installed."}),k.map((function(e){return(0,o.createComponentVNode)(2,c.Box,{children:(0,o.createComponentVNode)(2,c.Button,{icon:e.status?"check-square-o":"square-o",selected:e.status,content:e.name,onClick:function(){return u("channel",{channel:e.name})}})},e.name)}))]})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.RadioactiveMicrolaser=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.RadioactiveMicrolaser=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.irradiate,u=l.stealth,s=l.scanmode,p=l.intensity,m=l.wavelength,f=l.on_cooldown,h=l.cooldown;return(0,o.createComponentVNode)(2,a.Window,{title:"Radioactive Microlaser",width:320,height:335,theme:"syndicate",children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Laser Status",children:(0,o.createComponentVNode)(2,i.Box,{color:f?"average":"good",children:f?"Recharging":"Ready"})})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Scanner Controls",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Irradiation",children:(0,o.createComponentVNode)(2,i.Button,{icon:d?"power-off":"times",content:d?"On":"Off",selected:d,onClick:function(){return c("irradiate")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Stealth Mode",children:(0,o.createComponentVNode)(2,i.Button,{icon:u?"eye-slash":"eye",content:u?"On":"Off",disabled:!d,selected:u,onClick:function(){return c("stealth")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Scan Mode",children:(0,o.createComponentVNode)(2,i.Button,{icon:s?"mortar-pestle":"heartbeat",content:s?"Scan Reagents":"Scan Health",disabled:d&&u,onClick:function(){return c("scanmode")}})})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Laser Settings",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Radiation Intensity",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",onClick:function(){return c("radintensity",{adjust:-5})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"backward",onClick:function(){return c("radintensity",{adjust:-1})}})," ",(0,o.createComponentVNode)(2,i.NumberInput,{value:Math.round(p),width:"40px",minValue:1,maxValue:20,onChange:function(e,t){return c("radintensity",{target:t})}})," ",(0,o.createComponentVNode)(2,i.Button,{icon:"forward",onClick:function(){return c("radintensity",{adjust:1})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",onClick:function(){return c("radintensity",{adjust:5})}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Radiation Wavelength",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",onClick:function(){return c("radwavelength",{adjust:-5})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"backward",onClick:function(){return c("radwavelength",{adjust:-1})}})," ",(0,o.createComponentVNode)(2,i.NumberInput,{value:Math.round(m),width:"40px",minValue:0,maxValue:120,onChange:function(e,t){return c("radwavelength",{target:t})}})," ",(0,o.createComponentVNode)(2,i.Button,{icon:"forward",onClick:function(){return c("radwavelength",{adjust:1})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",onClick:function(){return c("radwavelength",{adjust:5})}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Laser Cooldown",children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,children:h})})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.RapidPipeDispenser=void 0;var o=n(0),r=n(6),i=n(1),a=n(3),c=n(2),l=["Atmospherics","Disposals","Transit Tubes"],d={Atmospherics:"wrench",Disposals:"trash-alt","Transit Tubes":"bus",Pipes:"grip-lines","Disposal Pipes":"grip-lines",Devices:"microchip","Heat Exchange":"thermometer-half","Station Equipment":"microchip"},u={grey:"#bbbbbb",amethyst:"#a365ff",blue:"#4466ff",brown:"#b26438",cyan:"#48eae8",dark:"#808080",green:"#1edd00",orange:"#ffa030",purple:"#b535ea",red:"#ff3333",violet:"#6e00f6",yellow:"#ffce26"},s=[{name:"Dispense",bitmask:1},{name:"Connect",bitmask:2},{name:"Destroy",bitmask:4},{name:"Paint",bitmask:8}];t.RapidPipeDispenser=function(e,t){var n=(0,i.useBackend)(t),p=n.act,m=n.data,f=m.category,h=m.categories,C=void 0===h?[]:h,g=m.selected_color,b=m.piping_layer,N=m.mode,v=m.preview_rows.flatMap((function(e){return e.previews})),V=(0,i.useLocalState)(t,"categoryName"),y=V[0],k=V[1],x=C.find((function(e){return e.cat_name===y}))||C[0];return(0,o.createComponentVNode)(2,c.Window,{width:425,height:515,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Category",children:l.map((function(e,t){return(0,o.createComponentVNode)(2,a.Button,{selected:f===t,icon:d[e],color:"transparent",content:e,onClick:function(){return p("category",{category:t})}},e)}))}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Modes",children:s.map((function(e){return(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:N&e.bitmask,content:e.name,onClick:function(){return p("mode",{mode:e.bitmask})}},e.bitmask)}))}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Color",children:[(0,o.createComponentVNode)(2,a.Box,{inline:!0,width:"64px",color:u[g],children:g}),Object.keys(u).map((function(e){return(0,o.createComponentVNode)(2,a.ColorBox,{ml:1,color:u[e],onClick:function(){return p("color",{paint_color:e})}},e)}))]})]})}),(0,o.createComponentVNode)(2,a.Flex,{m:-.5,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{m:.5,children:(0,o.createComponentVNode)(2,a.Section,{children:[0===f&&(0,o.createComponentVNode)(2,a.Box,{mb:1,children:[1,2,3].map((function(e){return(0,o.createComponentVNode)(2,a.Button.Checkbox,{fluid:!0,checked:e===b,content:"Layer "+e,onClick:function(){return p("piping_layer",{piping_layer:e})}},e)}))}),(0,o.createComponentVNode)(2,a.Box,{width:"108px",children:v.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{title:e.dir_name,selected:e.selected,style:{width:"48px",height:"48px",padding:0},onClick:function(){return p("setdir",{dir:e.dir,flipped:e.flipped})},children:(0,o.createComponentVNode)(2,a.Box,{className:(0,r.classes)(["pipes32x32",e.dir+"-"+e.icon_state]),style:{transform:"scale(1.5) translate(17%, 17%)"}})},e.dir)}))})]})}),(0,o.createComponentVNode)(2,a.Flex.Item,{m:.5,grow:1,children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Tabs,{children:C.map((function(e,t){return(0,o.createComponentVNode)(2,a.Tabs.Tab,{fluid:!0,icon:d[e.cat_name],selected:e.cat_name===x.cat_name,onClick:function(){return k(e.cat_name)},children:e.cat_name},e.cat_name)}))}),null==x?void 0:x.recipes.map((function(e){return(0,o.createComponentVNode)(2,a.Button.Checkbox,{fluid:!0,ellipsis:!0,checked:e.selected,content:e.pipe_name,title:e.pipe_name,onClick:function(){return p("pipe_type",{pipe_type:e.pipe_index,category:x.cat_name})}},e.pipe_index)}))]})})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.RemoteRobotControlContent=t.RemoteRobotControl=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(2);t.RemoteRobotControl=function(e,t){return(0,o.createComponentVNode)(2,c.Window,{title:"Remote Robot Control",width:500,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,l)})})};var l=function(e,t){var n=(0,i.useBackend)(t),c=n.act,l=n.data.robots,d=void 0===l?[]:l;return d.length?d.map((function(e){return(0,o.createComponentVNode)(2,a.Section,{title:e.name+" ("+e.model+")",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"tools",content:"Interface",onClick:function(){return c("interface",{ref:e.ref})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"phone-alt",content:"Call",onClick:function(){return c("callbot",{ref:e.ref})}})],4),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Status",children:[(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"Inactive"===(0,r.decodeHtmlEntities)(e.mode)?"bad":"Idle"===(0,r.decodeHtmlEntities)(e.mode)?"average":"good",children:(0,r.decodeHtmlEntities)(e.mode)})," ",e.hacked&&(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"bad",children:"(HACKED)"})||""]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Location",children:e.location})]})},e.ref)})):(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.NoticeBox,{textAlign:"center",children:"No robots detected"})})};t.RemoteRobotControlContent=l},function(e,t,n){"use strict";t.__esModule=!0,t.RoboticsControlConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.RoboticsControlConsole=function(e,t){var n=(0,r.useBackend)(t),d=(n.act,n.data),u=(0,r.useSharedState)(t,"tab",1),s=u[0],p=u[1],m=d.can_hack,f=d.cyborgs,h=void 0===f?[]:f,C=d.drones,g=void 0===C?[]:C;return(0,o.createComponentVNode)(2,a.Window,{width:500,height:460,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Tabs,{children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{icon:"list",lineHeight:"23px",selected:1===s,onClick:function(){return p(1)},children:["Cyborgs (",h.length,")"]}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{icon:"list",lineHeight:"23px",selected:2===s,onClick:function(){return p(2)},children:["Drones (",g.length,")"]})]}),1===s&&(0,o.createComponentVNode)(2,c,{cyborgs:h,can_hack:m}),2===s&&(0,o.createComponentVNode)(2,l,{drones:g})]})})};var c=function(e,t){var n=e.cyborgs,a=e.can_hack,c=(0,r.useBackend)(t),l=c.act;c.data;return n.length?n.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name,buttons:(0,o.createFragment)([!!a&&!e.emagged&&(0,o.createComponentVNode)(2,i.Button,{icon:"terminal",content:"Hack",color:"bad",onClick:function(){return l("magbot",{ref:e.ref})}}),(0,o.createComponentVNode)(2,i.Button.Confirm,{icon:e.locked_down?"unlock":"lock",color:e.locked_down?"good":"default",content:e.locked_down?"Release":"Lockdown",onClick:function(){return l("stopbot",{ref:e.ref})}}),(0,o.createComponentVNode)(2,i.Button.Confirm,{icon:"bomb",content:"Detonate",color:"bad",onClick:function(){return l("killbot",{ref:e.ref})}})],0),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:(0,o.createComponentVNode)(2,i.Box,{color:e.status?"bad":e.locked_down?"average":"good",children:e.status?"Not Responding":e.locked_down?"Locked Down":"Nominal"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Charge",children:(0,o.createComponentVNode)(2,i.Box,{color:e.charge<=30?"bad":e.charge<=70?"average":"good",children:"number"==typeof e.charge?e.charge+"%":"Not Found"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Module",children:e.module}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Master AI",children:(0,o.createComponentVNode)(2,i.Box,{color:e.synchronization?"default":"average",children:e.synchronization||"None"})})]})},e.ref)})):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No cyborg units detected within access parameters"})},l=function(e,t){var n=e.drones,a=(0,r.useBackend)(t).act;return n.length?n.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name,buttons:(0,o.createComponentVNode)(2,i.Button.Confirm,{icon:"bomb",content:"Detonate",color:"bad",onClick:function(){return a("killdrone",{ref:e.ref})}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:(0,o.createComponentVNode)(2,i.Box,{color:e.status?"bad":"good",children:e.status?"Not Responding":"Nominal"})})})},e.ref)})):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No drone units detected within access parameters"})}},function(e,t,n){"use strict";t.__esModule=!0,t.Roulette=t.RouletteBetTable=t.RouletteBoard=t.RouletteNumberButton=void 0;var o=n(0),r=n(6),i=n(1),a=n(3),c=n(2),l=function(e){if(0===e)return"green";for(var t=[[1,10],[19,28]],n=!0,o=0;o<t.length;o++){var r=t[o];if(e>=r[0]&&e<=r[1]){n=!1;break}}var i=e%2==0;return(n?i:!i)?"red":"black"},d=function(e,t){var n=e.number,r=(0,i.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Button,{bold:!0,content:n,color:l(n),width:"40px",height:"28px",fontSize:"20px",textAlign:"center",mb:0,className:"Roulette__board-extrabutton",onClick:function(){return r("ChangeBetType",{type:n})}})};t.RouletteNumberButton=d;var u=function(e,t){var n=(0,i.useBackend)(t).act;return(0,o.createVNode)(1,"table","Table",[(0,o.createVNode)(1,"tr","Roulette__board-row",[(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{content:"0",color:"transparent",height:"88px",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:0})}}),2,{rowSpan:"3"}),[3,6,9,12,15,18,21,24,27,30,33,36].map((function(e){return(0,o.createVNode)(1,"td","Roulette__board-cell Table__cell-collapsing",(0,o.createComponentVNode)(2,d,{number:e}),2,null,e)})),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"2 to 1",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s3rd col"})}}),2)],0),(0,o.createVNode)(1,"tr",null,[[2,5,8,11,14,17,20,23,26,29,32,35].map((function(e){return(0,o.createVNode)(1,"td","Roulette__board-cell Table__cell-collapsing",(0,o.createComponentVNode)(2,d,{number:e}),2,null,e)})),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"2 to 1",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s2nd col"})}}),2)],0),(0,o.createVNode)(1,"tr",null,[[1,4,7,10,13,16,19,22,25,28,31,34].map((function(e){return(0,o.createVNode)(1,"td","Roulette__board-cell Table__cell-collapsing",(0,o.createComponentVNode)(2,d,{number:e}),2,null,e)})),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"2 to 1",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s1st col"})}}),2)],0),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td"),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"1st 12",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s1-12"})}}),2,{colSpan:"4"}),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"2nd 12",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s13-24"})}}),2,{colSpan:"4"}),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"3rd 12",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s25-36"})}}),2,{colSpan:"4"})],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td"),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"1-18",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s1-18"})}}),2,{colSpan:"2"}),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"Even",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"even"})}}),2,{colSpan:"2"}),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"Black",color:"black",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"black"})}}),2,{colSpan:"2"}),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"Red",color:"red",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"red"})}}),2,{colSpan:"2"}),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"Odd",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"odd"})}}),2,{colSpan:"2"}),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"19-36",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s19-36"})}}),2,{colSpan:"2"})],4)],4,{style:{width:"1px"}})};t.RouletteBoard=u;var s=function(e,t){var n=(0,i.useBackend)(t),c=n.act,d=n.data,u=(0,i.useLocalState)(t,"customBet",500),s=u[0],p=u[1],m=d.BetType;return m.startsWith("s")&&(m=m.substring(1,m.length)),(0,o.createVNode)(1,"table","Roulette__lowertable",[(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"th",(0,r.classes)(["Roulette","Roulette__lowertable--cell","Roulette__lowertable--header"]),"Last Spun:",16),(0,o.createVNode)(1,"th",(0,r.classes)(["Roulette","Roulette__lowertable--cell","Roulette__lowertable--header"]),"Current Bet:",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",(0,r.classes)(["Roulette","Roulette__lowertable--cell","Roulette__lowertable--spinresult","Roulette__lowertable--spinresult-"+l(d.LastSpin)]),d.LastSpin,0),(0,o.createVNode)(1,"td",(0,r.classes)(["Roulette","Roulette__lowertable--cell","Roulette__lowertable--betscell"]),[(0,o.createComponentVNode)(2,a.Box,{bold:!0,mt:1,mb:1,fontSize:"25px",textAlign:"center",children:[d.BetAmount," cr on ",m]}),(0,o.createComponentVNode)(2,a.Box,{ml:1,mr:1,children:[(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:"Bet 10 cr",onClick:function(){return c("ChangeBetAmount",{amount:10})}}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:"Bet 50 cr",onClick:function(){return c("ChangeBetAmount",{amount:50})}}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:"Bet 100 cr",onClick:function(){return c("ChangeBetAmount",{amount:100})}}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:"Bet 500 cr",onClick:function(){return c("ChangeBetAmount",{amount:500})}}),(0,o.createComponentVNode)(2,a.Grid,{children:[(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:"Bet custom amount...",onClick:function(){return c("ChangeBetAmount",{amount:s})}})}),(0,o.createComponentVNode)(2,a.Grid.Column,{size:.1,children:(0,o.createComponentVNode)(2,a.NumberInput,{value:s,minValue:0,maxValue:1e3,step:10,stepPixelSize:4,width:"40px",onChange:function(e,t){return p(t)}})})]})]})],4)],4),(0,o.createVNode)(1,"tr",null,(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,a.Box,{bold:!0,m:1,fontSize:"14px",textAlign:"center",children:"Swipe an ID card with a connected account to spin!"}),2,{colSpan:"2"}),2),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td","Roulette__lowertable--cell",[(0,o.createComponentVNode)(2,a.Box,{inline:!0,bold:!0,mr:1,children:"House Balance:"}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:d.HouseBalance?d.HouseBalance+" cr":"None"})],4),(0,o.createVNode)(1,"td","Roulette__lowertable--cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:d.IsAnchored?"Bolted":"Unbolted",m:1,color:"transparent",textAlign:"center",onClick:function(){return c("anchor")}}),2)],4)],4)};t.RouletteBetTable=s;t.Roulette=function(e,t){return(0,o.createComponentVNode)(2,c.Window,{width:603,height:475,theme:"cardtable",children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,u),(0,o.createComponentVNode)(2,s)]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SatelliteControl=void 0;var o=n(0),r=n(1),i=n(3),a=n(174),c=n(2);t.SatelliteControl=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.satellites||[];return(0,o.createComponentVNode)(2,c.Window,{width:400,height:305,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[d.meteor_shield&&(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledListItem,{label:"Coverage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:d.meteor_shield_coverage/d.meteor_shield_coverage_max,content:100*d.meteor_shield_coverage/d.meteor_shield_coverage_max+"%",ranges:{good:[1,Infinity],average:[.3,1],bad:[-Infinity,.3]}})})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Satellite Controls",children:(0,o.createComponentVNode)(2,i.Box,{mr:-1,children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:e.active,content:"#"+e.id+" "+e.mode,onClick:function(){return l("toggle",{id:e.id})}},e.id)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ScannerGate=void 0;var o=n(0),r=n(1),i=n(3),a=n(60),c=n(2),l=["Positive","Harmless","Minor","Medium","Harmful","Dangerous","BIOHAZARD"],d=[{name:"Human",value:"human"},{name:"Lizardperson",value:"lizard"},{name:"Flyperson",value:"fly"},{name:"Felinid",value:"felinid"},{name:"Plasmaman",value:"plasma"},{name:"Mothperson",value:"moth"},{name:"Jellyperson",value:"jelly"},{name:"Podperson",value:"pod"},{name:"Golem",value:"golem"},{name:"Zombie",value:"zombie"}],u=[{name:"Starving",value:150},{name:"Obese",value:600}];t.ScannerGate=function(e,t){var n=(0,r.useBackend)(t),i=n.act,l=n.data;return(0,o.createComponentVNode)(2,c.Window,{width:400,height:300,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.InterfaceLockNoticeBox,{onLockedStatusChange:function(){return i("toggle_lock")}}),!l.locked&&(0,o.createComponentVNode)(2,p)]})})};var s={Off:{title:"Scanner Mode: Off",component:function(){return m}},Wanted:{title:"Scanner Mode: Wanted",component:function(){return f}},Guns:{title:"Scanner Mode: Guns",component:function(){return h}},Mindshield:{title:"Scanner Mode: Mindshield",component:function(){return C}},Disease:{title:"Scanner Mode: Disease",component:function(){return g}},Species:{title:"Scanner Mode: Species",component:function(){return b}},Nutrition:{title:"Scanner Mode: Nutrition",component:function(){return N}},Nanites:{title:"Scanner Mode: Nanites",component:function(){return v}}},p=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data.scan_mode,l=s[c]||s.off,d=l.component();return(0,o.createComponentVNode)(2,i.Section,{title:l.title,buttons:"Off"!==c&&(0,o.createComponentVNode)(2,i.Button,{icon:"arrow-left",content:"back",onClick:function(){return a("set_mode",{new_mode:"Off"})}}),children:(0,o.createComponentVNode)(2,d)})},m=function(e,t){var n=(0,r.useBackend)(t).act;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:"Select a scanning mode below."}),(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.Button,{content:"Wanted",onClick:function(){return n("set_mode",{new_mode:"Wanted"})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Guns",onClick:function(){return n("set_mode",{new_mode:"Guns"})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Mindshield",onClick:function(){return n("set_mode",{new_mode:"Mindshield"})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Disease",onClick:function(){return n("set_mode",{new_mode:"Disease"})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Species",onClick:function(){return n("set_mode",{new_mode:"Species"})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Nutrition",onClick:function(){return n("set_mode",{new_mode:"Nutrition"})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Nanites",onClick:function(){return n("set_mode",{new_mode:"Nanites"})}})]})],4)},f=function(e,t){var n=(0,r.useBackend)(t).data.reverse;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:["Trigger if the person scanned ",n?"does not have":"has"," ","any warrants for their arrest."]}),(0,o.createComponentVNode)(2,V)],4)},h=function(e,t){var n=(0,r.useBackend)(t).data.reverse;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:["Trigger if the person scanned ",n?"does not have":"has"," ","any guns."]}),(0,o.createComponentVNode)(2,V)],4)},C=function(e,t){var n=(0,r.useBackend)(t).data.reverse;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:["Trigger if the person scanned ",n?"does not have":"has"," ","a mindshield."]}),(0,o.createComponentVNode)(2,V)],4)},g=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,d=c.reverse,u=c.disease_threshold;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:["Trigger if the person scanned ",d?"does not have":"has"," ","a disease equal or worse than ",u,"."]}),(0,o.createComponentVNode)(2,i.Box,{mb:2,children:l.map((function(e){return(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:e===u,content:e,onClick:function(){return a("set_disease_threshold",{new_threshold:e})}},e)}))}),(0,o.createComponentVNode)(2,V)],4)},b=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.reverse,u=c.target_species,s=d.find((function(e){return e.value===u}));return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:["Trigger if the person scanned is ",l?"not":""," ","of the ",s.name," species.","zombie"===u&&" All zombie types will be detected, including dormant zombies."]}),(0,o.createComponentVNode)(2,i.Box,{mb:2,children:d.map((function(e){return(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:e.value===u,content:e.name,onClick:function(){return a("set_target_species",{new_species:e.value})}},e.value)}))}),(0,o.createComponentVNode)(2,V)],4)},N=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.reverse,d=c.target_nutrition,s=u.find((function(e){return e.value===d}));return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:["Trigger if the person scanned ",l?"does not have":"has"," ","the ",s.name," nutrition level."]}),(0,o.createComponentVNode)(2,i.Box,{mb:2,children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:e.value===d,content:e.name,onClick:function(){return a("set_target_nutrition",{new_nutrition:e.name})}},e.name)}))}),(0,o.createComponentVNode)(2,V)],4)},v=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.reverse,d=c.nanite_cloud;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:["Trigger if the person scanned ",l?"does not have":"has"," ","nanite cloud ",d,"."]}),(0,o.createComponentVNode)(2,i.Box,{mb:2,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cloud ID",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:d,width:"65px",minValue:1,maxValue:100,stepPixelSize:2,onChange:function(e,t){return a("set_nanite_cloud",{new_cloud:t})}})})})}),(0,o.createComponentVNode)(2,V)],4)},V=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data.reverse;return(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Scanning Mode",children:(0,o.createComponentVNode)(2,i.Button,{content:c?"Inverted":"Default",icon:c?"random":"long-arrow-alt-right",onClick:function(){return a("toggle_reverse")},color:c?"bad":"good"})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SeedExtractor=void 0;var o=n(0),r=n(16),i=n(33),a=n(19),c=n(1),l=n(3),d=n(2);t.SeedExtractor=function(e,t){var n,u,s=(0,c.useBackend)(t),p=s.act,m=s.data,f=(n=m.seeds,u=Object.keys(n).map((function(e){var t=function(e){var t,n=/([^;=]+)=([^;]+)/g,o={};do{(t=n.exec(e))&&(o[t[1]]=t[2]+"")}while(t);return o}(e);return t.amount=n[e],t.key=e,t.name=(0,a.toTitleCase)(t.name.replace("pack of ","")),t})),(0,i.flow)([(0,r.sortBy)((function(e){return e.name}))])(u));return(0,o.createComponentVNode)(2,d.Window,{width:1e3,height:400,resizable:!0,children:(0,o.createComponentVNode)(2,d.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,l.Section,{title:"Stored seeds:",children:(0,o.createComponentVNode)(2,l.Table,{cellpadding:"3",textAlign:"center",children:[(0,o.createComponentVNode)(2,l.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Name"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Lifespan"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Endurance"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Maturation"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Production"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Yield"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Potency"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Instability"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Stock"})]}),f.map((function(e){return(0,o.createComponentVNode)(2,l.Table.Row,{children:[(0,o.createComponentVNode)(2,l.Table.Cell,{bold:!0,children:e.name}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.lifespan}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.endurance}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.maturation}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.production}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.yield}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.potency}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.instability}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:[(0,o.createComponentVNode)(2,l.Button,{content:"Vend",onClick:function(){return p("select",{item:e.key})}}),"(",e.amount," left)"]})]},e.key)}))]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ShuttleManipulatorModification=t.ShuttleManipulatorTemplates=t.ShuttleManipulatorStatus=t.ShuttleManipulator=void 0;var o=n(0),r=n(16),i=n(1),a=n(3),c=n(2);t.ShuttleManipulator=function(e,t){var n=(0,i.useLocalState)(t,"tab",1),r=n[0],s=n[1];return(0,o.createComponentVNode)(2,c.Window,{title:"Shuttle Manipulator",width:800,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:1===r,onClick:function(){return s(1)},children:"Status"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:2===r,onClick:function(){return s(2)},children:"Templates"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:3===r,onClick:function(){return s(3)},children:"Modification"})]}),1===r&&(0,o.createComponentVNode)(2,l),2===r&&(0,o.createComponentVNode)(2,d),3===r&&(0,o.createComponentVNode)(2,u)]})})};var l=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data.shuttles||[];return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Table,{children:c.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,a.Button,{content:"JMP",onClick:function(){return r("jump_to",{type:"mobile",id:e.id})}},e.id)}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,a.Button,{content:"Fly",disabled:!e.can_fly,onClick:function(){return r("fly",{id:e.id})}},e.id)}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.name}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.id}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.status}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:[e.mode,!!e.timer&&(0,o.createFragment)([(0,o.createTextVNode)("("),e.timeleft,(0,o.createTextVNode)(")"),(0,o.createComponentVNode)(2,a.Button,{content:"Fast Travel",disabled:!e.can_fast_travel,onClick:function(){return r("fast_travel",{id:e.id})}},e.id)],0)]})]},e.id)}))})})};t.ShuttleManipulatorStatus=l;var d=function(e,t){var n,c=(0,i.useBackend)(t),l=c.act,d=c.data,u=d.templates||{},s=d.selected||{},p=(0,i.useLocalState)(t,"templateId",Object.keys(u)[0]),m=p[0],f=p[1],h=null==(n=u[m])?void 0:n.templates;return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Tabs,{vertical:!0,children:(0,r.map)((function(e,t){return(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:m===t,onClick:function(){return f(t)},children:e.port_id},t)}))(u)})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,basis:0,children:h.map((function(e){var t=e.shuttle_id===s.shuttle_id;return(0,o.createComponentVNode)(2,a.Section,{title:e.name,level:2,buttons:(0,o.createComponentVNode)(2,a.Button,{content:t?"Selected":"Select",selected:t,onClick:function(){return l("select_template",{shuttle_id:e.shuttle_id})}}),children:(!!e.description||!!e.admin_notes)&&(0,o.createComponentVNode)(2,a.LabeledList,{children:[!!e.description&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Description",children:e.description}),!!e.admin_notes&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Admin Notes",children:e.admin_notes})]})},e.shuttle_id)}))})]})})};t.ShuttleManipulatorTemplates=d;var u=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data,l=c.selected||{},d=c.existing_shuttle||{};return(0,o.createComponentVNode)(2,a.Section,{children:l?(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{level:2,title:l.name,children:(!!l.description||!!l.admin_notes)&&(0,o.createComponentVNode)(2,a.LabeledList,{children:[!!l.description&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Description",children:l.description}),!!l.admin_notes&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Admin Notes",children:l.admin_notes})]})}),d?(0,o.createComponentVNode)(2,a.Section,{level:2,title:"Existing Shuttle: "+d.name,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Status",buttons:(0,o.createComponentVNode)(2,a.Button,{content:"Jump To",onClick:function(){return r("jump_to",{type:"mobile",id:d.id})}}),children:[d.status,!!d.timer&&(0,o.createFragment)([(0,o.createTextVNode)("("),d.timeleft,(0,o.createTextVNode)(")")],0)]})})}):(0,o.createComponentVNode)(2,a.Section,{level:2,title:"Existing Shuttle: None"}),(0,o.createComponentVNode)(2,a.Section,{level:2,title:"Status",children:[(0,o.createComponentVNode)(2,a.Button,{content:"Preview",onClick:function(){return r("preview",{shuttle_id:l.shuttle_id})}}),(0,o.createComponentVNode)(2,a.Button,{content:"Load",color:"bad",onClick:function(){return r("load",{shuttle_id:l.shuttle_id})}})]})],0):"No shuttle selected"})};t.ShuttleManipulatorModification=u},function(e,t,n){"use strict";t.__esModule=!0,t.Signaler=void 0;var o=n(0),r=n(15),i=n(1),a=n(3),c=n(2);t.Signaler=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.code,s=d.frequency,p=d.minFrequency,m=d.maxFrequency;return(0,o.createComponentVNode)(2,c.Window,{width:280,height:132,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Grid,{children:[(0,o.createComponentVNode)(2,a.Grid.Column,{size:1.4,color:"label",children:"Frequency:"}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.NumberInput,{animate:!0,unit:"kHz",step:.2,stepPixelSize:6,minValue:p/10,maxValue:m/10,value:s/10,format:function(e){return(0,r.toFixed)(e,1)},width:"80px",onDrag:function(e,t){return l("freq",{freq:t})}})}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.Button,{ml:1.3,icon:"sync",content:"Reset",onClick:function(){return l("reset",{reset:"freq"})}})})]}),(0,o.createComponentVNode)(2,a.Grid,{mt:.6,children:[(0,o.createComponentVNode)(2,a.Grid.Column,{size:1.4,color:"label",children:"Code:"}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.NumberInput,{animate:!0,step:1,stepPixelSize:6,minValue:1,maxValue:100,value:u,width:"80px",onDrag:function(e,t){return l("code",{code:t})}})}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.Button,{ml:1.3,icon:"sync",content:"Reset",onClick:function(){return l("reset",{reset:"code"})}})})]}),(0,o.createComponentVNode)(2,a.Grid,{mt:.8,children:(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.Button,{mb:-.1,fluid:!0,icon:"arrow-up",content:"Send Signal",textAlign:"center",onClick:function(){return l("signal")}})})})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SkillPanel=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c={color:"lightgreen",fontWeight:"bold"},l={color:"#FFDB58",fontWeight:"bold"};t.SkillPanel=function(e,t){var n=(0,r.useBackend)(t),u=n.act,s=n.data.skills||[];return(0,o.createComponentVNode)(2,a.Window,{title:"Manage Skills",width:600,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:s.playername,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:s.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,children:[(0,o.createVNode)(1,"span",null,e.desc,0,{style:l}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,d,{skill_lvl_num:e.lvlnum,skill_lvl:e.lvl}),(0,o.createVNode)(1,"br"),"Total Experience: [",e.exp," XP]",(0,o.createVNode)(1,"br"),"XP To Next Level:\xa0",0!==e.exp_req?(0,o.createVNode)(1,"span",null,[(0,o.createTextVNode)("["),e.exp_prog,(0,o.createTextVNode)(" / "),e.exp_req,(0,o.createTextVNode)("]")],0):(0,o.createVNode)(1,"span",null,"[MAXXED]",16,{style:c}),(0,o.createVNode)(1,"br"),"Overall Skill Progress: [",e.exp," / ",e.max_exp,"]",(0,o.createComponentVNode)(2,i.ProgressBar,{value:e.exp_percent,color:"good"}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Button,{content:"Adjust Exp",onClick:function(){return u("adj_exp",{skill:e.path})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Set Exp",onClick:function(){return u("set_exp",{skill:e.path})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Set Level",onClick:function(){return u("set_lvl",{skill:e.path})}}),(0,o.createVNode)(1,"br"),(0,o.createVNode)(1,"br")]},e.name)}))})})})})};var d=function(e){var t=e.skill_lvl_num,n=e.skill_lvl;return(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:["Level: [",(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,textColor:"hsl("+50*t+", 50%, 50%)",children:n}),"]"]})}},function(e,t,n){"use strict";t.__esModule=!0,t.Sleeper=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Oxygen",type:"oxyLoss"}];t.Sleeper=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.open,s=d.occupant,p=void 0===s?{}:s,m=d.occupied,f=(d.chems||[]).sort((function(e,t){var n=e.name.toLowerCase(),o=t.name.toLowerCase();return n<o?-1:n>o?1:0}));return(0,o.createComponentVNode)(2,a.Window,{width:310,height:465,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:p.name?p.name:"No Occupant",minHeight:"210px",buttons:!!p.stat&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,color:p.statstate,children:p.stat}),children:!!m&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.ProgressBar,{value:p.health,minValue:p.minHealth,maxValue:p.maxHealth,ranges:{good:[50,Infinity],average:[0,50],bad:[-Infinity,0]}}),(0,o.createComponentVNode)(2,i.Box,{mt:1}),(0,o.createComponentVNode)(2,i.LabeledList,{children:[c.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.label,children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:p[e.type],minValue:0,maxValue:p.maxHealth,color:"bad"})},e.type)})),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cells",color:p.cloneLoss?"bad":"good",children:p.cloneLoss?"Damaged":"Healthy"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Brain",color:p.brainLoss?"bad":"good",children:p.brainLoss?"Abnormal":"Healthy"})]})],4)}),(0,o.createComponentVNode)(2,i.Section,{title:"Medicines",minHeight:"205px",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u?"door-open":"door-closed",content:u?"Open":"Closed",onClick:function(){return l("door")}}),children:f.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{icon:"flask",content:e.name,disabled:!m||!e.allowed,width:"140px",onClick:function(){return l("inject",{chem:e.id})}},e.name)}))})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SlimeBodySwapper=t.BodyEntry=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c={Dead:"bad",Unconscious:"average",Conscious:"good"},l={owner:"You Are Here",stranger:"Occupied",available:"Swap"},d=function(e,t){var n=e.body,r=e.swapFunc;return(0,o.createComponentVNode)(2,i.Section,{title:(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:n.htmlcolor,children:n.name}),level:2,buttons:(0,o.createComponentVNode)(2,i.Button,{content:l[n.occupied],selected:"owner"===n.occupied,color:"stranger"===n.occupied&&"bad",onClick:function(){return r()}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",bold:!0,color:c[n.status],children:n.status}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Jelly",children:n.exoticblood}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Location",children:n.area})]})})};t.BodyEntry=d;t.SlimeBodySwapper=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data.bodies,u=void 0===l?[]:l;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:400,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{children:u.map((function(e){return(0,o.createComponentVNode)(2,d,{body:e,swapFunc:function(){return c("swap",{ref:e.ref})}},e.name)}))})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SmartVend=void 0;var o=n(0),r=n(16),i=n(1),a=n(3),c=n(2);t.SmartVend=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data;return(0,o.createComponentVNode)(2,c.Window,{width:440,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:"Storage",buttons:!!d.isdryer&&(0,o.createComponentVNode)(2,a.Button,{icon:d.drying?"stop":"tint",onClick:function(){return l("Dry")},children:d.drying?"Stop drying":"Dry"}),children:0===d.contents.length&&(0,o.createComponentVNode)(2,a.NoticeBox,{children:["Unfortunately, this ",d.name," is empty."]})||(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:"Item"}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"center",children:d.verb?d.verb:"Dispense"})]}),(0,r.map)((function(e,t){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.name}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:e.amount}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,children:[(0,o.createComponentVNode)(2,a.Button,{content:"One",disabled:e.amount<1,onClick:function(){return l("Release",{name:e.name,amount:1})}}),(0,o.createComponentVNode)(2,a.Button,{content:"Many",disabled:e.amount<=1,onClick:function(){return l("Release",{name:e.name})}})]})]},t)}))(d.contents)]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Smes=void 0;var o=n(0),r=n(1),i=n(3),a=n(40),c=n(2);t.Smes=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.capacityPercent,s=(d.capacity,d.charge),p=d.inputAttempt,m=d.inputting,f=d.inputLevel,h=d.inputLevelMax,C=d.inputAvailable,g=d.outputAttempt,b=d.outputting,N=d.outputLevel,v=d.outputLevelMax,V=d.outputUsed,y=(u>=100?"good":m&&"average")||"bad",k=(b?"good":s>0&&"average")||"bad";return(0,o.createComponentVNode)(2,c.Window,{width:340,height:350,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Stored Energy",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:.01*u,ranges:{good:[.5,Infinity],average:[.15,.5],bad:[-Infinity,.15]}})}),(0,o.createComponentVNode)(2,i.Section,{title:"Input",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Charge Mode",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:p?"sync-alt":"times",selected:p,onClick:function(){return l("tryinput")},children:p?"Auto":"Off"}),children:(0,o.createComponentVNode)(2,i.Box,{color:y,children:(u>=100?"Fully Charged":m&&"Charging")||"Not Charging"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Target Input",children:(0,o.createComponentVNode)(2,i.Flex,{inline:!0,width:"100%",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",disabled:0===f,onClick:function(){return l("input",{target:"min"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"backward",disabled:0===f,onClick:function(){return l("input",{adjust:-1e4})}})]}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,mx:1,children:(0,o.createComponentVNode)(2,i.Slider,{value:f/1e3,fillValue:C/1e3,minValue:0,maxValue:h/1e3,step:5,stepPixelSize:4,format:function(e){return(0,a.formatPower)(1e3*e,1)},onDrag:function(e,t){return l("input",{target:1e3*t})}})}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"forward",disabled:f===h,onClick:function(){return l("input",{adjust:1e4})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",disabled:f===h,onClick:function(){return l("input",{target:"max"})}})]})]})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Available",children:(0,a.formatPower)(C)})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Output",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Output Mode",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:g?"power-off":"times",selected:g,onClick:function(){return l("tryoutput")},children:g?"On":"Off"}),children:(0,o.createComponentVNode)(2,i.Box,{color:k,children:b?"Sending":s>0?"Not Sending":"No Charge"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Target Output",children:(0,o.createComponentVNode)(2,i.Flex,{inline:!0,width:"100%",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",disabled:0===N,onClick:function(){return l("output",{target:"min"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"backward",disabled:0===N,onClick:function(){return l("output",{adjust:-1e4})}})]}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,mx:1,children:(0,o.createComponentVNode)(2,i.Slider,{value:N/1e3,minValue:0,maxValue:v/1e3,step:5,stepPixelSize:4,format:function(e){return(0,a.formatPower)(1e3*e,1)},onDrag:function(e,t){return l("output",{target:1e3*t})}})}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"forward",disabled:N===v,onClick:function(){return l("output",{adjust:1e4})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",disabled:N===v,onClick:function(){return l("output",{target:"max"})}})]})]})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Outputting",children:(0,a.formatPower)(V)})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SmokeMachine=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.SmokeMachine=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.TankContents,u=(l.isTankLoaded,l.TankCurrentVolume),s=l.TankMaxVolume,p=l.active,m=l.setting,f=(l.screen,l.maxSetting),h=void 0===f?[]:f;return(0,o.createComponentVNode)(2,a.Window,{width:350,height:350,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Dispersal Tank",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:p?"power-off":"times",selected:p,content:p?"On":"Off",onClick:function(){return c("power")}}),children:[(0,o.createComponentVNode)(2,i.ProgressBar,{value:u/s,ranges:{bad:[-Infinity,.3]},children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{initial:0,value:u||0})," / "+s]}),(0,o.createComponentVNode)(2,i.Box,{mt:1,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Range",children:[1,2,3,4,5].map((function(e){return(0,o.createComponentVNode)(2,i.Button,{selected:m===e,icon:"plus",content:3*e,disabled:h<e,onClick:function(){return c("setting",{amount:e})}},e)}))})})})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Contents",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"trash",content:"Purge",onClick:function(){return c("purge")}}),children:d.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{color:"label",children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{initial:0,value:e.volume})," ","units of ",e.name]},e.name)}))})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SolarControl=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.SolarControl=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.generated,u=l.generated_ratio,s=l.azimuth_current,p=l.azimuth_rate,m=l.max_rotation_rate,f=l.tracking_state,h=l.connected_panels,C=l.connected_tracker;return(0,o.createComponentVNode)(2,a.Window,{width:380,height:230,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Status",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Scan for new hardware",onClick:function(){return c("refresh")}}),children:(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Solar tracker",color:C?"good":"bad",children:C?"OK":"N/A"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Solar panels",color:h>0?"good":"bad",children:h})]})}),(0,o.createComponentVNode)(2,i.Grid.Column,{size:1.5,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power output",children:(0,o.createComponentVNode)(2,i.ProgressBar,{ranges:{good:[.66,Infinity],average:[.33,.66],bad:[-Infinity,.33]},minValue:0,maxValue:1,value:u,children:d+" W"})})})})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Controls",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Tracking",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"times",content:"Off",selected:0===f,onClick:function(){return c("tracking",{mode:0})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"clock-o",content:"Timed",selected:1===f,onClick:function(){return c("tracking",{mode:1})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Auto",selected:2===f,disabled:!C,onClick:function(){return c("tracking",{mode:2})}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Azimuth",children:[(0===f||1===f)&&(0,o.createComponentVNode)(2,i.NumberInput,{width:"52px",unit:"\xb0",step:1,stepPixelSize:2,minValue:-360,maxValue:720,value:s,onDrag:function(e,t){return c("azimuth",{value:t})}}),1===f&&(0,o.createComponentVNode)(2,i.NumberInput,{width:"80px",unit:"\xb0/m",step:.01,stepPixelSize:1,minValue:-m-.01,maxValue:m+.01,value:p,format:function(e){return(Math.sign(e)>0?"+":"-")+Math.abs(e)},onDrag:function(e,t){return c("azimuth_rate",{value:t})}}),2===f&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"label",mt:"3px",children:[s+" \xb0"," (auto)"]})]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SpaceHeater=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.SpaceHeater=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:305,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Power",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject Cell",disabled:!l.hasPowercell||!l.open,onClick:function(){return c("eject")}}),(0,o.createComponentVNode)(2,i.Button,{icon:l.on?"power-off":"times",content:l.on?"On":"Off",selected:l.on,disabled:!l.hasPowercell,onClick:function(){return c("power")}})],4),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cell",color:!l.hasPowercell&&"bad",children:l.hasPowercell&&(0,o.createComponentVNode)(2,i.ProgressBar,{value:l.powerLevel/100,ranges:{good:[.6,Infinity],average:[.3,.6],bad:[-Infinity,.3]},children:l.powerLevel+"%"})||"None"})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Thermostat",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Temperature",children:(0,o.createComponentVNode)(2,i.Box,{fontSize:"18px",color:Math.abs(l.targetTemp-l.currentTemp)>50?"bad":Math.abs(l.targetTemp-l.currentTemp)>20?"average":"good",children:[l.currentTemp,"\xb0C"]})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Target Temperature",children:l.open&&(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:parseFloat(l.targetTemp),width:"65px",unit:"\xb0C",minValue:l.minTemp,maxValue:l.maxTemp,onChange:function(e,t){return c("target",{target:t})}})||l.targetTemp+"\xb0C"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Mode",children:l.open?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"thermometer-half",content:"Auto",selected:"auto"===l.mode,onClick:function(){return c("mode",{mode:"auto"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fire-alt",content:"Heat",selected:"heat"===l.mode,onClick:function(){return c("mode",{mode:"heat"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fan",content:"Cool",selected:"cool"===l.mode,onClick:function(){return c("mode",{mode:"cool"})}})],4):"Auto"}),(0,o.createComponentVNode)(2,i.LabeledList.Divider)]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SpawnersMenu=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.SpawnersMenu=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data.spawners||[];return(0,o.createComponentVNode)(2,a.Window,{title:"Spawners Menu",width:700,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{children:l.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name+" ("+e.amount_left+" left)",level:2,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{content:"Jump",onClick:function(){return c("jump",{name:e.name})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Spawn",onClick:function(){return c("spawn",{name:e.name})}})],4),children:[(0,o.createComponentVNode)(2,i.Box,{bold:!0,mb:1,fontSize:"20px",children:e.short_desc}),(0,o.createComponentVNode)(2,i.Box,{children:e.flavor_text}),!!e.important_info&&(0,o.createComponentVNode)(2,i.Box,{mt:1,bold:!0,color:"bad",fontSize:"26px",children:e.important_info})]},e.name)}))})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SuitStorageUnit=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.SuitStorageUnit=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.locked,u=l.open,s=l.safeties,p=l.uv_active,m=l.occupied,f=l.suit,h=l.helmet,C=l.mask,g=l.storage;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:305,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[!(!m||!s)&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Biological entity detected in suit chamber. Please remove before continuing with operation."}),p&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Contents are currently being decontaminated. Please wait."})||(0,o.createComponentVNode)(2,i.Section,{title:"Storage",minHeight:"260px",buttons:(0,o.createFragment)([!u&&(0,o.createComponentVNode)(2,i.Button,{icon:d?"unlock":"lock",content:d?"Unlock":"Lock",onClick:function(){return c("lock")}}),!d&&(0,o.createComponentVNode)(2,i.Button,{icon:u?"sign-out-alt":"sign-in-alt",content:u?"Close":"Open",onClick:function(){return c("door")}})],0),children:d&&(0,o.createComponentVNode)(2,i.Box,{mt:6,bold:!0,textAlign:"center",fontSize:"40px",children:[(0,o.createComponentVNode)(2,i.Box,{children:"Unit Locked"}),(0,o.createComponentVNode)(2,i.Icon,{name:"lock"})]})||u&&(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Helmet",children:(0,o.createComponentVNode)(2,i.Button,{icon:h?"square":"square-o",content:h||"Empty",disabled:!h,onClick:function(){return c("dispense",{item:"helmet"})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Suit",children:(0,o.createComponentVNode)(2,i.Button,{icon:f?"square":"square-o",content:f||"Empty",disabled:!f,onClick:function(){return c("dispense",{item:"suit"})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Mask",children:(0,o.createComponentVNode)(2,i.Button,{icon:C?"square":"square-o",content:C||"Empty",disabled:!C,onClick:function(){return c("dispense",{item:"mask"})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Storage",children:(0,o.createComponentVNode)(2,i.Button,{icon:g?"square":"square-o",content:g||"Empty",disabled:!g,onClick:function(){return c("dispense",{item:"storage"})}})})]})||(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"recycle",content:"Decontaminate",disabled:m&&s,textAlign:"center",onClick:function(){return c("uv")}})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SyndPane=t.StatusPane=t.SyndContractorContent=t.SyndContractor=t.FakeTerminal=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);var c=function(e){var t,n;function r(t){var n;return(n=e.call(this,t)||this).timer=null,n.state={currentIndex:0,currentDisplay:[]},n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var a=r.prototype;return a.tick=function(){var e=this.props,t=this.state;t.currentIndex<=e.allMessages.length?(this.setState((function(e){return{currentIndex:e.currentIndex+1}})),t.currentDisplay.push(e.allMessages[t.currentIndex])):(clearTimeout(this.timer),setTimeout(e.onFinished,e.finishedTimeout))},a.componentDidMount=function(){var e=this,t=this.props.linesPerSecond,n=void 0===t?2.5:t;this.timer=setInterval((function(){return e.tick()}),1e3/n)},a.componentWillUnmount=function(){clearTimeout(this.timer)},a.render=function(){return(0,o.createComponentVNode)(2,i.Box,{m:1,children:this.state.currentDisplay.map((function(e){return(0,o.createFragment)([e,(0,o.createVNode)(1,"br")],0,e)}))})},r}(o.Component);t.FakeTerminal=c;t.SyndContractor=function(e,t){return(0,o.createComponentVNode)(2,a.NtosWindow,{width:500,height:600,theme:"syndicate",resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,l)})})};var l=function(e,t){var n=(0,r.useBackend)(t),a=n.data,l=n.act,d=["Recording biometric data...","Analyzing embedded syndicate info...","STATUS CONFIRMED","Contacting syndicate database...","Awaiting response...","Awaiting response...","Awaiting response...","Awaiting response...","Awaiting response...","Awaiting response...","Response received, ack 4851234...","CONFIRM ACC "+Math.round(2e4*Math.random()),"Setting up private accounts...","CONTRACTOR ACCOUNT CREATED","Searching for available contracts...","Searching for available contracts...","Searching for available contracts...","Searching for available contracts...","CONTRACTS FOUND","WELCOME, AGENT"],s=!!a.error&&(0,o.createComponentVNode)(2,i.Modal,{backgroundColor:"red",children:(0,o.createComponentVNode)(2,i.Flex,{align:"center",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{mr:2,children:(0,o.createComponentVNode)(2,i.Icon,{size:4,name:"exclamation-triangle"})}),(0,o.createComponentVNode)(2,i.Flex.Item,{mr:2,grow:1,textAlign:"center",children:[(0,o.createComponentVNode)(2,i.Box,{width:"260px",textAlign:"left",minHeight:"80px",children:a.error}),(0,o.createComponentVNode)(2,i.Button,{content:"Dismiss",onClick:function(){return l("PRG_clear_error")}})]})]})});return a.logged_in?a.logged_in&&a.first_load?(0,o.createComponentVNode)(2,i.Box,{backgroundColor:"rgba(0, 0, 0, 0.8)",minHeight:"525px",children:(0,o.createComponentVNode)(2,c,{allMessages:d,finishedTimeout:3e3,onFinished:function(){return l("PRG_set_first_load_finished")}})}):a.info_screen?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{backgroundColor:"rgba(0, 0, 0, 0.8)",minHeight:"500px",children:(0,o.createComponentVNode)(2,c,{allMessages:["SyndTract v2.0","","We've identified potentional high-value targets that are","currently assigned to your mission area. They are believed","to hold valuable information which could be of immediate","importance to our organisation.","","Listed below are all of the contracts available to you. You","are to bring the specified target to the designated","drop-off, and contact us via this uplink. We will send","a specialised extraction unit to put the body into.","","We want targets alive - but we will sometimes pay slight","amounts if they're not, you just won't recieve the shown","bonus. You can redeem your payment through this uplink in","the form of raw telecrystals, which can be put into your","regular Syndicate uplink to purchase whatever you may need.","We provide you with these crystals the moment you send the","target up to us, which can be collected at anytime through","this system.","","Targets extracted will be ransomed back to the station once","their use to us is fulfilled, with us providing you a small","percentage cut. You may want to be mindful of them","identifying you when they come back. We provide you with","a standard contractor loadout, which will help cover your","identity."],linesPerSecond:10})}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"CONTINUE",color:"transparent",textAlign:"center",onClick:function(){return l("PRG_toggle_info")}})],4):(0,o.createFragment)([s,(0,o.createComponentVNode)(2,u)],0):(0,o.createComponentVNode)(2,i.Section,{minHeight:"525px",children:[(0,o.createComponentVNode)(2,i.Box,{width:"100%",textAlign:"center",children:(0,o.createComponentVNode)(2,i.Button,{content:"REGISTER USER",color:"transparent",onClick:function(){return l("PRG_login")}})}),!!a.error&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:a.error})]})};t.SyndContractorContent=l;var d=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data;return(0,o.createComponentVNode)(2,i.Section,{title:(0,o.createFragment)([(0,o.createTextVNode)("Contractor Status"),(0,o.createComponentVNode)(2,i.Button,{content:"View Information Again",color:"transparent",mb:0,ml:1,onClick:function(){return a("PRG_toggle_info")}})],4),buttons:(0,o.createComponentVNode)(2,i.Box,{bold:!0,mr:1,children:[c.contract_rep," Rep"]}),children:(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{size:.85,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"TC Availible",buttons:(0,o.createComponentVNode)(2,i.Button,{content:"Claim",disabled:c.redeemable_tc<=0,onClick:function(){return a("PRG_redeem_TC")}}),children:c.redeemable_tc}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"TC Earned",children:c.earned_tc})]})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Contracts Completed",children:c.contracts_completed}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Status",children:"ACTIVE"})]})})]})})};t.StatusPane=d;var u=function(e,t){var n=(0,r.useLocalState)(t,"tab",1),a=n[0],c=n[1];return(0,o.createFragment)([(0,o.createComponentVNode)(2,d,{state:e.state}),(0,o.createComponentVNode)(2,i.Tabs,{children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:1===a,onClick:function(){return c(1)},children:"Contracts"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:2===a,onClick:function(){return c(2)},children:"Hub"})]}),1===a&&(0,o.createComponentVNode)(2,s),2===a&&(0,o.createComponentVNode)(2,p)],0)};t.SyndPane=u;var s=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.contracts||[];return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Availible Contracts",buttons:(0,o.createComponentVNode)(2,i.Button,{content:"Call Extraction",disabled:!c.ongoing_contract||c.extraction_enroute,onClick:function(){return a("PRG_call_extraction")}}),children:l.map((function(e){if(!c.ongoing_contract||2===e.status){var t=e.status>1;if(!(e.status>=5))return(0,o.createComponentVNode)(2,i.Section,{title:e.target?e.target+" ("+e.target_rank+")":"Invalid Target",level:t?1:2,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,mr:1,children:[e.payout," (+",e.payout_bonus,") TC"]}),(0,o.createComponentVNode)(2,i.Button,{content:t?"Abort":"Accept",disabled:e.extraction_enroute,color:t&&"bad",onClick:function(){return a("PRG_contract"+(t?"_abort":"-accept"),{contract_id:e.id})}})],4),children:(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:e.message}),(0,o.createComponentVNode)(2,i.Grid.Column,{size:.5,children:[(0,o.createComponentVNode)(2,i.Box,{bold:!0,mb:1,children:"Dropoff Location:"}),(0,o.createComponentVNode)(2,i.Box,{children:e.dropoff})]})]})},e.target)}}))}),(0,o.createComponentVNode)(2,i.Section,{title:"Dropoff Locator",textAlign:"center",opacity:c.ongoing_contract?100:0,children:(0,o.createComponentVNode)(2,i.Box,{bold:!0,children:c.dropoff_direction})})],4)},p=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.contractor_hub_items||[];return(0,o.createComponentVNode)(2,i.Section,{children:l.map((function(e){var t=e.cost?e.cost+" Rep":"FREE",n=-1!==e.limited;return(0,o.createComponentVNode)(2,i.Section,{title:e.name+" - "+t,level:2,buttons:(0,o.createFragment)([n&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,mr:1,children:[e.limited," remaining"]}),(0,o.createComponentVNode)(2,i.Button,{content:"Purchase",disabled:c.contract_rep<e.cost||n&&e.limited<=0,onClick:function(){return a("buy_hub",{item:e.name,cost:e.cost})}})],0),children:(0,o.createComponentVNode)(2,i.Table,{children:(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Icon,{fontSize:"60px",name:e.item_icon})}),(0,o.createComponentVNode)(2,i.Table.Cell,{verticalAlign:"top",children:e.desc})]})})},e.name)}))})}},function(e,t,n){"use strict";t.__esModule=!0,t.TachyonArrayContent=t.TachyonArray=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.TachyonArray=function(e,t){var n=(0,r.useBackend)(t),l=(n.act,n.data.records),d=void 0===l?[]:l;return(0,o.createComponentVNode)(2,a.Window,{width:500,height:225,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:d.length?(0,o.createComponentVNode)(2,c):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No Records"})})})};var c=function(e,t){var n,a=(0,r.useBackend)(t),c=a.act,l=a.data.records,d=void 0===l?[]:l,u=(0,r.useSharedState)(t,"record",null==(n=d[0])?void 0:n.name),s=u[0],p=u[1],m=d.find((function(e){return e.name===s}));return(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Tabs,{vertical:!0,children:d.map((function(e){return(0,o.createComponentVNode)(2,i.Tabs.Tab,{icon:"file",selected:e.name===s,onClick:function(){return p(e.name)},children:e.name},e.name)}))})}),m?(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Section,{level:"2",title:m.name,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button.Confirm,{icon:"trash",content:"Delete",color:"bad",onClick:function(){return c("delete_record",{ref:m.ref})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"print",content:"Print",onClick:function(){return c("print_record",{ref:m.ref})}})],4),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Timestamp",children:m.timestamp}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Coordinates",children:m.coordinates}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Displacement",children:[m.displacement," seconds"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Epicenter Radius",children:[m.factual_epicenter_radius,m.theory_epicenter_radius&&" (Theoretical: "+m.theory_epicenter_radius+")"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Outer Radius",children:[m.factual_outer_radius,m.theory_outer_radius&&" (Theoretical: "+m.theory_outer_radius+")"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Shockwave Radius",children:[m.factual_shockwave_radius,m.theory_shockwave_radius&&" (Theoretical: "+m.theory_shockwave_radius+")"]})]})})}):(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No Record Selected"})})]})})};t.TachyonArrayContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.Tank=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Tank=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:120,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Pressure",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:l.tankPressure/1013,ranges:{good:[.35,Infinity],average:[.15,.35],bad:[-Infinity,.15]},children:l.tankPressure+" kPa"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Pressure Regulator",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",disabled:l.ReleasePressure===l.minReleasePressure,onClick:function(){return c("pressure",{pressure:"min"})}}),(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:parseFloat(l.releasePressure),width:"65px",unit:"kPa",minValue:l.minReleasePressure,maxValue:l.maxReleasePressure,onChange:function(e,t){return c("pressure",{pressure:t})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",disabled:l.ReleasePressure===l.maxReleasePressure,onClick:function(){return c("pressure",{pressure:"max"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"undo",content:"",disabled:l.ReleasePressure===l.defaultReleasePressure,onClick:function(){return c("pressure",{pressure:"reset"})}})]})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.TankDispenser=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.TankDispenser=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:275,height:103,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Plasma",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:l.plasma?"square":"square-o",content:"Dispense",disabled:!l.plasma,onClick:function(){return c("plasma")}}),children:l.plasma}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Oxygen",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:l.oxygen?"square":"square-o",content:"Dispense",disabled:!l.oxygen,onClick:function(){return c("oxygen")}}),children:l.oxygen})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Teleporter=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Teleporter=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.calibrated,u=l.calibrating,s=l.power_station,p=l.regime_set,m=l.teleporter_hub,f=l.target;return(0,o.createComponentVNode)(2,a.Window,{width:470,height:140,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:!s&&(0,o.createComponentVNode)(2,i.Box,{color:"bad",textAlign:"center",children:"No power station linked."})||!m&&(0,o.createComponentVNode)(2,i.Box,{color:"bad",textAlign:"center",children:"No hub linked."})||(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Regime",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"tools",content:"Change Regime",onClick:function(){return c("regimeset")}}),children:p}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Target",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"tools",content:"Set Target",onClick:function(){return c("settarget")}}),children:f}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Calibration",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"tools",content:"Calibrate Hub",onClick:function(){return c("calibrate")}}),children:u&&(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"In Progress"})||d&&(0,o.createComponentVNode)(2,i.Box,{color:"good",children:"Optimal"})||(0,o.createComponentVNode)(2,i.Box,{color:"bad",children:"Sub-Optimal"})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ThermoMachine=void 0;var o=n(0),r=n(15),i=n(1),a=n(3),c=n(2);t.ThermoMachine=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data;return(0,o.createComponentVNode)(2,c.Window,{width:300,height:230,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Status",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Temperature",children:[(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:d.temperature,format:function(e){return(0,r.toFixed)(e,2)}})," K"]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pressure",children:[(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:d.pressure,format:function(e){return(0,r.toFixed)(e,2)}})," kPa"]})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Controls",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:d.on?"power-off":"times",content:d.on?"On":"Off",selected:d.on,onClick:function(){return l("power")}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Target Temperature",children:(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,value:Math.round(d.target),unit:"K",width:"62px",minValue:Math.round(d.min),maxValue:Math.round(d.max),step:5,stepPixelSize:3,onDrag:function(e,t){return l("target",{target:t})}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Presets",children:[(0,o.createComponentVNode)(2,a.Button,{icon:"fast-backward",disabled:d.target===d.min,title:"Minimum temperature",onClick:function(){return l("target",{target:d.min})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"sync",disabled:d.target===d.initial,title:"Room Temperature",onClick:function(){return l("target",{target:d.initial})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"fast-forward",disabled:d.target===d.max,title:"Maximum Temperature",onClick:function(){return l("target",{target:d.max})}})]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Timer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Timer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.minutes,u=l.seconds,s=l.timing,p=l.loop;return(0,o.createComponentVNode)(2,a.Window,{width:275,height:115,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Timing Unit",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:p?"Repeating":"Repeat",selected:p,onClick:function(){return c("repeat")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"clock-o",content:s?"Stop":"Start",selected:s,onClick:function(){return c("time")}})],4),children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",disabled:s,onClick:function(){return c("input",{adjust:-30})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"backward",disabled:s,onClick:function(){return c("input",{adjust:-1})}})," ",String(d).padStart(2,"0"),":",String(u).padStart(2,"0")," ",(0,o.createComponentVNode)(2,i.Button,{icon:"forward",disabled:s,onClick:function(){return c("input",{adjust:1})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",disabled:s,onClick:function(){return c("input",{adjust:30})}})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.TransferValve=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.TransferValve=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.tank_one,u=l.tank_two,s=l.attached_device,p=l.valve;return(0,o.createComponentVNode)(2,a.Window,{width:310,height:320,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Valve Status",children:(0,o.createComponentVNode)(2,i.Button,{icon:p?"unlock":"lock",content:p?"Open":"Closed",disabled:!d||!u,onClick:function(){return c("toggle")}})})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Valve Attachment",buttons:(0,o.createComponentVNode)(2,i.Button,{textAlign:"center",width:"30px",icon:"cog",disabled:!s,onClick:function(){return c("device")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:s?(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Attachment",children:(0,o.createComponentVNode)(2,i.Button,{icon:"wrench",content:s,disabled:!s,onClick:function(){return c("remove_device")}})}):(0,o.createComponentVNode)(2,i.NoticeBox,{textAlign:"center",children:"Insert Assembly"})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Attachment One",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:d?(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Attachment",children:(0,o.createComponentVNode)(2,i.Button,{icon:"wrench",content:d,disabled:!d,onClick:function(){return c("tankone")}})}):(0,o.createComponentVNode)(2,i.NoticeBox,{textAlign:"center",children:"Insert Tank"})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Attachment Two",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:u?(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Attachment",children:(0,o.createComponentVNode)(2,i.Button,{icon:"wrench",content:u,disabled:!u,onClick:function(){return c("tanktwo")}})}):(0,o.createComponentVNode)(2,i.NoticeBox,{textAlign:"center",children:"Insert Tank"})})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.TurbineComputer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.TurbineComputer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=Boolean(l.compressor&&!l.compressor_broke&&l.turbine&&!l.turbine_broke);return(0,o.createComponentVNode)(2,a.Window,{width:310,height:150,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Status",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:l.online?"power-off":"times",content:l.online?"Online":"Offline",selected:l.online,disabled:!d,onClick:function(){return c("toggle_power")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Reconnect",onClick:function(){return c("reconnect")}})],4),children:!d&&(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Compressor Status",color:!l.compressor||l.compressor_broke?"bad":"good",children:l.compressor_broke?l.compressor?"Offline":"Missing":"Online"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Turbine Status",color:!l.turbine||l.turbine_broke?"bad":"good",children:l.turbine_broke?l.turbine?"Offline":"Missing":"Online"})]})||(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Turbine Speed",children:[l.rpm," RPM"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Internal Temp",children:[l.temp," K"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Generated Power",children:l.power})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.TurretControl=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(60);t.TurretControl=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.locked&&!d.siliconUser,s=d.enabled,p=d.lethal,m=d.shootCyborgs;return(0,o.createComponentVNode)(2,a.Window,{width:305,height:168,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,c.InterfaceLockNoticeBox),(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Turret Status",children:(0,o.createComponentVNode)(2,i.Button,{icon:s?"power-off":"times",content:s?"Enabled":"Disabled",selected:s,disabled:u,onClick:function(){return l("power")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Turret Mode",children:(0,o.createComponentVNode)(2,i.Button,{icon:p?"exclamation-triangle":"minus-circle",content:p?"Lethal":"Stun",color:p?"bad":"average",disabled:u,onClick:function(){return l("mode")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Target Cyborgs",children:(0,o.createComponentVNode)(2,i.Button,{icon:m?"check":"times",content:m?"Yes":"No",selected:m,disabled:u,onClick:function(){return l("shoot_silicons")}})})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.VaultController=void 0;var o=n(0),r=n(15),i=n(1),a=n(3),c=n(2);t.VaultController=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data;return(0,o.createComponentVNode)(2,c.Window,{width:300,height:120,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Lock Status: ",buttons:(0,o.createComponentVNode)(2,a.Button,{content:d.doorstatus?"Locked":"Unlocked",icon:d.doorstatus?"lock":"unlock",disabled:d.stored<d.max,onClick:function(){return l("togglelock")}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Charge",children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:d.stored/d.max,ranges:{good:[1,Infinity],average:[.3,1],bad:[-Infinity,.3]},children:(0,r.toFixed)(d.stored/1e3)+" / "+(0,r.toFixed)(d.max/1e3)+" kW"})})})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Vendatray=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Vendatray=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.product_name,s=d.product_cost,p=d.tray_open,m=d.registered,f=d.owner_name;return(0,o.createComponentVNode)(2,a.Window,{width:300,height:270,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Flex,{mb:1,children:[(0,o.createComponentVNode)(2,i.Flex.Item,{mr:1,children:!!u&&(0,o.createComponentVNode)(2,c)}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,children:[(0,o.createComponentVNode)(2,i.Section,{fontSize:"18px",align:"center",children:[(0,o.createVNode)(1,"b",null,u||"Empty",0),(0,o.createComponentVNode)(2,i.Box,{fontSize:"16px",children:[(0,o.createVNode)(1,"i",null,[u?s:"N/A",(0,o.createTextVNode)(" cr ")],0),(0,o.createComponentVNode)(2,i.Button,{icon:"pen",onClick:function(){return l("Adjust")}})]})]}),(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"window-restore",content:p?"Open":"Closed",selected:p,onClick:function(){return l("Open")}}),(0,o.createComponentVNode)(2,i.Button.Confirm,{fluid:!0,icon:"money-bill-wave",content:"Purchase Item",disabled:!u,onClick:function(){return l("Buy")}})],4)]})]}),m?(0,o.createComponentVNode)(2,i.Section,{italics:!0,children:["Pays to the account of ",f,"."]}):(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{children:"Tray is unregistered."}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"cash-register",content:"Register Tray",disabled:m,onClick:function(){return l("Register")}})],4)]})})};var c=function(e,t){var n=(0,r.useBackend)(t).data.product_icon;return(0,o.createComponentVNode)(2,i.Section,{height:"100%",children:(0,o.createComponentVNode)(2,i.Box,{as:"img",m:1,src:"data:image/jpeg;base64,"+n,height:"96px",width:"96px",style:{"-ms-interpolation-mode":"nearest-neighbor","vertical-align":"middle"}})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Vending=void 0;var o=n(0),r=n(6),i=n(1),a=n(3),c=n(2),l=function(e,t){var n=(0,i.useBackend)(t),c=n.act,l=n.data,d=e.product,u=e.productStock,s=e.custom,p=l.onstation,m=l.department,f=l.user,h=!p||0===d.price||!d.premium&&m&&f&&m===f.department;return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,children:d.base64&&(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/jpeg;base64,"+d.img,style:{"vertical-align":"middle","horizontal-align":"middle"}})||(0,o.createVNode)(1,"span",(0,r.classes)(["vending32x32",d.path]),null,1,{style:{"vertical-align":"middle","horizontal-align":"middle"}})}),(0,o.createComponentVNode)(2,a.Table.Cell,{bold:!0,children:d.name}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"center",children:(0,o.createComponentVNode)(2,a.Box,{color:(s?"good":u<=0&&"bad")||u<=d.max_amount/2&&"average"||"good",children:[u," in stock"]})}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"center",children:s&&(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:l.access?"FREE":d.price+" cr",onClick:function(){return c("dispense",{item:d.name})}})||(0,o.createComponentVNode)(2,a.Button,{fluid:!0,disabled:0===u||!h&&(!l.user||d.price>l.user.cash),content:h?"FREE":d.price+" cr",onClick:function(){return c("vend",{ref:d.ref})}})})]})};t.Vending=function(e,t){var n,r=(0,i.useBackend)(t),d=(r.act,r.data),u=d.user,s=d.onstation,p=d.product_records,m=void 0===p?[]:p,f=d.coin_records,h=void 0===f?[]:f,C=d.hidden_records,g=void 0===C?[]:C,b=d.stock,N=!1;return d.vending_machine_input?(n=d.vending_machine_input||[],N=!0):(n=[].concat(m,h),d.extended_inventory&&(n=[].concat(n,g))),n=n.filter((function(e){return!!e})),(0,o.createComponentVNode)(2,c.Window,{title:"Vending Machine",width:450,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[!!s&&(0,o.createComponentVNode)(2,a.Section,{title:"User",children:u&&(0,o.createComponentVNode)(2,a.Box,{children:["Welcome, ",(0,o.createVNode)(1,"b",null,u.name,0),","," ",(0,o.createVNode)(1,"b",null,u.job||"Unemployed",0),"!",(0,o.createVNode)(1,"br"),"Your balance is ",(0,o.createVNode)(1,"b",null,[u.cash,(0,o.createTextVNode)(" credits")],0),"."]})||(0,o.createComponentVNode)(2,a.Box,{color:"light-grey",children:["No registered ID card!",(0,o.createVNode)(1,"br"),"Please contact your local HoP!"]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Products",children:(0,o.createComponentVNode)(2,a.Table,{children:n.map((function(e){return(0,o.createComponentVNode)(2,l,{custom:N,product:e,productStock:b[e.name]},e.name)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Wires=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Wires=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.wires||[],u=l.status||[];return(0,o.createComponentVNode)(2,a.Window,{width:350,height:150+30*d.length,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:d.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{className:"candystripe",label:e.color,labelColor:e.color,color:e.color,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{content:e.cut?"Mend":"Cut",onClick:function(){return c("cut",{wire:e.color})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Pulse",onClick:function(){return c("pulse",{wire:e.color})}}),(0,o.createComponentVNode)(2,i.Button,{content:e.attached?"Detach":"Attach",onClick:function(){return c("attach",{wire:e.color})}})],4),children:!!e.wire&&(0,o.createVNode)(1,"i",null,[(0,o.createTextVNode)("("),e.wire,(0,o.createTextVNode)(")")],0)},e.color)}))})}),!!u.length&&(0,o.createComponentVNode)(2,i.Section,{children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:e},e)}))})]})})}}]); \ No newline at end of file +!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=187)}([function(e,t,n){"use strict";t.__esModule=!0;var o=n(402);Object.keys(o).forEach((function(e){"default"!==e&&"__esModule"!==e&&(t[e]=o[e])}))},function(e,t,n){"use strict";(function(e){t.__esModule=!0,t.useSharedState=t.useLocalState=t.useBackend=t.selectBackend=t.sendAct=t.sendMessage=t.backendMiddleware=t.backendReducer=t.backendSuspendSuccess=t.backendSuspendStart=t.backendSetSharedState=t.backendUpdate=void 0;var o=n(167),r=n(34),i=n(91);var a=(0,n(44).createLogger)("backend");t.backendUpdate=function(e){return{type:"backend/update",payload:e}};var c=function(e,t){return{type:"backend/setSharedState",payload:{key:e,nextState:t}}};t.backendSetSharedState=c;t.backendSuspendStart=function(){return{type:"backend/suspendStart"}};t.backendSuspendSuccess=function(){return{type:"backend/suspendSuccess",payload:{timestamp:Date.now()}}};var l={config:{},data:{}};t.backendReducer=function(e,t){void 0===e&&(e=l);var n=t.type,o=t.payload;if("backend/update"===n){var i=Object.assign({},e.config,o.config),a=Object.assign({},e.data,o.static_data,o.data),c=Object.assign({},e.shared);if(o.shared)for(var d=0,u=Object.keys(o.shared);d<u.length;d++){var s=u[d],p=o.shared[s];c[s]=""===p?undefined:JSON.parse(p)}var m=i.status!==r.UI_DISABLED,f=i.status===r.UI_INTERACTIVE;return Object.assign({},e,{config:i,data:a,shared:c,visible:m,interactive:f,suspended:!1})}if("backend/setSharedState"===n){var h,C=o.key,g=o.nextState;return Object.assign({},e,{shared:Object.assign({},e.shared,(h={},h[C]=g,h))})}if("backend/suspendStart"===n)return Object.assign({},e,{suspending:!0});if("backend/suspendSuccess"===n){var b=o.timestamp;return Object.assign({},e,{data:{},shared:{},config:Object.assign({},e.config,{title:"",status:1}),suspending:!1,suspended:b})}return e};t.backendMiddleware=function(t){var n,r;return function(c){return function(l){var u=s(t.getState()),p=(u.config,u.suspended),m=l.type,f=l.payload;if("backend/suspendStart"===m&&!r){a.log("suspending ("+window.__windowId__+")");var h=function(){return d({type:"suspend"})};h(),r=setInterval(h,2e3)}if("backend/suspendSuccess"===m&&(clearInterval(r),r=undefined,(0,i.releaseHeldKeys)(),Byond.winset(window.__windowId__,{"is-visible":!1})),"backend/update"===m){var C,g,b=null==(C=f.config)||null==(g=C.window)?void 0:g.fancy;n===undefined?n=b:n!==b&&(a.log("changing fancy mode to",b),n=b,Byond.winset(window.__windowId__,{titlebar:!b,"can-resize":!b}))}return"backend/update"===m&&p&&e((function(){o.perf.mark("resume/start"),s(t.getState()).suspended||(Byond.winset(window.__windowId__,{"is-visible":!0}),o.perf.mark("resume/finish"))})),c(l)}}};var d=function(e){void 0===e&&(e={});var t=e,n=t.payload,o=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(t,["payload"]),r=Object.assign({tgui:1,window_id:window.__windowId__},o);null!==n&&n!==undefined&&(r.payload=JSON.stringify(n)),Byond.topic(r)};t.sendMessage=d;var u=function(e,t){void 0===t&&(t={}),"object"!=typeof t||null===t||Array.isArray(t)?a.error("Payload for act() must be an object, got this:",t):d({type:"act/"+e,payload:t})};t.sendAct=u;var s=function(e){return e.backend||{}};t.selectBackend=s;t.useBackend=function(e){var t=e.store,n=s(t.getState());return Object.assign({},n,{act:u})};t.useLocalState=function(e,t,n){var o,r=e.store,i=null!=(o=s(r.getState()).shared)?o:{},a=t in i?i[t]:n;return[a,function(e){r.dispatch(c(t,"function"==typeof e?e(a):e))}]};t.useSharedState=function(e,t,n){var o,r=e.store,i=null!=(o=s(r.getState()).shared)?o:{},a=t in i?i[t]:n;return[a,function(e){d({type:"setSharedState",key:t,value:JSON.stringify("function"==typeof e?e(a):e)||""})}]}}).call(this,n(418).setImmediate)},function(e,t,n){"use strict";t.__esModule=!0,t.Window=t.NtosWindow=t.refocusLayout=t.Layout=void 0;var o=n(122);t.Layout=o.Layout,t.refocusLayout=o.refocusLayout;var r=n(426);t.NtosWindow=r.NtosWindow;var i=n(176);t.Window=i.Window},function(e,t,n){"use strict";t.__esModule=!0,t.TimeDisplay=t.Tooltip=t.Tabs=t.TextArea=t.Table=t.Slider=t.Section=t.ProgressBar=t.NumberInput=t.NoticeBox=t.Modal=t.LabeledList=t.LabeledControls=t.Knob=t.Input=t.Icon=t.Grid=t.Flex=t.Dropdown=t.DraggableControl=t.Divider=t.Dimmer=t.ColorBox=t.Collapsible=t.Chart=t.ByondUi=t.Button=t.Box=t.BlockQuote=t.AnimatedNumber=void 0;var o=n(123);t.AnimatedNumber=o.AnimatedNumber;var r=n(427);t.BlockQuote=r.BlockQuote;var i=n(17);t.Box=i.Box;var a=n(124);t.Button=a.Button;var c=n(428);t.ByondUi=c.ByondUi;var l=n(430);t.Chart=l.Chart;var d=n(431);t.Collapsible=d.Collapsible;var u=n(432);t.ColorBox=u.ColorBox;var s=n(172);t.Dimmer=s.Dimmer;var p=n(173);t.Divider=p.Divider;var m=n(126);t.DraggableControl=m.DraggableControl;var f=n(433);t.Dropdown=f.Dropdown;var h=n(127);t.Flex=h.Flex;var C=n(434);t.Grid=C.Grid;var g=n(125);t.Icon=g.Icon;var b=n(435);t.Input=b.Input;var N=n(436);t.Knob=N.Knob;var v=n(437);t.LabeledControls=v.LabeledControls;var V=n(175);t.LabeledList=V.LabeledList;var y=n(438);t.Modal=y.Modal;var k=n(439);t.NoticeBox=k.NoticeBox;var x=n(128);t.NumberInput=x.NumberInput;var _=n(440);t.ProgressBar=_.ProgressBar;var w=n(441);t.Section=w.Section;var B=n(442);t.Slider=B.Slider;var S=n(174);t.Table=S.Table;var L=n(443);t.TextArea=L.TextArea;var I=n(444);t.Tabs=I.Tabs;var T=n(171);t.Tooltip=T.Tooltip;var A=n(445);t.TimeDisplay=A.TimeDisplay},function(e,t,n){"use strict";var o=n(7),r=n(22).f,i=n(31),a=n(24),c=n(93),l=n(134),d=n(66);e.exports=function(e,t){var n,u,s,p,m,f=e.target,h=e.global,C=e.stat;if(n=h?o:C?o[f]||c(f,{}):(o[f]||{}).prototype)for(u in t){if(p=t[u],s=e.noTargetGet?(m=r(n,u))&&m.value:n[u],!d(h?u:f+(C?".":"#")+u,e.forced)&&s!==undefined){if(typeof p==typeof s)continue;l(p,s)}(e.sham||s&&s.sham)&&i(p,"sham",!0),a(n,u,p,e)}}},function(e,t,n){"use strict";e.exports=function(e){try{return!!e()}catch(t){return!0}}},function(e,t,n){"use strict";t.__esModule=!0,t.isFalsy=t.pureComponentHooks=t.shallowDiffers=t.normalizeChildren=t.classes=void 0;t.classes=function(e){for(var t="",n=0;n<e.length;n++){var o=e[n];"string"==typeof o&&(t+=o+" ")}return t};t.normalizeChildren=function(e){return Array.isArray(e)?e.flat().filter((function(e){return e})):"object"==typeof e?[e]:[]};var o=function(e,t){var n;for(n in e)if(!(n in t))return!0;for(n in t)if(e[n]!==t[n])return!0;return!1};t.shallowDiffers=o;var r={onComponentShouldUpdate:function(e,t){return o(e,t)}};t.pureComponentHooks=r;t.isFalsy=function(e){return e===undefined||null===e||!1===e}},function(e,t,n){"use strict";(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof t&&t)||Function("return this")()}).call(this,n(74))},function(e,t,n){"use strict";e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){"use strict";var o=n(5);e.exports=!o((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,n){"use strict";var o=n(8);e.exports=function(e){if(!o(e))throw TypeError(String(e)+" is not an object");return e}},function(e,t,n){"use strict";var o,r=n(107),i=n(9),a=n(7),c=n(8),l=n(20),d=n(78),u=n(31),s=n(24),p=n(14).f,m=n(38),f=n(54),h=n(13),C=n(63),g=a.Int8Array,b=g&&g.prototype,N=a.Uint8ClampedArray,v=N&&N.prototype,V=g&&m(g),y=b&&m(b),k=Object.prototype,x=k.isPrototypeOf,_=h("toStringTag"),w=C("TYPED_ARRAY_TAG"),B=r&&!!f&&"Opera"!==d(a.opera),S=!1,L={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},I=function(e){var t=d(e);return"DataView"===t||l(L,t)},T=function(e){return c(e)&&l(L,d(e))};for(o in L)a[o]||(B=!1);if((!B||"function"!=typeof V||V===Function.prototype)&&(V=function(){throw TypeError("Incorrect invocation")},B))for(o in L)a[o]&&f(a[o],V);if((!B||!y||y===k)&&(y=V.prototype,B))for(o in L)a[o]&&f(a[o].prototype,y);if(B&&m(v)!==y&&f(v,y),i&&!l(y,_))for(o in S=!0,p(y,_,{get:function(){return c(this)?this[w]:undefined}}),L)a[o]&&u(a[o],w,o);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:B,TYPED_ARRAY_TAG:S&&w,aTypedArray:function(e){if(T(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(f){if(x.call(V,e))return e}else for(var t in L)if(l(L,o)){var n=a[t];if(n&&(e===n||x.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(i){if(n)for(var o in L){var r=a[o];r&&l(r.prototype,e)&&delete r.prototype[e]}y[e]&&!n||s(y,e,n?t:B&&b[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var o,r;if(i){if(f){if(n)for(o in L)(r=a[o])&&l(r,e)&&delete r[e];if(V[e]&&!n)return;try{return s(V,e,n?t:B&&g[e]||t)}catch(c){}}for(o in L)!(r=a[o])||r[e]&&!n||s(r,e,t)}},isView:I,isTypedArray:T,TypedArray:V,TypedArrayPrototype:y}},function(e,t,n){"use strict";var o=n(32),r=Math.min;e.exports=function(e){return e>0?r(o(e),9007199254740991):0}},function(e,t,n){"use strict";var o=n(7),r=n(95),i=n(20),a=n(63),c=n(99),l=n(137),d=r("wks"),u=o.Symbol,s=l?u:u&&u.withoutSetter||a;e.exports=function(e){return i(d,e)||(c&&i(u,e)?d[e]=u[e]:d[e]=s("Symbol."+e)),d[e]}},function(e,t,n){"use strict";var o=n(9),r=n(131),i=n(10),a=n(36),c=Object.defineProperty;t.f=o?c:function(e,t,n){if(i(e),t=a(t,!0),i(n),r)try{return c(e,t,n)}catch(o){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){"use strict";t.__esModule=!0,t.zipWith=t.zip=t.uniqBy=t.reduce=t.sortBy=t.map=t.filter=t.toKeyedArray=t.toArray=void 0;t.toArray=function(e){if(Array.isArray(e))return e;if("object"==typeof e){var t=Object.prototype.hasOwnProperty,n=[];for(var o in e)t.call(e,o)&&n.push(e[o]);return n}return[]};t.toKeyedArray=function(e,t){return void 0===t&&(t="key"),o((function(e,n){var o;return Object.assign(((o={})[t]=n,o),e)}))(e)};t.filter=function(e){return function(t){if(null===t&&t===undefined)return t;if(Array.isArray(t)){for(var n=[],o=0;o<t.length;o++){var r=t[o];e(r,o,t)&&n.push(r)}return n}throw new Error("filter() can't iterate on type "+typeof t)}};var o=function(e){return function(t){if(null===t&&t===undefined)return t;if(Array.isArray(t)){for(var n=[],o=0;o<t.length;o++)n.push(e(t[o],o,t));return n}if("object"==typeof t){var r=Object.prototype.hasOwnProperty,i=[];for(var a in t)r.call(t,a)&&i.push(e(t[a],a,t));return i}throw new Error("map() can't iterate on type "+typeof t)}};t.map=o;var r=function(e,t){for(var n=e.criteria,o=t.criteria,r=n.length,i=0;i<r;i++){var a=n[i],c=o[i];if(a<c)return-1;if(a>c)return 1}return 0};t.sortBy=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){if(!Array.isArray(e))return e;for(var n=e.length,o=[],i=function(n){var r=e[n];o.push({criteria:t.map((function(e){return e(r)})),value:r})},a=0;a<n;a++)i(a);for(o.sort(r);n--;)o[n]=o[n].value;return o}};t.reduce=function(e,t){return function(n){var o,r,i=n.length;for(t===undefined?(o=1,r=n[0]):(o=0,r=t);o<i;o++)r=e(r,n[o],o,n);return r}};t.uniqBy=function(e){return function(t){var n=t.length,o=[],r=e?[]:o,i=-1;e:for(;++i<n;){var a=t[i],c=e?e(a):a;if(a=0!==a?a:0,c==c){for(var l=r.length;l--;)if(r[l]===c)continue e;e&&r.push(c),o.push(a)}else r.includes(c)||(r!==o&&r.push(c),o.push(a))}return o}};var i=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];if(0!==t.length){for(var o=t.length,r=t[0].length,i=[],a=0;a<r;a++){for(var c=[],l=0;l<o;l++)c.push(t[l][a]);i.push(c)}return i}};t.zip=i;t.zipWith=function(e){return function(){return o((function(t){return e.apply(void 0,t)}))(i.apply(void 0,arguments))}}},function(e,t,n){"use strict";t.__esModule=!0,t.keyOfMatchingRange=t.inRange=t.toFixed=t.round=t.scale=t.clamp01=t.clamp=void 0;t.clamp=function(e,t,n){return e<t?t:e>n?n:e};t.clamp01=function(e){return e<0?0:e>1?1:e};t.scale=function(e,t,n){return(e-t)/(n-t)};t.round=function(e,t){return!e||isNaN(e)?e:(t|=0,i=(e*=n=Math.pow(10,t))>0|-(e<0),r=Math.abs(e%1)>=.4999999999854481,o=Math.floor(e),r&&(e=o+(i>0)),(r?e:Math.round(e))/n);var n,o,r,i};t.toFixed=function(e,t){return void 0===t&&(t=0),Number(e).toFixed(Math.max(t,0))};var o=function(e,t){return t&&e>=t[0]&&e<=t[1]};t.inRange=o;t.keyOfMatchingRange=function(e,t){for(var n=0,r=Object.keys(t);n<r.length;n++){var i=r[n],a=t[i];if(o(e,a))return i}}},function(e,t,n){"use strict";t.__esModule=!0,t.Box=t.computeBoxClassName=t.computeBoxProps=t.halfUnit=t.unit=void 0;var o=n(6),r=n(0),i=n(425),a=n(34);var c=function(e){return"string"==typeof e?e.endsWith("px")&&!Byond.IS_LTE_IE8?parseFloat(e)/12+"rem":e:"number"==typeof e?Byond.IS_LTE_IE8?12*e+"px":e+"rem":void 0};t.unit=c;var l=function(e){return"string"==typeof e?c(e):"number"==typeof e?c(.5*e):void 0};t.halfUnit=l;var d=function(e){return"string"==typeof e&&a.CSS_COLORS.includes(e)},u=function(e){return function(t,n){(0,o.isFalsy)(n)||(t[e]=n)}},s=function(e,t){return function(n,r){(0,o.isFalsy)(r)||(n[e]=t(r))}},p=function(e,t){return function(n,r){(0,o.isFalsy)(r)||(n[e]=t)}},m=function(e,t,n){return function(r,i){if(!(0,o.isFalsy)(i))for(var a=0;a<n.length;a++)r[e+"-"+n[a]]=t(i)}},f=function(e){return function(t,n){d(n)||(t[e]=n)}},h={position:u("position"),overflow:u("overflow"),overflowX:u("overflow-x"),overflowY:u("overflow-y"),top:s("top",c),bottom:s("bottom",c),left:s("left",c),right:s("right",c),width:s("width",c),minWidth:s("min-width",c),maxWidth:s("max-width",c),height:s("height",c),minHeight:s("min-height",c),maxHeight:s("max-height",c),fontSize:s("font-size",c),fontFamily:u("font-family"),lineHeight:function(e,t){(0,o.isFalsy)(t)||(e["line-height"]="number"==typeof t?t:c(t))},opacity:u("opacity"),textAlign:u("text-align"),verticalAlign:u("vertical-align"),inline:p("display","inline-block"),bold:p("font-weight","bold"),italic:p("font-style","italic"),nowrap:p("white-space","nowrap"),m:m("margin",l,["top","bottom","left","right"]),mx:m("margin",l,["left","right"]),my:m("margin",l,["top","bottom"]),mt:s("margin-top",l),mb:s("margin-bottom",l),ml:s("margin-left",l),mr:s("margin-right",l),p:m("padding",l,["top","bottom","left","right"]),px:m("padding",l,["left","right"]),py:m("padding",l,["top","bottom"]),pt:s("padding-top",l),pb:s("padding-bottom",l),pl:s("padding-left",l),pr:s("padding-right",l),color:f("color"),textColor:f("color"),backgroundColor:f("background-color"),fillPositionedParent:function(e,t){t&&(e.position="absolute",e.top=0,e.bottom=0,e.left=0,e.right=0)}},C=function(e){for(var t={},n={},o=0,r=Object.keys(e);o<r.length;o++){var i=r[o];if("style"!==i){var a=e[i],c=h[i];c?c(n,a):t[i]=a}}for(var l="",d=0,u=Object.keys(n);d<u.length;d++){var s=u[d];l+=s+":"+n[s]+";"}if(e.style)for(var p=0,m=Object.keys(e.style);p<m.length;p++){var f=m[p];l+=f+":"+e.style[f]+";"}return l.length>0&&(t.style=l),t};t.computeBoxProps=C;var g=function(e){var t=e.textColor||e.color,n=e.backgroundColor;return(0,o.classes)([d(t)&&"color-"+t,d(n)&&"color-bg-"+n])};t.computeBoxClassName=g;var b=function(e){var t=e.as,n=void 0===t?"div":t,o=e.className,a=e.children,c=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,["as","className","children"]);if("function"==typeof a)return a(C(e));var l="string"==typeof o?o+" "+g(c):g(c),d=C(c);return(0,r.createVNode)(i.VNodeFlags.HtmlElement,n,l,a,i.ChildFlags.UnknownChildren,d)};t.Box=b,b.defaultHooks=o.pureComponentHooks},function(e,t,n){"use strict";var o=n(23);e.exports=function(e){return Object(o(e))}},function(e,t,n){"use strict";function o(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}t.__esModule=!0,t.buildQueryString=t.decodeHtmlEntities=t.toTitleCase=t.capitalize=t.createSearch=t.createGlobPattern=t.multiline=void 0;t.multiline=function i(e){if(Array.isArray(e))return i(e.join(""));for(var t,n,r=e.split("\n"),a=o(r);!(n=a()).done;)for(var c=n.value,l=0;l<c.length;l++){if(" "!==c[l]){(t===undefined||l<t)&&(t=l);break}}return t||(t=0),r.map((function(e){return e.substr(t).trimRight()})).join("\n").trim()};t.createGlobPattern=function(e){var t=new RegExp("^"+e.split(/\*+/).map((function(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&")})).join(".*")+"$");return function(e){return t.test(e)}};t.createSearch=function(e,t){var n=e.toLowerCase().trim();return function(e){if(!n)return!0;var o=t?t(e):e;return!!o&&o.toLowerCase().includes(n)}};t.capitalize=function a(e){return Array.isArray(e)?e.map(a):e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()};t.toTitleCase=function c(e){if(Array.isArray(e))return e.map(c);if("string"!=typeof e)return e;for(var t=e.replace(/([^\W_]+[^\s-]*) */g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})),n=0,o=["A","An","And","As","At","But","By","For","For","From","In","Into","Near","Nor","Of","On","Onto","Or","The","To","With"];n<o.length;n++){var r=new RegExp("\\s"+o[n]+"\\s","g");t=t.replace(r,(function(e){return e.toLowerCase()}))}for(var i=0,a=["Id","Tv"];i<a.length;i++){var l=new RegExp("\\b"+a[i]+"\\b","g");t=t.replace(l,(function(e){return e.toLowerCase()}))}return t};t.decodeHtmlEntities=function(e){if(!e)return e;var t={nbsp:" ",amp:"&",quot:'"',lt:"<",gt:">",apos:"'"};return e.replace(/<br>/gi,"\n").replace(/<\/?[a-z0-9-_]+[^>]*>/gi,"").replace(/&(nbsp|amp|quot|lt|gt|apos);/g,(function(e,n){return t[n]})).replace(/&#?([0-9]+);/gi,(function(e,t){var n=parseInt(t,10);return String.fromCharCode(n)})).replace(/&#x?([0-9a-f]+);/gi,(function(e,t){var n=parseInt(t,16);return String.fromCharCode(n)}))};t.buildQueryString=function(e){return Object.keys(e).map((function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])})).join("&")}},function(e,t,n){"use strict";var o={}.hasOwnProperty;e.exports=function(e,t){return o.call(e,t)}},function(e,t,n){"use strict";var o=n(52),r=n(62),i=n(18),a=n(12),c=n(68),l=[].push,d=function(e){var t=1==e,n=2==e,d=3==e,u=4==e,s=6==e,p=5==e||s;return function(m,f,h,C){for(var g,b,N=i(m),v=r(N),V=o(f,h,3),y=a(v.length),k=0,x=C||c,_=t?x(m,y):n?x(m,0):undefined;y>k;k++)if((p||k in v)&&(b=V(g=v[k],k,N),e))if(t)_[k]=b;else if(b)switch(e){case 3:return!0;case 5:return g;case 6:return k;case 2:l.call(_,g)}else if(u)return!1;return s?-1:d||u?u:_}};e.exports={forEach:d(0),map:d(1),filter:d(2),some:d(3),every:d(4),find:d(5),findIndex:d(6)}},function(e,t,n){"use strict";var o=n(9),r=n(75),i=n(50),a=n(26),c=n(36),l=n(20),d=n(131),u=Object.getOwnPropertyDescriptor;t.f=o?u:function(e,t){if(e=a(e),t=c(t,!0),d)try{return u(e,t)}catch(n){}if(l(e,t))return i(!r.f.call(e,t),e[t])}},function(e,t,n){"use strict";e.exports=function(e){if(e==undefined)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){"use strict";var o=n(7),r=n(31),i=n(20),a=n(93),c=n(94),l=n(37),d=l.get,u=l.enforce,s=String(String).split("String");(e.exports=function(e,t,n,c){var l=!!c&&!!c.unsafe,d=!!c&&!!c.enumerable,p=!!c&&!!c.noTargetGet;"function"==typeof n&&("string"!=typeof t||i(n,"name")||r(n,"name",t),u(n).source=s.join("string"==typeof t?t:"")),e!==o?(l?!p&&e[t]&&(d=!0):delete e[t],d?e[t]=n:r(e,t,n)):d?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&d(this).source||c(this)}))},function(e,t,n){"use strict";var o=n(9),r=n(5),i=n(20),a=Object.defineProperty,c={},l=function(e){throw e};e.exports=function(e,t){if(i(c,e))return c[e];t||(t={});var n=[][e],d=!!i(t,"ACCESSORS")&&t.ACCESSORS,u=i(t,0)?t[0]:l,s=i(t,1)?t[1]:undefined;return c[e]=!!n&&!r((function(){if(d&&!o)return!0;var e={length:-1};d?a(e,1,{enumerable:!0,get:l}):e[1]=1,n.call(e,u,s)}))}},function(e,t,n){"use strict";var o=n(62),r=n(23);e.exports=function(e){return o(r(e))}},function(e,t,n){"use strict";var o=n(135),r=n(20),i=n(141),a=n(14).f;e.exports=function(e){var t=o.Symbol||(o.Symbol={});r(t,e)||a(t,e,{value:i.f(e)})}},function(e,t,n){"use strict";var o=n(23),r=/"/g;e.exports=function(e,t,n,i){var a=String(o(e)),c="<"+t;return""!==n&&(c+=" "+n+'="'+String(i).replace(r,""")+'"'),c+">"+a+"</"+t+">"}},function(e,t,n){"use strict";var o=n(5);e.exports=function(e){return o((function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}))}},function(e,t,n){"use strict";function o(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}t.__esModule=!0,t.compose=t.flow=void 0;t.flow=function i(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){for(var n=e,r=arguments.length,a=new Array(r>1?r-1:0),c=1;c<r;c++)a[c-1]=arguments[c];for(var l,d=o(t);!(l=d()).done;){var u=l.value;Array.isArray(u)?n=i.apply(void 0,u).apply(void 0,[n].concat(a)):u&&(n=u.apply(void 0,[n].concat(a)))}return n}};t.compose=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return 0===t.length?function(e){return e}:1===t.length?t[0]:t.reduce((function(e,t){return function(n){for(var o=arguments.length,r=new Array(o>1?o-1:0),i=1;i<o;i++)r[i-1]=arguments[i];return e.apply(void 0,[t.apply(void 0,[n].concat(r))].concat(r))}}))}},function(e,t,n){"use strict";var o=n(9),r=n(14),i=n(50);e.exports=o?function(e,t,n){return r.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){"use strict";var o=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:o)(e)}},function(e,t,n){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},function(e,t,n){"use strict";t.__esModule=!0,t.getGasColor=t.getGasLabel=t.RADIO_CHANNELS=t.CSS_COLORS=t.COLORS=t.UI_CLOSE=t.UI_DISABLED=t.UI_UPDATE=t.UI_INTERACTIVE=void 0;t.UI_INTERACTIVE=2;t.UI_UPDATE=1;t.UI_DISABLED=0;t.UI_CLOSE=-1;t.COLORS={department:{captain:"#c06616",security:"#e74c3c",medbay:"#3498db",science:"#9b59b6",engineering:"#f1c40f",cargo:"#f39c12",centcom:"#00c100",other:"#c38312"},damageType:{oxy:"#3498db",toxin:"#2ecc71",burn:"#e67e22",brute:"#e74c3c"}};t.CSS_COLORS=["black","white","red","orange","yellow","olive","green","teal","blue","violet","purple","pink","brown","grey","good","average","bad","label"];t.RADIO_CHANNELS=[{name:"Syndicate",freq:1213,color:"#a52a2a"},{name:"Red Team",freq:1215,color:"#ff4444"},{name:"Blue Team",freq:1217,color:"#3434fd"},{name:"CentCom",freq:1337,color:"#2681a5"},{name:"Supply",freq:1347,color:"#b88646"},{name:"Service",freq:1349,color:"#6ca729"},{name:"Science",freq:1351,color:"#c68cfa"},{name:"Command",freq:1353,color:"#5177ff"},{name:"Medical",freq:1355,color:"#57b8f0"},{name:"Engineering",freq:1357,color:"#f37746"},{name:"Security",freq:1359,color:"#dd3535"},{name:"AI Private",freq:1447,color:"#d65d95"},{name:"Common",freq:1459,color:"#1ecc43"}];var o=[{id:"o2",name:"Oxygen",label:"O\u2082",color:"blue"},{id:"n2",name:"Nitrogen",label:"N\u2082",color:"red"},{id:"co2",name:"Carbon Dioxide",label:"CO\u2082",color:"grey"},{id:"plasma",name:"Plasma",label:"Plasma",color:"pink"},{id:"water_vapor",name:"Water Vapor",label:"H\u2082O",color:"grey"},{id:"nob",name:"Hyper-noblium",label:"Hyper-nob",color:"teal"},{id:"n2o",name:"Nitrous Oxide",label:"N\u2082O",color:"red"},{id:"no2",name:"Nitryl",label:"NO\u2082",color:"brown"},{id:"tritium",name:"Tritium",label:"Tritium",color:"green"},{id:"bz",name:"BZ",label:"BZ",color:"purple"},{id:"stim",name:"Stimulum",label:"Stimulum",color:"purple"},{id:"pluox",name:"Pluoxium",label:"Pluoxium",color:"blue"},{id:"miasma",name:"Miasma",label:"Miasma",color:"olive"},{id:"hydrogen",name:"Hydrogen",label:"H\u2082",color:"white"}];t.getGasLabel=function(e,t){var n=String(e).toLowerCase(),r=o.find((function(e){return e.id===n||e.name.toLowerCase()===n}));return r&&r.label||t||e};t.getGasColor=function(e){var t=String(e).toLowerCase(),n=o.find((function(e){return e.id===t||e.name.toLowerCase()===t}));return n&&n.color}},function(e,t,n){"use strict";var o={}.toString;e.exports=function(e){return o.call(e).slice(8,-1)}},function(e,t,n){"use strict";var o=n(8);e.exports=function(e,t){if(!o(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!o(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){"use strict";var o,r,i,a=n(133),c=n(7),l=n(8),d=n(31),u=n(20),s=n(76),p=n(64),m=c.WeakMap;if(a){var f=new m,h=f.get,C=f.has,g=f.set;o=function(e,t){return g.call(f,e,t),t},r=function(e){return h.call(f,e)||{}},i=function(e){return C.call(f,e)}}else{var b=s("state");p[b]=!0,o=function(e,t){return d(e,b,t),t},r=function(e){return u(e,b)?e[b]:{}},i=function(e){return u(e,b)}}e.exports={set:o,get:r,has:i,enforce:function(e){return i(e)?r(e):o(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=r(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){"use strict";var o=n(20),r=n(18),i=n(76),a=n(106),c=i("IE_PROTO"),l=Object.prototype;e.exports=a?Object.getPrototypeOf:function(e){return e=r(e),o(e,c)?e[c]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},function(e,t,n){"use strict";var o=n(135),r=n(7),i=function(e){return"function"==typeof e?e:undefined};e.exports=function(e,t){return arguments.length<2?i(o[e])||i(r[e]):o[e]&&o[e][t]||r[e]&&r[e][t]}},function(e,t,n){"use strict";t.__esModule=!0,t.formatMoney=t.formatPower=t.formatSiUnit=void 0;var o=n(16),r=["f","p","n","\u03bc","m"," ","k","M","G","T","P","E","Z","Y"],i=r.indexOf(" "),a=function(e,t,n){if(void 0===t&&(t=-i),void 0===n&&(n=""),"number"!=typeof e||!Number.isFinite(e))return e;var a=Math.floor(Math.log10(e)),c=Math.floor(Math.max(3*t,a)),l=Math.floor(a/3),d=Math.floor(c/3),u=(0,o.clamp)(i+d,0,r.length),s=r[u],p=e/Math.pow(1e3,d),m=l>t?2+3*d-c:0;return((0,o.toFixed)(p,m)+" "+s+n).trim()};t.formatSiUnit=a;t.formatPower=function(e,t){return void 0===t&&(t=0),a(e,t,"W")};t.formatMoney=function(e,t){if(void 0===t&&(t=0),!Number.isFinite(e))return e;var n=(0,o.round)(e,t);t>0&&(n=(0,o.toFixed)(e,t));var r=(n=String(n)).length,i=n.indexOf(".");-1===i&&(i=r);for(var a="",c=0;c<r;c++)c>0&&c<i&&(i-c)%3==0&&(a+="\u2009"),a+=n.charAt(c);return a}},function(e,t,n){"use strict";e.exports=!1},function(e,t,n){"use strict";var o=n(5);e.exports=function(e,t){var n=[][e];return!!n&&o((function(){n.call(null,t||function(){throw 1},1)}))}},function(e,t,n){"use strict";var o=n(4),r=n(7),i=n(9),a=n(119),c=n(11),l=n(81),d=n(58),u=n(50),s=n(31),p=n(12),m=n(149),f=n(164),h=n(36),C=n(20),g=n(78),b=n(8),N=n(46),v=n(54),V=n(51).f,y=n(165),k=n(21).forEach,x=n(57),_=n(14),w=n(22),B=n(37),S=n(83),L=B.get,I=B.set,T=_.f,A=w.f,E=Math.round,M=r.RangeError,P=l.ArrayBuffer,R=l.DataView,O=c.NATIVE_ARRAY_BUFFER_VIEWS,F=c.TYPED_ARRAY_TAG,j=c.TypedArray,D=c.TypedArrayPrototype,z=c.aTypedArrayConstructor,W=c.isTypedArray,H=function(e,t){for(var n=0,o=t.length,r=new(z(e))(o);o>n;)r[n]=t[n++];return r},U=function(e,t){T(e,t,{get:function(){return L(this)[t]}})},G=function(e){var t;return e instanceof P||"ArrayBuffer"==(t=g(e))||"SharedArrayBuffer"==t},K=function(e,t){return W(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},q=function(e,t){return K(e,t=h(t,!0))?u(2,e[t]):A(e,t)},Y=function(e,t,n){return!(K(e,t=h(t,!0))&&b(n)&&C(n,"value"))||C(n,"get")||C(n,"set")||n.configurable||C(n,"writable")&&!n.writable||C(n,"enumerable")&&!n.enumerable?T(e,t,n):(e[t]=n.value,e)};i?(O||(w.f=q,_.f=Y,U(D,"buffer"),U(D,"byteOffset"),U(D,"byteLength"),U(D,"length")),o({target:"Object",stat:!0,forced:!O},{getOwnPropertyDescriptor:q,defineProperty:Y}),e.exports=function(e,t,n){var i=e.match(/\d+$/)[0]/8,c=e+(n?"Clamped":"")+"Array",l="get"+e,u="set"+e,h=r[c],C=h,g=C&&C.prototype,_={},w=function(e,t){T(e,t,{get:function(){return function(e,t){var n=L(e);return n.view[l](t*i+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,o){var r=L(e);n&&(o=(o=E(o))<0?0:o>255?255:255&o),r.view[u](t*i+r.byteOffset,o,!0)}(this,t,e)},enumerable:!0})};O?a&&(C=t((function(e,t,n,o){return d(e,C,c),S(b(t)?G(t)?o!==undefined?new h(t,f(n,i),o):n!==undefined?new h(t,f(n,i)):new h(t):W(t)?H(C,t):y.call(C,t):new h(m(t)),e,C)})),v&&v(C,j),k(V(h),(function(e){e in C||s(C,e,h[e])})),C.prototype=g):(C=t((function(e,t,n,o){d(e,C,c);var r,a,l,u=0,s=0;if(b(t)){if(!G(t))return W(t)?H(C,t):y.call(C,t);r=t,s=f(n,i);var h=t.byteLength;if(o===undefined){if(h%i)throw M("Wrong length");if((a=h-s)<0)throw M("Wrong length")}else if((a=p(o)*i)+s>h)throw M("Wrong length");l=a/i}else l=m(t),r=new P(a=l*i);for(I(e,{buffer:r,byteOffset:s,byteLength:a,length:l,view:new R(r)});u<l;)w(e,u++)})),v&&v(C,j),g=C.prototype=N(D)),g.constructor!==C&&s(g,"constructor",C),F&&s(g,F,c),_[c]=C,o({global:!0,forced:C!=h,sham:!O},_),"BYTES_PER_ELEMENT"in C||s(C,"BYTES_PER_ELEMENT",i),"BYTES_PER_ELEMENT"in g||s(g,"BYTES_PER_ELEMENT",i),x(c)}):e.exports=function(){}},function(e,t,n){"use strict";t.__esModule=!0,t.logger=t.createLogger=void 0;n(168);var o=0,r=1,i=2,a=3,c=4,l=function(e,t){for(var n=arguments.length,o=new Array(n>2?n-2:0),r=2;r<n;r++)o[r-2]=arguments[r];if(e>=i){var a=[t].concat(o).map((function(e){return"string"==typeof e?e:e instanceof Error?e.stack||String(e):JSON.stringify(e)})).filter((function(e){return e})).join(" ")+"\nUser Agent: "+navigator.userAgent;Byond.topic({tgui:1,window_id:window.__windowId__,type:"log",message:a})}},d=function(e){return{debug:function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return l.apply(void 0,[o,e].concat(n))},log:function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];return l.apply(void 0,[r,e].concat(n))},info:function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];return l.apply(void 0,[i,e].concat(n))},warn:function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];return l.apply(void 0,[a,e].concat(n))},error:function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];return l.apply(void 0,[c,e].concat(n))}}};t.createLogger=d;var u=d();t.logger=u},function(e,t,n){"use strict";var o=n(32),r=Math.max,i=Math.min;e.exports=function(e,t){var n=o(e);return n<0?r(n+t,0):i(n,t)}},function(e,t,n){"use strict";var o,r=n(10),i=n(138),a=n(97),c=n(64),l=n(139),d=n(92),u=n(76),s=u("IE_PROTO"),p=function(){},m=function(e){return"<script>"+e+"<\/script>"},f=function(){try{o=document.domain&&new ActiveXObject("htmlfile")}catch(r){}var e,t;f=o?function(e){e.write(m("")),e.close();var t=e.parentWindow.Object;return e=null,t}(o):((t=d("iframe")).style.display="none",l.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(m("document.F=Object")),e.close(),e.F);for(var n=a.length;n--;)delete f.prototype[a[n]];return f()};c[s]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(p.prototype=r(e),n=new p,p.prototype=null,n[s]=e):n=f(),t===undefined?n:i(n,t)}},function(e,t,n){"use strict";var o=n(14).f,r=n(20),i=n(13)("toStringTag");e.exports=function(e,t,n){e&&!r(e=n?e:e.prototype,i)&&o(e,i,{configurable:!0,value:t})}},function(e,t,n){"use strict";var o=n(13),r=n(46),i=n(14),a=o("unscopables"),c=Array.prototype;c[a]==undefined&&i.f(c,a,{configurable:!0,value:r(null)}),e.exports=function(e){c[a][e]=!0}},function(e,t,n){"use strict";var o=n(10),r=n(33),i=n(13)("species");e.exports=function(e,t){var n,a=o(e).constructor;return a===undefined||(n=o(a)[i])==undefined?t:r(n)}},function(e,t,n){"use strict";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){"use strict";var o=n(136),r=n(97).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return o(e,r)}},function(e,t,n){"use strict";var o=n(33);e.exports=function(e,t,n){if(o(e),t===undefined)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,o){return e.call(t,n,o)};case 3:return function(n,o,r){return e.call(t,n,o,r)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){"use strict";var o=n(36),r=n(14),i=n(50);e.exports=function(e,t,n){var a=o(t);a in e?r.f(e,a,i(0,n)):e[a]=n}},function(e,t,n){"use strict";var o=n(10),r=n(147);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(i){}return function(n,i){return o(n),r(i),t?e.call(n,i):n.__proto__=i,n}}():undefined)},function(e,t,n){"use strict";var o=n(64),r=n(8),i=n(20),a=n(14).f,c=n(63),l=n(72),d=c("meta"),u=0,s=Object.isExtensible||function(){return!0},p=function(e){a(e,d,{value:{objectID:"O"+ ++u,weakData:{}}})},m=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!r(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,d)){if(!s(e))return"F";if(!t)return"E";p(e)}return e[d].objectID},getWeakData:function(e,t){if(!i(e,d)){if(!s(e))return!0;if(!t)return!1;p(e)}return e[d].weakData},onFreeze:function(e){return l&&m.REQUIRED&&s(e)&&!i(e,d)&&p(e),e}};o[d]=!0},function(e,t,n){"use strict";var o=n(35);e.exports=Array.isArray||function(e){return"Array"==o(e)}},function(e,t,n){"use strict";var o=n(39),r=n(14),i=n(13),a=n(9),c=i("species");e.exports=function(e){var t=o(e),n=r.f;a&&t&&!t[c]&&n(t,c,{configurable:!0,get:function(){return this}})}},function(e,t,n){"use strict";e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},function(e,t,n){"use strict";var o=n(23),r="["+n(85)+"]",i=RegExp("^"+r+r+"*"),a=RegExp(r+r+"*$"),c=function(e){return function(t){var n=String(o(t));return 1&e&&(n=n.replace(i,"")),2&e&&(n=n.replace(a,"")),n}};e.exports={start:c(1),end:c(2),trim:c(3)}},function(e,t,n){"use strict";t.__esModule=!0,t.assetMiddleware=t.resolveAsset=t.loadCSS=void 0;var o=n(423),r=(0,n(44).createLogger)("assets"),i=[/v4shim/i],a=[],c={},l=function(e){a.includes(e)||(a.push(e),r.log("loading stylesheet '"+e+"'"),(0,o.loadCSS)(e))};t.loadCSS=l;t.resolveAsset=function(e){return c[e]||e};t.assetMiddleware=function(e){return function(e){return function(t){var n=t.type,o=t.payload;if("asset/stylesheet"!==n)if("asset/mappings"!==n)e(t);else for(var r=function(){var e=d[a];if(i.some((function(t){return t.test(e)})))return"continue";var t=o[e],n=e.split(".").pop();c[e]=t,"css"===n&&l(t)},a=0,d=Object.keys(o);a<d.length;a++)r();else l(o)}}}},function(e,t,n){"use strict";t.__esModule=!0,t.InterfaceLockNoticeBox=void 0;var o=n(0),r=n(1),i=n(3);t.InterfaceLockNoticeBox=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=e.siliconUser,d=void 0===l?c.siliconUser:l,u=e.locked,s=void 0===u?c.locked:u,p=e.onLockStatusChange,m=void 0===p?function(){return a("lock")}:p,f=e.accessText,h=void 0===f?"an ID card":f;return d?(0,o.createComponentVNode)(2,i.NoticeBox,{color:d&&"grey",children:(0,o.createComponentVNode)(2,i.Flex,{align:"center",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:"Interface lock status:"}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Button,{m:0,color:s?"red":"green",icon:s?"lock":"unlock",content:s?"Locked":"Unlocked",onClick:function(){m&&m(!s)}})})]})}):(0,o.createComponentVNode)(2,i.NoticeBox,{children:["Swipe ",h," ","to ",s?"unlock":"lock"," this interface."]})}},function(e,t,n){"use strict";var o=n(5),r=n(35),i="".split;e.exports=o((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==r(e)?i.call(e,""):Object(e)}:Object},function(e,t,n){"use strict";var o=0,r=Math.random();e.exports=function(e){return"Symbol("+String(e===undefined?"":e)+")_"+(++o+r).toString(36)}},function(e,t,n){"use strict";e.exports={}},function(e,t,n){"use strict";var o=n(26),r=n(12),i=n(45),a=function(e){return function(t,n,a){var c,l=o(t),d=r(l.length),u=i(a,d);if(e&&n!=n){for(;d>u;)if((c=l[u++])!=c)return!0}else for(;d>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},function(e,t,n){"use strict";var o=n(5),r=/#|\.prototype\./,i=function(e,t){var n=c[a(e)];return n==d||n!=l&&("function"==typeof t?o(t):!!t)},a=i.normalize=function(e){return String(e).replace(r,".").toLowerCase()},c=i.data={},l=i.NATIVE="N",d=i.POLYFILL="P";e.exports=i},function(e,t,n){"use strict";var o=n(136),r=n(97);e.exports=Object.keys||function(e){return o(e,r)}},function(e,t,n){"use strict";var o=n(8),r=n(56),i=n(13)("species");e.exports=function(e,t){var n;return r(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!r(n.prototype)?o(n)&&null===(n=n[i])&&(n=undefined):n=undefined),new(n===undefined?Array:n)(0===t?0:t)}},function(e,t,n){"use strict";var o=n(5),r=n(13),i=n(100),a=r("species");e.exports=function(e){return i>=51||!o((function(){var t=[];return(t.constructor={})[a]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},function(e,t,n){"use strict";e.exports={}},function(e,t,n){"use strict";var o=n(24);e.exports=function(e,t,n){for(var r in t)o(e,r,t[r],n);return e}},function(e,t,n){"use strict";var o=n(5);e.exports=!o((function(){return Object.isExtensible(Object.preventExtensions({}))}))},function(e,t,n){"use strict";var o=n(10),r=n(102),i=n(12),a=n(52),c=n(103),l=n(144),d=function(e,t){this.stopped=e,this.result=t};(e.exports=function(e,t,n,u,s){var p,m,f,h,C,g,b,N=a(t,n,u?2:1);if(s)p=e;else{if("function"!=typeof(m=c(e)))throw TypeError("Target is not iterable");if(r(m)){for(f=0,h=i(e.length);h>f;f++)if((C=u?N(o(b=e[f])[0],b[1]):N(e[f]))&&C instanceof d)return C;return new d(!1)}p=m.call(e)}for(g=p.next;!(b=g.call(p)).done;)if("object"==typeof(C=l(p,N,b.value,u))&&C&&C instanceof d)return C;return new d(!1)}).stop=function(e){return new d(!0,e)}},function(e,t,n){"use strict";var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(r){"object"==typeof window&&(o=window)}e.exports=o},function(e,t,n){"use strict";var o={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!o.call({1:2},1);t.f=i?function(e){var t=r(this,e);return!!t&&t.enumerable}:o},function(e,t,n){"use strict";var o=n(95),r=n(63),i=o("keys");e.exports=function(e){return i[e]||(i[e]=r(e))}},function(e,t,n){"use strict";var o=n(39);e.exports=o("navigator","userAgent")||""},function(e,t,n){"use strict";var o=n(104),r=n(35),i=n(13)("toStringTag"),a="Arguments"==r(function(){return arguments}());e.exports=o?r:function(e){var t,n,o;return e===undefined?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(n){}}(t=Object(e),i))?n:a?r(t):"Object"==(o=r(t))&&"function"==typeof t.callee?"Arguments":o}},function(e,t,n){"use strict";var o=n(13)("iterator"),r=!1;try{var i=0,a={next:function(){return{done:!!i++}},"return":function(){r=!0}};a[o]=function(){return this},Array.from(a,(function(){throw 2}))}catch(c){}e.exports=function(e,t){if(!t&&!r)return!1;var n=!1;try{var i={};i[o]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(c){}return n}},function(e,t,n){"use strict";var o=n(33),r=n(18),i=n(62),a=n(12),c=function(e){return function(t,n,c,l){o(n);var d=r(t),u=i(d),s=a(d.length),p=e?s-1:0,m=e?-1:1;if(c<2)for(;;){if(p in u){l=u[p],p+=m;break}if(p+=m,e?p<0:s<=p)throw TypeError("Reduce of empty array with no initial value")}for(;e?p>=0:s>p;p+=m)p in u&&(l=n(l,u[p],p,d));return l}};e.exports={left:c(!1),right:c(!0)}},function(e,t,n){"use strict";var o=n(7),r=n(9),i=n(107),a=n(31),c=n(71),l=n(5),d=n(58),u=n(32),s=n(12),p=n(149),m=n(234),f=n(38),h=n(54),C=n(51).f,g=n(14).f,b=n(101),N=n(47),v=n(37),V=v.get,y=v.set,k=o.ArrayBuffer,x=k,_=o.DataView,w=_&&_.prototype,B=Object.prototype,S=o.RangeError,L=m.pack,I=m.unpack,T=function(e){return[255&e]},A=function(e){return[255&e,e>>8&255]},E=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},M=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},P=function(e){return L(e,23,4)},R=function(e){return L(e,52,8)},O=function(e,t){g(e.prototype,t,{get:function(){return V(this)[t]}})},F=function(e,t,n,o){var r=p(n),i=V(e);if(r+t>i.byteLength)throw S("Wrong index");var a=V(i.buffer).bytes,c=r+i.byteOffset,l=a.slice(c,c+t);return o?l:l.reverse()},j=function(e,t,n,o,r,i){var a=p(n),c=V(e);if(a+t>c.byteLength)throw S("Wrong index");for(var l=V(c.buffer).bytes,d=a+c.byteOffset,u=o(+r),s=0;s<t;s++)l[d+s]=u[i?s:t-s-1]};if(i){if(!l((function(){k(1)}))||!l((function(){new k(-1)}))||l((function(){return new k,new k(1.5),new k(NaN),"ArrayBuffer"!=k.name}))){for(var D,z=(x=function(e){return d(this,x),new k(p(e))}).prototype=k.prototype,W=C(k),H=0;W.length>H;)(D=W[H++])in x||a(x,D,k[D]);z.constructor=x}h&&f(w)!==B&&h(w,B);var U=new _(new x(2)),G=w.setInt8;U.setInt8(0,2147483648),U.setInt8(1,2147483649),!U.getInt8(0)&&U.getInt8(1)||c(w,{setInt8:function(e,t){G.call(this,e,t<<24>>24)},setUint8:function(e,t){G.call(this,e,t<<24>>24)}},{unsafe:!0})}else x=function(e){d(this,x,"ArrayBuffer");var t=p(e);y(this,{bytes:b.call(new Array(t),0),byteLength:t}),r||(this.byteLength=t)},_=function(e,t,n){d(this,_,"DataView"),d(e,x,"DataView");var o=V(e).byteLength,i=u(t);if(i<0||i>o)throw S("Wrong offset");if(i+(n=n===undefined?o-i:s(n))>o)throw S("Wrong length");y(this,{buffer:e,byteLength:n,byteOffset:i}),r||(this.buffer=e,this.byteLength=n,this.byteOffset=i)},r&&(O(x,"byteLength"),O(_,"buffer"),O(_,"byteLength"),O(_,"byteOffset")),c(_.prototype,{getInt8:function(e){return F(this,1,e)[0]<<24>>24},getUint8:function(e){return F(this,1,e)[0]},getInt16:function(e){var t=F(this,2,e,arguments.length>1?arguments[1]:undefined);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=F(this,2,e,arguments.length>1?arguments[1]:undefined);return t[1]<<8|t[0]},getInt32:function(e){return M(F(this,4,e,arguments.length>1?arguments[1]:undefined))},getUint32:function(e){return M(F(this,4,e,arguments.length>1?arguments[1]:undefined))>>>0},getFloat32:function(e){return I(F(this,4,e,arguments.length>1?arguments[1]:undefined),23)},getFloat64:function(e){return I(F(this,8,e,arguments.length>1?arguments[1]:undefined),52)},setInt8:function(e,t){j(this,1,e,T,t)},setUint8:function(e,t){j(this,1,e,T,t)},setInt16:function(e,t){j(this,2,e,A,t,arguments.length>2?arguments[2]:undefined)},setUint16:function(e,t){j(this,2,e,A,t,arguments.length>2?arguments[2]:undefined)},setInt32:function(e,t){j(this,4,e,E,t,arguments.length>2?arguments[2]:undefined)},setUint32:function(e,t){j(this,4,e,E,t,arguments.length>2?arguments[2]:undefined)},setFloat32:function(e,t){j(this,4,e,P,t,arguments.length>2?arguments[2]:undefined)},setFloat64:function(e,t){j(this,8,e,R,t,arguments.length>2?arguments[2]:undefined)}});N(x,"ArrayBuffer"),N(_,"DataView"),e.exports={ArrayBuffer:x,DataView:_}},function(e,t,n){"use strict";var o=n(4),r=n(7),i=n(66),a=n(24),c=n(55),l=n(73),d=n(58),u=n(8),s=n(5),p=n(79),m=n(47),f=n(83);e.exports=function(e,t,n){var h=-1!==e.indexOf("Map"),C=-1!==e.indexOf("Weak"),g=h?"set":"add",b=r[e],N=b&&b.prototype,v=b,V={},y=function(e){var t=N[e];a(N,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(C&&!u(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return C&&!u(e)?undefined:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(C&&!u(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(i(e,"function"!=typeof b||!(C||N.forEach&&!s((function(){(new b).entries().next()})))))v=n.getConstructor(t,e,h,g),c.REQUIRED=!0;else if(i(e,!0)){var k=new v,x=k[g](C?{}:-0,1)!=k,_=s((function(){k.has(1)})),w=p((function(e){new b(e)})),B=!C&&s((function(){for(var e=new b,t=5;t--;)e[g](t,t);return!e.has(-0)}));w||((v=t((function(t,n){d(t,v,e);var o=f(new b,t,v);return n!=undefined&&l(n,o[g],o,h),o}))).prototype=N,N.constructor=v),(_||B)&&(y("delete"),y("has"),h&&y("get")),(B||x)&&y(g),C&&N.clear&&delete N.clear}return V[e]=v,o({global:!0,forced:v!=b},V),m(v,e),C||n.setStrong(v,e,h),v}},function(e,t,n){"use strict";var o=n(8),r=n(54);e.exports=function(e,t,n){var i,a;return r&&"function"==typeof(i=t.constructor)&&i!==n&&o(a=i.prototype)&&a!==n.prototype&&r(e,a),e}},function(e,t,n){"use strict";var o=Math.expm1,r=Math.exp;e.exports=!o||o(10)>22025.465794806718||o(10)<22025.465794806718||-2e-17!=o(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:r(e)-1}:o},function(e,t,n){"use strict";e.exports="\t\n\x0B\f\r \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff"},function(e,t,n){"use strict";var o=n(41),r=n(7),i=n(5);e.exports=o||!i((function(){var e=Math.random();__defineSetter__.call(null,e,(function(){})),delete r[e]}))},function(e,t,n){"use strict";var o=n(10);e.exports=function(){var e=o(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},function(e,t,n){"use strict";var o,r,i=n(87),a=n(113),c=RegExp.prototype.exec,l=String.prototype.replace,d=c,u=(o=/a/,r=/b*/g,c.call(o,"a"),c.call(r,"a"),0!==o.lastIndex||0!==r.lastIndex),s=a.UNSUPPORTED_Y||a.BROKEN_CARET,p=/()??/.exec("")[1]!==undefined;(u||p||s)&&(d=function(e){var t,n,o,r,a=this,d=s&&a.sticky,m=i.call(a),f=a.source,h=0,C=e;return d&&(-1===(m=m.replace("y","")).indexOf("g")&&(m+="g"),C=String(e).slice(a.lastIndex),a.lastIndex>0&&(!a.multiline||a.multiline&&"\n"!==e[a.lastIndex-1])&&(f="(?: "+f+")",C=" "+C,h++),n=new RegExp("^(?:"+f+")",m)),p&&(n=new RegExp("^"+f+"$(?!\\s)",m)),u&&(t=a.lastIndex),o=c.call(d?n:a,C),d?o?(o.input=o.input.slice(h),o[0]=o[0].slice(h),o.index=a.lastIndex,a.lastIndex+=o[0].length):a.lastIndex=0:u&&o&&(a.lastIndex=a.global?o.index+o[0].length:t),p&&o&&o.length>1&&l.call(o[0],n,(function(){for(r=1;r<arguments.length-2;r++)arguments[r]===undefined&&(o[r]=undefined)})),o}),e.exports=d},function(e,t,n){"use strict";n(162);var o=n(24),r=n(5),i=n(13),a=n(88),c=n(31),l=i("species"),d=!r((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")})),u="$0"==="a".replace(/./,"$0"),s=i("replace"),p=!!/./[s]&&""===/./[s]("a","$0"),m=!r((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));e.exports=function(e,t,n,s){var f=i(e),h=!r((function(){var t={};return t[f]=function(){return 7},7!=""[e](t)})),C=h&&!r((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[f]=/./[f]),n.exec=function(){return t=!0,null},n[f](""),!t}));if(!h||!C||"replace"===e&&(!d||!u||p)||"split"===e&&!m){var g=/./[f],b=n(f,""[e],(function(e,t,n,o,r){return t.exec===a?h&&!r?{done:!0,value:g.call(t,n,o)}:{done:!0,value:e.call(n,t,o)}:{done:!1}}),{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:p}),N=b[0],v=b[1];o(String.prototype,e,N),o(RegExp.prototype,f,2==t?function(e,t){return v.call(e,this,t)}:function(e){return v.call(e,this)})}s&&c(RegExp.prototype[f],"sham",!0)}},function(e,t,n){"use strict";var o=n(35),r=n(88);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var i=n.call(e,t);if("object"!=typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==o(e))throw TypeError("RegExp#exec called on incompatible receiver");return r.call(e,t)}},function(e,t,n){"use strict";function o(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}t.__esModule=!0,t.hotKeyMiddleware=t.subscribeToHotKey=t.releaseHeldKeys=t.KEY_MINUS=t.KEY_EQUAL=t.KEY_F12=t.KEY_F11=t.KEY_F10=t.KEY_F9=t.KEY_F8=t.KEY_F7=t.KEY_F6=t.KEY_F5=t.KEY_F4=t.KEY_F3=t.KEY_F2=t.KEY_F1=t.KEY_Z=t.KEY_Y=t.KEY_X=t.KEY_W=t.KEY_V=t.KEY_U=t.KEY_T=t.KEY_S=t.KEY_R=t.KEY_Q=t.KEY_P=t.KEY_O=t.KEY_N=t.KEY_M=t.KEY_L=t.KEY_K=t.KEY_J=t.KEY_I=t.KEY_H=t.KEY_G=t.KEY_F=t.KEY_E=t.KEY_D=t.KEY_C=t.KEY_B=t.KEY_A=t.KEY_9=t.KEY_8=t.KEY_7=t.KEY_6=t.KEY_5=t.KEY_4=t.KEY_3=t.KEY_2=t.KEY_1=t.KEY_0=t.KEY_SPACE=t.KEY_ESCAPE=t.KEY_ALT=t.KEY_CTRL=t.KEY_SHIFT=t.KEY_ENTER=t.KEY_TAB=t.KEY_BACKSPACE=void 0;var i=(0,n(44).createLogger)("hotkeys");t.KEY_BACKSPACE=8;t.KEY_TAB=9;t.KEY_ENTER=13;t.KEY_SHIFT=16;t.KEY_CTRL=17;t.KEY_ALT=18;t.KEY_ESCAPE=27;t.KEY_SPACE=32;t.KEY_0=48;t.KEY_1=49;t.KEY_2=50;t.KEY_3=51;t.KEY_4=52;t.KEY_5=53;t.KEY_6=54;t.KEY_7=55;t.KEY_8=56;t.KEY_9=57;t.KEY_A=65;t.KEY_B=66;t.KEY_C=67;t.KEY_D=68;t.KEY_E=69;t.KEY_F=70;t.KEY_G=71;t.KEY_H=72;t.KEY_I=73;t.KEY_J=74;t.KEY_K=75;t.KEY_L=76;t.KEY_M=77;t.KEY_N=78;t.KEY_O=79;t.KEY_P=80;t.KEY_Q=81;t.KEY_R=82;t.KEY_S=83;t.KEY_T=84;t.KEY_U=85;t.KEY_V=86;t.KEY_W=87;t.KEY_X=88;t.KEY_Y=89;t.KEY_Z=90;t.KEY_F1=112;t.KEY_F2=113;t.KEY_F3=114;t.KEY_F4=115;t.KEY_F5=116;t.KEY_F6=117;t.KEY_F7=118;t.KEY_F8=119;t.KEY_F9=120;t.KEY_F10=121;t.KEY_F11=122;t.KEY_F12=123;t.KEY_EQUAL=187;t.KEY_MINUS=189;var a=[17,18,16],c=[27,13,32,9,17,16,112,113,114,115,116,117,118,119,120,121,122,123],l={},d=function(e,t,n,o){var r="";return e&&(r+="Ctrl+"),t&&(r+="Alt+"),n&&(r+="Shift+"),r+=o>=48&&o<=90?String.fromCharCode(o):o>=112&&o<=123?"F"+(o-111):"["+o+"]"},u=function(e){var t=window.event?e.which:e.keyCode,n=e.ctrlKey,o=e.altKey,r=e.shiftKey;return{keyCode:t,ctrlKey:n,altKey:o,shiftKey:r,hasModifierKeys:n||o||r,keyString:d(n,o,r,t)}},s=function(){for(var e=0,t=Object.keys(l);e<t.length;e++){var n=t[e];l[n]&&(i.log("releasing ["+n+"] key"),l[n]=!1,Byond.topic({__keyup:n}))}};t.releaseHeldKeys=s;var p=[];t.subscribeToHotKey=function(e,t){p.push((function(n,o){if(o.keyString===e){var r=t(n);r&&n.dispatch(r)}}))};t.hotKeyMiddleware=function(e){var t;return t=function(t,n){Byond.IS_LTE_IE8||function(e,t){if(!e.defaultPrevented){var n=e.target&&e.target.localName;if("input"!==n&&"textarea"!==n){var o=u(e),r=o.keyCode,a=o.ctrlKey,d=o.shiftKey;a||d||c.includes(r)||("keydown"!==t||l[r]?"keyup"===t&&l[r]&&(i.debug("passthrough",t,o),Byond.topic({__keyup:r})):(i.debug("passthrough",t,o),Byond.topic({__keydown:r})))}}}(t,n),function(e,t,n){if("keyup"===t){var r=u(e),c=r.keyCode,l=r.hasModifierKeys,d=r.keyString;if(l&&!a.includes(c)||c>=112&&c<=123){i.log(d);for(var s,m=o(p);!(s=m()).done;)(0,s.value)(n,r)}}}(t,n,e)},document.addEventListener("keydown",(function(e){var n=window.event?e.which:e.keyCode;t(e,"keydown"),l[n]=!0})),document.addEventListener("keyup",(function(e){var n=window.event?e.which:e.keyCode;t(e,"keyup"),l[n]=!1})),Byond.IS_LTE_IE8||function(e){var t;document.addEventListener("focusout",(function(){t=setTimeout(e)})),document.addEventListener("focusin",(function(){clearTimeout(t)})),window.addEventListener("beforeunload",e)}((function(){s()})),function(e){return function(t){return e(t)}}}},function(e,t,n){"use strict";var o=n(7),r=n(8),i=o.document,a=r(i)&&r(i.createElement);e.exports=function(e){return a?i.createElement(e):{}}},function(e,t,n){"use strict";var o=n(7),r=n(31);e.exports=function(e,t){try{r(o,e,t)}catch(n){o[e]=t}return t}},function(e,t,n){"use strict";var o=n(132),r=Function.toString;"function"!=typeof o.inspectSource&&(o.inspectSource=function(e){return r.call(e)}),e.exports=o.inspectSource},function(e,t,n){"use strict";var o=n(41),r=n(132);(e.exports=function(e,t){return r[e]||(r[e]=t!==undefined?t:{})})("versions",[]).push({version:"3.6.5",mode:o?"pure":"global",copyright:"\xa9 2020 Denis Pushkarev (zloirock.ru)"})},function(e,t,n){"use strict";var o=n(39),r=n(51),i=n(98),a=n(10);e.exports=o("Reflect","ownKeys")||function(e){var t=r.f(a(e)),n=i.f;return n?t.concat(n(e)):t}},function(e,t,n){"use strict";e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(e,t,n){"use strict";t.f=Object.getOwnPropertySymbols},function(e,t,n){"use strict";var o=n(5);e.exports=!!Object.getOwnPropertySymbols&&!o((function(){return!String(Symbol())}))},function(e,t,n){"use strict";var o,r,i=n(7),a=n(77),c=i.process,l=c&&c.versions,d=l&&l.v8;d?r=(o=d.split("."))[0]+o[1]:a&&(!(o=a.match(/Edge\/(\d+)/))||o[1]>=74)&&(o=a.match(/Chrome\/(\d+)/))&&(r=o[1]),e.exports=r&&+r},function(e,t,n){"use strict";var o=n(18),r=n(45),i=n(12);e.exports=function(e){for(var t=o(this),n=i(t.length),a=arguments.length,c=r(a>1?arguments[1]:undefined,n),l=a>2?arguments[2]:undefined,d=l===undefined?n:r(l,n);d>c;)t[c++]=e;return t}},function(e,t,n){"use strict";var o=n(13),r=n(70),i=o("iterator"),a=Array.prototype;e.exports=function(e){return e!==undefined&&(r.Array===e||a[i]===e)}},function(e,t,n){"use strict";var o=n(78),r=n(70),i=n(13)("iterator");e.exports=function(e){if(e!=undefined)return e[i]||e["@@iterator"]||r[o(e)]}},function(e,t,n){"use strict";var o={};o[n(13)("toStringTag")]="z",e.exports="[object z]"===String(o)},function(e,t,n){"use strict";var o=n(4),r=n(219),i=n(38),a=n(54),c=n(47),l=n(31),d=n(24),u=n(13),s=n(41),p=n(70),m=n(146),f=m.IteratorPrototype,h=m.BUGGY_SAFARI_ITERATORS,C=u("iterator"),g=function(){return this};e.exports=function(e,t,n,u,m,b,N){r(n,t,u);var v,V,y,k=function(e){if(e===m&&S)return S;if(!h&&e in w)return w[e];switch(e){case"keys":case"values":case"entries":return function(){return new n(this,e)}}return function(){return new n(this)}},x=t+" Iterator",_=!1,w=e.prototype,B=w[C]||w["@@iterator"]||m&&w[m],S=!h&&B||k(m),L="Array"==t&&w.entries||B;if(L&&(v=i(L.call(new e)),f!==Object.prototype&&v.next&&(s||i(v)===f||(a?a(v,f):"function"!=typeof v[C]&&l(v,C,g)),c(v,x,!0,!0),s&&(p[x]=g))),"values"==m&&B&&"values"!==B.name&&(_=!0,S=function(){return B.call(this)}),s&&!N||w[C]===S||l(w,C,S),p[t]=S,m)if(V={values:k("values"),keys:b?S:k("keys"),entries:k("entries")},N)for(y in V)(h||_||!(y in w))&&d(w,y,V[y]);else o({target:t,proto:!0,forced:h||_},V);return V}},function(e,t,n){"use strict";var o=n(5);e.exports=!o((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},function(e,t,n){"use strict";e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},function(e,t,n){"use strict";var o=n(12),r=n(109),i=n(23),a=Math.ceil,c=function(e){return function(t,n,c){var l,d,u=String(i(t)),s=u.length,p=c===undefined?" ":String(c),m=o(n);return m<=s||""==p?u:(l=m-s,(d=r.call(p,a(l/p.length))).length>l&&(d=d.slice(0,l)),e?u+d:d+u)}};e.exports={start:c(!1),end:c(!0)}},function(e,t,n){"use strict";var o=n(32),r=n(23);e.exports="".repeat||function(e){var t=String(r(this)),n="",i=o(e);if(i<0||i==Infinity)throw RangeError("Wrong number of repetitions");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n}},function(e,t,n){"use strict";e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},function(e,t,n){"use strict";var o,r,i,a=n(7),c=n(5),l=n(35),d=n(52),u=n(139),s=n(92),p=n(158),m=a.location,f=a.setImmediate,h=a.clearImmediate,C=a.process,g=a.MessageChannel,b=a.Dispatch,N=0,v={},V=function(e){if(v.hasOwnProperty(e)){var t=v[e];delete v[e],t()}},y=function(e){return function(){V(e)}},k=function(e){V(e.data)},x=function(e){a.postMessage(e+"",m.protocol+"//"+m.host)};f&&h||(f=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return v[++N]=function(){("function"==typeof e?e:Function(e)).apply(undefined,t)},o(N),N},h=function(e){delete v[e]},"process"==l(C)?o=function(e){C.nextTick(y(e))}:b&&b.now?o=function(e){b.now(y(e))}:g&&!p?(i=(r=new g).port2,r.port1.onmessage=k,o=d(i.postMessage,i,1)):!a.addEventListener||"function"!=typeof postMessage||a.importScripts||c(x)||"file:"===m.protocol?o="onreadystatechange"in s("script")?function(e){u.appendChild(s("script")).onreadystatechange=function(){u.removeChild(this),V(e)}}:function(e){setTimeout(y(e),0)}:(o=x,a.addEventListener("message",k,!1))),e.exports={set:f,clear:h}},function(e,t,n){"use strict";var o=n(8),r=n(35),i=n(13)("match");e.exports=function(e){var t;return o(e)&&((t=e[i])!==undefined?!!t:"RegExp"==r(e))}},function(e,t,n){"use strict";var o=n(5);function r(e,t){return RegExp(e,t)}t.UNSUPPORTED_Y=o((function(){var e=r("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),t.BROKEN_CARET=o((function(){var e=r("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},function(e,t,n){"use strict";var o=n(32),r=n(23),i=function(e){return function(t,n){var i,a,c=String(r(t)),l=o(n),d=c.length;return l<0||l>=d?e?"":undefined:(i=c.charCodeAt(l))<55296||i>56319||l+1===d||(a=c.charCodeAt(l+1))<56320||a>57343?e?c.charAt(l):i:e?c.slice(l,l+2):a-56320+(i-55296<<10)+65536}};e.exports={codeAt:i(!1),charAt:i(!0)}},function(e,t,n){"use strict";var o=n(112);e.exports=function(e){if(o(e))throw TypeError("The method doesn't accept regular expressions");return e}},function(e,t,n){"use strict";var o=n(13)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[o]=!1,"/./"[e](t)}catch(r){}}return!1}},function(e,t,n){"use strict";var o=n(114).charAt;e.exports=function(e,t,n){return t+(n?o(e,t).length:1)}},function(e,t,n){"use strict";var o=n(5),r=n(85);e.exports=function(e){return o((function(){return!!r[e]()||"\u200b\x85\u180e"!="\u200b\x85\u180e"[e]()||r[e].name!==e}))}},function(e,t,n){"use strict";var o=n(7),r=n(5),i=n(79),a=n(11).NATIVE_ARRAY_BUFFER_VIEWS,c=o.ArrayBuffer,l=o.Int8Array;e.exports=!a||!r((function(){l(1)}))||!r((function(){new l(-1)}))||!i((function(e){new l,new l(null),new l(1.5),new l(e)}),!0)||r((function(){return 1!==new l(new c(2),1,undefined).length}))},function(e,t,n){"use strict";t.__esModule=!0,t.vecNormalize=t.vecLength=t.vecInverse=t.vecScale=t.vecDivide=t.vecMultiply=t.vecSubtract=t.vecAdd=void 0;var o=n(15),r=function(e,t){return e+t},i=function(e,t){return e-t},a=function(e,t){return e*t},c=function(e,t){return e/t};t.vecAdd=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,o.reduce)((function(e,t){return(0,o.zipWith)(r)(e,t)}))(t)};t.vecSubtract=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,o.reduce)((function(e,t){return(0,o.zipWith)(i)(e,t)}))(t)};t.vecMultiply=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,o.reduce)((function(e,t){return(0,o.zipWith)(a)(e,t)}))(t)};var l=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,o.reduce)((function(e,t){return(0,o.zipWith)(c)(e,t)}))(t)};t.vecDivide=l;t.vecScale=function(e,t){return(0,o.map)((function(e){return e*t}))(e)};t.vecInverse=function(e){return(0,o.map)((function(e){return-e}))(e)};var d=function(e){return Math.sqrt((0,o.reduce)(r)((0,o.zipWith)(a)(e,e)))};t.vecLength=d;t.vecNormalize=function(e){return l(e,d(e))}},function(e,t,n){"use strict";t.__esModule=!0,t.debugReducer=t.useDebug=t.selectDebug=t.toggleDebugLayout=t.toggleKitchenSink=void 0;var o=n(91),r=function(){return{type:"debug/toggleKitchenSink"}};t.toggleKitchenSink=r;var i=function(){return{type:"debug/toggleDebugLayout"}};t.toggleDebugLayout=i,(0,o.subscribeToHotKey)("F11",(function(){return{type:"debug/toggleDebugLayout"}})),(0,o.subscribeToHotKey)("F12",(function(){return{type:"debug/toggleKitchenSink"}})),(0,o.subscribeToHotKey)("Ctrl+Alt+[8]",(function(){setTimeout((function(){throw new Error("OOPSIE WOOPSIE!! UwU We made a fucky wucky!! A wittle fucko boingo! The code monkeys at our headquarters are working VEWY HAWD to fix this!")}))}));var a=function(e){return e.debug};t.selectDebug=a;t.useDebug=function(e){return a(e.store.getState())};t.debugReducer=function(e,t){void 0===e&&(e={});var n=t.type;t.payload;return"debug/toggleKitchenSink"===n?Object.assign({},e,{kitchenSink:!e.kitchenSink}):"debug/toggleDebugLayout"===n?Object.assign({},e,{debugLayout:!e.debugLayout}):e}},function(e,t,n){"use strict";t.__esModule=!0,t.Layout=t.refocusLayout=void 0;var o=n(0),r=n(6),i=n(17);t.refocusLayout=function(){if(!Byond.IS_LTE_IE8){var e=document.getElementById("Layout__content");e&&e.focus()}};var a=function(e){var t=e.className,n=e.theme,i=void 0===n?"nanotrasen":n,a=e.children;return(0,o.createVNode)(1,"div","theme-"+i,(0,o.createVNode)(1,"div",(0,r.classes)(["Layout",t]),a,0),2)};t.Layout=a;a.Content=function(e){var t=e.className,n=e.scrollable,a=e.children,c=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,["className","scrollable","children"]);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Layout__content",n&&"Layout__content--scrollable",t].concat((0,i.computeBoxClassName)(c))),a,0,Object.assign({id:"Layout__content"},(0,i.computeBoxProps)(c))))}},function(e,t,n){"use strict";t.__esModule=!0,t.AnimatedNumber=void 0;var o=n(16),r=n(0);var i=function(e){return"number"==typeof e&&Number.isFinite(e)&&!Number.isNaN(e)},a=function(e){var t,n;function r(t){var n;return(n=e.call(this,t)||this).timer=null,n.state={value:0},i(t.initial)?n.state.value=t.initial:i(t.value)&&(n.state.value=Number(t.value)),n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var a=r.prototype;return a.tick=function(){var e=this.props,t=this.state,n=Number(t.value),o=Number(e.value);if(i(o)){var r=.5*n+.5*o;this.setState({value:r})}},a.componentDidMount=function(){var e=this;this.timer=setInterval((function(){return e.tick()}),50)},a.componentWillUnmount=function(){clearTimeout(this.timer)},a.render=function(){var e=this.props,t=this.state,n=e.format,r=e.children,a=t.value,c=e.value;if(!i(c))return c||null;var l=a;if(n)l=n(a);else{var d=String(c).split(".")[1],u=d?d.length:0;l=(0,o.toFixed)(a,(0,o.clamp)(u,0,8))}return"function"==typeof r?r(l,a):l},r}(r.Component);t.AnimatedNumber=a},function(e,t,n){"use strict";t.__esModule=!0,t.ButtonInput=t.ButtonConfirm=t.ButtonCheckbox=t.Button=void 0;var o=n(0),r=n(6),i=n(91),a=n(2),c=n(44),l=n(17),d=n(125),u=n(171);function s(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function p(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var m=(0,c.createLogger)("Button"),f=function(e){var t=e.className,n=e.fluid,c=e.icon,s=e.color,f=e.disabled,h=e.selected,C=e.tooltip,g=e.tooltipPosition,b=e.ellipsis,N=e.content,v=e.iconRotation,V=e.iconSpin,y=e.children,k=e.onclick,x=e.onClick,_=p(e,["className","fluid","icon","color","disabled","selected","tooltip","tooltipPosition","ellipsis","content","iconRotation","iconSpin","children","onclick","onClick"]),w=!(!N&&!y);return k&&m.warn("Lowercase 'onclick' is not supported on Button and lowercase prop names are discouraged in general. Please use a camelCase'onClick' instead and read: https://infernojs.org/docs/guides/event-handling"),(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.Box,Object.assign({className:(0,r.classes)(["Button",n&&"Button--fluid",f&&"Button--disabled",h&&"Button--selected",w&&"Button--hasContent",b&&"Button--ellipsis",s&&"string"==typeof s?"Button--color--"+s:"Button--color--default",t]),tabIndex:!f&&"0",unselectable:Byond.IS_LTE_IE8,onclick:function(e){(0,a.refocusLayout)(),!f&&x&&x(e)},onKeyDown:function(e){var t=window.event?e.which:e.keyCode;return t===i.KEY_SPACE||t===i.KEY_ENTER?(e.preventDefault(),void(!f&&x&&x(e))):t===i.KEY_ESCAPE?(e.preventDefault(),void(0,a.refocusLayout)()):void 0}},_,{children:[c&&(0,o.createComponentVNode)(2,d.Icon,{name:c,rotation:v,spin:V}),N,y,C&&(0,o.createComponentVNode)(2,u.Tooltip,{content:C,position:g})]})))};t.Button=f,f.defaultHooks=r.pureComponentHooks;var h=function(e){var t=e.checked,n=p(e,["checked"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,f,Object.assign({color:"transparent",icon:t?"check-square-o":"square-o",selected:t},n)))};t.ButtonCheckbox=h,f.Checkbox=h;var C=function(e){function t(){var t;return(t=e.call(this)||this).state={clickedOnce:!1},t.handleClick=function(){t.state.clickedOnce&&t.setClickedOnce(!1)},t}s(t,e);var n=t.prototype;return n.setClickedOnce=function(e){var t=this;this.setState({clickedOnce:e}),e?setTimeout((function(){return window.addEventListener("click",t.handleClick)})):window.removeEventListener("click",this.handleClick)},n.render=function(){var e=this,t=this.props,n=t.confirmContent,r=void 0===n?"Confirm?":n,i=t.confirmColor,a=void 0===i?"bad":i,c=t.confirmIcon,l=t.icon,d=t.color,u=t.content,s=t.onClick,m=p(t,["confirmContent","confirmColor","confirmIcon","icon","color","content","onClick"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,f,Object.assign({content:this.state.clickedOnce?r:u,icon:this.state.clickedOnce?c:l,color:this.state.clickedOnce?a:d,onClick:function(){return e.state.clickedOnce?s():e.setClickedOnce(!0)}},m)))},t}(o.Component);t.ButtonConfirm=C,f.Confirm=C;var g=function(e){function t(){var t;return(t=e.call(this)||this).inputRef=(0,o.createRef)(),t.state={inInput:!1},t}s(t,e);var n=t.prototype;return n.setInInput=function(e){if(this.setState({inInput:e}),this.inputRef){var t=this.inputRef.current;if(e){t.value=this.props.currentValue||"";try{t.focus(),t.select()}catch(n){}}}},n.commitResult=function(e){if(this.inputRef){var t=this.inputRef.current;if(""!==t.value)return void this.props.onCommit(e,t.value);if(!this.props.defaultValue)return;this.props.onCommit(e,this.props.defaultValue)}},n.render=function(){var e=this,t=this.props,n=t.fluid,a=t.content,c=t.icon,s=t.iconRotation,m=t.iconSpin,f=t.tooltip,h=t.tooltipPosition,C=t.color,g=void 0===C?"default":C,b=(t.placeholder,t.maxLength,p(t,["fluid","content","icon","iconRotation","iconSpin","tooltip","tooltipPosition","color","placeholder","maxLength"]));return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.Box,Object.assign({className:(0,r.classes)(["Button",n&&"Button--fluid","Button--color--"+g])},b,{onClick:function(){return e.setInInput(!0)},children:[c&&(0,o.createComponentVNode)(2,d.Icon,{name:c,rotation:s,spin:m}),(0,o.createVNode)(1,"div",null,a,0),(0,o.createVNode)(64,"input","NumberInput__input",null,1,{style:{display:this.state.inInput?undefined:"none","text-align":"left"},onBlur:function(t){e.state.inInput&&(e.setInInput(!1),e.commitResult(t))},onKeyDown:function(t){if(t.keyCode===i.KEY_ENTER)return e.setInInput(!1),void e.commitResult(t);t.keyCode===i.KEY_ESCAPE&&e.setInInput(!1)}},null,this.inputRef),f&&(0,o.createComponentVNode)(2,u.Tooltip,{content:f,position:h})]})))},t}(o.Component);t.ButtonInput=g,f.Input=g},function(e,t,n){"use strict";t.__esModule=!0,t.Icon=void 0;var o=n(0),r=n(6),i=n(17);var a=/-o$/,c=function(e){var t=e.name,n=e.size,c=e.spin,l=e.className,d=e.style,u=void 0===d?{}:d,s=e.rotation,p=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,["name","size","spin","className","style","rotation"]);n&&(u["font-size"]=100*n+"%"),"number"==typeof s&&(u.transform="rotate("+s+"deg)");var m=a.test(t),f=t.replace(a,"");return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({as:"i",className:(0,r.classes)([l,m?"far":"fas","fa-"+f,c&&"fa-spin"]),style:u},p)))};t.Icon=c,c.defaultHooks=r.pureComponentHooks},function(e,t,n){"use strict";t.__esModule=!0,t.DraggableControl=void 0;var o=n(0),r=n(16),i=n(6),a=n(123);var c=function(e,t){return e.screenX*t[0]+e.screenY*t[1]},l=function(e){var t,n;function i(t){var n;return(n=e.call(this,t)||this).inputRef=(0,o.createRef)(),n.state={value:t.value,dragging:!1,editing:!1,internalValue:null,origin:null,suppressingFlicker:!1},n.flickerTimer=null,n.suppressFlicker=function(){var e=n.props.suppressFlicker;e>0&&(n.setState({suppressingFlicker:!0}),clearTimeout(n.flickerTimer),n.flickerTimer=setTimeout((function(){return n.setState({suppressingFlicker:!1})}),e))},n.handleDragStart=function(e){var t=n.props,o=t.value,r=t.dragMatrix;n.state.editing||(document.body.style["pointer-events"]="none",n.ref=e.target,n.setState({dragging:!1,origin:c(e,r),value:o,internalValue:o}),n.timer=setTimeout((function(){n.setState({dragging:!0})}),250),n.dragInterval=setInterval((function(){var t=n.state,o=t.dragging,r=t.value,i=n.props.onDrag;o&&i&&i(e,r)}),500),document.addEventListener("mousemove",n.handleDragMove),document.addEventListener("mouseup",n.handleDragEnd))},n.handleDragMove=function(e){var t=n.props,o=t.minValue,i=t.maxValue,a=t.step,l=t.stepPixelSize,d=t.dragMatrix;n.setState((function(t){var n=Object.assign({},t),u=c(e,d)-n.origin;if(t.dragging){var s=Number.isFinite(o)?o%a:0;n.internalValue=(0,r.clamp)(n.internalValue+u*a/l,o-a,i+a),n.value=(0,r.clamp)(n.internalValue-n.internalValue%a+s,o,i),n.origin=c(e,d)}else Math.abs(u)>4&&(n.dragging=!0);return n}))},n.handleDragEnd=function(e){var t=n.props,o=t.onChange,r=t.onDrag,i=n.state,a=i.dragging,c=i.value,l=i.internalValue;if(document.body.style["pointer-events"]="auto",clearTimeout(n.timer),clearInterval(n.dragInterval),n.setState({dragging:!1,editing:!a,origin:null}),document.removeEventListener("mousemove",n.handleDragMove),document.removeEventListener("mouseup",n.handleDragEnd),a)n.suppressFlicker(),o&&o(e,c),r&&r(e,c);else if(n.inputRef){var d=n.inputRef.current;d.value=l;try{d.focus(),d.select()}catch(u){}}},n}return n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n,i.prototype.render=function(){var e=this,t=this.state,n=t.dragging,i=t.editing,c=t.value,l=t.suppressingFlicker,d=this.props,u=d.animated,s=d.value,p=d.unit,m=d.minValue,f=d.maxValue,h=d.format,C=d.onChange,g=d.onDrag,b=d.children,N=d.height,v=d.lineHeight,V=d.fontSize,y=s;(n||l)&&(y=c);var k=function(e){return e+(p?" "+p:"")},x=u&&!n&&!l&&(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:y,format:h,children:k})||k(h?h(y):y),_=(0,o.createVNode)(64,"input","NumberInput__input",null,1,{style:{display:i?undefined:"none",height:N,"line-height":v,"font-size":V},onBlur:function(t){if(i){var n=(0,r.clamp)(t.target.value,m,f);e.setState({editing:!1,value:n}),e.suppressFlicker(),C&&C(t,n),g&&g(t,n)}},onKeyDown:function(t){if(13===t.keyCode){var n=(0,r.clamp)(t.target.value,m,f);return e.setState({editing:!1,value:n}),e.suppressFlicker(),C&&C(t,n),void(g&&g(t,n))}27!==t.keyCode||e.setState({editing:!1})}},null,this.inputRef);return b({dragging:n,editing:i,value:s,displayValue:y,displayElement:x,inputElement:_,handleDragStart:this.handleDragStart})},i}(o.Component);t.DraggableControl=l,l.defaultHooks=i.pureComponentHooks,l.defaultProps={minValue:-Infinity,maxValue:+Infinity,step:1,stepPixelSize:1,suppressFlicker:50,dragMatrix:[1,0]}},function(e,t,n){"use strict";t.__esModule=!0,t.FlexItem=t.computeFlexItemProps=t.Flex=t.computeFlexProps=void 0;var o=n(0),r=n(6),i=n(17);function a(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var c=function(e){var t=e.className,n=e.direction,o=e.wrap,i=e.align,c=e.justify,l=e.inline,d=e.spacing,u=void 0===d?0:d,s=a(e,["className","direction","wrap","align","justify","inline","spacing"]);return Object.assign({className:(0,r.classes)(["Flex",Byond.IS_LTE_IE10&&("column"===n?"Flex--iefix--column":"Flex--iefix"),l&&"Flex--inline",u>0&&"Flex--spacing--"+u,t]),style:Object.assign({},s.style,{"flex-direction":n,"flex-wrap":o,"align-items":i,"justify-content":c})},s)};t.computeFlexProps=c;var l=function(e){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({},c(e))))};t.Flex=l,l.defaultHooks=r.pureComponentHooks;var d=function(e){var t=e.className,n=e.grow,o=e.order,c=e.shrink,l=e.basis,d=void 0===l?e.width:l,u=e.align,s=a(e,["className","grow","order","shrink","basis","align"]);return Object.assign({className:(0,r.classes)(["Flex__item",Byond.IS_LTE_IE10&&"Flex__item--iefix",t]),style:Object.assign({},s.style,{"flex-grow":n,"flex-shrink":c,"flex-basis":(0,i.unit)(d),order:o,"align-self":u})},s)};t.computeFlexItemProps=d;var u=function(e){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({},d(e))))};t.FlexItem=u,u.defaultHooks=r.pureComponentHooks,l.Item=u},function(e,t,n){"use strict";t.__esModule=!0,t.NumberInput=void 0;var o=n(0),r=n(16),i=n(6),a=n(123),c=n(17);var l=function(e){var t,n;function l(t){var n;n=e.call(this,t)||this;var i=t.value;return n.inputRef=(0,o.createRef)(),n.state={value:i,dragging:!1,editing:!1,internalValue:null,origin:null,suppressingFlicker:!1},n.flickerTimer=null,n.suppressFlicker=function(){var e=n.props.suppressFlicker;e>0&&(n.setState({suppressingFlicker:!0}),clearTimeout(n.flickerTimer),n.flickerTimer=setTimeout((function(){return n.setState({suppressingFlicker:!1})}),e))},n.handleDragStart=function(e){var t=n.props.value;n.state.editing||(document.body.style["pointer-events"]="none",n.ref=e.target,n.setState({dragging:!1,origin:e.screenY,value:t,internalValue:t}),n.timer=setTimeout((function(){n.setState({dragging:!0})}),250),n.dragInterval=setInterval((function(){var t=n.state,o=t.dragging,r=t.value,i=n.props.onDrag;o&&i&&i(e,r)}),500),document.addEventListener("mousemove",n.handleDragMove),document.addEventListener("mouseup",n.handleDragEnd))},n.handleDragMove=function(e){var t=n.props,o=t.minValue,i=t.maxValue,a=t.step,c=t.stepPixelSize;n.setState((function(t){var n=Object.assign({},t),l=n.origin-e.screenY;if(t.dragging){var d=Number.isFinite(o)?o%a:0;n.internalValue=(0,r.clamp)(n.internalValue+l*a/c,o-a,i+a),n.value=(0,r.clamp)(n.internalValue-n.internalValue%a+d,o,i),n.origin=e.screenY}else Math.abs(l)>4&&(n.dragging=!0);return n}))},n.handleDragEnd=function(e){var t=n.props,o=t.onChange,r=t.onDrag,i=n.state,a=i.dragging,c=i.value,l=i.internalValue;if(document.body.style["pointer-events"]="auto",clearTimeout(n.timer),clearInterval(n.dragInterval),n.setState({dragging:!1,editing:!a,origin:null}),document.removeEventListener("mousemove",n.handleDragMove),document.removeEventListener("mouseup",n.handleDragEnd),a)n.suppressFlicker(),o&&o(e,c),r&&r(e,c);else if(n.inputRef){var d=n.inputRef.current;d.value=l;try{d.focus(),d.select()}catch(u){}}},n}return n=e,(t=l).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n,l.prototype.render=function(){var e=this,t=this.state,n=t.dragging,l=t.editing,d=t.value,u=t.suppressingFlicker,s=this.props,p=s.className,m=s.fluid,f=s.animated,h=s.value,C=s.unit,g=s.minValue,b=s.maxValue,N=s.height,v=s.width,V=s.lineHeight,y=s.fontSize,k=s.format,x=s.onChange,_=s.onDrag,w=h;(n||u)&&(w=d);var B=function(e){return(0,o.createVNode)(1,"div","NumberInput__content",e+(C?" "+C:""),0,{unselectable:Byond.IS_LTE_IE8})},S=f&&!n&&!u&&(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:w,format:k,children:B})||B(k?k(w):w);return(0,o.createComponentVNode)(2,c.Box,{className:(0,i.classes)(["NumberInput",m&&"NumberInput--fluid",p]),minWidth:v,minHeight:N,lineHeight:V,fontSize:y,onMouseDown:this.handleDragStart,children:[(0,o.createVNode)(1,"div","NumberInput__barContainer",(0,o.createVNode)(1,"div","NumberInput__bar",null,1,{style:{height:(0,r.clamp)((w-g)/(b-g)*100,0,100)+"%"}}),2),S,(0,o.createVNode)(64,"input","NumberInput__input",null,1,{style:{display:l?undefined:"none",height:N,"line-height":V,"font-size":y},onBlur:function(t){if(l){var n=(0,r.clamp)(t.target.value,g,b);e.setState({editing:!1,value:n}),e.suppressFlicker(),x&&x(t,n),_&&_(t,n)}},onKeyDown:function(t){if(13===t.keyCode){var n=(0,r.clamp)(t.target.value,g,b);return e.setState({editing:!1,value:n}),e.suppressFlicker(),x&&x(t,n),void(_&&_(t,n))}27!==t.keyCode||e.setState({editing:!1})}},null,this.inputRef)]})},l}(o.Component);t.NumberInput=l,l.defaultHooks=i.pureComponentHooks,l.defaultProps={minValue:-Infinity,maxValue:+Infinity,step:1,stepPixelSize:1,suppressFlicker:50}},function(e,t,n){"use strict";t.__esModule=!0,t.GenericUplink=t.Uplink=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(40),l=n(2);t.Uplink=function(e,t){var n=(0,i.useBackend)(t).data.telecrystals;return(0,o.createComponentVNode)(2,l.Window,{width:620,height:580,theme:"syndicate",resizable:!0,children:(0,o.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,d,{currencyAmount:n,currencySymbol:"TC"})})})};var d=function(e,t){var n,l,d=e.currencyAmount,s=void 0===d?0:d,p=e.currencySymbol,m=void 0===p?"cr":p,f=(0,i.useBackend)(t),h=f.act,C=f.data,g=C.compactMode,b=C.lockable,N=C.categories,v=void 0===N?[]:N,V=(0,i.useLocalState)(t,"searchText",""),y=V[0],k=V[1],x=(0,i.useLocalState)(t,"category",null==(n=v[0])?void 0:n.name),_=x[0],w=x[1],B=(0,r.createSearch)(y,(function(e){return e.name+e.desc})),S=y.length>0&&v.flatMap((function(e){return e.items||[]})).filter(B).filter((function(e,t){return t<25}))||(null==(l=v.find((function(e){return e.name===_})))?void 0:l.items)||[];return(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:s>0?"good":"bad",children:[(0,c.formatMoney)(s)," ",m]}),buttons:(0,o.createFragment)([(0,o.createTextVNode)("Search"),(0,o.createComponentVNode)(2,a.Input,{autoFocus:!0,value:y,onInput:function(e,t){return k(t)},mx:1}),(0,o.createComponentVNode)(2,a.Button,{icon:g?"list":"info",content:g?"Compact":"Detailed",onClick:function(){return h("compact_toggle")}}),!!b&&(0,o.createComponentVNode)(2,a.Button,{icon:"lock",content:"Lock",onClick:function(){return h("lock")}})],0),children:(0,o.createComponentVNode)(2,a.Flex,{children:[0===y.length&&(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Tabs,{vertical:!0,children:v.map((function(e){var t;return(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:e.name===_,onClick:function(){return w(e.name)},children:[e.name," (",(null==(t=e.items)?void 0:t.length)||0,")"]},e.name)}))})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,basis:0,children:[0===S.length&&(0,o.createComponentVNode)(2,a.NoticeBox,{children:0===y.length?"No items in this category.":"No results found."}),(0,o.createComponentVNode)(2,u,{compactMode:y.length>0||g,currencyAmount:s,currencySymbol:m,items:S})]})]})})};t.GenericUplink=d;var u=function(e,t){var n=e.compactMode,l=e.currencyAmount,d=e.currencySymbol,u=(0,i.useBackend)(t).act,s=(0,i.useLocalState)(t,"hoveredItem",{}),p=s[0],m=s[1],f=p&&p.cost||0,h=e.items.map((function(e){var t=p&&p.name!==e.name,n=l-f<e.cost,o=t&&n,r=l<e.cost||o;return Object.assign({},e,{disabled:r})}));return n?(0,o.createComponentVNode)(2,a.Table,{children:h.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,a.Table.Cell,{bold:!0,children:(0,r.decodeHtmlEntities)(e.name)}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:(0,c.formatMoney)(e.cost)+" "+d,disabled:e.disabled,tooltip:e.desc,tooltipPosition:"left",onmouseover:function(){return m(e)},onmouseout:function(){return m({})},onClick:function(){return u("buy",{name:e.name})}})})]},e.name)}))}):h.map((function(e){return(0,o.createComponentVNode)(2,a.Section,{title:e.name,level:2,buttons:(0,o.createComponentVNode)(2,a.Button,{content:e.cost+" "+d,disabled:e.disabled,onmouseover:function(){return m(e)},onmouseout:function(){return m({})},onClick:function(){return u("buy",{name:e.name})}}),children:(0,r.decodeHtmlEntities)(e.desc)},e.name)}))}},function(e,t,n){"use strict";t.__esModule=!0,t.AreaCharge=t.PowerMonitorContent=t.PowerMonitor=t.powerRank=void 0;var o=n(0),r=n(15),i=n(30),a=n(16),c=n(6),l=n(1),d=n(3),u=n(2),s=5e5,p=function(e){var t=String(e.split(" ")[1]).toLowerCase();return["w","kw","mw","gw"].indexOf(t)};t.powerRank=p;t.PowerMonitor=function(){return(0,o.createComponentVNode)(2,u.Window,{width:550,height:700,resizable:!0,children:(0,o.createComponentVNode)(2,u.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,m)})})};var m=function(e,t){var n=(0,l.useBackend)(t).data,c=n.history,u=(0,l.useLocalState)(t,"sortByField",null),m=u[0],C=u[1],g=c.supply[c.supply.length-1]||0,b=c.demand[c.demand.length-1]||0,N=c.supply.map((function(e,t){return[t,e]})),v=c.demand.map((function(e,t){return[t,e]})),V=Math.max.apply(Math,[s].concat(c.supply,c.demand)),y=(0,i.flow)([(0,r.map)((function(e,t){return Object.assign({},e,{id:e.name+t})})),"name"===m&&(0,r.sortBy)((function(e){return e.name})),"charge"===m&&(0,r.sortBy)((function(e){return-e.charge})),"draw"===m&&(0,r.sortBy)((function(e){return-p(e.load)}),(function(e){return-parseFloat(e.load)}))])(n.areas);return(0,o.createFragment)([(0,o.createComponentVNode)(2,d.Flex,{mx:-.5,mb:1,children:[(0,o.createComponentVNode)(2,d.Flex.Item,{mx:.5,width:"200px",children:(0,o.createComponentVNode)(2,d.Section,{children:(0,o.createComponentVNode)(2,d.LabeledList,{children:[(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Supply",children:(0,o.createComponentVNode)(2,d.ProgressBar,{value:g,minValue:0,maxValue:V,color:"teal",children:(0,a.toFixed)(g/1e3)+" kW"})}),(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Draw",children:(0,o.createComponentVNode)(2,d.ProgressBar,{value:b,minValue:0,maxValue:V,color:"pink",children:(0,a.toFixed)(b/1e3)+" kW"})})]})})}),(0,o.createComponentVNode)(2,d.Flex.Item,{mx:.5,grow:1,children:(0,o.createComponentVNode)(2,d.Section,{position:"relative",height:"100%",children:[(0,o.createComponentVNode)(2,d.Chart.Line,{fillPositionedParent:!0,data:N,rangeX:[0,N.length-1],rangeY:[0,V],strokeColor:"rgba(0, 181, 173, 1)",fillColor:"rgba(0, 181, 173, 0.25)"}),(0,o.createComponentVNode)(2,d.Chart.Line,{fillPositionedParent:!0,data:v,rangeX:[0,v.length-1],rangeY:[0,V],strokeColor:"rgba(224, 57, 151, 1)",fillColor:"rgba(224, 57, 151, 0.25)"})]})})]}),(0,o.createComponentVNode)(2,d.Section,{children:[(0,o.createComponentVNode)(2,d.Box,{mb:1,children:[(0,o.createComponentVNode)(2,d.Box,{inline:!0,mr:2,color:"label",children:"Sort by:"}),(0,o.createComponentVNode)(2,d.Button.Checkbox,{checked:"name"===m,content:"Name",onClick:function(){return C("name"!==m&&"name")}}),(0,o.createComponentVNode)(2,d.Button.Checkbox,{checked:"charge"===m,content:"Charge",onClick:function(){return C("charge"!==m&&"charge")}}),(0,o.createComponentVNode)(2,d.Button.Checkbox,{checked:"draw"===m,content:"Draw",onClick:function(){return C("draw"!==m&&"draw")}})]}),(0,o.createComponentVNode)(2,d.Table,{children:[(0,o.createComponentVNode)(2,d.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,d.Table.Cell,{children:"Area"}),(0,o.createComponentVNode)(2,d.Table.Cell,{collapsing:!0,children:"Charge"}),(0,o.createComponentVNode)(2,d.Table.Cell,{textAlign:"right",children:"Draw"}),(0,o.createComponentVNode)(2,d.Table.Cell,{collapsing:!0,title:"Equipment",children:"Eqp"}),(0,o.createComponentVNode)(2,d.Table.Cell,{collapsing:!0,title:"Lighting",children:"Lgt"}),(0,o.createComponentVNode)(2,d.Table.Cell,{collapsing:!0,title:"Environment",children:"Env"})]}),y.map((function(e,t){return(0,o.createVNode)(1,"tr","Table__row candystripe",[(0,o.createVNode)(1,"td",null,e.name,0),(0,o.createVNode)(1,"td","Table__cell text-right text-nowrap",(0,o.createComponentVNode)(2,f,{charging:e.charging,charge:e.charge}),2),(0,o.createVNode)(1,"td","Table__cell text-right text-nowrap",e.load,0),(0,o.createVNode)(1,"td","Table__cell text-center text-nowrap",(0,o.createComponentVNode)(2,h,{status:e.eqp}),2),(0,o.createVNode)(1,"td","Table__cell text-center text-nowrap",(0,o.createComponentVNode)(2,h,{status:e.lgt}),2),(0,o.createVNode)(1,"td","Table__cell text-center text-nowrap",(0,o.createComponentVNode)(2,h,{status:e.env}),2)],4,null,e.id)}))]})]})],4)};t.PowerMonitorContent=m;var f=function(e){var t=e.charging,n=e.charge;return(0,o.createFragment)([(0,o.createComponentVNode)(2,d.Icon,{width:"18px",textAlign:"center",name:0===t&&(n>50?"battery-half":"battery-quarter")||1===t&&"bolt"||2===t&&"battery-full",color:0===t&&(n>50?"yellow":"red")||1===t&&"yellow"||2===t&&"green"}),(0,o.createComponentVNode)(2,d.Box,{inline:!0,width:"36px",textAlign:"right",children:(0,a.toFixed)(n)+"%"})],4)};t.AreaCharge=f,f.defaultHooks=c.pureComponentHooks;var h=function(e){var t=e.status,n=Boolean(2&t),r=Boolean(1&t),i=(n?"On":"Off")+" ["+(r?"auto":"manual")+"]";return(0,o.createComponentVNode)(2,d.ColorBox,{color:n?"good":"bad",content:r?undefined:"M",title:i})};h.defaultHooks=c.pureComponentHooks},function(e,t,n){"use strict";var o=n(9),r=n(5),i=n(92);e.exports=!o&&!r((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(e,t,n){"use strict";var o=n(7),r=n(93),i=o["__core-js_shared__"]||r("__core-js_shared__",{});e.exports=i},function(e,t,n){"use strict";var o=n(7),r=n(94),i=o.WeakMap;e.exports="function"==typeof i&&/native code/.test(r(i))},function(e,t,n){"use strict";var o=n(20),r=n(96),i=n(22),a=n(14);e.exports=function(e,t){for(var n=r(t),c=a.f,l=i.f,d=0;d<n.length;d++){var u=n[d];o(e,u)||c(e,u,l(t,u))}}},function(e,t,n){"use strict";var o=n(7);e.exports=o},function(e,t,n){"use strict";var o=n(20),r=n(26),i=n(65).indexOf,a=n(64);e.exports=function(e,t){var n,c=r(e),l=0,d=[];for(n in c)!o(a,n)&&o(c,n)&&d.push(n);for(;t.length>l;)o(c,n=t[l++])&&(~i(d,n)||d.push(n));return d}},function(e,t,n){"use strict";var o=n(99);e.exports=o&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(e,t,n){"use strict";var o=n(9),r=n(14),i=n(10),a=n(67);e.exports=o?Object.defineProperties:function(e,t){i(e);for(var n,o=a(t),c=o.length,l=0;c>l;)r.f(e,n=o[l++],t[n]);return e}},function(e,t,n){"use strict";var o=n(39);e.exports=o("document","documentElement")},function(e,t,n){"use strict";var o=n(26),r=n(51).f,i={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return a&&"[object Window]"==i.call(e)?function(e){try{return r(e)}catch(t){return a.slice()}}(e):r(o(e))}},function(e,t,n){"use strict";var o=n(13);t.f=o},function(e,t,n){"use strict";var o=n(18),r=n(45),i=n(12),a=Math.min;e.exports=[].copyWithin||function(e,t){var n=o(this),c=i(n.length),l=r(e,c),d=r(t,c),u=arguments.length>2?arguments[2]:undefined,s=a((u===undefined?c:r(u,c))-d,c-l),p=1;for(d<l&&l<d+s&&(p=-1,d+=s-1,l+=s-1);s-- >0;)d in n?n[l]=n[d]:delete n[l],l+=p,d+=p;return n}},function(e,t,n){"use strict";var o=n(56),r=n(12),i=n(52);e.exports=function a(e,t,n,c,l,d,u,s){for(var p,m=l,f=0,h=!!u&&i(u,s,3);f<c;){if(f in n){if(p=h?h(n[f],f,t):n[f],d>0&&o(p))m=a(e,t,p,r(p.length),m,d-1)-1;else{if(m>=9007199254740991)throw TypeError("Exceed the acceptable array length");e[m]=p}m++}f++}return m}},function(e,t,n){"use strict";var o=n(10);e.exports=function(e,t,n,r){try{return r?t(o(n)[0],n[1]):t(n)}catch(a){var i=e["return"];throw i!==undefined&&o(i.call(e)),a}}},function(e,t,n){"use strict";var o=n(26),r=n(48),i=n(70),a=n(37),c=n(105),l=a.set,d=a.getterFor("Array Iterator");e.exports=c(Array,"Array",(function(e,t){l(this,{type:"Array Iterator",target:o(e),index:0,kind:t})}),(function(){var e=d(this),t=e.target,n=e.kind,o=e.index++;return!t||o>=t.length?(e.target=undefined,{value:undefined,done:!0}):"keys"==n?{value:o,done:!1}:"values"==n?{value:t[o],done:!1}:{value:[o,t[o]],done:!1}}),"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(e,t,n){"use strict";var o,r,i,a=n(38),c=n(31),l=n(20),d=n(13),u=n(41),s=d("iterator"),p=!1;[].keys&&("next"in(i=[].keys())?(r=a(a(i)))!==Object.prototype&&(o=r):p=!0),o==undefined&&(o={}),u||l(o,s)||c(o,s,(function(){return this})),e.exports={IteratorPrototype:o,BUGGY_SAFARI_ITERATORS:p}},function(e,t,n){"use strict";var o=n(8);e.exports=function(e){if(!o(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},function(e,t,n){"use strict";var o=n(26),r=n(32),i=n(12),a=n(42),c=n(25),l=Math.min,d=[].lastIndexOf,u=!!d&&1/[1].lastIndexOf(1,-0)<0,s=a("lastIndexOf"),p=c("indexOf",{ACCESSORS:!0,1:0}),m=u||!s||!p;e.exports=m?function(e){if(u)return d.apply(this,arguments)||0;var t=o(this),n=i(t.length),a=n-1;for(arguments.length>1&&(a=l(a,r(arguments[1]))),a<0&&(a=n+a);a>=0;a--)if(a in t&&t[a]===e)return a||0;return-1}:d},function(e,t,n){"use strict";var o=n(32),r=n(12);e.exports=function(e){if(e===undefined)return 0;var t=o(e),n=r(t);if(t!==n)throw RangeError("Wrong length or index");return n}},function(e,t,n){"use strict";var o=n(33),r=n(8),i=[].slice,a={},c=function(e,t,n){if(!(t in a)){for(var o=[],r=0;r<t;r++)o[r]="a["+r+"]";a[t]=Function("C,a","return new C("+o.join(",")+")")}return a[t](e,n)};e.exports=Function.bind||function(e){var t=o(this),n=i.call(arguments,1),a=function(){var o=n.concat(i.call(arguments));return this instanceof a?c(t,o.length,o):t.apply(e,o)};return r(t.prototype)&&(a.prototype=t.prototype),a}},function(e,t,n){"use strict";var o=n(14).f,r=n(46),i=n(71),a=n(52),c=n(58),l=n(73),d=n(105),u=n(57),s=n(9),p=n(55).fastKey,m=n(37),f=m.set,h=m.getterFor;e.exports={getConstructor:function(e,t,n,d){var u=e((function(e,o){c(e,u,t),f(e,{type:t,index:r(null),first:undefined,last:undefined,size:0}),s||(e.size=0),o!=undefined&&l(o,e[d],e,n)})),m=h(t),C=function(e,t,n){var o,r,i=m(e),a=g(e,t);return a?a.value=n:(i.last=a={index:r=p(t,!0),key:t,value:n,previous:o=i.last,next:undefined,removed:!1},i.first||(i.first=a),o&&(o.next=a),s?i.size++:e.size++,"F"!==r&&(i.index[r]=a)),e},g=function(e,t){var n,o=m(e),r=p(t);if("F"!==r)return o.index[r];for(n=o.first;n;n=n.next)if(n.key==t)return n};return i(u.prototype,{clear:function(){for(var e=m(this),t=e.index,n=e.first;n;)n.removed=!0,n.previous&&(n.previous=n.previous.next=undefined),delete t[n.index],n=n.next;e.first=e.last=undefined,s?e.size=0:this.size=0},"delete":function(e){var t=m(this),n=g(this,e);if(n){var o=n.next,r=n.previous;delete t.index[n.index],n.removed=!0,r&&(r.next=o),o&&(o.previous=r),t.first==n&&(t.first=o),t.last==n&&(t.last=r),s?t.size--:this.size--}return!!n},forEach:function(e){for(var t,n=m(this),o=a(e,arguments.length>1?arguments[1]:undefined,3);t=t?t.next:n.first;)for(o(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!g(this,e)}}),i(u.prototype,n?{get:function(e){var t=g(this,e);return t&&t.value},set:function(e,t){return C(this,0===e?0:e,t)}}:{add:function(e){return C(this,e=0===e?0:e,e)}}),s&&o(u.prototype,"size",{get:function(){return m(this).size}}),u},setStrong:function(e,t,n){var o=t+" Iterator",r=h(t),i=h(o);d(e,t,(function(e,t){f(this,{type:o,target:e,state:r(e),kind:t,last:undefined})}),(function(){for(var e=i(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?"keys"==t?{value:n.key,done:!1}:"values"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=undefined,{value:undefined,done:!0})}),n?"entries":"values",!n,!0),u(t)}}},function(e,t,n){"use strict";var o=Math.log;e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:o(1+e)}},function(e,t,n){"use strict";var o=n(8),r=Math.floor;e.exports=function(e){return!o(e)&&isFinite(e)&&r(e)===e}},function(e,t,n){"use strict";var o=n(7),r=n(59).trim,i=n(85),a=o.parseInt,c=/^[+-]?0[Xx]/,l=8!==a(i+"08")||22!==a(i+"0x16");e.exports=l?function(e,t){var n=r(String(e));return a(n,t>>>0||(c.test(n)?16:10))}:a},function(e,t,n){"use strict";var o=n(9),r=n(67),i=n(26),a=n(75).f,c=function(e){return function(t){for(var n,c=i(t),l=r(c),d=l.length,u=0,s=[];d>u;)n=l[u++],o&&!a.call(c,n)||s.push(e?[n,c[n]]:c[n]);return s}};e.exports={entries:c(!0),values:c(!1)}},function(e,t,n){"use strict";e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},function(e,t,n){"use strict";var o=n(7);e.exports=o.Promise},function(e,t,n){"use strict";var o=n(77);e.exports=/(iphone|ipod|ipad).*applewebkit/i.test(o)},function(e,t,n){"use strict";var o,r,i,a,c,l,d,u,s=n(7),p=n(22).f,m=n(35),f=n(111).set,h=n(158),C=s.MutationObserver||s.WebKitMutationObserver,g=s.process,b=s.Promise,N="process"==m(g),v=p(s,"queueMicrotask"),V=v&&v.value;V||(o=function(){var e,t;for(N&&(e=g.domain)&&e.exit();r;){t=r.fn,r=r.next;try{t()}catch(n){throw r?a():i=undefined,n}}i=undefined,e&&e.enter()},N?a=function(){g.nextTick(o)}:C&&!h?(c=!0,l=document.createTextNode(""),new C(o).observe(l,{characterData:!0}),a=function(){l.data=c=!c}):b&&b.resolve?(d=b.resolve(undefined),u=d.then,a=function(){u.call(d,o)}):a=function(){f.call(s,o)}),e.exports=V||function(e){var t={fn:e,next:undefined};i&&(i.next=t),r||(r=t,a()),i=t}},function(e,t,n){"use strict";var o=n(10),r=n(8),i=n(161);e.exports=function(e,t){if(o(e),r(t)&&t.constructor===e)return t;var n=i.f(e);return(0,n.resolve)(t),n.promise}},function(e,t,n){"use strict";var o=n(33),r=function(e){var t,n;this.promise=new e((function(e,o){if(t!==undefined||n!==undefined)throw TypeError("Bad Promise constructor");t=e,n=o})),this.resolve=o(t),this.reject=o(n)};e.exports.f=function(e){return new r(e)}},function(e,t,n){"use strict";var o=n(4),r=n(88);o({target:"RegExp",proto:!0,forced:/./.exec!==r},{exec:r})},function(e,t,n){"use strict";var o=n(77);e.exports=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(o)},function(e,t,n){"use strict";var o=n(363);e.exports=function(e,t){var n=o(e);if(n%t)throw RangeError("Wrong offset");return n}},function(e,t,n){"use strict";var o=n(18),r=n(12),i=n(103),a=n(102),c=n(52),l=n(11).aTypedArrayConstructor;e.exports=function(e){var t,n,d,u,s,p,m=o(e),f=arguments.length,h=f>1?arguments[1]:undefined,C=h!==undefined,g=i(m);if(g!=undefined&&!a(g))for(p=(s=g.call(m)).next,m=[];!(u=p.call(s)).done;)m.push(u.value);for(C&&f>2&&(h=c(h,arguments[2],2)),n=r(m.length),d=new(l(this))(n),t=0;n>t;t++)d[t]=C?h(m[t],t):m[t];return d}},function(e,t,n){"use strict";var o=n(71),r=n(55).getWeakData,i=n(10),a=n(8),c=n(58),l=n(73),d=n(21),u=n(20),s=n(37),p=s.set,m=s.getterFor,f=d.find,h=d.findIndex,C=0,g=function(e){return e.frozen||(e.frozen=new b)},b=function(){this.entries=[]},N=function(e,t){return f(e.entries,(function(e){return e[0]===t}))};b.prototype={get:function(e){var t=N(this,e);if(t)return t[1]},has:function(e){return!!N(this,e)},set:function(e,t){var n=N(this,e);n?n[1]=t:this.entries.push([e,t])},"delete":function(e){var t=h(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,d){var s=e((function(e,o){c(e,s,t),p(e,{type:t,id:C++,frozen:undefined}),o!=undefined&&l(o,e[d],e,n)})),f=m(t),h=function(e,t,n){var o=f(e),a=r(i(t),!0);return!0===a?g(o).set(t,n):a[o.id]=n,e};return o(s.prototype,{"delete":function(e){var t=f(this);if(!a(e))return!1;var n=r(e);return!0===n?g(t)["delete"](e):n&&u(n,t.id)&&delete n[t.id]},has:function(e){var t=f(this);if(!a(e))return!1;var n=r(e);return!0===n?g(t).has(e):n&&u(n,t.id)}}),o(s.prototype,n?{get:function(e){var t=f(this);if(a(e)){var n=r(e);return!0===n?g(t).get(e):n?n[t.id]:undefined}},set:function(e,t){return h(this,e,t)}}:{add:function(e){return h(this,e,!0)}}),s}}},function(e,t,n){"use strict";t.__esModule=!0,t.perf=void 0;var o={mark:function(e,t){0},measure:function(e,t){0}};t.perf=o},function(e,t,n){"use strict";t.__esModule=!0,t.setupHotReloading=t.sendLogEntry=void 0;t.sendLogEntry=function(e,t){};t.setupHotReloading=function(){0}},function(e,t,n){"use strict";t.__esModule=!0,t.resizeStartHandler=t.dragStartHandler=t.setupDrag=t.recallWindowGeometry=t.storeWindowGeometry=t.getScreenSize=t.getScreenPosition=t.setWindowSize=t.setWindowPosition=t.getWindowSize=t.getWindowPosition=t.setWindowKey=void 0;var o=n(421),r=n(120);function i(e,t,n,o,r,i,a){try{var c=e[i](a),l=c.value}catch(d){return void n(d)}c.done?t(l):Promise.resolve(l).then(o,r)}function a(e){return function(){var t=this,n=arguments;return new Promise((function(o,r){var a=e.apply(t,n);function c(e){i(a,o,r,c,l,"next",e)}function l(e){i(a,o,r,c,l,"throw",e)}c(undefined)}))}}var c,l,d,u,s,p=(0,n(44).createLogger)("drag"),m=window.__windowId__,f=!1,h=!1,C=[0,0];t.setWindowKey=function(e){m=e};var g=function(){return[window.screenLeft,window.screenTop]};t.getWindowPosition=g;var b=function(){return[window.innerWidth,window.innerHeight]};t.getWindowSize=b;var N=function(e){var t=(0,r.vecAdd)(e,C);return Byond.winset(window.__windowId__,{pos:t[0]+","+t[1]})};t.setWindowPosition=N;var v=function(e){return Byond.winset(window.__windowId__,{size:e[0]+"x"+e[1]})};t.setWindowSize=v;var V=function(){return[0-C[0],0-C[1]]};t.getScreenPosition=V;var y=function(){return[window.screen.availWidth,window.screen.availHeight]};t.getScreenSize=y;var k=function(e){p.log("storing geometry");var t={pos:g(),size:b()};o.storage.set(e,t);var n=function(e,t,n){void 0===n&&(n=50);for(var o,r=[t],i=0;i<e.length;i++){var a=e[i];a!==t&&(r.length<n?r.push(a):o=a)}return[r,o]}(o.storage.get("geometries")||[],e),r=n[0],i=n[1];i&&o.storage.remove(i),o.storage.set("geometries",r)};t.storeWindowGeometry=k;var x=function(){var e=a(regeneratorRuntime.mark((function t(e,n){var i,a,l,d,u;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(void 0===n&&(n={}),(i=n.fancy&&o.storage.get(e))&&p.log("recalled geometry:",i),a=(null==i?void 0:i.pos)||n.pos,(l=n.size)&&v(l),!a){t.next=13;break}return t.next=9,c;case 9:l&&n.locked&&(a=w(a,l)[1]),N(a),t.next=19;break;case 13:if(!l){t.next=19;break}return t.next=16,c;case 16:d=[window.screen.availWidth-Math.abs(C[0]),window.screen.availHeight-Math.abs(C[1])],u=(0,r.vecAdd)((0,r.vecScale)(d,.5),(0,r.vecScale)(l,-.5),(0,r.vecScale)(C,-1)),N(u);case 19:case"end":return t.stop()}}),t)})));return function(t,n){return e.apply(this,arguments)}}();t.recallWindowGeometry=x;var _=function(){var e=a(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return c=Byond.winget(window.__windowId__,"pos").then((function(e){return[e.x-window.screenLeft,e.y-window.screenTop]})),e.next=3,c;case 3:C=e.sent,p.debug("screen offset",C);case 5:case"end":return e.stop()}}),t)})));return function(){return e.apply(this,arguments)}}();t.setupDrag=_;var w=function(e,t){for(var n=V(),o=y(),r=[e[0],e[1]],i=!1,a=0;a<2;a++){var c=n[a],l=n[a]+o[a];e[a]<c?(r[a]=c,i=!0):e[a]+t[a]>l&&(r[a]=l-t[a],i=!0)}return[i,r]};t.dragStartHandler=function(e){p.log("drag start"),f=!0,l=[window.screenLeft-e.screenX,window.screenTop-e.screenY],document.addEventListener("mousemove",S),document.addEventListener("mouseup",B),S(e)};var B=function T(e){p.log("drag end"),S(e),document.removeEventListener("mousemove",S),document.removeEventListener("mouseup",T),f=!1,k(m)},S=function(e){f&&(e.preventDefault(),N((0,r.vecAdd)([e.screenX,e.screenY],l)))};t.resizeStartHandler=function(e,t){return function(n){d=[e,t],p.log("resize start",d),h=!0,l=[window.screenLeft-n.screenX,window.screenTop-n.screenY],u=[window.innerWidth,window.innerHeight],document.addEventListener("mousemove",I),document.addEventListener("mouseup",L),I(n)}};var L=function A(e){p.log("resize end",s),I(e),document.removeEventListener("mousemove",I),document.removeEventListener("mouseup",A),h=!1,k(m)},I=function(e){h&&(e.preventDefault(),(s=(0,r.vecAdd)(u,(0,r.vecMultiply)(d,(0,r.vecAdd)([e.screenX,e.screenY],(0,r.vecInverse)([window.screenLeft,window.screenTop]),l,[1,1]))))[0]=Math.max(s[0],150),s[1]=Math.max(s[1],50),v(s))}},function(e,t,n){"use strict";t.__esModule=!0,t.useDispatch=t.StoreProvider=t.createStore=void 0;var o=n(30),r=n(422),i=n(0),a=n(1),c=n(121),l=n(91),d=n(44),u=n(60);(0,d.createLogger)("store");t.createStore=function(){var e=(0,o.flow)([function(e,t){return void 0===e&&(e={}),e},(0,r.combineReducers)({debug:c.debugReducer,backend:a.backendReducer})]),t=[!1,u.assetMiddleware,l.hotKeyMiddleware,a.backendMiddleware];return(0,r.createStore)(e,r.applyMiddleware.apply(void 0,t.filter(Boolean)))};var s=function(e){var t,n;function o(){return e.apply(this,arguments)||this}n=e,(t=o).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var r=o.prototype;return r.getChildContext=function(){return{store:this.props.store}},r.render=function(){return this.props.children},o}(i.Component);t.StoreProvider=s;t.useDispatch=function(e){return e.store.dispatch}},function(e,t,n){"use strict";t.__esModule=!0,t.Tooltip=void 0;var o=n(0),r=n(6);t.Tooltip=function(e){var t=e.content,n=e.position,i=void 0===n?"bottom":n,a="string"==typeof t&&t.length>35;return(0,o.createVNode)(1,"div",(0,r.classes)(["Tooltip",a&&"Tooltip--long",i&&"Tooltip--"+i]),null,1,{"data-tooltip":t})}},function(e,t,n){"use strict";t.__esModule=!0,t.Dimmer=void 0;var o=n(0),r=n(6),i=n(17);t.Dimmer=function(e){var t=e.className,n=e.children,a=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,["className","children"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({className:(0,r.classes)(["Dimmer"].concat(t))},a,{children:(0,o.createVNode)(1,"div","Dimmer__inner",n,0)})))}},function(e,t,n){"use strict";t.__esModule=!0,t.Divider=void 0;var o=n(0),r=n(6);t.Divider=function(e){var t=e.vertical,n=e.hidden;return(0,o.createVNode)(1,"div",(0,r.classes)(["Divider",n&&"Divider--hidden",t?"Divider--vertical":"Divider--horizontal"]))}},function(e,t,n){"use strict";t.__esModule=!0,t.TableCell=t.TableRow=t.Table=void 0;var o=n(0),r=n(6),i=n(17);function a(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var c=function(e){var t=e.className,n=e.collapsing,c=e.children,l=a(e,["className","collapsing","children"]);return(0,o.normalizeProps)((0,o.createVNode)(1,"table",(0,r.classes)(["Table",n&&"Table--collapsing",t,(0,i.computeBoxClassName)(l)]),(0,o.createVNode)(1,"tbody",null,c,0),2,Object.assign({},(0,i.computeBoxProps)(l))))};t.Table=c,c.defaultHooks=r.pureComponentHooks;var l=function(e){var t=e.className,n=e.header,c=a(e,["className","header"]);return(0,o.normalizeProps)((0,o.createVNode)(1,"tr",(0,r.classes)(["Table__row",n&&"Table__row--header",t,(0,i.computeBoxClassName)(e)]),null,1,Object.assign({},(0,i.computeBoxProps)(c))))};t.TableRow=l,l.defaultHooks=r.pureComponentHooks;var d=function(e){var t=e.className,n=e.collapsing,c=e.header,l=a(e,["className","collapsing","header"]);return(0,o.normalizeProps)((0,o.createVNode)(1,"td",(0,r.classes)(["Table__cell",n&&"Table__cell--collapsing",c&&"Table__cell--header",t,(0,i.computeBoxClassName)(e)]),null,1,Object.assign({},(0,i.computeBoxProps)(l))))};t.TableCell=d,d.defaultHooks=r.pureComponentHooks,c.Row=l,c.Cell=d},function(e,t,n){"use strict";t.__esModule=!0,t.LabeledListDivider=t.LabeledListItem=t.LabeledList=void 0;var o=n(0),r=n(6),i=n(17),a=n(173),c=function(e){var t=e.children;return(0,o.createVNode)(1,"table","LabeledList",t,0)};t.LabeledList=c,c.defaultHooks=r.pureComponentHooks;var l=function(e){var t=e.className,n=e.label,a=e.labelColor,c=void 0===a?"label":a,l=e.color,d=e.textAlign,u=e.buttons,s=e.content,p=e.children;return(0,o.createVNode)(1,"tr",(0,r.classes)(["LabeledList__row",t]),[(0,o.createComponentVNode)(2,i.Box,{as:"td",color:c,className:(0,r.classes)(["LabeledList__cell","LabeledList__label"]),children:n?n+":":null}),(0,o.createComponentVNode)(2,i.Box,{as:"td",color:l,textAlign:d,className:(0,r.classes)(["LabeledList__cell","LabeledList__content"]),colSpan:u?undefined:2,children:[s,p]}),u&&(0,o.createVNode)(1,"td","LabeledList__cell LabeledList__buttons",u,0)],0)};t.LabeledListItem=l,l.defaultHooks=r.pureComponentHooks;var d=function(e){var t=e.size?(0,i.unit)(Math.max(0,e.size-1)):0;return(0,o.createVNode)(1,"tr","LabeledList__row",(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,a.Divider),2,{colSpan:3,style:{"padding-top":t,"padding-bottom":t}}),2)};t.LabeledListDivider=d,d.defaultHooks=r.pureComponentHooks,c.Item=l,c.Divider=d},function(e,t,n){"use strict";t.__esModule=!0,t.Window=void 0;var o=n(0),r=n(6),i=n(19),a=n(1),c=n(3),l=n(34),d=n(121),u=n(169),s=n(44),p=n(170),m=n(122);var f=(0,s.createLogger)("Window"),h=[400,600],C=function(e){var t,n;function c(){return e.apply(this,arguments)||this}n=e,(t=c).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var s=c.prototype;return s.componentDidMount=function(){var e=(0,a.useBackend)(this.context),t=e.config;if(!e.suspended){f.log("mounting");var n=Object.assign({size:h},t.window);this.props.width&&this.props.height&&(n.size=[this.props.width,this.props.height]),(0,u.setWindowKey)(t.window.key),(0,u.recallWindowGeometry)(t.window.key,n),(0,m.refocusLayout)()}},s.render=function(){var e,t=this.props,n=t.resizable,c=t.theme,s=t.title,h=t.children,C=(0,a.useBackend)(this.context),g=C.config,N=C.suspended,v=(0,d.useDebug)(this.context).debugLayout,V=(0,p.useDispatch)(this.context),y=null==(e=g.window)?void 0:e.fancy,k=g.user.observer?g.status<l.UI_DISABLED:g.status<l.UI_INTERACTIVE;return(0,o.createComponentVNode)(2,m.Layout,{className:"Window",theme:c,children:[(0,o.createComponentVNode)(2,b,{className:"Window__titleBar",title:!N&&(s||(0,i.decodeHtmlEntities)(g.title)),status:g.status,fancy:y,onDragStart:u.dragStartHandler,onClose:function(){f.log("pressed close"),V((0,a.backendSuspendStart)())}}),(0,o.createVNode)(1,"div",(0,r.classes)(["Window__rest",v&&"debug-layout"]),[!N&&h,k&&(0,o.createVNode)(1,"div","Window__dimmer")],0),y&&n&&(0,o.createFragment)([(0,o.createVNode)(1,"div","Window__resizeHandle__e",null,1,{onMousedown:(0,u.resizeStartHandler)(1,0)}),(0,o.createVNode)(1,"div","Window__resizeHandle__s",null,1,{onMousedown:(0,u.resizeStartHandler)(0,1)}),(0,o.createVNode)(1,"div","Window__resizeHandle__se",null,1,{onMousedown:(0,u.resizeStartHandler)(1,1)})],4)]})},c}(o.Component);t.Window=C;C.Content=function(e){var t=e.className,n=e.fitted,i=e.children,a=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,["className","fitted","children"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,m.Layout.Content,Object.assign({className:(0,r.classes)(["Window__content",t])},a,{children:n&&i||(0,o.createVNode)(1,"div","Window__contentPadding",i,0)})))};var g=function(e){switch(e){case l.UI_INTERACTIVE:return"good";case l.UI_UPDATE:return"average";case l.UI_DISABLED:default:return"bad"}},b=function(e,t){var n=e.className,a=e.title,l=e.status,d=e.fancy,u=e.onDragStart,s=e.onClose;(0,p.useDispatch)(t);return(0,o.createVNode)(1,"div",(0,r.classes)(["TitleBar",n]),[(0,o.createComponentVNode)(2,c.Icon,{className:"TitleBar__statusIcon",color:g(l),name:"eye"}),(0,o.createVNode)(1,"div","TitleBar__title","string"==typeof a&&a===a.toLowerCase()&&(0,i.toTitleCase)(a)||a,0),(0,o.createVNode)(1,"div","TitleBar__dragZone",null,1,{onMousedown:function(e){return d&&u(e)}}),!1,!!d&&(0,o.createVNode)(1,"div","TitleBar__close TitleBar__clickable",Byond.IS_LTE_IE8?"x":"\xd7",0,{onclick:s})],0)}},function(e,t,n){"use strict";t.__esModule=!0,t.AiRestorerContent=t.AiRestorer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.AiRestorer=function(){return(0,o.createComponentVNode)(2,a.Window,{width:370,height:360,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.AI_present,d=c.error,u=c.name,s=c.laws,p=c.isDead,m=c.restoring,f=c.health,h=c.ejectable;return(0,o.createFragment)([d&&(0,o.createComponentVNode)(2,i.NoticeBox,{textAlign:"center",children:d}),!!h&&(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"eject",content:l?u:"----------",disabled:!l,onClick:function(){return a("PRG_eject")}}),!!l&&(0,o.createComponentVNode)(2,i.Section,{title:h?"System Status":u,buttons:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,color:p?"bad":"good",children:p?"Nonfunctional":"Functional"}),children:[(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Integrity",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:f,minValue:0,maxValue:100,ranges:{good:[70,Infinity],average:[50,70],bad:[-Infinity,50]}})})}),!!m&&(0,o.createComponentVNode)(2,i.Box,{bold:!0,textAlign:"center",fontSize:"20px",color:"good",mt:1,children:"RECONSTRUCTION IN PROGRESS"}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"plus",content:"Begin Reconstruction",disabled:m,mt:1,onClick:function(){return a("PRG_beginReconstruction")}}),(0,o.createComponentVNode)(2,i.Section,{title:"Laws",level:2,children:s.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{className:"candystripe",children:e},e)}))})]})],0)};t.AiRestorerContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.AccessList=void 0;var o=n(0),r=n(15),i=n(1),a=n(3);function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return l(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return l(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}var d={0:{icon:"times-circle",color:"bad"},1:{icon:"stop-circle",color:null},2:{icon:"check-circle",color:"good"}};t.AccessList=function(e,t){var n,l=e.accesses,u=void 0===l?[]:l,s=e.selectedList,p=void 0===s?[]:s,m=e.accessMod,f=e.grantAll,h=e.denyAll,C=e.grantDep,g=e.denyDep,b=(0,i.useLocalState)(t,"accessName",null==(n=u[0])?void 0:n.name),N=b[0],v=b[1],V=u.find((function(e){return e.name===N})),y=(0,r.sortBy)((function(e){return e.desc}))((null==V?void 0:V.accesses)||[]),k=function(e){for(var t,n=!1,o=!1,r=c(e);!(t=r()).done;){var i=t.value;p.includes(i.ref)?n=!0:o=!0}return!n&&o?0:n&&o?1:2};return(0,o.createComponentVNode)(2,a.Section,{title:"Access",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"check-double",content:"Grant All",color:"good",onClick:function(){return f()}}),(0,o.createComponentVNode)(2,a.Button,{icon:"undo",content:"Deny All",color:"bad",onClick:function(){return h()}})],4),children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Tabs,{vertical:!0,children:u.map((function(e){var t=e.accesses||[],n=d[k(t)].icon,r=d[k(t)].color;return(0,o.createComponentVNode)(2,a.Tabs.Tab,{altSelection:!0,color:r,icon:n,selected:e.name===N,onClick:function(){return v(e.name)},children:e.name},e.name)}))})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:[(0,o.createComponentVNode)(2,a.Grid,{children:[(0,o.createComponentVNode)(2,a.Grid.Column,{mr:0,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,icon:"check",content:"Grant Region",color:"good",onClick:function(){return C(V.regid)}})}),(0,o.createComponentVNode)(2,a.Grid.Column,{ml:0,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,icon:"times",content:"Deny Region",color:"bad",onClick:function(){return g(V.regid)}})})]}),y.map((function(e){return(0,o.createComponentVNode)(2,a.Button.Checkbox,{fluid:!0,content:e.desc,checked:p.includes(e.ref),onClick:function(){return m(e.ref)}},e.desc)}))]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.CargoCatalog=t.Cargo=void 0;var o=n(0),r=n(15),i=n(1),a=n(3),c=n(40),l=n(2);t.Cargo=function(e,t){var n=(0,i.useBackend)(t),r=(n.act,n.data),c=(0,i.useSharedState)(t,"tab","catalog"),p=c[0],f=c[1],h=r.requestonly,C=r.cart||[],g=r.requests||[];return(0,o.createComponentVNode)(2,l.Window,{width:780,height:750,resizable:!0,children:(0,o.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,d),(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"list",selected:"catalog"===p,onClick:function(){return f("catalog")},children:"Catalog"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"envelope",textColor:"requests"!==p&&g.length>0&&"yellow",selected:"requests"===p,onClick:function(){return f("requests")},children:["Requests (",g.length,")"]}),!h&&(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"shopping-cart",textColor:"cart"!==p&&C.length>0&&"yellow",selected:"cart"===p,onClick:function(){return f("cart")},children:["Checkout (",C.length,")"]})]}),"catalog"===p&&(0,o.createComponentVNode)(2,u),"requests"===p&&(0,o.createComponentVNode)(2,s),"cart"===p&&(0,o.createComponentVNode)(2,m)]})})};var d=function(e,t){var n=(0,i.useBackend)(t),r=n.act,l=n.data,d=l.away,u=l.docked,s=l.loan,p=l.loan_dispatched,m=l.location,f=l.message,h=l.points,C=l.requestonly;return(0,o.createComponentVNode)(2,a.Section,{title:"Cargo",buttons:(0,o.createComponentVNode)(2,a.Box,{inline:!0,bold:!0,children:[(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:h,format:function(e){return(0,c.formatMoney)(e)}})," credits"]}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Shuttle",children:u&&!C&&(0,o.createComponentVNode)(2,a.Button,{content:m,onClick:function(){return r("send")}})||m}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"CentCom Message",children:f}),!!s&&!C&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Loan",children:!p&&(0,o.createComponentVNode)(2,a.Button,{content:"Loan Shuttle",disabled:!(d&&u),onClick:function(){return r("loan")}})||(0,o.createComponentVNode)(2,a.Box,{color:"bad",children:"Loaned to Centcom"})})]})})},u=function(e,t){var n,l=e.express,d=(0,i.useBackend)(t),u=d.act,s=d.data,m=s.self_paid,f=(0,r.toArray)(s.supplies),h=(0,i.useSharedState)(t,"supply",null==(n=f[0])?void 0:n.name),C=h[0],g=h[1],b=f.find((function(e){return e.name===C}));return(0,o.createComponentVNode)(2,a.Section,{title:"Catalog",buttons:!l&&(0,o.createFragment)([(0,o.createComponentVNode)(2,p),(0,o.createComponentVNode)(2,a.Button.Checkbox,{ml:2,content:"Buy Privately",checked:m,onClick:function(){return u("toggleprivate")}})],4),children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Tabs,{vertical:!0,children:f.map((function(e){return(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:e.name===C,onClick:function(){return g(e.name)},children:[e.name," (",e.packs.length,")"]},e.name)}))})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,a.Table,{children:null==b?void 0:b.packs.map((function(e){var t=[];return e.small_item&&t.push("Small"),e.access&&t.push("Restricted"),(0,o.createComponentVNode)(2,a.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.name}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,color:"label",textAlign:"right",children:t.join(", ")}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,tooltip:e.desc,tooltipPosition:"left",onClick:function(){return u("add",{id:e.id})},children:[(0,c.formatMoney)(m&&!e.goody?Math.round(1.1*e.cost):e.cost)," cr"]})})]},e.name)}))})})]})})};t.CargoCatalog=u;var s=function(e,t){var n=(0,i.useBackend)(t),r=n.act,l=n.data,d=l.requestonly,u=l.requests||[];return(0,o.createComponentVNode)(2,a.Section,{title:"Active Requests",buttons:!d&&(0,o.createComponentVNode)(2,a.Button,{icon:"times",content:"Clear",color:"transparent",onClick:function(){return r("denyall")}}),children:[0===u.length&&(0,o.createComponentVNode)(2,a.Box,{color:"good",children:"No Requests"}),u.length>0&&(0,o.createComponentVNode)(2,a.Table,{children:u.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,color:"label",children:["#",e.id]}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.object}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createVNode)(1,"b",null,e.orderer,0)}),(0,o.createComponentVNode)(2,a.Table.Cell,{width:"25%",children:(0,o.createVNode)(1,"i",null,e.reason,0)}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:[(0,c.formatMoney)(e.cost)," cr"]}),!d&&(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,children:[(0,o.createComponentVNode)(2,a.Button,{icon:"check",color:"good",onClick:function(){return r("approve",{id:e.id})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"times",color:"bad",onClick:function(){return r("deny",{id:e.id})}})]})]},e.id)}))})]})},p=function(e,t){var n=(0,i.useBackend)(t),r=n.act,l=n.data,d=l.requestonly,u=l.cart||[],s=u.reduce((function(e,t){return e+t.cost}),0);return d?null:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{inline:!0,mx:1,children:[0===u.length&&"Cart is empty",1===u.length&&"1 item",u.length>=2&&u.length+" items"," ",s>0&&"("+(0,c.formatMoney)(s)+" cr)"]}),(0,o.createComponentVNode)(2,a.Button,{icon:"times",color:"transparent",content:"Clear",onClick:function(){return r("clear")}})],4)},m=function(e,t){var n=(0,i.useBackend)(t),r=n.act,l=n.data,d=l.requestonly,u=l.away,s=l.docked,m=l.location,f=l.cart||[];return(0,o.createComponentVNode)(2,a.Section,{title:"Current Cart",buttons:(0,o.createComponentVNode)(2,p),children:[0===f.length&&(0,o.createComponentVNode)(2,a.Box,{color:"label",children:"Nothing in cart"}),f.length>0&&(0,o.createComponentVNode)(2,a.Table,{children:f.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,color:"label",children:["#",e.id]}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.object}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,children:!!e.paid&&(0,o.createVNode)(1,"b",null,"[Paid Privately]",16)}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:[(0,c.formatMoney)(e.cost)," cr"]}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,children:(0,o.createComponentVNode)(2,a.Button,{icon:"minus",onClick:function(){return r("remove",{id:e.id})}})})]},e.id)}))}),f.length>0&&!d&&(0,o.createComponentVNode)(2,a.Box,{mt:2,children:1===u&&1===s&&(0,o.createComponentVNode)(2,a.Button,{color:"green",style:{"line-height":"28px",padding:"0 12px"},content:"Confirm the order",onClick:function(){return r("send")}})||(0,o.createComponentVNode)(2,a.Box,{opacity:.5,children:["Shuttle in ",m,"."]})})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.BeakerContents=void 0;var o=n(0),r=n(3);t.BeakerContents=function(e){var t=e.beakerLoaded,n=e.beakerContents;return(0,o.createComponentVNode)(2,r.Box,{children:[!t&&(0,o.createComponentVNode)(2,r.Box,{color:"label",children:"No beaker loaded."})||0===n.length&&(0,o.createComponentVNode)(2,r.Box,{color:"label",children:"Beaker is empty."}),n.map((function(e){return(0,o.createComponentVNode)(2,r.Box,{color:"label",children:[e.volume," units of ",e.name]},e.name)}))]})}},function(e,t,n){"use strict";t.__esModule=!0,t.LaunchpadConsole=t.LaunchpadControl=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=function(e,t){var n=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,i.Grid,{width:"1px",children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:[(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-left",iconRotation:45,mb:1,onClick:function(){return n("move_pos",{x:-1,y:1})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-left",mb:1,onClick:function(){return n("move_pos",{x:-1})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-down",iconRotation:45,mb:1,onClick:function(){return n("move_pos",{x:-1,y:-1})}})]}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:[(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-up",mb:1,onClick:function(){return n("move_pos",{y:1})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"R",mb:1,onClick:function(){return n("set_pos",{x:0,y:0})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-down",mb:1,onClick:function(){return n("move_pos",{y:-1})}})]}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:[(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-up",iconRotation:45,mb:1,onClick:function(){return n("move_pos",{x:1,y:1})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-right",mb:1,onClick:function(){return n("move_pos",{x:1})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"arrow-right",iconRotation:45,mb:1,onClick:function(){return n("move_pos",{x:1,y:-1})}})]})]})},l=function(e,t){var n=e.topLevel,a=(0,r.useBackend)(t),l=a.act,d=a.data,u=d.x,s=d.y,p=d.pad_name,m=d.range;return(0,o.createComponentVNode)(2,i.Section,{title:(0,o.createComponentVNode)(2,i.Input,{value:p,width:"170px",onChange:function(e,t){return l("rename",{name:t})}}),level:n?1:2,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"times",content:"Remove",color:"bad",onClick:function(){return l("remove")}}),children:[(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Controls",level:2,children:(0,o.createComponentVNode)(2,c)})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Target",level:2,children:(0,o.createComponentVNode)(2,i.Box,{fontSize:"26px",children:[(0,o.createComponentVNode)(2,i.Box,{mb:1,children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,mr:1,children:"X:"}),(0,o.createComponentVNode)(2,i.NumberInput,{value:u,minValue:-m,maxValue:m,lineHeight:"30px",fontSize:"26px",width:"90px",height:"30px",stepPixelSize:10,onChange:function(e,t){return l("set_pos",{x:t})}})]}),(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,mr:1,children:"Y:"}),(0,o.createComponentVNode)(2,i.NumberInput,{value:s,minValue:-m,maxValue:m,stepPixelSize:10,lineHeight:"30px",fontSize:"26px",width:"90px",height:"30px",onChange:function(e,t){return l("set_pos",{y:t})}})]})]})})})]}),(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"upload",content:"Launch",textAlign:"center",onClick:function(){return l("launch")}})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"download",content:"Pull",textAlign:"center",onClick:function(){return l("pull")}})})]})]})};t.LaunchpadControl=l;t.LaunchpadConsole=function(e,t){var n=(0,r.useBackend)(t),c=n.act,d=n.data,u=d.launchpads,s=void 0===u?[]:u,p=d.selected_id;return(0,o.createComponentVNode)(2,a.Window,{width:475,height:260,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:0===s.length&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No Pads Connected"})||(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Flex,{minHeight:"190px",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{width:"140px",minHeight:"190px",children:s.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{fluid:!0,ellipsis:!0,content:e.name,selected:p===e.id,color:"transparent",onClick:function(){return c("select_pad",{id:e.id})}},e.name)}))}),(0,o.createComponentVNode)(2,i.Flex.Item,{minHeight:"100%",children:(0,o.createComponentVNode)(2,i.Divider,{vertical:!0})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,minHeight:"100%",children:p&&(0,o.createComponentVNode)(2,l)||(0,o.createComponentVNode)(2,i.Box,{children:"Please select a pad"})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosCyborgRemoteMonitorContent=t.NtosCyborgRemoteMonitor=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosCyborgRemoteMonitor=function(e,t){return(0,o.createComponentVNode)(2,a.NtosWindow,{width:600,height:800,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.card,d=c.cyborgs,u=void 0===d?[]:d;return u.length?(0,o.createFragment)([!l&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Certain features require an ID card login."}),u.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"terminal",content:"Send Message",color:"blue",disabled:!l,onClick:function(){return a("messagebot",{ref:e.ref})}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:(0,o.createComponentVNode)(2,i.Box,{color:e.status?"bad":e.locked_down?"average":"good",children:e.status?"Not Responding":e.locked_down?"Locked Down":e.shell_discon?"Nominal/Disconnected":"Nominal"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Charge",children:(0,o.createComponentVNode)(2,i.Box,{color:e.charge<=30?"bad":e.charge<=70?"average":"good",children:"number"==typeof e.charge?e.charge+"%":"Not Found"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Module",children:e.module}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Upgrades",children:e.upgrades})]})},e.ref)}))],0):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No cyborg units detected."})};t.NtosCyborgRemoteMonitorContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.NtosRadarContent=t.NtosRadar=void 0;var o=n(0),r=n(6),i=n(60),a=n(1),c=n(3),l=n(2);t.NtosRadar=function(e,t){return(0,o.createComponentVNode)(2,l.NtosWindow,{width:800,height:600,theme:"ntos",children:(0,o.createComponentVNode)(2,d)})};var d=function(e,t){var n=(0,a.useBackend)(t),d=n.act,u=n.data,s=u.selected,p=u.object,m=void 0===p?[]:p,f=u.target,h=void 0===f?[]:f,C=u.scanning;return(0,o.createComponentVNode)(2,c.Flex,{direction:"row",hight:"100%",children:[(0,o.createComponentVNode)(2,c.Flex.Item,{position:"relative",width:20.5,hight:"100%",children:(0,o.createComponentVNode)(2,l.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c.Section,{children:[(0,o.createComponentVNode)(2,c.Button,{icon:"redo-alt",content:C?"Scanning...":"Scan",color:"blue",disabled:C,onClick:function(){return d("scan")}}),!m.length&&!C&&(0,o.createVNode)(1,"div",null,"No trackable signals found",16),!C&&m.map((function(e){return(0,o.createVNode)(1,"div",(0,r.classes)(["Button","Button--fluid","Button--color--transparent","Button--ellipsis",e.ref===s&&"Button--selected"]),e.name,0,{title:e.name,onClick:function(){d("selecttarget",{ref:e.ref})}},e.dev)}))]})})}),(0,o.createComponentVNode)(2,c.Flex.Item,{style:{"background-image":'url("'+(0,i.resolveAsset)("ntosradarbackground.png")+'")',"background-position":"center","background-repeat":"no-repeat",top:"20px"},position:"relative",m:1.5,width:45,height:45,children:0===Object.keys(h).length?!!s&&(0,o.createComponentVNode)(2,c.NoticeBox,{position:"absolute",top:20.6,left:1.35,width:42,fontSize:"30px",textAlign:"center",children:"Signal Lost"}):!!h.userot&&(0,o.createComponentVNode)(2,c.Box,{as:"img",src:(0,i.resolveAsset)(h.arrowstyle),position:"absolute",top:"20px",left:"243px",style:{transform:"rotate("+h.rot+"deg)"}})||(0,o.createComponentVNode)(2,c.Icon,{name:h.pointer,position:"absolute",size:2,color:h.color,top:10*h.locy+19+"px",left:10*h.locx+16+"px"})})]})};t.NtosRadarContent=d},function(e,t,n){"use strict";t.__esModule=!0,t.RequestKioskContent=t.RequestKiosk=void 0;var o=n(0),r=n(1),i=n(3),a=n(40),c=n(2);t.RequestKiosk=function(e,t){return(0,o.createComponentVNode)(2,c.Window,{width:550,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,l)})})};var l=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.accountName,u=l.requests,s=void 0===u?[]:u,p=l.applicants,m=void 0===p?[]:p,f=l.bountyValue;l.bountyText;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Account",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",content:"Log out",onClick:function(){return c("clear")}}),children:d||"N/A"})})}),(0,o.createComponentVNode)(2,i.Flex,{mb:1,children:[(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:null==s?void 0:s.map((function(e){return(0,o.createComponentVNode)(2,i.Collapsible,{title:e.owner,width:"300px",children:(0,o.createComponentVNode)(2,i.Section,{width:"300px",children:[(0,o.createComponentVNode)(2,i.Flex,{spacing:1,align:"baseline",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{bold:!0,width:"310px",children:e.owner}),(0,o.createComponentVNode)(2,i.Flex.Item,{width:"100px",children:(0,a.formatMoney)(e.value)+" cr"}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"pen-fancy",content:"Apply",onClick:function(){return c("apply",{request:e.acc_number})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"trash-alt",content:"Delete",color:"red",onClick:function(){return c("deleteRequest",{request:e.acc_number})}})]})]}),(0,o.createComponentVNode)(2,i.Section,{align:"center",children:(0,o.createVNode)(1,"i",null,[(0,o.createTextVNode)('"'),e.description,(0,o.createTextVNode)('"')],0)}),(0,o.createComponentVNode)(2,i.Section,{title:"Request Applicants",children:null==m?void 0:m.map((function(t){return t.request_id===e.acc_number&&(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,p:.5,backgroundColor:"rgba(0, 0, 69, 0.5)",width:"510px",style:{border:"2px solid rgba(13, 13, 213, 0.7)"},children:t.name}),(0,o.createComponentVNode)(2,i.Flex.Item,{align:"end",children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"cash-register",onClick:function(){return c("payApplicant",{applicant:t.requestee_id,request:e.acc_number})}})})]})}))})]},e.name)},e.name)}))}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Collapsible,{title:"New Bounty",width:"220px",color:"green",children:(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.TextArea,{fluid:!0,height:"250px",width:"200px",backgroundColor:"black",textColor:"white",onChange:function(e,t){return c("bountyText",{bountytext:t})}}),(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.NumberInput,{animate:!0,unit:"cr",minValue:1,maxValue:1e3,value:f,width:"80px",onChange:function(e,t){return c("bountyVal",{bountyval:t})}})}),(0,o.createComponentVNode)(2,i.Button,{icon:"print",content:"Submit bounty",onClick:function(){return c("createBounty")}})]})})})]})],4)};t.RequestKioskContent=l},function(e,t,n){"use strict";t.__esModule=!0,t.StationAlertConsoleContent=t.StationAlertConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.StationAlertConsole=function(){return(0,o.createComponentVNode)(2,a.Window,{width:325,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t).data.alarms||[],a=n.Fire||[],c=n.Atmosphere||[],l=n.Power||[];return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Fire Alarms",children:(0,o.createVNode)(1,"ul",null,[0===a.length&&(0,o.createVNode)(1,"li","color-good","Systems Nominal",16),a.map((function(e){return(0,o.createVNode)(1,"li","color-average",e,0,null,e)}))],0)}),(0,o.createComponentVNode)(2,i.Section,{title:"Atmospherics Alarms",children:(0,o.createVNode)(1,"ul",null,[0===c.length&&(0,o.createVNode)(1,"li","color-good","Systems Nominal",16),c.map((function(e){return(0,o.createVNode)(1,"li","color-average",e,0,null,e)}))],0)}),(0,o.createComponentVNode)(2,i.Section,{title:"Power Alarms",children:(0,o.createVNode)(1,"ul",null,[0===l.length&&(0,o.createVNode)(1,"li","color-good","Systems Nominal",16),l.map((function(e){return(0,o.createVNode)(1,"li","color-average",e,0,null,e)}))],0)})],4)};t.StationAlertConsoleContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.PortableBasicInfo=void 0;var o=n(0),r=n(1),i=n(3);t.PortableBasicInfo=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.connected,d=c.holding,u=c.on,s=c.pressure;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Status",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u?"power-off":"times",content:u?"On":"Off",selected:u,onClick:function(){return a("power")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Pressure",children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:s})," kPa"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Port",color:l?"good":"average",children:l?"Connected":"Not Connected"})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Holding Tank",minHeight:"82px",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",disabled:!d,onClick:function(){return a("eject")}}),children:d?(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Label",children:d.name}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Pressure",children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:d.pressure})," kPa"]})]}):(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"No holding tank"})})],4)}},function(e,t,n){e.exports=n(188)},function(e,t,n){"use strict";n(189),n(190),n(191),n(192),n(193),n(194),n(195),n(196),n(197),n(198),n(199),n(200),n(201),n(202),n(203),n(204),n(205),n(206),n(207),n(208),n(209),n(210),n(211),n(212),n(214),n(216),n(217),n(218),n(145),n(220),n(221),n(222),n(223),n(224),n(225),n(226),n(227),n(228),n(229),n(230),n(231),n(232),n(233),n(235),n(236),n(237),n(238),n(239),n(241),n(242),n(244),n(245),n(246),n(247),n(248),n(249),n(250),n(251),n(252),n(253),n(254),n(255),n(256),n(257),n(259),n(260),n(261),n(262),n(263),n(264),n(265),n(266),n(267),n(268),n(269),n(270),n(271),n(273),n(274),n(275),n(276),n(277),n(278),n(280),n(281),n(283),n(285),n(286),n(287),n(288),n(289),n(290),n(291),n(292),n(293),n(294),n(295),n(296),n(297),n(298),n(299),n(300),n(301),n(302),n(303),n(304),n(305),n(306),n(307),n(309),n(310),n(311),n(314),n(315),n(316),n(317),n(318),n(319),n(320),n(321),n(322),n(323),n(324),n(325),n(326),n(327),n(328),n(162),n(329),n(330),n(331),n(332),n(333),n(334),n(335),n(336),n(337),n(338),n(339),n(340),n(341),n(342),n(343),n(344),n(345),n(346),n(347),n(348),n(349),n(350),n(351),n(352),n(353),n(354),n(355),n(356),n(357),n(358),n(359),n(360),n(361),n(362),n(364),n(365),n(366),n(367),n(368),n(369),n(370),n(371),n(372),n(373),n(374),n(375),n(376),n(377),n(378),n(379),n(380),n(381),n(382),n(383),n(384),n(385),n(386),n(387),n(388),n(389),n(390),n(391),n(392),n(393),n(394),n(395),n(396),n(397),n(398),n(399),n(400),n(401);var o=n(0);n(403),n(404),n(405),n(406),n(407),n(408),n(409),n(410),n(411),n(412),n(413),n(414),n(415),n(416),n(417);var r=n(167),i=(n(168),n(1)),a=n(169),c=n(44),l=n(170);r.perf.mark("inception",window.__inception__),r.perf.mark("init");var d,u=(0,l.createStore)(),s=!0,p=function(){for(u.subscribe((function(){!function(){r.perf.mark("render/start");var e=u.getState(),t=(0,i.selectBackend)(e),p=t.suspended;t.assets;s&&(c.logger.log("initial render",e),"recycled"!==s&&(0,a.setupDrag)());var m=(0,n(424).getRoutedComponent)(e),f=(0,o.createComponentVNode)(2,l.StoreProvider,{store:u,children:(0,o.createComponentVNode)(2,m)});d||(d=document.getElementById("react-root")),(0,o.render)(f,d),p||(r.perf.mark("render/finish"),s&&(s=!1))}()})),window.update=function(e){var t=(0,i.selectBackend)(u.getState()).suspended,n="string"==typeof e?function(e){var t=function(e,t){return"object"==typeof t&&null!==t&&t.__number__?parseFloat(t.__number__):t};Byond.IS_LTE_IE8&&(t=undefined);try{return JSON.parse(e,t)}catch(o){c.logger.log(o),c.logger.log("What we got:",e);var n=o&&o.message;throw new Error("JSON parsing error: "+n)}}(e):e;c.logger.debug("received message '"+(null==n?void 0:n.type)+"'");var o=n.type,r=n.payload;if("update"===o)return t&&(c.logger.log("resuming"),s="recycled"),void u.dispatch((0,i.backendUpdate)(r));"suspend"!==o?"ping"!==o?u.dispatch(n):(0,i.sendMessage)({type:"pingReply"}):u.dispatch((0,i.backendSuspendSuccess)())};;){var e=window.__updateQueue__.shift();if(!e)break;window.update(e)}};window.__logger__={fatal:function(e,t){var n=(0,i.selectBackend)(u.getState()),o={config:n.config,suspended:n.suspended,suspending:n.suspending};return c.logger.log("FatalError:",e||t),c.logger.log("State:",o),t+="\nState: "+JSON.stringify(o)}},"loading"===document.readyState?document.addEventListener("DOMContentLoaded",p):p()},function(e,t,n){"use strict";var o=n(4),r=n(7),i=n(39),a=n(41),c=n(9),l=n(99),d=n(137),u=n(5),s=n(20),p=n(56),m=n(8),f=n(10),h=n(18),C=n(26),g=n(36),b=n(50),N=n(46),v=n(67),V=n(51),y=n(140),k=n(98),x=n(22),_=n(14),w=n(75),B=n(31),S=n(24),L=n(95),I=n(76),T=n(64),A=n(63),E=n(13),M=n(141),P=n(27),R=n(47),O=n(37),F=n(21).forEach,j=I("hidden"),D=E("toPrimitive"),z=O.set,W=O.getterFor("Symbol"),H=Object.prototype,U=r.Symbol,G=i("JSON","stringify"),K=x.f,q=_.f,Y=y.f,$=w.f,X=L("symbols"),Q=L("op-symbols"),J=L("string-to-symbol-registry"),Z=L("symbol-to-string-registry"),ee=L("wks"),te=r.QObject,ne=!te||!te.prototype||!te.prototype.findChild,oe=c&&u((function(){return 7!=N(q({},"a",{get:function(){return q(this,"a",{value:7}).a}})).a}))?function(e,t,n){var o=K(H,t);o&&delete H[t],q(e,t,n),o&&e!==H&&q(H,t,o)}:q,re=function(e,t){var n=X[e]=N(U.prototype);return z(n,{type:"Symbol",tag:e,description:t}),c||(n.description=t),n},ie=d?function(e){return"symbol"==typeof e}:function(e){return Object(e)instanceof U},ae=function(e,t,n){e===H&&ae(Q,t,n),f(e);var o=g(t,!0);return f(n),s(X,o)?(n.enumerable?(s(e,j)&&e[j][o]&&(e[j][o]=!1),n=N(n,{enumerable:b(0,!1)})):(s(e,j)||q(e,j,b(1,{})),e[j][o]=!0),oe(e,o,n)):q(e,o,n)},ce=function(e,t){f(e);var n=C(t),o=v(n).concat(pe(n));return F(o,(function(t){c&&!de.call(n,t)||ae(e,t,n[t])})),e},le=function(e,t){return t===undefined?N(e):ce(N(e),t)},de=function(e){var t=g(e,!0),n=$.call(this,t);return!(this===H&&s(X,t)&&!s(Q,t))&&(!(n||!s(this,t)||!s(X,t)||s(this,j)&&this[j][t])||n)},ue=function(e,t){var n=C(e),o=g(t,!0);if(n!==H||!s(X,o)||s(Q,o)){var r=K(n,o);return!r||!s(X,o)||s(n,j)&&n[j][o]||(r.enumerable=!0),r}},se=function(e){var t=Y(C(e)),n=[];return F(t,(function(e){s(X,e)||s(T,e)||n.push(e)})),n},pe=function(e){var t=e===H,n=Y(t?Q:C(e)),o=[];return F(n,(function(e){!s(X,e)||t&&!s(H,e)||o.push(X[e])})),o};(l||(S((U=function(){if(this instanceof U)throw TypeError("Symbol is not a constructor");var e=arguments.length&&arguments[0]!==undefined?String(arguments[0]):undefined,t=A(e),n=function o(e){this===H&&o.call(Q,e),s(this,j)&&s(this[j],t)&&(this[j][t]=!1),oe(this,t,b(1,e))};return c&&ne&&oe(H,t,{configurable:!0,set:n}),re(t,e)}).prototype,"toString",(function(){return W(this).tag})),S(U,"withoutSetter",(function(e){return re(A(e),e)})),w.f=de,_.f=ae,x.f=ue,V.f=y.f=se,k.f=pe,M.f=function(e){return re(E(e),e)},c&&(q(U.prototype,"description",{configurable:!0,get:function(){return W(this).description}}),a||S(H,"propertyIsEnumerable",de,{unsafe:!0}))),o({global:!0,wrap:!0,forced:!l,sham:!l},{Symbol:U}),F(v(ee),(function(e){P(e)})),o({target:"Symbol",stat:!0,forced:!l},{"for":function(e){var t=String(e);if(s(J,t))return J[t];var n=U(t);return J[t]=n,Z[n]=t,n},keyFor:function(e){if(!ie(e))throw TypeError(e+" is not a symbol");if(s(Z,e))return Z[e]},useSetter:function(){ne=!0},useSimple:function(){ne=!1}}),o({target:"Object",stat:!0,forced:!l,sham:!c},{create:le,defineProperty:ae,defineProperties:ce,getOwnPropertyDescriptor:ue}),o({target:"Object",stat:!0,forced:!l},{getOwnPropertyNames:se,getOwnPropertySymbols:pe}),o({target:"Object",stat:!0,forced:u((function(){k.f(1)}))},{getOwnPropertySymbols:function(e){return k.f(h(e))}}),G)&&o({target:"JSON",stat:!0,forced:!l||u((function(){var e=U();return"[null]"!=G([e])||"{}"!=G({a:e})||"{}"!=G(Object(e))}))},{stringify:function(e,t,n){for(var o,r=[e],i=1;arguments.length>i;)r.push(arguments[i++]);if(o=t,(m(t)||e!==undefined)&&!ie(e))return p(t)||(t=function(e,t){if("function"==typeof o&&(t=o.call(this,e,t)),!ie(t))return t}),r[1]=t,G.apply(null,r)}});U.prototype[D]||B(U.prototype,D,U.prototype.valueOf),R(U,"Symbol"),T[j]=!0},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(7),a=n(20),c=n(8),l=n(14).f,d=n(134),u=i.Symbol;if(r&&"function"==typeof u&&(!("description"in u.prototype)||u().description!==undefined)){var s={},p=function(){var e=arguments.length<1||arguments[0]===undefined?undefined:String(arguments[0]),t=this instanceof p?new u(e):e===undefined?u():u(e);return""===e&&(s[t]=!0),t};d(p,u);var m=p.prototype=u.prototype;m.constructor=p;var f=m.toString,h="Symbol(test)"==String(u("test")),C=/^Symbol\((.*)\)[^)]+$/;l(m,"description",{configurable:!0,get:function(){var e=c(this)?this.valueOf():this,t=f.call(e);if(a(s,e))return"";var n=h?t.slice(7,-1):t.replace(C,"$1");return""===n?undefined:n}}),o({global:!0,forced:!0},{Symbol:p})}},function(e,t,n){"use strict";n(27)("asyncIterator")},function(e,t,n){"use strict";n(27)("hasInstance")},function(e,t,n){"use strict";n(27)("isConcatSpreadable")},function(e,t,n){"use strict";n(27)("iterator")},function(e,t,n){"use strict";n(27)("match")},function(e,t,n){"use strict";n(27)("replace")},function(e,t,n){"use strict";n(27)("search")},function(e,t,n){"use strict";n(27)("species")},function(e,t,n){"use strict";n(27)("split")},function(e,t,n){"use strict";n(27)("toPrimitive")},function(e,t,n){"use strict";n(27)("toStringTag")},function(e,t,n){"use strict";n(27)("unscopables")},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(56),a=n(8),c=n(18),l=n(12),d=n(53),u=n(68),s=n(69),p=n(13),m=n(100),f=p("isConcatSpreadable"),h=m>=51||!r((function(){var e=[];return e[f]=!1,e.concat()[0]!==e})),C=s("concat"),g=function(e){if(!a(e))return!1;var t=e[f];return t!==undefined?!!t:i(e)};o({target:"Array",proto:!0,forced:!h||!C},{concat:function(e){var t,n,o,r,i,a=c(this),s=u(a,0),p=0;for(t=-1,o=arguments.length;t<o;t++)if(g(i=-1===t?a:arguments[t])){if(p+(r=l(i.length))>9007199254740991)throw TypeError("Maximum allowed index exceeded");for(n=0;n<r;n++,p++)n in i&&d(s,p,i[n])}else{if(p>=9007199254740991)throw TypeError("Maximum allowed index exceeded");d(s,p++,i)}return s.length=p,s}})},function(e,t,n){"use strict";var o=n(4),r=n(142),i=n(48);o({target:"Array",proto:!0},{copyWithin:r}),i("copyWithin")},function(e,t,n){"use strict";var o=n(4),r=n(21).every,i=n(42),a=n(25),c=i("every"),l=a("every");o({target:"Array",proto:!0,forced:!c||!l},{every:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(101),i=n(48);o({target:"Array",proto:!0},{fill:r}),i("fill")},function(e,t,n){"use strict";var o=n(4),r=n(21).filter,i=n(69),a=n(25),c=i("filter"),l=a("filter");o({target:"Array",proto:!0,forced:!c||!l},{filter:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(21).find,i=n(48),a=n(25),c=!0,l=a("find");"find"in[]&&Array(1).find((function(){c=!1})),o({target:"Array",proto:!0,forced:c||!l},{find:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}}),i("find")},function(e,t,n){"use strict";var o=n(4),r=n(21).findIndex,i=n(48),a=n(25),c=!0,l=a("findIndex");"findIndex"in[]&&Array(1).findIndex((function(){c=!1})),o({target:"Array",proto:!0,forced:c||!l},{findIndex:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}}),i("findIndex")},function(e,t,n){"use strict";var o=n(4),r=n(143),i=n(18),a=n(12),c=n(32),l=n(68);o({target:"Array",proto:!0},{flat:function(){var e=arguments.length?arguments[0]:undefined,t=i(this),n=a(t.length),o=l(t,0);return o.length=r(o,t,t,n,0,e===undefined?1:c(e)),o}})},function(e,t,n){"use strict";var o=n(4),r=n(143),i=n(18),a=n(12),c=n(33),l=n(68);o({target:"Array",proto:!0},{flatMap:function(e){var t,n=i(this),o=a(n.length);return c(e),(t=l(n,0)).length=r(t,n,n,o,0,1,e,arguments.length>1?arguments[1]:undefined),t}})},function(e,t,n){"use strict";var o=n(4),r=n(213);o({target:"Array",proto:!0,forced:[].forEach!=r},{forEach:r})},function(e,t,n){"use strict";var o=n(21).forEach,r=n(42),i=n(25),a=r("forEach"),c=i("forEach");e.exports=a&&c?[].forEach:function(e){return o(this,e,arguments.length>1?arguments[1]:undefined)}},function(e,t,n){"use strict";var o=n(4),r=n(215);o({target:"Array",stat:!0,forced:!n(79)((function(e){Array.from(e)}))},{from:r})},function(e,t,n){"use strict";var o=n(52),r=n(18),i=n(144),a=n(102),c=n(12),l=n(53),d=n(103);e.exports=function(e){var t,n,u,s,p,m,f=r(e),h="function"==typeof this?this:Array,C=arguments.length,g=C>1?arguments[1]:undefined,b=g!==undefined,N=d(f),v=0;if(b&&(g=o(g,C>2?arguments[2]:undefined,2)),N==undefined||h==Array&&a(N))for(n=new h(t=c(f.length));t>v;v++)m=b?g(f[v],v):f[v],l(n,v,m);else for(p=(s=N.call(f)).next,n=new h;!(u=p.call(s)).done;v++)m=b?i(s,g,[u.value,v],!0):u.value,l(n,v,m);return n.length=v,n}},function(e,t,n){"use strict";var o=n(4),r=n(65).includes,i=n(48);o({target:"Array",proto:!0,forced:!n(25)("indexOf",{ACCESSORS:!0,1:0})},{includes:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}}),i("includes")},function(e,t,n){"use strict";var o=n(4),r=n(65).indexOf,i=n(42),a=n(25),c=[].indexOf,l=!!c&&1/[1].indexOf(1,-0)<0,d=i("indexOf"),u=a("indexOf",{ACCESSORS:!0,1:0});o({target:"Array",proto:!0,forced:l||!d||!u},{indexOf:function(e){return l?c.apply(this,arguments)||0:r(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";n(4)({target:"Array",stat:!0},{isArray:n(56)})},function(e,t,n){"use strict";var o=n(146).IteratorPrototype,r=n(46),i=n(50),a=n(47),c=n(70),l=function(){return this};e.exports=function(e,t,n){var d=t+" Iterator";return e.prototype=r(o,{next:i(1,n)}),a(e,d,!1,!0),c[d]=l,e}},function(e,t,n){"use strict";var o=n(4),r=n(62),i=n(26),a=n(42),c=[].join,l=r!=Object,d=a("join",",");o({target:"Array",proto:!0,forced:l||!d},{join:function(e){return c.call(i(this),e===undefined?",":e)}})},function(e,t,n){"use strict";var o=n(4),r=n(148);o({target:"Array",proto:!0,forced:r!==[].lastIndexOf},{lastIndexOf:r})},function(e,t,n){"use strict";var o=n(4),r=n(21).map,i=n(69),a=n(25),c=i("map"),l=a("map");o({target:"Array",proto:!0,forced:!c||!l},{map:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(53);o({target:"Array",stat:!0,forced:r((function(){function e(){}return!(Array.of.call(e)instanceof e)}))},{of:function(){for(var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);t>e;)i(n,e,arguments[e++]);return n.length=t,n}})},function(e,t,n){"use strict";var o=n(4),r=n(80).left,i=n(42),a=n(25),c=i("reduce"),l=a("reduce",{1:0});o({target:"Array",proto:!0,forced:!c||!l},{reduce:function(e){return r(this,e,arguments.length,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(80).right,i=n(42),a=n(25),c=i("reduceRight"),l=a("reduce",{1:0});o({target:"Array",proto:!0,forced:!c||!l},{reduceRight:function(e){return r(this,e,arguments.length,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(8),i=n(56),a=n(45),c=n(12),l=n(26),d=n(53),u=n(13),s=n(69),p=n(25),m=s("slice"),f=p("slice",{ACCESSORS:!0,0:0,1:2}),h=u("species"),C=[].slice,g=Math.max;o({target:"Array",proto:!0,forced:!m||!f},{slice:function(e,t){var n,o,u,s=l(this),p=c(s.length),m=a(e,p),f=a(t===undefined?p:t,p);if(i(s)&&("function"!=typeof(n=s.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[h])&&(n=undefined):n=undefined,n===Array||n===undefined))return C.call(s,m,f);for(o=new(n===undefined?Array:n)(g(f-m,0)),u=0;m<f;m++,u++)m in s&&d(o,u,s[m]);return o.length=u,o}})},function(e,t,n){"use strict";var o=n(4),r=n(21).some,i=n(42),a=n(25),c=i("some"),l=a("some");o({target:"Array",proto:!0,forced:!c||!l},{some:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(33),i=n(18),a=n(5),c=n(42),l=[],d=l.sort,u=a((function(){l.sort(undefined)})),s=a((function(){l.sort(null)})),p=c("sort");o({target:"Array",proto:!0,forced:u||!s||!p},{sort:function(e){return e===undefined?d.call(i(this)):d.call(i(this),r(e))}})},function(e,t,n){"use strict";n(57)("Array")},function(e,t,n){"use strict";var o=n(4),r=n(45),i=n(32),a=n(12),c=n(18),l=n(68),d=n(53),u=n(69),s=n(25),p=u("splice"),m=s("splice",{ACCESSORS:!0,0:0,1:2}),f=Math.max,h=Math.min;o({target:"Array",proto:!0,forced:!p||!m},{splice:function(e,t){var n,o,u,s,p,m,C=c(this),g=a(C.length),b=r(e,g),N=arguments.length;if(0===N?n=o=0:1===N?(n=0,o=g-b):(n=N-2,o=h(f(i(t),0),g-b)),g+n-o>9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=l(C,o),s=0;s<o;s++)(p=b+s)in C&&d(u,s,C[p]);if(u.length=o,n<o){for(s=b;s<g-o;s++)m=s+n,(p=s+o)in C?C[m]=C[p]:delete C[m];for(s=g;s>g-o+n;s--)delete C[s-1]}else if(n>o)for(s=g-o;s>b;s--)m=s+n-1,(p=s+o-1)in C?C[m]=C[p]:delete C[m];for(s=0;s<n;s++)C[s+b]=arguments[s+2];return C.length=g-o+n,u}})},function(e,t,n){"use strict";n(48)("flat")},function(e,t,n){"use strict";n(48)("flatMap")},function(e,t,n){"use strict";var o=n(4),r=n(7),i=n(81),a=n(57),c=i.ArrayBuffer;o({global:!0,forced:r.ArrayBuffer!==c},{ArrayBuffer:c}),a("ArrayBuffer")},function(e,t,n){"use strict";var o=Math.abs,r=Math.pow,i=Math.floor,a=Math.log,c=Math.LN2;e.exports={pack:function(e,t,n){var l,d,u,s=new Array(n),p=8*n-t-1,m=(1<<p)-1,f=m>>1,h=23===t?r(2,-24)-r(2,-77):0,C=e<0||0===e&&1/e<0?1:0,g=0;for((e=o(e))!=e||e===1/0?(d=e!=e?1:0,l=m):(l=i(a(e)/c),e*(u=r(2,-l))<1&&(l--,u*=2),(e+=l+f>=1?h/u:h*r(2,1-f))*u>=2&&(l++,u/=2),l+f>=m?(d=0,l=m):l+f>=1?(d=(e*u-1)*r(2,t),l+=f):(d=e*r(2,f-1)*r(2,t),l=0));t>=8;s[g++]=255&d,d/=256,t-=8);for(l=l<<t|d,p+=t;p>0;s[g++]=255&l,l/=256,p-=8);return s[--g]|=128*C,s},unpack:function(e,t){var n,o=e.length,i=8*o-t-1,a=(1<<i)-1,c=a>>1,l=i-7,d=o-1,u=e[d--],s=127&u;for(u>>=7;l>0;s=256*s+e[d],d--,l-=8);for(n=s&(1<<-l)-1,s>>=-l,l+=t;l>0;n=256*n+e[d],d--,l-=8);if(0===s)s=1-c;else{if(s===a)return n?NaN:u?-1/0:1/0;n+=r(2,t),s-=c}return(u?-1:1)*n*r(2,s-t)}}},function(e,t,n){"use strict";var o=n(4),r=n(11);o({target:"ArrayBuffer",stat:!0,forced:!r.NATIVE_ARRAY_BUFFER_VIEWS},{isView:r.isView})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(81),a=n(10),c=n(45),l=n(12),d=n(49),u=i.ArrayBuffer,s=i.DataView,p=u.prototype.slice;o({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:r((function(){return!new u(2).slice(1,undefined).byteLength}))},{slice:function(e,t){if(p!==undefined&&t===undefined)return p.call(a(this),e);for(var n=a(this).byteLength,o=c(e,n),r=c(t===undefined?n:t,n),i=new(d(this,u))(l(r-o)),m=new s(this),f=new s(i),h=0;o<r;)f.setUint8(h++,m.getUint8(o++));return i}})},function(e,t,n){"use strict";var o=n(4),r=n(81);o({global:!0,forced:!n(107)},{DataView:r.DataView})},function(e,t,n){"use strict";n(4)({target:"Date",stat:!0},{now:function(){return(new Date).getTime()}})},function(e,t,n){"use strict";var o=n(4),r=n(240);o({target:"Date",proto:!0,forced:Date.prototype.toISOString!==r},{toISOString:r})},function(e,t,n){"use strict";var o=n(5),r=n(108).start,i=Math.abs,a=Date.prototype,c=a.getTime,l=a.toISOString;e.exports=o((function(){return"0385-07-25T07:06:39.999Z"!=l.call(new Date(-50000000000001))}))||!o((function(){l.call(new Date(NaN))}))?function(){if(!isFinite(c.call(this)))throw RangeError("Invalid time value");var e=this.getUTCFullYear(),t=this.getUTCMilliseconds(),n=e<0?"-":e>9999?"+":"";return n+r(i(e),n?6:4,0)+"-"+r(this.getUTCMonth()+1,2,0)+"-"+r(this.getUTCDate(),2,0)+"T"+r(this.getUTCHours(),2,0)+":"+r(this.getUTCMinutes(),2,0)+":"+r(this.getUTCSeconds(),2,0)+"."+r(t,3,0)+"Z"}:l},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(18),a=n(36);o({target:"Date",proto:!0,forced:r((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}))},{toJSON:function(e){var t=i(this),n=a(t);return"number"!=typeof n||isFinite(n)?t.toISOString():null}})},function(e,t,n){"use strict";var o=n(31),r=n(243),i=n(13)("toPrimitive"),a=Date.prototype;i in a||o(a,i,r)},function(e,t,n){"use strict";var o=n(10),r=n(36);e.exports=function(e){if("string"!==e&&"number"!==e&&"default"!==e)throw TypeError("Incorrect hint");return r(o(this),"number"!==e)}},function(e,t,n){"use strict";var o=n(24),r=Date.prototype,i=r.toString,a=r.getTime;new Date(NaN)+""!="Invalid Date"&&o(r,"toString",(function(){var e=a.call(this);return e==e?i.call(this):"Invalid Date"}))},function(e,t,n){"use strict";n(4)({target:"Function",proto:!0},{bind:n(150)})},function(e,t,n){"use strict";var o=n(8),r=n(14),i=n(38),a=n(13)("hasInstance"),c=Function.prototype;a in c||r.f(c,a,{value:function(e){if("function"!=typeof this||!o(e))return!1;if(!o(this.prototype))return e instanceof this;for(;e=i(e);)if(this.prototype===e)return!0;return!1}})},function(e,t,n){"use strict";var o=n(9),r=n(14).f,i=Function.prototype,a=i.toString,c=/^\s*function ([^ (]*)/;o&&!("name"in i)&&r(i,"name",{configurable:!0,get:function(){try{return a.call(this).match(c)[1]}catch(e){return""}}})},function(e,t,n){"use strict";var o=n(7);n(47)(o.JSON,"JSON",!0)},function(e,t,n){"use strict";var o=n(82),r=n(151);e.exports=o("Map",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),r)},function(e,t,n){"use strict";var o=n(4),r=n(152),i=Math.acosh,a=Math.log,c=Math.sqrt,l=Math.LN2;o({target:"Math",stat:!0,forced:!i||710!=Math.floor(i(Number.MAX_VALUE))||i(Infinity)!=Infinity},{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?a(e)+l:r(e-1+c(e-1)*c(e+1))}})},function(e,t,n){"use strict";var o=n(4),r=Math.asinh,i=Math.log,a=Math.sqrt;o({target:"Math",stat:!0,forced:!(r&&1/r(0)>0)},{asinh:function c(e){return isFinite(e=+e)&&0!=e?e<0?-c(-e):i(e+a(e*e+1)):e}})},function(e,t,n){"use strict";var o=n(4),r=Math.atanh,i=Math.log;o({target:"Math",stat:!0,forced:!(r&&1/r(-0)<0)},{atanh:function(e){return 0==(e=+e)?e:i((1+e)/(1-e))/2}})},function(e,t,n){"use strict";var o=n(4),r=n(110),i=Math.abs,a=Math.pow;o({target:"Math",stat:!0},{cbrt:function(e){return r(e=+e)*a(i(e),1/3)}})},function(e,t,n){"use strict";var o=n(4),r=Math.floor,i=Math.log,a=Math.LOG2E;o({target:"Math",stat:!0},{clz32:function(e){return(e>>>=0)?31-r(i(e+.5)*a):32}})},function(e,t,n){"use strict";var o=n(4),r=n(84),i=Math.cosh,a=Math.abs,c=Math.E;o({target:"Math",stat:!0,forced:!i||i(710)===Infinity},{cosh:function(e){var t=r(a(e)-1)+1;return(t+1/(t*c*c))*(c/2)}})},function(e,t,n){"use strict";var o=n(4),r=n(84);o({target:"Math",stat:!0,forced:r!=Math.expm1},{expm1:r})},function(e,t,n){"use strict";n(4)({target:"Math",stat:!0},{fround:n(258)})},function(e,t,n){"use strict";var o=n(110),r=Math.abs,i=Math.pow,a=i(2,-52),c=i(2,-23),l=i(2,127)*(2-c),d=i(2,-126);e.exports=Math.fround||function(e){var t,n,i=r(e),u=o(e);return i<d?u*(i/d/c+1/a-1/a)*d*c:(n=(t=(1+c/a)*i)-(t-i))>l||n!=n?u*Infinity:u*n}},function(e,t,n){"use strict";var o=n(4),r=Math.hypot,i=Math.abs,a=Math.sqrt;o({target:"Math",stat:!0,forced:!!r&&r(Infinity,NaN)!==Infinity},{hypot:function(e,t){for(var n,o,r=0,c=0,l=arguments.length,d=0;c<l;)d<(n=i(arguments[c++]))?(r=r*(o=d/n)*o+1,d=n):r+=n>0?(o=n/d)*o:n;return d===Infinity?Infinity:d*a(r)}})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=Math.imul;o({target:"Math",stat:!0,forced:r((function(){return-5!=i(4294967295,5)||2!=i.length}))},{imul:function(e,t){var n=+e,o=+t,r=65535&n,i=65535&o;return 0|r*i+((65535&n>>>16)*i+r*(65535&o>>>16)<<16>>>0)}})},function(e,t,n){"use strict";var o=n(4),r=Math.log,i=Math.LOG10E;o({target:"Math",stat:!0},{log10:function(e){return r(e)*i}})},function(e,t,n){"use strict";n(4)({target:"Math",stat:!0},{log1p:n(152)})},function(e,t,n){"use strict";var o=n(4),r=Math.log,i=Math.LN2;o({target:"Math",stat:!0},{log2:function(e){return r(e)/i}})},function(e,t,n){"use strict";n(4)({target:"Math",stat:!0},{sign:n(110)})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(84),a=Math.abs,c=Math.exp,l=Math.E;o({target:"Math",stat:!0,forced:r((function(){return-2e-17!=Math.sinh(-2e-17)}))},{sinh:function(e){return a(e=+e)<1?(i(e)-i(-e))/2:(c(e-1)-c(-e-1))*(l/2)}})},function(e,t,n){"use strict";var o=n(4),r=n(84),i=Math.exp;o({target:"Math",stat:!0},{tanh:function(e){var t=r(e=+e),n=r(-e);return t==Infinity?1:n==Infinity?-1:(t-n)/(i(e)+i(-e))}})},function(e,t,n){"use strict";n(47)(Math,"Math",!0)},function(e,t,n){"use strict";var o=n(4),r=Math.ceil,i=Math.floor;o({target:"Math",stat:!0},{trunc:function(e){return(e>0?i:r)(e)}})},function(e,t,n){"use strict";var o=n(9),r=n(7),i=n(66),a=n(24),c=n(20),l=n(35),d=n(83),u=n(36),s=n(5),p=n(46),m=n(51).f,f=n(22).f,h=n(14).f,C=n(59).trim,g=r.Number,b=g.prototype,N="Number"==l(p(b)),v=function(e){var t,n,o,r,i,a,c,l,d=u(e,!1);if("string"==typeof d&&d.length>2)if(43===(t=(d=C(d)).charCodeAt(0))||45===t){if(88===(n=d.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(d.charCodeAt(1)){case 66:case 98:o=2,r=49;break;case 79:case 111:o=8,r=55;break;default:return+d}for(a=(i=d.slice(2)).length,c=0;c<a;c++)if((l=i.charCodeAt(c))<48||l>r)return NaN;return parseInt(i,o)}return+d};if(i("Number",!g(" 0o1")||!g("0b1")||g("+0x1"))){for(var V,y=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof y&&(N?s((function(){b.valueOf.call(n)})):"Number"!=l(n))?d(new g(v(t)),n,y):v(t)},k=o?m(g):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),x=0;k.length>x;x++)c(g,V=k[x])&&!c(y,V)&&h(y,V,f(g,V));y.prototype=b,b.constructor=y,a(r,"Number",y)}},function(e,t,n){"use strict";n(4)({target:"Number",stat:!0},{EPSILON:Math.pow(2,-52)})},function(e,t,n){"use strict";n(4)({target:"Number",stat:!0},{isFinite:n(272)})},function(e,t,n){"use strict";var o=n(7).isFinite;e.exports=Number.isFinite||function(e){return"number"==typeof e&&o(e)}},function(e,t,n){"use strict";n(4)({target:"Number",stat:!0},{isInteger:n(153)})},function(e,t,n){"use strict";n(4)({target:"Number",stat:!0},{isNaN:function(e){return e!=e}})},function(e,t,n){"use strict";var o=n(4),r=n(153),i=Math.abs;o({target:"Number",stat:!0},{isSafeInteger:function(e){return r(e)&&i(e)<=9007199254740991}})},function(e,t,n){"use strict";n(4)({target:"Number",stat:!0},{MAX_SAFE_INTEGER:9007199254740991})},function(e,t,n){"use strict";n(4)({target:"Number",stat:!0},{MIN_SAFE_INTEGER:-9007199254740991})},function(e,t,n){"use strict";var o=n(4),r=n(279);o({target:"Number",stat:!0,forced:Number.parseFloat!=r},{parseFloat:r})},function(e,t,n){"use strict";var o=n(7),r=n(59).trim,i=n(85),a=o.parseFloat,c=1/a(i+"-0")!=-Infinity;e.exports=c?function(e){var t=r(String(e)),n=a(t);return 0===n&&"-"==t.charAt(0)?-0:n}:a},function(e,t,n){"use strict";var o=n(4),r=n(154);o({target:"Number",stat:!0,forced:Number.parseInt!=r},{parseInt:r})},function(e,t,n){"use strict";var o=n(4),r=n(32),i=n(282),a=n(109),c=n(5),l=1..toFixed,d=Math.floor,u=function s(e,t,n){return 0===t?n:t%2==1?s(e,t-1,n*e):s(e*e,t/2,n)};o({target:"Number",proto:!0,forced:l&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!c((function(){l.call({})}))},{toFixed:function(e){var t,n,o,c,l=i(this),s=r(e),p=[0,0,0,0,0,0],m="",f="0",h=function(e,t){for(var n=-1,o=t;++n<6;)o+=e*p[n],p[n]=o%1e7,o=d(o/1e7)},C=function(e){for(var t=6,n=0;--t>=0;)n+=p[t],p[t]=d(n/e),n=n%e*1e7},g=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==p[e]){var n=String(p[e]);t=""===t?n:t+a.call("0",7-n.length)+n}return t};if(s<0||s>20)throw RangeError("Incorrect fraction digits");if(l!=l)return"NaN";if(l<=-1e21||l>=1e21)return String(l);if(l<0&&(m="-",l=-l),l>1e-21)if(n=(t=function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t}(l*u(2,69,1))-69)<0?l*u(2,-t,1):l/u(2,t,1),n*=4503599627370496,(t=52-t)>0){for(h(0,n),o=s;o>=7;)h(1e7,0),o-=7;for(h(u(10,o,1),0),o=t-1;o>=23;)C(1<<23),o-=23;C(1<<o),h(1,1),C(2),f=g()}else h(0,n),h(1<<-t,0),f=g()+a.call("0",s);return f=s>0?m+((c=f.length)<=s?"0."+a.call("0",s-c)+f:f.slice(0,c-s)+"."+f.slice(c-s)):m+f}})},function(e,t,n){"use strict";var o=n(35);e.exports=function(e){if("number"!=typeof e&&"Number"!=o(e))throw TypeError("Incorrect invocation");return+e}},function(e,t,n){"use strict";var o=n(4),r=n(284);o({target:"Object",stat:!0,forced:Object.assign!==r},{assign:r})},function(e,t,n){"use strict";var o=n(9),r=n(5),i=n(67),a=n(98),c=n(75),l=n(18),d=n(62),u=Object.assign,s=Object.defineProperty;e.exports=!u||r((function(){if(o&&1!==u({b:1},u(s({},"a",{enumerable:!0,get:function(){s(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol();return e[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(e){t[e]=e})),7!=u({},e)[n]||"abcdefghijklmnopqrst"!=i(u({},t)).join("")}))?function(e,t){for(var n=l(e),r=arguments.length,u=1,s=a.f,p=c.f;r>u;)for(var m,f=d(arguments[u++]),h=s?i(f).concat(s(f)):i(f),C=h.length,g=0;C>g;)m=h[g++],o&&!p.call(f,m)||(n[m]=f[m]);return n}:u},function(e,t,n){"use strict";n(4)({target:"Object",stat:!0,sham:!n(9)},{create:n(46)})},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(86),a=n(18),c=n(33),l=n(14);r&&o({target:"Object",proto:!0,forced:i},{__defineGetter__:function(e,t){l.f(a(this),e,{get:c(t),enumerable:!0,configurable:!0})}})},function(e,t,n){"use strict";var o=n(4),r=n(9);o({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperties:n(138)})},function(e,t,n){"use strict";var o=n(4),r=n(9);o({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperty:n(14).f})},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(86),a=n(18),c=n(33),l=n(14);r&&o({target:"Object",proto:!0,forced:i},{__defineSetter__:function(e,t){l.f(a(this),e,{set:c(t),enumerable:!0,configurable:!0})}})},function(e,t,n){"use strict";var o=n(4),r=n(155).entries;o({target:"Object",stat:!0},{entries:function(e){return r(e)}})},function(e,t,n){"use strict";var o=n(4),r=n(72),i=n(5),a=n(8),c=n(55).onFreeze,l=Object.freeze;o({target:"Object",stat:!0,forced:i((function(){l(1)})),sham:!r},{freeze:function(e){return l&&a(e)?l(c(e)):e}})},function(e,t,n){"use strict";var o=n(4),r=n(73),i=n(53);o({target:"Object",stat:!0},{fromEntries:function(e){var t={};return r(e,(function(e,n){i(t,e,n)}),undefined,!0),t}})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(26),a=n(22).f,c=n(9),l=r((function(){a(1)}));o({target:"Object",stat:!0,forced:!c||l,sham:!c},{getOwnPropertyDescriptor:function(e,t){return a(i(e),t)}})},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(96),a=n(26),c=n(22),l=n(53);o({target:"Object",stat:!0,sham:!r},{getOwnPropertyDescriptors:function(e){for(var t,n,o=a(e),r=c.f,d=i(o),u={},s=0;d.length>s;)(n=r(o,t=d[s++]))!==undefined&&l(u,t,n);return u}})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(140).f;o({target:"Object",stat:!0,forced:r((function(){return!Object.getOwnPropertyNames(1)}))},{getOwnPropertyNames:i})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(18),a=n(38),c=n(106);o({target:"Object",stat:!0,forced:r((function(){a(1)})),sham:!c},{getPrototypeOf:function(e){return a(i(e))}})},function(e,t,n){"use strict";n(4)({target:"Object",stat:!0},{is:n(156)})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(8),a=Object.isExtensible;o({target:"Object",stat:!0,forced:r((function(){a(1)}))},{isExtensible:function(e){return!!i(e)&&(!a||a(e))}})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(8),a=Object.isFrozen;o({target:"Object",stat:!0,forced:r((function(){a(1)}))},{isFrozen:function(e){return!i(e)||!!a&&a(e)}})},function(e,t,n){"use strict";var o=n(4),r=n(5),i=n(8),a=Object.isSealed;o({target:"Object",stat:!0,forced:r((function(){a(1)}))},{isSealed:function(e){return!i(e)||!!a&&a(e)}})},function(e,t,n){"use strict";var o=n(4),r=n(18),i=n(67);o({target:"Object",stat:!0,forced:n(5)((function(){i(1)}))},{keys:function(e){return i(r(e))}})},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(86),a=n(18),c=n(36),l=n(38),d=n(22).f;r&&o({target:"Object",proto:!0,forced:i},{__lookupGetter__:function(e){var t,n=a(this),o=c(e,!0);do{if(t=d(n,o))return t.get}while(n=l(n))}})},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(86),a=n(18),c=n(36),l=n(38),d=n(22).f;r&&o({target:"Object",proto:!0,forced:i},{__lookupSetter__:function(e){var t,n=a(this),o=c(e,!0);do{if(t=d(n,o))return t.set}while(n=l(n))}})},function(e,t,n){"use strict";var o=n(4),r=n(8),i=n(55).onFreeze,a=n(72),c=n(5),l=Object.preventExtensions;o({target:"Object",stat:!0,forced:c((function(){l(1)})),sham:!a},{preventExtensions:function(e){return l&&r(e)?l(i(e)):e}})},function(e,t,n){"use strict";var o=n(4),r=n(8),i=n(55).onFreeze,a=n(72),c=n(5),l=Object.seal;o({target:"Object",stat:!0,forced:c((function(){l(1)})),sham:!a},{seal:function(e){return l&&r(e)?l(i(e)):e}})},function(e,t,n){"use strict";n(4)({target:"Object",stat:!0},{setPrototypeOf:n(54)})},function(e,t,n){"use strict";var o=n(104),r=n(24),i=n(308);o||r(Object.prototype,"toString",i,{unsafe:!0})},function(e,t,n){"use strict";var o=n(104),r=n(78);e.exports=o?{}.toString:function(){return"[object "+r(this)+"]"}},function(e,t,n){"use strict";var o=n(4),r=n(155).values;o({target:"Object",stat:!0},{values:function(e){return r(e)}})},function(e,t,n){"use strict";var o=n(4),r=n(154);o({global:!0,forced:parseInt!=r},{parseInt:r})},function(e,t,n){"use strict";var o,r,i,a,c=n(4),l=n(41),d=n(7),u=n(39),s=n(157),p=n(24),m=n(71),f=n(47),h=n(57),C=n(8),g=n(33),b=n(58),N=n(35),v=n(94),V=n(73),y=n(79),k=n(49),x=n(111).set,_=n(159),w=n(160),B=n(312),S=n(161),L=n(313),I=n(37),T=n(66),A=n(13),E=n(100),M=A("species"),P="Promise",R=I.get,O=I.set,F=I.getterFor(P),j=s,D=d.TypeError,z=d.document,W=d.process,H=u("fetch"),U=S.f,G=U,K="process"==N(W),q=!!(z&&z.createEvent&&d.dispatchEvent),Y=T(P,(function(){if(!(v(j)!==String(j))){if(66===E)return!0;if(!K&&"function"!=typeof PromiseRejectionEvent)return!0}if(l&&!j.prototype["finally"])return!0;if(E>=51&&/native code/.test(j))return!1;var e=j.resolve(1),t=function(e){e((function(){}),(function(){}))};return(e.constructor={})[M]=t,!(e.then((function(){}))instanceof t)})),$=Y||!y((function(e){j.all(e)["catch"]((function(){}))})),X=function(e){var t;return!(!C(e)||"function"!=typeof(t=e.then))&&t},Q=function(e,t,n){if(!t.notified){t.notified=!0;var o=t.reactions;_((function(){for(var r=t.value,i=1==t.state,a=0;o.length>a;){var c,l,d,u=o[a++],s=i?u.ok:u.fail,p=u.resolve,m=u.reject,f=u.domain;try{s?(i||(2===t.rejection&&te(e,t),t.rejection=1),!0===s?c=r:(f&&f.enter(),c=s(r),f&&(f.exit(),d=!0)),c===u.promise?m(D("Promise-chain cycle")):(l=X(c))?l.call(c,p,m):p(c)):m(r)}catch(h){f&&!d&&f.exit(),m(h)}}t.reactions=[],t.notified=!1,n&&!t.rejection&&Z(e,t)}))}},J=function(e,t,n){var o,r;q?((o=z.createEvent("Event")).promise=t,o.reason=n,o.initEvent(e,!1,!0),d.dispatchEvent(o)):o={promise:t,reason:n},(r=d["on"+e])?r(o):"unhandledrejection"===e&&B("Unhandled promise rejection",n)},Z=function(e,t){x.call(d,(function(){var n,o=t.value;if(ee(t)&&(n=L((function(){K?W.emit("unhandledRejection",o,e):J("unhandledrejection",e,o)})),t.rejection=K||ee(t)?2:1,n.error))throw n.value}))},ee=function(e){return 1!==e.rejection&&!e.parent},te=function(e,t){x.call(d,(function(){K?W.emit("rejectionHandled",e):J("rejectionhandled",e,t.value)}))},ne=function(e,t,n,o){return function(r){e(t,n,r,o)}},oe=function(e,t,n,o){t.done||(t.done=!0,o&&(t=o),t.value=n,t.state=2,Q(e,t,!0))},re=function ie(e,t,n,o){if(!t.done){t.done=!0,o&&(t=o);try{if(e===n)throw D("Promise can't be resolved itself");var r=X(n);r?_((function(){var o={done:!1};try{r.call(n,ne(ie,e,o,t),ne(oe,e,o,t))}catch(i){oe(e,o,i,t)}})):(t.value=n,t.state=1,Q(e,t,!1))}catch(i){oe(e,{done:!1},i,t)}}};Y&&(j=function(e){b(this,j,P),g(e),o.call(this);var t=R(this);try{e(ne(re,this,t),ne(oe,this,t))}catch(n){oe(this,t,n)}},(o=function(e){O(this,{type:P,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:undefined})}).prototype=m(j.prototype,{then:function(e,t){var n=F(this),o=U(k(this,j));return o.ok="function"!=typeof e||e,o.fail="function"==typeof t&&t,o.domain=K?W.domain:undefined,n.parent=!0,n.reactions.push(o),0!=n.state&&Q(this,n,!1),o.promise},"catch":function(e){return this.then(undefined,e)}}),r=function(){var e=new o,t=R(e);this.promise=e,this.resolve=ne(re,e,t),this.reject=ne(oe,e,t)},S.f=U=function(e){return e===j||e===i?new r(e):G(e)},l||"function"!=typeof s||(a=s.prototype.then,p(s.prototype,"then",(function(e,t){var n=this;return new j((function(e,t){a.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof H&&c({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return w(j,H.apply(d,arguments))}}))),c({global:!0,wrap:!0,forced:Y},{Promise:j}),f(j,P,!1,!0),h(P),i=u(P),c({target:P,stat:!0,forced:Y},{reject:function(e){var t=U(this);return t.reject.call(undefined,e),t.promise}}),c({target:P,stat:!0,forced:l||Y},{resolve:function(e){return w(l&&this===i?j:this,e)}}),c({target:P,stat:!0,forced:$},{all:function(e){var t=this,n=U(t),o=n.resolve,r=n.reject,i=L((function(){var n=g(t.resolve),i=[],a=0,c=1;V(e,(function(e){var l=a++,d=!1;i.push(undefined),c++,n.call(t,e).then((function(e){d||(d=!0,i[l]=e,--c||o(i))}),r)})),--c||o(i)}));return i.error&&r(i.value),n.promise},race:function(e){var t=this,n=U(t),o=n.reject,r=L((function(){var r=g(t.resolve);V(e,(function(e){r.call(t,e).then(n.resolve,o)}))}));return r.error&&o(r.value),n.promise}})},function(e,t,n){"use strict";var o=n(7);e.exports=function(e,t){var n=o.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},function(e,t,n){"use strict";e.exports=function(e){try{return{error:!1,value:e()}}catch(t){return{error:!0,value:t}}}},function(e,t,n){"use strict";var o=n(4),r=n(41),i=n(157),a=n(5),c=n(39),l=n(49),d=n(160),u=n(24);o({target:"Promise",proto:!0,real:!0,forced:!!i&&a((function(){i.prototype["finally"].call({then:function(){}},(function(){}))}))},{"finally":function(e){var t=l(this,c("Promise")),n="function"==typeof e;return this.then(n?function(n){return d(t,e()).then((function(){return n}))}:e,n?function(n){return d(t,e()).then((function(){throw n}))}:e)}}),r||"function"!=typeof i||i.prototype["finally"]||u(i.prototype,"finally",c("Promise").prototype["finally"])},function(e,t,n){"use strict";var o=n(4),r=n(39),i=n(33),a=n(10),c=n(5),l=r("Reflect","apply"),d=Function.apply;o({target:"Reflect",stat:!0,forced:!c((function(){l((function(){}))}))},{apply:function(e,t,n){return i(e),a(n),l?l(e,t,n):d.call(e,t,n)}})},function(e,t,n){"use strict";var o=n(4),r=n(39),i=n(33),a=n(10),c=n(8),l=n(46),d=n(150),u=n(5),s=r("Reflect","construct"),p=u((function(){function e(){}return!(s((function(){}),[],e)instanceof e)})),m=!u((function(){s((function(){}))})),f=p||m;o({target:"Reflect",stat:!0,forced:f,sham:f},{construct:function(e,t){i(e),a(t);var n=arguments.length<3?e:i(arguments[2]);if(m&&!p)return s(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var o=[null];return o.push.apply(o,t),new(d.apply(e,o))}var r=n.prototype,u=l(c(r)?r:Object.prototype),f=Function.apply.call(e,u,t);return c(f)?f:u}})},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(10),a=n(36),c=n(14);o({target:"Reflect",stat:!0,forced:n(5)((function(){Reflect.defineProperty(c.f({},1,{value:1}),1,{value:2})})),sham:!r},{defineProperty:function(e,t,n){i(e);var o=a(t,!0);i(n);try{return c.f(e,o,n),!0}catch(r){return!1}}})},function(e,t,n){"use strict";var o=n(4),r=n(10),i=n(22).f;o({target:"Reflect",stat:!0},{deleteProperty:function(e,t){var n=i(r(e),t);return!(n&&!n.configurable)&&delete e[t]}})},function(e,t,n){"use strict";var o=n(4),r=n(8),i=n(10),a=n(20),c=n(22),l=n(38);o({target:"Reflect",stat:!0},{get:function d(e,t){var n,o,u=arguments.length<3?e:arguments[2];return i(e)===u?e[t]:(n=c.f(e,t))?a(n,"value")?n.value:n.get===undefined?undefined:n.get.call(u):r(o=l(e))?d(o,t,u):void 0}})},function(e,t,n){"use strict";var o=n(4),r=n(9),i=n(10),a=n(22);o({target:"Reflect",stat:!0,sham:!r},{getOwnPropertyDescriptor:function(e,t){return a.f(i(e),t)}})},function(e,t,n){"use strict";var o=n(4),r=n(10),i=n(38);o({target:"Reflect",stat:!0,sham:!n(106)},{getPrototypeOf:function(e){return i(r(e))}})},function(e,t,n){"use strict";n(4)({target:"Reflect",stat:!0},{has:function(e,t){return t in e}})},function(e,t,n){"use strict";var o=n(4),r=n(10),i=Object.isExtensible;o({target:"Reflect",stat:!0},{isExtensible:function(e){return r(e),!i||i(e)}})},function(e,t,n){"use strict";n(4)({target:"Reflect",stat:!0},{ownKeys:n(96)})},function(e,t,n){"use strict";var o=n(4),r=n(39),i=n(10);o({target:"Reflect",stat:!0,sham:!n(72)},{preventExtensions:function(e){i(e);try{var t=r("Object","preventExtensions");return t&&t(e),!0}catch(n){return!1}}})},function(e,t,n){"use strict";var o=n(4),r=n(10),i=n(8),a=n(20),c=n(5),l=n(14),d=n(22),u=n(38),s=n(50);o({target:"Reflect",stat:!0,forced:c((function(){var e=l.f({},"a",{configurable:!0});return!1!==Reflect.set(u(e),"a",1,e)}))},{set:function p(e,t,n){var o,c,m=arguments.length<4?e:arguments[3],f=d.f(r(e),t);if(!f){if(i(c=u(e)))return p(c,t,n,m);f=s(0)}if(a(f,"value")){if(!1===f.writable||!i(m))return!1;if(o=d.f(m,t)){if(o.get||o.set||!1===o.writable)return!1;o.value=n,l.f(m,t,o)}else l.f(m,t,s(0,n));return!0}return f.set!==undefined&&(f.set.call(m,n),!0)}})},function(e,t,n){"use strict";var o=n(4),r=n(10),i=n(147),a=n(54);a&&o({target:"Reflect",stat:!0},{setPrototypeOf:function(e,t){r(e),i(t);try{return a(e,t),!0}catch(n){return!1}}})},function(e,t,n){"use strict";var o=n(9),r=n(7),i=n(66),a=n(83),c=n(14).f,l=n(51).f,d=n(112),u=n(87),s=n(113),p=n(24),m=n(5),f=n(37).set,h=n(57),C=n(13)("match"),g=r.RegExp,b=g.prototype,N=/a/g,v=/a/g,V=new g(N)!==N,y=s.UNSUPPORTED_Y;if(o&&i("RegExp",!V||y||m((function(){return v[C]=!1,g(N)!=N||g(v)==v||"/a/i"!=g(N,"i")})))){for(var k=function(e,t){var n,o=this instanceof k,r=d(e),i=t===undefined;if(!o&&r&&e.constructor===k&&i)return e;V?r&&!i&&(e=e.source):e instanceof k&&(i&&(t=u.call(e)),e=e.source),y&&(n=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var c=a(V?new g(e,t):g(e,t),o?this:b,k);return y&&n&&f(c,{sticky:n}),c},x=function(e){e in k||c(k,e,{configurable:!0,get:function(){return g[e]},set:function(t){g[e]=t}})},_=l(g),w=0;_.length>w;)x(_[w++]);b.constructor=k,k.prototype=b,p(r,"RegExp",k)}h("RegExp")},function(e,t,n){"use strict";var o=n(9),r=n(14),i=n(87),a=n(113).UNSUPPORTED_Y;o&&("g"!=/./g.flags||a)&&r.f(RegExp.prototype,"flags",{configurable:!0,get:i})},function(e,t,n){"use strict";var o=n(24),r=n(10),i=n(5),a=n(87),c=RegExp.prototype,l=c.toString,d=i((function(){return"/a/b"!=l.call({source:"a",flags:"b"})})),u="toString"!=l.name;(d||u)&&o(RegExp.prototype,"toString",(function(){var e=r(this),t=String(e.source),n=e.flags;return"/"+t+"/"+String(n===undefined&&e instanceof RegExp&&!("flags"in c)?a.call(e):n)}),{unsafe:!0})},function(e,t,n){"use strict";var o=n(82),r=n(151);e.exports=o("Set",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),r)},function(e,t,n){"use strict";var o=n(4),r=n(114).codeAt;o({target:"String",proto:!0},{codePointAt:function(e){return r(this,e)}})},function(e,t,n){"use strict";var o,r=n(4),i=n(22).f,a=n(12),c=n(115),l=n(23),d=n(116),u=n(41),s="".endsWith,p=Math.min,m=d("endsWith");r({target:"String",proto:!0,forced:!!(u||m||(o=i(String.prototype,"endsWith"),!o||o.writable))&&!m},{endsWith:function(e){var t=String(l(this));c(e);var n=arguments.length>1?arguments[1]:undefined,o=a(t.length),r=n===undefined?o:p(a(n),o),i=String(e);return s?s.call(t,i,r):t.slice(r-i.length,r)===i}})},function(e,t,n){"use strict";var o=n(4),r=n(45),i=String.fromCharCode,a=String.fromCodePoint;o({target:"String",stat:!0,forced:!!a&&1!=a.length},{fromCodePoint:function(e){for(var t,n=[],o=arguments.length,a=0;o>a;){if(t=+arguments[a++],r(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?i(t):i(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}})},function(e,t,n){"use strict";var o=n(4),r=n(115),i=n(23);o({target:"String",proto:!0,forced:!n(116)("includes")},{includes:function(e){return!!~String(i(this)).indexOf(r(e),arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(114).charAt,r=n(37),i=n(105),a=r.set,c=r.getterFor("String Iterator");i(String,"String",(function(e){a(this,{type:"String Iterator",string:String(e),index:0})}),(function(){var e,t=c(this),n=t.string,r=t.index;return r>=n.length?{value:undefined,done:!0}:(e=o(n,r),t.index+=e.length,{value:e,done:!1})}))},function(e,t,n){"use strict";var o=n(89),r=n(10),i=n(12),a=n(23),c=n(117),l=n(90);o("match",1,(function(e,t,n){return[function(t){var n=a(this),o=t==undefined?undefined:t[e];return o!==undefined?o.call(t,n):new RegExp(t)[e](String(n))},function(e){var o=n(t,e,this);if(o.done)return o.value;var a=r(e),d=String(this);if(!a.global)return l(a,d);var u=a.unicode;a.lastIndex=0;for(var s,p=[],m=0;null!==(s=l(a,d));){var f=String(s[0]);p[m]=f,""===f&&(a.lastIndex=c(d,i(a.lastIndex),u)),m++}return 0===m?null:p}]}))},function(e,t,n){"use strict";var o=n(4),r=n(108).end;o({target:"String",proto:!0,forced:n(163)},{padEnd:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(108).start;o({target:"String",proto:!0,forced:n(163)},{padStart:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var o=n(4),r=n(26),i=n(12);o({target:"String",stat:!0},{raw:function(e){for(var t=r(e.raw),n=i(t.length),o=arguments.length,a=[],c=0;n>c;)a.push(String(t[c++])),c<o&&a.push(String(arguments[c]));return a.join("")}})},function(e,t,n){"use strict";n(4)({target:"String",proto:!0},{repeat:n(109)})},function(e,t,n){"use strict";var o=n(89),r=n(10),i=n(18),a=n(12),c=n(32),l=n(23),d=n(117),u=n(90),s=Math.max,p=Math.min,m=Math.floor,f=/\$([$&'`]|\d\d?|<[^>]*>)/g,h=/\$([$&'`]|\d\d?)/g;o("replace",2,(function(e,t,n,o){var C=o.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,g=o.REPLACE_KEEPS_$0,b=C?"$":"$0";return[function(n,o){var r=l(this),i=n==undefined?undefined:n[e];return i!==undefined?i.call(n,r,o):t.call(String(r),n,o)},function(e,o){if(!C&&g||"string"==typeof o&&-1===o.indexOf(b)){var i=n(t,e,this,o);if(i.done)return i.value}var l=r(e),m=String(this),f="function"==typeof o;f||(o=String(o));var h=l.global;if(h){var v=l.unicode;l.lastIndex=0}for(var V=[];;){var y=u(l,m);if(null===y)break;if(V.push(y),!h)break;""===String(y[0])&&(l.lastIndex=d(m,a(l.lastIndex),v))}for(var k,x="",_=0,w=0;w<V.length;w++){y=V[w];for(var B=String(y[0]),S=s(p(c(y.index),m.length),0),L=[],I=1;I<y.length;I++)L.push((k=y[I])===undefined?k:String(k));var T=y.groups;if(f){var A=[B].concat(L,S,m);T!==undefined&&A.push(T);var E=String(o.apply(undefined,A))}else E=N(B,m,S,L,T,o);S>=_&&(x+=m.slice(_,S)+E,_=S+B.length)}return x+m.slice(_)}];function N(e,n,o,r,a,c){var l=o+e.length,d=r.length,u=h;return a!==undefined&&(a=i(a),u=f),t.call(c,u,(function(t,i){var c;switch(i.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,o);case"'":return n.slice(l);case"<":c=a[i.slice(1,-1)];break;default:var u=+i;if(0===u)return t;if(u>d){var s=m(u/10);return 0===s?t:s<=d?r[s-1]===undefined?i.charAt(1):r[s-1]+i.charAt(1):t}c=r[u-1]}return c===undefined?"":c}))}}))},function(e,t,n){"use strict";var o=n(89),r=n(10),i=n(23),a=n(156),c=n(90);o("search",1,(function(e,t,n){return[function(t){var n=i(this),o=t==undefined?undefined:t[e];return o!==undefined?o.call(t,n):new RegExp(t)[e](String(n))},function(e){var o=n(t,e,this);if(o.done)return o.value;var i=r(e),l=String(this),d=i.lastIndex;a(d,0)||(i.lastIndex=0);var u=c(i,l);return a(i.lastIndex,d)||(i.lastIndex=d),null===u?-1:u.index}]}))},function(e,t,n){"use strict";var o=n(89),r=n(112),i=n(10),a=n(23),c=n(49),l=n(117),d=n(12),u=n(90),s=n(88),p=n(5),m=[].push,f=Math.min,h=!p((function(){return!RegExp(4294967295,"y")}));o("split",2,(function(e,t,n){var o;return o="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var o=String(a(this)),i=n===undefined?4294967295:n>>>0;if(0===i)return[];if(e===undefined)return[o];if(!r(e))return t.call(o,e,i);for(var c,l,d,u=[],p=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),f=0,h=new RegExp(e.source,p+"g");(c=s.call(h,o))&&!((l=h.lastIndex)>f&&(u.push(o.slice(f,c.index)),c.length>1&&c.index<o.length&&m.apply(u,c.slice(1)),d=c[0].length,f=l,u.length>=i));)h.lastIndex===c.index&&h.lastIndex++;return f===o.length?!d&&h.test("")||u.push(""):u.push(o.slice(f)),u.length>i?u.slice(0,i):u}:"0".split(undefined,0).length?function(e,n){return e===undefined&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var r=a(this),i=t==undefined?undefined:t[e];return i!==undefined?i.call(t,r,n):o.call(String(r),t,n)},function(e,r){var a=n(o,e,this,r,o!==t);if(a.done)return a.value;var s=i(e),p=String(this),m=c(s,RegExp),C=s.unicode,g=(s.ignoreCase?"i":"")+(s.multiline?"m":"")+(s.unicode?"u":"")+(h?"y":"g"),b=new m(h?s:"^(?:"+s.source+")",g),N=r===undefined?4294967295:r>>>0;if(0===N)return[];if(0===p.length)return null===u(b,p)?[p]:[];for(var v=0,V=0,y=[];V<p.length;){b.lastIndex=h?V:0;var k,x=u(b,h?p:p.slice(V));if(null===x||(k=f(d(b.lastIndex+(h?0:V)),p.length))===v)V=l(p,V,C);else{if(y.push(p.slice(v,V)),y.length===N)return y;for(var _=1;_<=x.length-1;_++)if(y.push(x[_]),y.length===N)return y;V=v=k}}return y.push(p.slice(v)),y}]}),!h)},function(e,t,n){"use strict";var o,r=n(4),i=n(22).f,a=n(12),c=n(115),l=n(23),d=n(116),u=n(41),s="".startsWith,p=Math.min,m=d("startsWith");r({target:"String",proto:!0,forced:!!(u||m||(o=i(String.prototype,"startsWith"),!o||o.writable))&&!m},{startsWith:function(e){var t=String(l(this));c(e);var n=a(p(arguments.length>1?arguments[1]:undefined,t.length)),o=String(e);return s?s.call(t,o,n):t.slice(n,n+o.length)===o}})},function(e,t,n){"use strict";var o=n(4),r=n(59).trim;o({target:"String",proto:!0,forced:n(118)("trim")},{trim:function(){return r(this)}})},function(e,t,n){"use strict";var o=n(4),r=n(59).end,i=n(118)("trimEnd"),a=i?function(){return r(this)}:"".trimEnd;o({target:"String",proto:!0,forced:i},{trimEnd:a,trimRight:a})},function(e,t,n){"use strict";var o=n(4),r=n(59).start,i=n(118)("trimStart"),a=i?function(){return r(this)}:"".trimStart;o({target:"String",proto:!0,forced:i},{trimStart:a,trimLeft:a})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("anchor")},{anchor:function(e){return r(this,"a","name",e)}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("big")},{big:function(){return r(this,"big","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("blink")},{blink:function(){return r(this,"blink","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("bold")},{bold:function(){return r(this,"b","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("fixed")},{fixed:function(){return r(this,"tt","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("fontcolor")},{fontcolor:function(e){return r(this,"font","color",e)}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("fontsize")},{fontsize:function(e){return r(this,"font","size",e)}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("italics")},{italics:function(){return r(this,"i","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("link")},{link:function(e){return r(this,"a","href",e)}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("small")},{small:function(){return r(this,"small","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("strike")},{strike:function(){return r(this,"strike","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("sub")},{sub:function(){return r(this,"sub","","")}})},function(e,t,n){"use strict";var o=n(4),r=n(28);o({target:"String",proto:!0,forced:n(29)("sup")},{sup:function(){return r(this,"sup","","")}})},function(e,t,n){"use strict";n(43)("Float32",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";var o=n(32);e.exports=function(e){var t=o(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},function(e,t,n){"use strict";n(43)("Float64",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";n(43)("Int8",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";n(43)("Int16",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";n(43)("Int32",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";n(43)("Uint8",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";n(43)("Uint8",(function(e){return function(t,n,o){return e(this,t,n,o)}}),!0)},function(e,t,n){"use strict";n(43)("Uint16",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";n(43)("Uint32",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},function(e,t,n){"use strict";var o=n(11),r=n(142),i=o.aTypedArray;(0,o.exportTypedArrayMethod)("copyWithin",(function(e,t){return r.call(i(this),e,t,arguments.length>2?arguments[2]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=n(21).every,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("every",(function(e){return r(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=n(101),i=o.aTypedArray;(0,o.exportTypedArrayMethod)("fill",(function(e){return r.apply(i(this),arguments)}))},function(e,t,n){"use strict";var o=n(11),r=n(21).filter,i=n(49),a=o.aTypedArray,c=o.aTypedArrayConstructor;(0,o.exportTypedArrayMethod)("filter",(function(e){for(var t=r(a(this),e,arguments.length>1?arguments[1]:undefined),n=i(this,this.constructor),o=0,l=t.length,d=new(c(n))(l);l>o;)d[o]=t[o++];return d}))},function(e,t,n){"use strict";var o=n(11),r=n(21).find,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("find",(function(e){return r(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=n(21).findIndex,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("findIndex",(function(e){return r(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=n(21).forEach,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("forEach",(function(e){r(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(119);(0,n(11).exportTypedArrayStaticMethod)("from",n(165),o)},function(e,t,n){"use strict";var o=n(11),r=n(65).includes,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("includes",(function(e){return r(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=n(65).indexOf,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("indexOf",(function(e){return r(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(7),r=n(11),i=n(145),a=n(13)("iterator"),c=o.Uint8Array,l=i.values,d=i.keys,u=i.entries,s=r.aTypedArray,p=r.exportTypedArrayMethod,m=c&&c.prototype[a],f=!!m&&("values"==m.name||m.name==undefined),h=function(){return l.call(s(this))};p("entries",(function(){return u.call(s(this))})),p("keys",(function(){return d.call(s(this))})),p("values",h,!f),p(a,h,!f)},function(e,t,n){"use strict";var o=n(11),r=o.aTypedArray,i=o.exportTypedArrayMethod,a=[].join;i("join",(function(e){return a.apply(r(this),arguments)}))},function(e,t,n){"use strict";var o=n(11),r=n(148),i=o.aTypedArray;(0,o.exportTypedArrayMethod)("lastIndexOf",(function(e){return r.apply(i(this),arguments)}))},function(e,t,n){"use strict";var o=n(11),r=n(21).map,i=n(49),a=o.aTypedArray,c=o.aTypedArrayConstructor;(0,o.exportTypedArrayMethod)("map",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:undefined,(function(e,t){return new(c(i(e,e.constructor)))(t)}))}))},function(e,t,n){"use strict";var o=n(11),r=n(119),i=o.aTypedArrayConstructor;(0,o.exportTypedArrayStaticMethod)("of",(function(){for(var e=0,t=arguments.length,n=new(i(this))(t);t>e;)n[e]=arguments[e++];return n}),r)},function(e,t,n){"use strict";var o=n(11),r=n(80).left,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("reduce",(function(e){return r(i(this),e,arguments.length,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=n(80).right,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("reduceRight",(function(e){return r(i(this),e,arguments.length,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=o.aTypedArray,i=o.exportTypedArrayMethod,a=Math.floor;i("reverse",(function(){for(var e,t=r(this).length,n=a(t/2),o=0;o<n;)e=this[o],this[o++]=this[--t],this[t]=e;return this}))},function(e,t,n){"use strict";var o=n(11),r=n(12),i=n(164),a=n(18),c=n(5),l=o.aTypedArray;(0,o.exportTypedArrayMethod)("set",(function(e){l(this);var t=i(arguments.length>1?arguments[1]:undefined,1),n=this.length,o=a(e),c=r(o.length),d=0;if(c+t>n)throw RangeError("Wrong length");for(;d<c;)this[t+d]=o[d++]}),c((function(){new Int8Array(1).set({})})))},function(e,t,n){"use strict";var o=n(11),r=n(49),i=n(5),a=o.aTypedArray,c=o.aTypedArrayConstructor,l=o.exportTypedArrayMethod,d=[].slice;l("slice",(function(e,t){for(var n=d.call(a(this),e,t),o=r(this,this.constructor),i=0,l=n.length,u=new(c(o))(l);l>i;)u[i]=n[i++];return u}),i((function(){new Int8Array(1).slice()})))},function(e,t,n){"use strict";var o=n(11),r=n(21).some,i=o.aTypedArray;(0,o.exportTypedArrayMethod)("some",(function(e){return r(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var o=n(11),r=o.aTypedArray,i=o.exportTypedArrayMethod,a=[].sort;i("sort",(function(e){return a.call(r(this),e)}))},function(e,t,n){"use strict";var o=n(11),r=n(12),i=n(45),a=n(49),c=o.aTypedArray;(0,o.exportTypedArrayMethod)("subarray",(function(e,t){var n=c(this),o=n.length,l=i(e,o);return new(a(n,n.constructor))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,r((t===undefined?o:i(t,o))-l))}))},function(e,t,n){"use strict";var o=n(7),r=n(11),i=n(5),a=o.Int8Array,c=r.aTypedArray,l=r.exportTypedArrayMethod,d=[].toLocaleString,u=[].slice,s=!!a&&i((function(){d.call(new a(1))}));l("toLocaleString",(function(){return d.apply(s?u.call(c(this)):c(this),arguments)}),i((function(){return[1,2].toLocaleString()!=new a([1,2]).toLocaleString()}))||!i((function(){a.prototype.toLocaleString.call([1,2])})))},function(e,t,n){"use strict";var o=n(11).exportTypedArrayMethod,r=n(5),i=n(7).Uint8Array,a=i&&i.prototype||{},c=[].toString,l=[].join;r((function(){c.call({})}))&&(c=function(){return l.call(this)});var d=a.toString!=c;o("toString",c,d)},function(e,t,n){"use strict";var o,r=n(7),i=n(71),a=n(55),c=n(82),l=n(166),d=n(8),u=n(37).enforce,s=n(133),p=!r.ActiveXObject&&"ActiveXObject"in r,m=Object.isExtensible,f=function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}},h=e.exports=c("WeakMap",f,l);if(s&&p){o=l.getConstructor(f,"WeakMap",!0),a.REQUIRED=!0;var C=h.prototype,g=C["delete"],b=C.has,N=C.get,v=C.set;i(C,{"delete":function(e){if(d(e)&&!m(e)){var t=u(this);return t.frozen||(t.frozen=new o),g.call(this,e)||t.frozen["delete"](e)}return g.call(this,e)},has:function(e){if(d(e)&&!m(e)){var t=u(this);return t.frozen||(t.frozen=new o),b.call(this,e)||t.frozen.has(e)}return b.call(this,e)},get:function(e){if(d(e)&&!m(e)){var t=u(this);return t.frozen||(t.frozen=new o),b.call(this,e)?N.call(this,e):t.frozen.get(e)}return N.call(this,e)},set:function(e,t){if(d(e)&&!m(e)){var n=u(this);n.frozen||(n.frozen=new o),b.call(this,e)?v.call(this,e,t):n.frozen.set(e,t)}else v.call(this,e,t);return this}})}},function(e,t,n){"use strict";n(82)("WeakSet",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),n(166))},function(e,t,n){"use strict";var o=n(4),r=n(7),i=n(111);o({global:!0,bind:!0,enumerable:!0,forced:!r.setImmediate||!r.clearImmediate},{setImmediate:i.set,clearImmediate:i.clear})},function(e,t,n){"use strict";var o=n(4),r=n(7),i=n(159),a=n(35),c=r.process,l="process"==a(c);o({global:!0,enumerable:!0,noTargetGet:!0},{queueMicrotask:function(e){var t=l&&c.domain;i(t?t.bind(e):e)}})},function(e,t,n){"use strict";var o=n(4),r=n(7),i=n(77),a=[].slice,c=function(e){return function(t,n){var o=arguments.length>2,r=o?a.call(arguments,2):undefined;return e(o?function(){("function"==typeof t?t:Function(t)).apply(this,r)}:t,n)}};o({global:!0,bind:!0,forced:/MSIE .\./.test(i)},{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},function(e,t,n){"use strict";t.__esModule=!0,t._CI=Se,t._HI=O,t._M=Le,t._MCCC=Ee,t._ME=Te,t._MFCC=Me,t._MP=we,t._MR=be,t.__render=je,t.createComponentVNode=function(e,t,n,o,r){var a=new L(1,null,null,e=function(e,t){if(12&e)return e;if(t.prototype&&t.prototype.render)return 4;if(t.render)return 32776;return 8}(e,t),o,function(e,t,n){var o=(32768&e?t.render:t).defaultProps;if(i(o))return n;if(i(n))return u(o,null);return B(n,o)}(e,t,n),function(e,t,n){if(4&e)return n;var o=(32768&e?t.render:t).defaultHooks;if(i(o))return n;if(i(n))return o;return B(n,o)}(e,t,r),t);x.createVNode&&x.createVNode(a);return a},t.createFragment=A,t.createPortal=function(e,t){var n=O(e);return I(1024,1024,null,n,0,null,n.key,t)},t.createRef=function(){return{current:null}},t.createRenderer=function(e){return function(t,n,o,r){e||(e=t),De(n,e,o,r)}},t.createTextVNode=T,t.createVNode=I,t.directClone=E,t.findDOMfromVNode=N,t.forwardRef=function(e){return{render:e}},t.getFlagsForElementVnode=function(e){switch(e){case"svg":return 32;case"input":return 64;case"select":return 256;case"textarea":return 128;case"$F":return 8192;default:return 1}},t.linkEvent=function(e,t){if(c(t))return{data:e,event:t};return null},t.normalizeProps=function(e){var t=e.props;if(t){var n=e.flags;481&n&&(void 0!==t.children&&i(e.children)&&R(e,t.children),void 0!==t.className&&(e.className=t.className||null,t.className=undefined)),void 0!==t.key&&(e.key=t.key,t.key=undefined),void 0!==t.ref&&(e.ref=8&n?u(e.ref,t.ref):t.ref,t.ref=undefined)}return e},t.render=De,t.rerender=Ke,t.version=t.options=t.Fragment=t.EMPTY_OBJ=t.Component=void 0;var o=Array.isArray;function r(e){var t=typeof e;return"string"===t||"number"===t}function i(e){return null==e}function a(e){return null===e||!1===e||!0===e||void 0===e}function c(e){return"function"==typeof e}function l(e){return"string"==typeof e}function d(e){return null===e}function u(e,t){var n={};if(e)for(var o in e)n[o]=e[o];if(t)for(var r in t)n[r]=t[r];return n}function s(e){return!d(e)&&"object"==typeof e}var p={};t.EMPTY_OBJ=p;function m(e){return e.substr(2).toLowerCase()}function f(e,t){e.appendChild(t)}function h(e,t,n){d(n)?f(e,t):e.insertBefore(t,n)}function C(e,t){e.removeChild(t)}function g(e){for(var t=0;t<e.length;t++)e[t]()}function b(e,t,n){var o=e.children;return 4&n?o.$LI:8192&n?2===e.childFlags?o:o[t?0:o.length-1]:o}function N(e,t){for(var n;e;){if(2033&(n=e.flags))return e.dom;e=b(e,t,n)}return null}function v(e,t){do{var n=e.flags;if(2033&n)return void C(t,e.dom);var o=e.children;if(4&n&&(e=o.$LI),8&n&&(e=o),8192&n){if(2!==e.childFlags){for(var r=0,i=o.length;r<i;++r)v(o[r],t);return}e=o}}while(e)}function V(e,t,n){do{var o=e.flags;if(2033&o)return void h(t,e.dom,n);var r=e.children;if(4&o&&(e=r.$LI),8&o&&(e=r),8192&o){if(2!==e.childFlags){for(var i=0,a=r.length;i<a;++i)V(r[i],t,n);return}e=r}}while(e)}function y(e,t,n){return e.constructor.getDerivedStateFromProps?u(n,e.constructor.getDerivedStateFromProps(t,n)):n}t.Fragment="$F";var k={v:!1},x={componentComparator:null,createVNode:null,renderComplete:null};function _(e,t){e.textContent=t}function w(e,t){return s(e)&&e.event===t.event&&e.data===t.data}function B(e,t){for(var n in t)void 0===e[n]&&(e[n]=t[n]);return e}function S(e,t){return!!c(e)&&(e(t),!0)}t.options=x;function L(e,t,n,o,r,i,a,c){this.childFlags=e,this.children=t,this.className=n,this.dom=null,this.flags=o,this.key=void 0===r?null:r,this.props=void 0===i?null:i,this.ref=void 0===a?null:a,this.type=c}function I(e,t,n,o,r,i,a,c){var l=void 0===r?1:r,d=new L(l,o,n,e,a,i,c,t);return x.createVNode&&x.createVNode(d),0===l&&R(d,d.children),d}function T(e,t){return new L(1,i(e)||!0===e||!1===e?"":e,null,16,t,null,null,null)}function A(e,t,n){var o=I(8192,8192,null,e,t,null,n,null);switch(o.childFlags){case 1:o.children=M(),o.childFlags=2;break;case 16:o.children=[T(e)],o.childFlags=4}return o}function E(e){var t=-16385&e.flags,n=e.props;if(14&t&&!d(n)){var o=n;for(var r in n={},o)n[r]=o[r]}return 0==(8192&t)?new L(e.childFlags,e.children,e.className,t,e.key,n,e.ref,e.type):function(e){var t,n=e.children,o=e.childFlags;if(2===o)t=E(n);else if(12&o){t=[];for(var r=0,i=n.length;r<i;++r)t.push(E(n[r]))}return A(t,o,e.key)}(e)}function M(){return T("",null)}function P(e,t,n,i){for(var c=e.length;n<c;n++){var u=e[n];if(!a(u)){var s=i+"$"+n;if(o(u))P(u,t,0,s);else{if(r(u))u=T(u,s);else{var p=u.key,m=l(p)&&"$"===p[0];(81920&u.flags||m)&&(u=E(u)),u.flags|=65536,m?p.substring(0,i.length)!==i&&(u.key=i+p):d(p)?u.key=s:u.key=i+p}t.push(u)}}}}function R(e,t){var n,i=1;if(a(t))n=t;else if(r(t))i=16,n=t;else if(o(t)){for(var c=t.length,u=0;u<c;++u){var s=t[u];if(a(s)||o(s)){n=n||t.slice(0,u),P(t,n,u,"");break}if(r(s))(n=n||t.slice(0,u)).push(T(s,"$"+u));else{var p=s.key,m=(81920&s.flags)>0,f=d(p),h=l(p)&&"$"===p[0];m||f||h?(n=n||t.slice(0,u),(m||h)&&(s=E(s)),(f||h)&&(s.key="$"+u),n.push(s)):n&&n.push(s),s.flags|=65536}}i=0===(n=n||t).length?1:8}else(n=t).flags|=65536,81920&t.flags&&(n=E(t)),i=2;return e.children=n,e.childFlags=i,e}function O(e){return a(e)||r(e)?T(e,null):o(e)?A(e,0,null):16384&e.flags?E(e):e}var F="http://www.w3.org/1999/xlink",j="http://www.w3.org/XML/1998/namespace",D={"xlink:actuate":F,"xlink:arcrole":F,"xlink:href":F,"xlink:role":F,"xlink:show":F,"xlink:title":F,"xlink:type":F,"xml:base":j,"xml:lang":j,"xml:space":j};function z(e){return{onClick:e,onDblClick:e,onFocusIn:e,onFocusOut:e,onKeyDown:e,onKeyPress:e,onKeyUp:e,onMouseDown:e,onMouseMove:e,onMouseUp:e,onTouchEnd:e,onTouchMove:e,onTouchStart:e}}var W=z(0),H=z(null),U=z(!0);function G(e,t){var n=t.$EV;return n||(n=t.$EV=z(null)),n[e]||1==++W[e]&&(H[e]=function(e){var t="onClick"===e||"onDblClick"===e?function(e){return function(t){0===t.button?q(t,!0,e,Q(t)):t.stopPropagation()}}(e):function(e){return function(t){q(t,!1,e,Q(t))}}(e);return document.addEventListener(m(e),t),t}(e)),n}function K(e,t){var n=t.$EV;n&&n[e]&&(0==--W[e]&&(document.removeEventListener(m(e),H[e]),H[e]=null),n[e]=null)}function q(e,t,n,o){var r=function(e){return c(e.composedPath)?e.composedPath()[0]:e.target}(e);do{if(t&&r.disabled)return;var i=r.$EV;if(i){var a=i[n];if(a&&(o.dom=r,a.event?a.event(a.data,e):a(e),e.cancelBubble))return}r=r.parentNode}while(!d(r))}function Y(){this.cancelBubble=!0,this.immediatePropagationStopped||this.stopImmediatePropagation()}function $(){return this.defaultPrevented}function X(){return this.cancelBubble}function Q(e){var t={dom:document};return e.isDefaultPrevented=$,e.isPropagationStopped=X,e.stopPropagation=Y,Object.defineProperty(e,"currentTarget",{configurable:!0,get:function(){return t.dom}}),t}function J(e,t,n){if(e[t]){var o=e[t];o.event?o.event(o.data,n):o(n)}else{var r=t.toLowerCase();e[r]&&e[r](n)}}function Z(e,t){var n=function(n){var o=this.$V;if(o){var r=o.props||p,i=o.dom;if(l(e))J(r,e,n);else for(var a=0;a<e.length;++a)J(r,e[a],n);if(c(t)){var d=this.$V,u=d.props||p;t(u,i,!1,d)}}};return Object.defineProperty(n,"wrapped",{configurable:!1,enumerable:!1,value:!0,writable:!1}),n}function ee(e,t,n){var o="$"+t,r=e[o];if(r){if(r[1].wrapped)return;e.removeEventListener(r[0],r[1]),e[o]=null}c(n)&&(e.addEventListener(t,n),e[o]=[t,n])}function te(e){return"checkbox"===e||"radio"===e}var ne=Z("onInput",ie),oe=Z(["onClick","onChange"],ie);function re(e){e.stopPropagation()}function ie(e,t){var n=e.type,o=e.value,r=e.checked,a=e.multiple,c=e.defaultValue,l=!i(o);n&&n!==t.type&&t.setAttribute("type",n),i(a)||a===t.multiple||(t.multiple=a),i(c)||l||(t.defaultValue=c+""),te(n)?(l&&(t.value=o),i(r)||(t.checked=r)):l&&t.value!==o?(t.defaultValue=o,t.value=o):i(r)||(t.checked=r)}function ae(e,t){if("option"===e.type)!function(e,t){var n=e.props||p,r=e.dom;r.value=n.value,n.value===t||o(t)&&-1!==t.indexOf(n.value)?r.selected=!0:i(t)&&i(n.selected)||(r.selected=n.selected||!1)}(e,t);else{var n=e.children,r=e.flags;if(4&r)ae(n.$LI,t);else if(8&r)ae(n,t);else if(2===e.childFlags)ae(n,t);else if(12&e.childFlags)for(var a=0,c=n.length;a<c;++a)ae(n[a],t)}}re.wrapped=!0;var ce=Z("onChange",le);function le(e,t,n,o){var r=Boolean(e.multiple);i(e.multiple)||r===t.multiple||(t.multiple=r);var a=e.selectedIndex;if(-1===a&&(t.selectedIndex=-1),1!==o.childFlags){var c=e.value;"number"==typeof a&&a>-1&&t.options[a]&&(c=t.options[a].value),n&&i(c)&&(c=e.defaultValue),ae(o,c)}}var de,ue,se=Z("onInput",me),pe=Z("onChange");function me(e,t,n){var o=e.value,r=t.value;if(i(o)){if(n){var a=e.defaultValue;i(a)||a===r||(t.defaultValue=a,t.value=a)}}else r!==o&&(t.defaultValue=o,t.value=o)}function fe(e,t,n,o,r,i){64&e?ie(o,n):256&e?le(o,n,r,t):128&e&&me(o,n,r),i&&(n.$V=t)}function he(e,t,n){64&e?function(e,t){te(t.type)?(ee(e,"change",oe),ee(e,"click",re)):ee(e,"input",ne)}(t,n):256&e?function(e){ee(e,"change",ce)}(t):128&e&&function(e,t){ee(e,"input",se),t.onChange&&ee(e,"change",pe)}(t,n)}function Ce(e){return e.type&&te(e.type)?!i(e.checked):!i(e.value)}function ge(e){e&&!S(e,null)&&e.current&&(e.current=null)}function be(e,t,n){e&&(c(e)||void 0!==e.current)&&n.push((function(){S(e,t)||void 0===e.current||(e.current=t)}))}function Ne(e,t){ve(e),v(e,t)}function ve(e){var t,n=e.flags,o=e.children;if(481&n){t=e.ref;var r=e.props;ge(t);var a=e.childFlags;if(!d(r))for(var l=Object.keys(r),u=0,s=l.length;u<s;u++){var m=l[u];U[m]&&K(m,e.dom)}12&a?Ve(o):2===a&&ve(o)}else o&&(4&n?(c(o.componentWillUnmount)&&o.componentWillUnmount(),ge(e.ref),o.$UN=!0,ve(o.$LI)):8&n?(!i(t=e.ref)&&c(t.onComponentWillUnmount)&&t.onComponentWillUnmount(N(e,!0),e.props||p),ve(o)):1024&n?Ne(o,e.ref):8192&n&&12&e.childFlags&&Ve(o))}function Ve(e){for(var t=0,n=e.length;t<n;++t)ve(e[t])}function ye(e){e.textContent=""}function ke(e,t,n){Ve(n),8192&t.flags?v(t,e):ye(e)}function xe(e,t,n,o){var r=e&&e.__html||"",a=t&&t.__html||"";r!==a&&(i(a)||function(e,t){var n=document.createElement("i");return n.innerHTML=t,n.innerHTML===e.innerHTML}(o,a)||(d(n)||(12&n.childFlags?Ve(n.children):2===n.childFlags&&ve(n.children),n.children=null,n.childFlags=1),o.innerHTML=a))}function _e(e,t,n,o,r,a,d){switch(e){case"children":case"childrenType":case"className":case"defaultValue":case"key":case"multiple":case"ref":case"selectedIndex":break;case"autoFocus":o.autofocus=!!n;break;case"allowfullscreen":case"autoplay":case"capture":case"checked":case"controls":case"default":case"disabled":case"hidden":case"indeterminate":case"loop":case"muted":case"novalidate":case"open":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"selected":o[e]=!!n;break;case"defaultChecked":case"value":case"volume":if(a&&"value"===e)break;var u=i(n)?"":n;o[e]!==u&&(o[e]=u);break;case"style":!function(e,t,n){if(i(t))n.removeAttribute("style");else{var o,r,a=n.style;if(l(t))a.cssText=t;else if(i(e)||l(e))for(o in t)r=t[o],a.setProperty(o,r);else{for(o in t)(r=t[o])!==e[o]&&a.setProperty(o,r);for(o in e)i(t[o])&&a.removeProperty(o)}}}(t,n,o);break;case"dangerouslySetInnerHTML":xe(t,n,d,o);break;default:U[e]?function(e,t,n,o){if(c(n))G(e,o)[e]=n;else if(s(n)){if(w(t,n))return;G(e,o)[e]=n}else K(e,o)}(e,t,n,o):111===e.charCodeAt(0)&&110===e.charCodeAt(1)?function(e,t,n,o){if(s(n)){if(w(t,n))return;n=function(e){var t=e.event;return function(n){t(e.data,n)}}(n)}ee(o,m(e),n)}(e,t,n,o):i(n)?o.removeAttribute(e):r&&D[e]?o.setAttributeNS(D[e],e,n):o.setAttribute(e,n)}}function we(e,t,n,o,r){var i=!1,a=(448&t)>0;for(var c in a&&(i=Ce(n))&&he(t,o,n),n)_e(c,null,n[c],o,r,i,null);a&&fe(t,e,o,n,!0,i)}function Be(e,t,n){var o=O(e.render(t,e.state,n)),r=n;return c(e.getChildContext)&&(r=u(n,e.getChildContext())),e.$CX=r,o}function Se(e,t,n,o,r,i){var a=new t(n,o),l=a.$N=Boolean(t.getDerivedStateFromProps||a.getSnapshotBeforeUpdate);if(a.$SVG=r,a.$L=i,e.children=a,a.$BS=!1,a.context=o,a.props===p&&(a.props=n),l)a.state=y(a,n,a.state);else if(c(a.componentWillMount)){a.$BR=!0,a.componentWillMount();var u=a.$PS;if(!d(u)){var s=a.state;if(d(s))a.state=u;else for(var m in u)s[m]=u[m];a.$PS=null}a.$BR=!1}return a.$LI=Be(a,n,o),a}function Le(e,t,n,o,r,i){var a=e.flags|=16384;481&a?Te(e,t,n,o,r,i):4&a?function(e,t,n,o,r,i){var a=Se(e,e.type,e.props||p,n,o,i);Le(a.$LI,t,a.$CX,o,r,i),Ee(e.ref,a,i)}(e,t,n,o,r,i):8&a?(!function(e,t,n,o,r,i){Le(e.children=O(function(e,t){return 32768&e.flags?e.type.render(e.props||p,e.ref,t):e.type(e.props||p,t)}(e,n)),t,n,o,r,i)}(e,t,n,o,r,i),Me(e,i)):512&a||16&a?Ie(e,t,r):8192&a?function(e,t,n,o,r,i){var a=e.children,c=e.childFlags;12&c&&0===a.length&&(c=e.childFlags=2,a=e.children=M());2===c?Le(a,n,r,o,r,i):Ae(a,n,t,o,r,i)}(e,n,t,o,r,i):1024&a&&function(e,t,n,o,r){Le(e.children,e.ref,t,!1,null,r);var i=M();Ie(i,n,o),e.dom=i.dom}(e,n,t,r,i)}function Ie(e,t,n){var o=e.dom=document.createTextNode(e.children);d(t)||h(t,o,n)}function Te(e,t,n,o,r,a){var c=e.flags,l=e.props,u=e.className,s=e.children,p=e.childFlags,m=e.dom=function(e,t){return t?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e)}(e.type,o=o||(32&c)>0);if(i(u)||""===u||(o?m.setAttribute("class",u):m.className=u),16===p)_(m,s);else if(1!==p){var f=o&&"foreignObject"!==e.type;2===p?(16384&s.flags&&(e.children=s=E(s)),Le(s,m,n,f,null,a)):8!==p&&4!==p||Ae(s,m,n,f,null,a)}d(t)||h(t,m,r),d(l)||we(e,c,l,m,o),be(e.ref,m,a)}function Ae(e,t,n,o,r,i){for(var a=0;a<e.length;++a){var c=e[a];16384&c.flags&&(e[a]=c=E(c)),Le(c,t,n,o,r,i)}}function Ee(e,t,n){be(e,t,n),c(t.componentDidMount)&&n.push(function(e){return function(){e.componentDidMount()}}(t))}function Me(e,t){var n=e.ref;i(n)||(S(n.onComponentWillMount,e.props||p),c(n.onComponentDidMount)&&t.push(function(e,t){return function(){e.onComponentDidMount(N(t,!0),t.props||p)}}(n,e)))}function Pe(e,t,n,o,r,l,s){var m=t.flags|=16384;e.flags!==m||e.type!==t.type||e.key!==t.key||2048&m?16384&e.flags?function(e,t,n,o,r,i){ve(e),0!=(t.flags&e.flags&2033)?(Le(t,null,o,r,null,i),function(e,t,n){e.replaceChild(t,n)}(n,t.dom,e.dom)):(Le(t,n,o,r,N(e,!0),i),v(e,n))}(e,t,n,o,r,s):Le(t,n,o,r,l,s):481&m?function(e,t,n,o,r,a){var c,l=t.dom=e.dom,d=e.props,u=t.props,s=!1,m=!1;if(o=o||(32&r)>0,d!==u){var f=d||p;if((c=u||p)!==p)for(var h in(s=(448&r)>0)&&(m=Ce(c)),c){var C=f[h],g=c[h];C!==g&&_e(h,C,g,l,o,m,e)}if(f!==p)for(var b in f)i(c[b])&&!i(f[b])&&_e(b,f[b],null,l,o,m,e)}var N=t.children,v=t.className;e.className!==v&&(i(v)?l.removeAttribute("class"):o?l.setAttribute("class",v):l.className=v);4096&r?function(e,t){e.textContent!==t&&(e.textContent=t)}(l,N):Re(e.childFlags,t.childFlags,e.children,N,l,n,o&&"foreignObject"!==t.type,null,e,a);s&&fe(r,t,l,c,!1,m);var V=t.ref,y=e.ref;y!==V&&(ge(y),be(V,l,a))}(e,t,o,r,m,s):4&m?function(e,t,n,o,r,i,a){var l=t.children=e.children;if(d(l))return;l.$L=a;var s=t.props||p,m=t.ref,f=e.ref,h=l.state;if(!l.$N){if(c(l.componentWillReceiveProps)){if(l.$BR=!0,l.componentWillReceiveProps(s,o),l.$UN)return;l.$BR=!1}d(l.$PS)||(h=u(h,l.$PS),l.$PS=null)}Oe(l,h,s,n,o,r,!1,i,a),f!==m&&(ge(f),be(m,l,a))}(e,t,n,o,r,l,s):8&m?function(e,t,n,o,r,a,l){var d=!0,u=t.props||p,s=t.ref,m=e.props,f=!i(s),h=e.children;f&&c(s.onComponentShouldUpdate)&&(d=s.onComponentShouldUpdate(m,u));if(!1!==d){f&&c(s.onComponentWillUpdate)&&s.onComponentWillUpdate(m,u);var C=t.type,g=O(32768&t.flags?C.render(u,s,o):C(u,o));Pe(h,g,n,o,r,a,l),t.children=g,f&&c(s.onComponentDidUpdate)&&s.onComponentDidUpdate(m,u)}else t.children=h}(e,t,n,o,r,l,s):16&m?function(e,t){var n=t.children,o=t.dom=e.dom;n!==e.children&&(o.nodeValue=n)}(e,t):512&m?t.dom=e.dom:8192&m?function(e,t,n,o,r,i){var a=e.children,c=t.children,l=e.childFlags,d=t.childFlags,u=null;12&d&&0===c.length&&(d=t.childFlags=2,c=t.children=M());var s=0!=(2&d);if(12&l){var p=a.length;(8&l&&8&d||s||!s&&c.length>p)&&(u=N(a[p-1],!1).nextSibling)}Re(l,d,a,c,n,o,r,u,e,i)}(e,t,n,o,r,s):function(e,t,n,o){var r=e.ref,i=t.ref,c=t.children;if(Re(e.childFlags,t.childFlags,e.children,c,r,n,!1,null,e,o),t.dom=e.dom,r!==i&&!a(c)){var l=c.dom;C(r,l),f(i,l)}}(e,t,o,s)}function Re(e,t,n,o,r,i,a,c,l,d){switch(e){case 2:switch(t){case 2:Pe(n,o,r,i,a,c,d);break;case 1:Ne(n,r);break;case 16:ve(n),_(r,o);break;default:!function(e,t,n,o,r,i){ve(e),Ae(t,n,o,r,N(e,!0),i),v(e,n)}(n,o,r,i,a,d)}break;case 1:switch(t){case 2:Le(o,r,i,a,c,d);break;case 1:break;case 16:_(r,o);break;default:Ae(o,r,i,a,c,d)}break;case 16:switch(t){case 16:!function(e,t,n){e!==t&&(""!==e?n.firstChild.nodeValue=t:_(n,t))}(n,o,r);break;case 2:ye(r),Le(o,r,i,a,c,d);break;case 1:ye(r);break;default:ye(r),Ae(o,r,i,a,c,d)}break;default:switch(t){case 16:Ve(n),_(r,o);break;case 2:ke(r,l,n),Le(o,r,i,a,c,d);break;case 1:ke(r,l,n);break;default:var u=0|n.length,s=0|o.length;0===u?s>0&&Ae(o,r,i,a,c,d):0===s?ke(r,l,n):8===t&&8===e?function(e,t,n,o,r,i,a,c,l,d){var u,s,p=i-1,m=a-1,f=0,h=e[f],C=t[f];e:{for(;h.key===C.key;){if(16384&C.flags&&(t[f]=C=E(C)),Pe(h,C,n,o,r,c,d),e[f]=C,++f>p||f>m)break e;h=e[f],C=t[f]}for(h=e[p],C=t[m];h.key===C.key;){if(16384&C.flags&&(t[m]=C=E(C)),Pe(h,C,n,o,r,c,d),e[p]=C,p--,m--,f>p||f>m)break e;h=e[p],C=t[m]}}if(f>p){if(f<=m)for(s=(u=m+1)<a?N(t[u],!0):c;f<=m;)16384&(C=t[f]).flags&&(t[f]=C=E(C)),++f,Le(C,n,o,r,s,d)}else if(f>m)for(;f<=p;)Ne(e[f++],n);else!function(e,t,n,o,r,i,a,c,l,d,u,s,p){var m,f,h,C=0,g=c,b=c,v=i-c+1,y=a-c+1,k=new Int32Array(y+1),x=v===o,_=!1,w=0,B=0;if(r<4||(v|y)<32)for(C=g;C<=i;++C)if(m=e[C],B<y){for(c=b;c<=a;c++)if(f=t[c],m.key===f.key){if(k[c-b]=C+1,x)for(x=!1;g<C;)Ne(e[g++],l);w>c?_=!0:w=c,16384&f.flags&&(t[c]=f=E(f)),Pe(m,f,l,n,d,u,p),++B;break}!x&&c>a&&Ne(m,l)}else x||Ne(m,l);else{var S={};for(C=b;C<=a;++C)S[t[C].key]=C;for(C=g;C<=i;++C)if(m=e[C],B<y)if(void 0!==(c=S[m.key])){if(x)for(x=!1;C>g;)Ne(e[g++],l);k[c-b]=C+1,w>c?_=!0:w=c,16384&(f=t[c]).flags&&(t[c]=f=E(f)),Pe(m,f,l,n,d,u,p),++B}else x||Ne(m,l);else x||Ne(m,l)}if(x)ke(l,s,e),Ae(t,l,n,d,u,p);else if(_){var L=function(e){var t=0,n=0,o=0,r=0,i=0,a=0,c=0,l=e.length;l>Fe&&(Fe=l,de=new Int32Array(l),ue=new Int32Array(l));for(;n<l;++n)if(0!==(t=e[n])){if(o=de[r],e[o]<t){ue[n]=o,de[++r]=n;continue}for(i=0,a=r;i<a;)e[de[c=i+a>>1]]<t?i=c+1:a=c;t<e[de[i]]&&(i>0&&(ue[n]=de[i-1]),de[i]=n)}i=r+1;var d=new Int32Array(i);a=de[i-1];for(;i-- >0;)d[i]=a,a=ue[a],de[i]=0;return d}(k);for(c=L.length-1,C=y-1;C>=0;C--)0===k[C]?(16384&(f=t[w=C+b]).flags&&(t[w]=f=E(f)),Le(f,l,n,d,(h=w+1)<r?N(t[h],!0):u,p)):c<0||C!==L[c]?V(f=t[w=C+b],l,(h=w+1)<r?N(t[h],!0):u):c--}else if(B!==y)for(C=y-1;C>=0;C--)0===k[C]&&(16384&(f=t[w=C+b]).flags&&(t[w]=f=E(f)),Le(f,l,n,d,(h=w+1)<r?N(t[h],!0):u,p))}(e,t,o,i,a,p,m,f,n,r,c,l,d)}(n,o,r,i,a,u,s,c,l,d):function(e,t,n,o,r,i,a,c,l){for(var d,u,s=i>a?a:i,p=0;p<s;++p)d=t[p],u=e[p],16384&d.flags&&(d=t[p]=E(d)),Pe(u,d,n,o,r,c,l),e[p]=d;if(i<a)for(p=s;p<a;++p)16384&(d=t[p]).flags&&(d=t[p]=E(d)),Le(d,n,o,r,c,l);else if(i>a)for(p=s;p<i;++p)Ne(e[p],n)}(n,o,r,i,a,u,s,c,d)}}}function Oe(e,t,n,o,r,i,a,l,d){var s=e.state,p=e.props,m=Boolean(e.$N),f=c(e.shouldComponentUpdate);if(m&&(t=y(e,n,t!==s?u(s,t):t)),a||!f||f&&e.shouldComponentUpdate(n,t,r)){!m&&c(e.componentWillUpdate)&&e.componentWillUpdate(n,t,r),e.props=n,e.state=t,e.context=r;var h=null,C=Be(e,n,r);m&&c(e.getSnapshotBeforeUpdate)&&(h=e.getSnapshotBeforeUpdate(p,s)),Pe(e.$LI,C,o,e.$CX,i,l,d),e.$LI=C,c(e.componentDidUpdate)&&function(e,t,n,o,r){r.push((function(){e.componentDidUpdate(t,n,o)}))}(e,p,s,h,d)}else e.props=n,e.state=t,e.context=r}var Fe=0;function je(e,t,n,o){var r=[],a=t.$V;k.v=!0,i(a)?i(e)||(16384&e.flags&&(e=E(e)),Le(e,t,o,!1,null,r),t.$V=e,a=e):i(e)?(Ne(a,t),t.$V=null):(16384&e.flags&&(e=E(e)),Pe(a,e,t,o,!1,null,r),a=t.$V=e),g(r),k.v=!1,c(n)&&n(),c(x.renderComplete)&&x.renderComplete(a,t)}function De(e,t,n,o){void 0===n&&(n=null),void 0===o&&(o=p),je(e,t,n,o)}"undefined"!=typeof document&&window.Node&&(Node.prototype.$EV=null,Node.prototype.$V=null);var ze=[],We="undefined"!=typeof Promise?Promise.resolve().then.bind(Promise.resolve()):function(e){window.setTimeout(e,0)},He=!1;function Ue(e,t,n,o){var r=e.$PS;if(c(t)&&(t=t(r?u(e.state,r):e.state,e.props,e.context)),i(r))e.$PS=t;else for(var a in t)r[a]=t[a];if(e.$BR)c(n)&&e.$L.push(n.bind(e));else{if(!k.v&&0===ze.length)return qe(e,o),void(c(n)&&n.call(e));if(-1===ze.indexOf(e)&&ze.push(e),He||(He=!0,We(Ke)),c(n)){var l=e.$QU;l||(l=e.$QU=[]),l.push(n)}}}function Ge(e){for(var t=e.$QU,n=0;n<t.length;++n)t[n].call(e);e.$QU=null}function Ke(){var e;for(He=!1;e=ze.shift();)e.$UN||(qe(e,!1),e.$QU&&Ge(e))}function qe(e,t){if(t||!e.$BR){var n=e.$PS;e.$PS=null;var o=[];k.v=!0,Oe(e,u(e.state,n),e.props,N(e.$LI,!0).parentNode,e.context,e.$SVG,t,null,o),g(o),k.v=!1}else e.state=e.$PS,e.$PS=null}var Ye=function(e,t){this.state=null,this.$BR=!1,this.$BS=!0,this.$PS=null,this.$LI=null,this.$UN=!1,this.$CX=null,this.$QU=null,this.$N=!1,this.$L=null,this.$SVG=!1,this.props=e||p,this.context=t||p};t.Component=Ye,Ye.prototype.forceUpdate=function(e){this.$UN||Ue(this,{},e,!0)},Ye.prototype.setState=function(e,t){this.$UN||this.$BS||Ue(this,e,t,!1)},Ye.prototype.render=function(e,t,n){return null};t.version="7.4.2"},function(e,t,n){"use strict";var o=function(e){var t=Object.prototype,n=t.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},r=o.iterator||"@@iterator",i=o.asyncIterator||"@@asyncIterator",a=o.toStringTag||"@@toStringTag";function c(e,t,n,o){var r=t&&t.prototype instanceof u?t:u,i=Object.create(r.prototype),a=new y(o||[]);return i._invoke=function(e,t,n){var o="suspendedStart";return function(r,i){if("executing"===o)throw new Error("Generator is already running");if("completed"===o){if("throw"===r)throw i;return x()}for(n.method=r,n.arg=i;;){var a=n.delegate;if(a){var c=N(a,n);if(c){if(c===d)continue;return c}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===o)throw o="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o="executing";var u=l(e,t,n);if("normal"===u.type){if(o=n.done?"completed":"suspendedYield",u.arg===d)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(o="completed",n.method="throw",n.arg=u.arg)}}}(e,n,a),i}function l(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(o){return{type:"throw",arg:o}}}e.wrap=c;var d={};function u(){}function s(){}function p(){}var m={};m[r]=function(){return this};var f=Object.getPrototypeOf,h=f&&f(f(k([])));h&&h!==t&&n.call(h,r)&&(m=h);var C=p.prototype=u.prototype=Object.create(m);function g(e){["next","throw","return"].forEach((function(t){e[t]=function(e){return this._invoke(t,e)}}))}function b(e,t){var o;this._invoke=function(r,i){function a(){return new t((function(o,a){!function c(o,r,i,a){var d=l(e[o],e,r);if("throw"!==d.type){var u=d.arg,s=u.value;return s&&"object"==typeof s&&n.call(s,"__await")?t.resolve(s.__await).then((function(e){c("next",e,i,a)}),(function(e){c("throw",e,i,a)})):t.resolve(s).then((function(e){u.value=e,i(u)}),(function(e){return c("throw",e,i,a)}))}a(d.arg)}(r,i,o,a)}))}return o=o?o.then(a,a):a()}}function N(e,t){var n=e.iterator[t.method];if(void 0===n){if(t.delegate=null,"throw"===t.method){if(e.iterator["return"]&&(t.method="return",t.arg=void 0,N(e,t),"throw"===t.method))return d;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return d}var o=l(n,e.iterator,t.arg);if("throw"===o.type)return t.method="throw",t.arg=o.arg,t.delegate=null,d;var r=o.arg;return r?r.done?(t[e.resultName]=r.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,d):r:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,d)}function v(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function V(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function y(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(v,this),this.reset(!0)}function k(e){if(e){var t=e[r];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function t(){for(;++o<e.length;)if(n.call(e,o))return t.value=e[o],t.done=!1,t;return t.value=void 0,t.done=!0,t};return i.next=i}}return{next:x}}function x(){return{value:void 0,done:!0}}return s.prototype=C.constructor=p,p.constructor=s,p[a]=s.displayName="GeneratorFunction",e.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===s||"GeneratorFunction"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,p):(e.__proto__=p,a in e||(e[a]="GeneratorFunction")),e.prototype=Object.create(C),e},e.awrap=function(e){return{__await:e}},g(b.prototype),b.prototype[i]=function(){return this},e.AsyncIterator=b,e.async=function(t,n,o,r,i){void 0===i&&(i=Promise);var a=new b(c(t,n,o,r),i);return e.isGeneratorFunction(n)?a:a.next().then((function(e){return e.done?e.value:a.next()}))},g(C),C[a]="Generator",C[r]=function(){return this},C.toString=function(){return"[object Generator]"},e.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function o(){for(;t.length;){var n=t.pop();if(n in e)return o.value=n,o.done=!1,o}return o.done=!0,o}},e.values=k,y.prototype={constructor:y,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(V),!e)for(var t in this)"t"===t.charAt(0)&&n.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=void 0)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function o(n,o){return a.type="throw",a.arg=e,t.next=n,o&&(t.method="next",t.arg=void 0),!!o}for(var r=this.tryEntries.length-1;r>=0;--r){var i=this.tryEntries[r],a=i.completion;if("root"===i.tryLoc)return o("end");if(i.tryLoc<=this.prev){var c=n.call(i,"catchLoc"),l=n.call(i,"finallyLoc");if(c&&l){if(this.prev<i.catchLoc)return o(i.catchLoc,!0);if(this.prev<i.finallyLoc)return o(i.finallyLoc)}else if(c){if(this.prev<i.catchLoc)return o(i.catchLoc,!0)}else{if(!l)throw new Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return o(i.finallyLoc)}}}},abrupt:function(e,t){for(var o=this.tryEntries.length-1;o>=0;--o){var r=this.tryEntries[o];if(r.tryLoc<=this.prev&&n.call(r,"finallyLoc")&&this.prev<r.finallyLoc){var i=r;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=e,a.arg=t,i?(this.method="next",this.next=i.finallyLoc,d):this.complete(a)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),d},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),V(n),d}},"catch":function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var o=n.completion;if("throw"===o.type){var r=o.arg;V(n)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:k(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),d}},e}(e.exports);try{regeneratorRuntime=o}catch(r){Function("r","regeneratorRuntime = r")(o)}},function(e,t,n){"use strict";!function(t,n){var o,r,i=t.html5||{},a=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,c=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,l=0,d={};function u(){var e=f.elements;return"string"==typeof e?e.split(" "):e}function s(e){var t=d[e._html5shiv];return t||(t={},l++,e._html5shiv=l,d[l]=t),t}function p(e,t,o){return t||(t=n),r?t.createElement(e):(o||(o=s(t)),!(i=o.cache[e]?o.cache[e].cloneNode():c.test(e)?(o.cache[e]=o.createElem(e)).cloneNode():o.createElem(e)).canHaveChildren||a.test(e)||i.tagUrn?i:o.frag.appendChild(i));var i}function m(e){e||(e=n);var t=s(e);return!f.shivCSS||o||t.hasCSS||(t.hasCSS=!!function(e,t){var n=e.createElement("p"),o=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x<style>"+t+"</style>",o.insertBefore(n.lastChild,o.firstChild)}(e,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),r||function(e,t){t.cache||(t.cache={},t.createElem=e.createElement,t.createFrag=e.createDocumentFragment,t.frag=t.createFrag()),e.createElement=function(n){return f.shivMethods?p(n,e,t):t.createElem(n)},e.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+u().join().replace(/[\w\-:]+/g,(function(e){return t.createElem(e),t.frag.createElement(e),'c("'+e+'")'}))+");return n}")(f,t.frag)}(e,t),e}!function(){try{var e=n.createElement("a");e.innerHTML="<xyz></xyz>",o="hidden"in e,r=1==e.childNodes.length||function(){n.createElement("a");var e=n.createDocumentFragment();return"undefined"==typeof e.cloneNode||"undefined"==typeof e.createDocumentFragment||"undefined"==typeof e.createElement}()}catch(t){o=!0,r=!0}}();var f={elements:i.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:"3.7.3",shivCSS:!1!==i.shivCSS,supportsUnknownElements:r,shivMethods:!1!==i.shivMethods,type:"default",shivDocument:m,createElement:p,createDocumentFragment:function(e,t){if(e||(e=n),r)return e.createDocumentFragment();for(var o=(t=t||s(e)).frag.cloneNode(),i=0,a=u(),c=a.length;i<c;i++)o.createElement(a[i]);return o},addElements:function(e,t){var n=f.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof e&&(e=e.join(" ")),f.elements=n+" "+e,m(t)}};t.html5=f,m(n),e.exports&&(e.exports=f)}(window,document)},function(e,t,n){"use strict";!function(e){if(!document.createEvent){var t,n=!0,o=!1,r="__IE8__"+Math.random(),i=Object.defineProperty||function(e,t,n){e[t]=n.value},a=Object.defineProperties||function(t,n){for(var o in n)if(l.call(n,o))try{i(t,o,n[o])}catch(r){e.console}},c=Object.getOwnPropertyDescriptor,l=Object.prototype.hasOwnProperty,d=e.Element.prototype,u=e.Text.prototype,s=/^[a-z]+$/,p=/loaded|complete/,m={},f=document.createElement("div"),h=document.documentElement,C=h.removeAttribute,g=h.setAttribute,b=function(e){return{enumerable:!0,writable:!0,configurable:!0,value:e}};k(e.HTMLCommentElement.prototype,d,"nodeValue"),k(e.HTMLScriptElement.prototype,null,"text"),k(u,null,"nodeValue"),k(e.HTMLTitleElement.prototype,null,"text"),i(e.HTMLStyleElement.prototype,"textContent",(t=c(e.CSSStyleSheet.prototype,"cssText"),y((function(){return t.get.call(this.styleSheet)}),(function(e){t.set.call(this.styleSheet,e)}))));var N=/\b\s*alpha\s*\(\s*opacity\s*=\s*(\d+)\s*\)/;i(e.CSSStyleDeclaration.prototype,"opacity",{get:function(){var e=this.filter.match(N);return e?(e[1]/100).toString():""},set:function(e){this.zoom=1;var t=!1;e=e<1?" alpha(opacity="+Math.round(100*e)+")":"",this.filter=this.filter.replace(N,(function(){return t=!0,e})),!t&&e&&(this.filter+=e)}}),a(d,{textContent:{get:_,set:L},firstElementChild:{get:function(){for(var e=this.childNodes||[],t=0,n=e.length;t<n;t++)if(1==e[t].nodeType)return e[t]}},lastElementChild:{get:function(){for(var e=this.childNodes||[],t=e.length;t--;)if(1==e[t].nodeType)return e[t]}},oninput:{get:function(){return this._oninput||null},set:function(e){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=e,e&&this.addEventListener("input",e))}},previousElementSibling:{get:function(){for(var e=this.previousSibling;e&&1!=e.nodeType;)e=e.previousSibling;return e}},nextElementSibling:{get:function(){for(var e=this.nextSibling;e&&1!=e.nodeType;)e=e.nextSibling;return e}},childElementCount:{get:function(){for(var e=0,t=this.childNodes||[],n=t.length;n--;e+=1==t[n].nodeType);return e}},addEventListener:b((function(e,t,n){if("function"==typeof t||"object"==typeof t){var o,a,c=this,d="on"+e,u=c[r]||i(c,r,{value:{}})[r],p=u[d]||(u[d]={}),h=p.h||(p.h=[]);if(!l.call(p,"w")){if(p.w=function(e){return e[r]||V(c,I(0,e),h,!1)},!l.call(m,d))if(s.test(e)){try{(o=document.createEventObject())[r]=!0,9!=c.nodeType&&(null==c.parentNode&&f.appendChild(c),(a=c.getAttribute(d))&&C.call(c,d)),c.fireEvent(d,o),m[d]=!0}catch(b){for(m[d]=!1;f.hasChildNodes();)f.removeChild(f.firstChild)}null!=a&&g.call(c,d,a)}else m[d]=!1;(p.n=m[d])&&c.attachEvent(d,p.w)}x(h,t)<0&&h[n?"unshift":"push"](t),"input"===e&&c.attachEvent("onkeyup",w)}})),dispatchEvent:b((function(e){var t,n="on"+e.type,o=this[r],i=o&&o[n],a=!!i;return e.target||(e.target=this),a?i.n?this.fireEvent(n,e):V(this,e,i.h,!0):!(t=this.parentNode)||t.dispatchEvent(e),!e.defaultPrevented})),removeEventListener:b((function(e,t,n){if("function"==typeof t||"object"==typeof t){var o="on"+e,i=this[r],a=i&&i[o],c=a&&a.h,l=c?x(c,t):-1;-1<l&&c.splice(l,1)}}))}),a(u,{addEventListener:b(d.addEventListener),dispatchEvent:b(d.dispatchEvent),removeEventListener:b(d.removeEventListener)}),a(e.XMLHttpRequest.prototype,{addEventListener:b((function(e,t,n){var o=this,a="on"+e,c=o[r]||i(o,r,{value:{}})[r],l=c[a]||(c[a]={}),d=l.h||(l.h=[]);x(d,t)<0&&(o[a]||(o[a]=function(){var t=document.createEvent("Event");t.initEvent(e,!0,!0),o.dispatchEvent(t)}),d[n?"unshift":"push"](t))})),dispatchEvent:b((function(e){var t="on"+e.type,n=this[r],o=n&&n[t];return!!o&&(o.n?this.fireEvent(t,e):V(this,e,o.h,!0))})),removeEventListener:b(d.removeEventListener)});var v=c(Event.prototype,"button").get;a(e.Event.prototype,{bubbles:b(!0),cancelable:b(!0),preventDefault:b((function(){this.cancelable&&(this.returnValue=!1)})),stopPropagation:b((function(){this.stoppedPropagation=!0,this.cancelBubble=!0})),stopImmediatePropagation:b((function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()})),initEvent:b((function(e,t,n){this.type=e,this.bubbles=!!t,this.cancelable=!!n,this.bubbles||this.stopPropagation()})),pageX:{get:function(){return this._pageX||(this._pageX=this.clientX+e.scrollX-(h.clientLeft||0))}},pageY:{get:function(){return this._pageY||(this._pageY=this.clientY+e.scrollY-(h.clientTop||0))}},which:{get:function(){return this.keyCode?this.keyCode:isNaN(this.button)?undefined:this.button+1}},charCode:{get:function(){return this.keyCode&&"keypress"==this.type?this.keyCode:0}},buttons:{get:function(){return v.call(this)}},button:{get:function(){var e=this.buttons;return 1&e?0:2&e?2:4&e?1:undefined}},defaultPrevented:{get:function(){var e=this.returnValue;return!(void 0===e||e)}},relatedTarget:{get:function(){var e=this.type;return"mouseover"===e?this.fromElement:"mouseout"===e?this.toElement:null}}}),a(e.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?_.call(this):null},set:function(e){11===this.nodeType&&L.call(this,e)}},addEventListener:b((function(t,o,r){var i=this;d.addEventListener.call(i,t,o,r),n&&"DOMContentLoaded"===t&&!p.test(i.readyState)&&(n=!1,i.attachEvent("onreadystatechange",B),e==top&&function a(e){try{i.documentElement.doScroll("left"),B()}catch(t){setTimeout(a,50)}}())})),dispatchEvent:b(d.dispatchEvent),removeEventListener:b(d.removeEventListener),createEvent:b((function(e){var t;if("Event"!==e)throw new Error("unsupported "+e);return(t=document.createEventObject()).timeStamp=(new Date).getTime(),t}))}),a(e.Window.prototype,{getComputedStyle:b(function(){var e=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,t=/^(top|right|bottom|left)$/,n=/\-([a-z])/g,o=function(e,t){return t.toUpperCase()};function r(e){this._=e}function i(){}return r.prototype.getPropertyValue=function(r){var i,a,c,l=this._,d=l.style,u=l.currentStyle,s=l.runtimeStyle;return"opacity"==r?d.opacity||"1":(r=("float"===r?"style-float":r).replace(n,o),i=u?u[r]:d[r],e.test(i)&&!t.test(r)&&(a=d.left,(c=s&&s.left)&&(s.left=u.left),d.left="fontSize"===r?"1em":i,i=d.pixelLeft+"px",d.left=a,c&&(s.left=c)),null==i?i:i+""||"auto")},i.prototype.getPropertyValue=function(){return null},function(e,t){return t?new i(e):new r(e)}}()),addEventListener:b((function(t,n,o){var i,a=e,c="on"+t;a[c]||(a[c]=function(e){return V(a,I(0,e),i,!1)&&undefined}),x(i=a[c][r]||(a[c][r]=[]),n)<0&&i[o?"unshift":"push"](n)})),dispatchEvent:b((function(t){var n=e["on"+t.type];return!n||!1!==n.call(e,t)&&!t.defaultPrevented})),removeEventListener:b((function(t,n,o){var i=(e["on"+t]||Object)[r],a=i?x(i,n):-1;-1<a&&i.splice(a,1)})),pageXOffset:{get:S("scrollLeft")},pageYOffset:{get:S("scrollTop")},scrollX:{get:S("scrollLeft")},scrollY:{get:S("scrollTop")},innerWidth:{get:S("clientWidth")},innerHeight:{get:S("clientHeight")}}),e.HTMLElement=e.Element,function(e,t,n){for(n=0;n<t.length;n++)document.createElement(t[n]);e.length||document.createStyleSheet(""),e[0].addRule(t.join(","),"display:block;")}(document.styleSheets,["header","nav","section","article","aside","footer"]),function(){if(!document.createRange){document.createRange=function(){return new n};var e=n.prototype;e.cloneContents=function(){for(var e=this._start.ownerDocument.createDocumentFragment(),n=t(this._start,this._end),o=0,r=n.length;o<r;o++)e.appendChild(n[o].cloneNode(!0));return e},e.cloneRange=function(){var e=new n;return e._start=this._start,e._end=this._end,e},e.deleteContents=function(){for(var e=this._start.parentNode,n=t(this._start,this._end),o=0,r=n.length;o<r;o++)e.removeChild(n[o])},e.extractContents=function(){for(var e=this._start.ownerDocument.createDocumentFragment(),n=t(this._start,this._end),o=0,r=n.length;o<r;o++)e.appendChild(n[o]);return e},e.setEndAfter=function(e){this._end=e},e.setEndBefore=function(e){this._end=e.previousSibling},e.setStartAfter=function(e){this._start=e.nextSibling},e.setStartBefore=function(e){this._start=e}}function t(e,t){for(var n=[e];e!==t;)n.push(e=e.nextSibling);return n}function n(){}}()}function V(e,t,n,o){for(var r,i,a=n.slice(),c=function(e,t){return e.currentTarget=t,e.eventPhase=e.target===e.currentTarget?2:3,e}(t,e),l=0,d=a.length;l<d&&("object"==typeof(r=a[l])?"function"==typeof r.handleEvent&&r.handleEvent(c):r.call(e,c),!c.stoppedImmediatePropagation);l++);return i=!c.stoppedPropagation,o&&i&&e.parentNode?e.parentNode.dispatchEvent(c):!c.defaultPrevented}function y(e,t){return{configurable:!0,get:e,set:t}}function k(e,t,n){var o=c(t||e,n);i(e,"textContent",y((function(){return o.get.call(this)}),(function(e){o.set.call(this,e)})))}function x(e,t){for(var n=e.length;n--&&e[n]!==t;);return n}function _(){if("BR"===this.tagName)return"\n";for(var e=this.firstChild,t=[];e;)8!==e.nodeType&&7!==e.nodeType&&t.push(e.textContent),e=e.nextSibling;return t.join("")}function w(e){var t=document.createEvent("Event");t.initEvent("input",!0,!0),(e.srcElement||e.fromElement||document).dispatchEvent(t)}function B(e){!o&&p.test(document.readyState)&&(o=!o,document.detachEvent("onreadystatechange",B),(e=document.createEvent("Event")).initEvent("DOMContentLoaded",!0,!0),document.dispatchEvent(e))}function S(e){return function(){return h[e]||document.body&&document.body[e]||0}}function L(e){for(var t;t=this.lastChild;)this.removeChild(t);null!=e&&this.appendChild(document.createTextNode(e))}function I(t,n){return n||(n=e.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}}(window)},function(e,t,n){"use strict";!function(e){function t(){return s.createDocumentFragment()}function n(e){return s.createElement(e)}function o(e,t){if(!e)throw new Error("Failed to construct "+t+": 1 argument required, but only 0 present.")}function r(e){if(1===e.length)return i(e[0]);for(var n=t(),o=A.call(e),r=0;r<e.length;r++)n.appendChild(i(o[r]));return n}function i(e){return"object"==typeof e?e:s.createTextNode(e)}for(var a,c,l,d,u,s=e.document,p=Object.prototype.hasOwnProperty,m=Object.defineProperty||function(e,t,n){return p.call(n,"value")?e[t]=n.value:(p.call(n,"get")&&e.__defineGetter__(t,n.get),p.call(n,"set")&&e.__defineSetter__(t,n.set)),e},f=[].indexOf||function(e){for(var t=this.length;t--&&this[t]!==e;);return t},h=function(e){var t="undefined"==typeof e.className,n=t?e.getAttribute("class")||"":e.className,o=t||"object"==typeof n,r=(o?t?n:n.baseVal:n).replace(g,"");r.length&&T.push.apply(this,r.split(b)),this._isSVG=o,this._=e},C={get:function(){return new h(this)},set:function(){}},g=/^\s+|\s+$/g,b=/\s+/,N=function(e,t){return this.contains(e)?t||this.remove(e):(t===undefined||t)&&(t=!0,this.add(e)),!!t},v=e.DocumentFragment&&DocumentFragment.prototype,V=e.Node,y=(V||Element).prototype,k=e.CharacterData||V,x=k&&k.prototype,_=e.DocumentType,w=_&&_.prototype,B=(e.Element||V||e.HTMLElement).prototype,S=e.HTMLSelectElement||n("select").constructor,L=S.prototype.remove,I=e.SVGElement,T=["matches",B.matchesSelector||B.webkitMatchesSelector||B.khtmlMatchesSelector||B.mozMatchesSelector||B.msMatchesSelector||B.oMatchesSelector||function(e){var t=this.parentNode;return!!t&&-1<f.call(t.querySelectorAll(e),this)},"closest",function(e){for(var t,n=this;(t=n&&n.matches)&&!n.matches(e);)n=n.parentNode;return t?n:null},"prepend",function(){var e=this.firstChild,t=r(arguments);e?this.insertBefore(t,e):this.appendChild(t)},"append",function(){this.appendChild(r(arguments))},"before",function(){var e=this.parentNode;e&&e.insertBefore(r(arguments),this)},"after",function(){var e=this.parentNode,t=this.nextSibling,n=r(arguments);e&&(t?e.insertBefore(n,t):e.appendChild(n))},"toggleAttribute",function(e,t){var n=this.hasAttribute(e);return 1<arguments.length?n&&!t?this.removeAttribute(e):t&&!n&&this.setAttribute(e,""):n?this.removeAttribute(e):this.setAttribute(e,""),this.hasAttribute(e)},"replace",function(){this.replaceWith.apply(this,arguments)},"replaceWith",function(){var e=this.parentNode;e&&e.replaceChild(r(arguments),this)},"remove",function(){var e=this.parentNode;e&&e.removeChild(this)}],A=T.slice,E=T.length;E;E-=2)if((c=T[E-2])in B||(B[c]=T[E-1]),"remove"!==c||L._dom4||((S.prototype[c]=function(){return 0<arguments.length?L.apply(this,arguments):B.remove.call(this)})._dom4=!0),/^(?:before|after|replace|replaceWith|remove)$/.test(c)&&(k&&!(c in x)&&(x[c]=T[E-1]),_&&!(c in w)&&(w[c]=T[E-1])),/^(?:append|prepend)$/.test(c))if(v)c in v||(v[c]=T[E-1]);else try{t().constructor.prototype[c]=T[E-1]}catch(P){}var M;n("a").matches("a")||(B[c]=(M=B[c],function(e){return M.call(this.parentNode?this:t().appendChild(this),e)})),h.prototype={length:0,add:function(){for(var e,t=0;t<arguments.length;t++)e=arguments[t],this.contains(e)||T.push.call(this,c);this._isSVG?this._.setAttribute("class",""+this):this._.className=""+this},contains:function(e){return function(t){return-1<(E=e.call(this,c=function(e){if(!e)throw"SyntaxError";if(b.test(e))throw"InvalidCharacterError";return e}(t)))}}([].indexOf||function(e){for(E=this.length;E--&&this[E]!==e;);return E}),item:function(e){return this[e]||null},remove:function(){for(var e,t=0;t<arguments.length;t++)e=arguments[t],this.contains(e)&&T.splice.call(this,E,1);this._isSVG?this._.setAttribute("class",""+this):this._.className=""+this},toggle:N,toString:function(){return T.join.call(this," ")}},I&&!("classList"in I.prototype)&&m(I.prototype,"classList",C),"classList"in s.documentElement?((d=n("div").classList).add("a","b","a"),"a b"!=d&&("add"in(l=d.constructor.prototype)||(l=e.TemporaryTokenList.prototype),u=function(e){return function(){for(var t=0;t<arguments.length;)e.call(this,arguments[t++])}},l.add=u(l.add),l.remove=u(l.remove),l.toggle=N)):m(B,"classList",C),"contains"in y||m(y,"contains",{value:function(e){for(;e&&e!==this;)e=e.parentNode;return this===e}}),"head"in s||m(s,"head",{get:function(){return a||(a=s.getElementsByTagName("head")[0])}}),function(){for(var t,n=e.requestAnimationFrame,o=e.cancelAnimationFrame,r=["o","ms","moz","webkit"],i=r.length;!o&&i--;)n=n||e[r[i]+"RequestAnimationFrame"],o=e[r[i]+"CancelAnimationFrame"]||e[r[i]+"CancelRequestAnimationFrame"];o||(n?(t=n,n=function(e){var n=!0;return t((function(){n&&e.apply(this,arguments)})),function(){n=!1}},o=function(e){e()}):(n=function(e){return setTimeout(e,15,15)},o=function(e){clearTimeout(e)})),e.requestAnimationFrame=n,e.cancelAnimationFrame=o}();try{new e.CustomEvent("?")}catch(P){e.CustomEvent=function(e,t){function n(e,t,n,o){this.initEvent(e,t,n),this.detail=o}return function(o,r){var i=s.createEvent(e);if("string"!=typeof o)throw new Error("An event name must be provided");return"Event"==e&&(i.initCustomEvent=n),null==r&&(r=t),i.initCustomEvent(o,r.bubbles,r.cancelable,r.detail),i}}(e.CustomEvent?"CustomEvent":"Event",{bubbles:!1,cancelable:!1,detail:null})}try{new Event("_")}catch(P){P=function(e){function t(e,t){o(arguments.length,"Event");var n=s.createEvent("Event");return t||(t={}),n.initEvent(e,!!t.bubbles,!!t.cancelable),n}return t.prototype=e.prototype,t}(e.Event||function(){}),m(e,"Event",{value:P}),Event!==P&&(Event=P)}try{new KeyboardEvent("_",{})}catch(P){P=function(t){var n,r=0,i={char:"",key:"",location:0,ctrlKey:!1,shiftKey:!1,altKey:!1,metaKey:!1,altGraphKey:!1,repeat:!1,locale:navigator.language,detail:0,bubbles:!1,cancelable:!1,keyCode:0,charCode:0,which:0};try{var a=s.createEvent("KeyboardEvent");a.initKeyboardEvent("keyup",!1,!1,e,"+",3,!0,!1,!0,!1,!1),r="+"==(a.keyIdentifier||a.key)&&3==(a.keyLocation||a.location)&&(a.ctrlKey?a.altKey?1:3:a.shiftKey?2:4)||9}catch(P){}function c(e){for(var t=[],n=["ctrlKey","Control","shiftKey","Shift","altKey","Alt","metaKey","Meta","altGraphKey","AltGraph"],o=0;o<n.length;o+=2)e[n[o]]&&t.push(n[o+1]);return t.join(" ")}function l(e,t){for(var n in t)t.hasOwnProperty(n)&&!t.hasOwnProperty.call(e,n)&&(e[n]=t[n]);return e}function d(e,t,n){try{t[e]=n[e]}catch(P){}}function u(t,a){o(arguments.length,"KeyboardEvent"),a=l(a||{},i);var u,p=s.createEvent(n),m=a.ctrlKey,f=a.shiftKey,h=a.altKey,C=a.metaKey,g=a.altGraphKey,b=r>3?c(a):null,N=String(a.key),v=String(a.char),V=a.location,y=a.keyCode||(a.keyCode=N)&&N.charCodeAt(0)||0,k=a.charCode||(a.charCode=v)&&v.charCodeAt(0)||0,x=a.bubbles,_=a.cancelable,w=a.repeat,B=a.locale,S=a.view||e;if(a.which||(a.which=a.keyCode),"initKeyEvent"in p)p.initKeyEvent(t,x,_,S,m,h,f,C,y,k);else if(0<r&&"initKeyboardEvent"in p){switch(u=[t,x,_,S],r){case 1:u.push(N,V,m,f,h,C,g);break;case 2:u.push(m,h,f,C,y,k);break;case 3:u.push(N,V,m,h,f,C,g);break;case 4:u.push(N,V,b,w,B);break;default:u.push(char,N,V,b,w,B)}p.initKeyboardEvent.apply(p,u)}else p.initEvent(t,x,_);for(N in p)i.hasOwnProperty(N)&&p[N]!==a[N]&&d(N,p,a);return p}return n=0<r?"KeyboardEvent":"Event",u.prototype=t.prototype,u}(e.KeyboardEvent||function(){}),m(e,"KeyboardEvent",{value:P}),KeyboardEvent!==P&&(KeyboardEvent=P)}try{new MouseEvent("_",{})}catch(P){P=function(t){function n(t,n){o(arguments.length,"MouseEvent");var r=s.createEvent("MouseEvent");return n||(n={}),r.initMouseEvent(t,!!n.bubbles,!!n.cancelable,n.view||e,n.detail||1,n.screenX||0,n.screenY||0,n.clientX||0,n.clientY||0,!!n.ctrlKey,!!n.altKey,!!n.shiftKey,!!n.metaKey,n.button||0,n.relatedTarget||null),r}return n.prototype=t.prototype,n}(e.MouseEvent||function(){}),m(e,"MouseEvent",{value:P}),MouseEvent!==P&&(MouseEvent=P)}s.querySelectorAll("*").forEach||function(){function e(e){var t=e.querySelectorAll;e.querySelectorAll=function(e){var n=t.call(this,e);return n.forEach=Array.prototype.forEach,n}}e(s),e(Element.prototype)}();try{s.querySelector(":scope *")}catch(P){!function(){var e="data-scope-"+(1e9*Math.random()>>>0),t=Element.prototype,n=t.querySelector,o=t.querySelectorAll;function r(t,n,o){t.setAttribute(e,null);var r=n.call(t,String(o).replace(/(^|,\s*)(:scope([ >]|$))/g,(function(t,n,o,r){return n+"["+e+"]"+(r||" ")})));return t.removeAttribute(e),r}t.querySelector=function(e){return r(this,n,e)},t.querySelectorAll=function(e){return r(this,o,e)}}()}}(window),function(e){var t=e.WeakMap||function(){var e,t=0,n=!1,o=!1;function r(t,r,i){o=i,n=!1,e=undefined,t.dispatchEvent(r)}function i(e){this.value=e}function c(){t++,this.__ce__=new a("@DOMMap:"+t+Math.random())}return i.prototype.handleEvent=function(t){n=!0,o?t.currentTarget.removeEventListener(t.type,this,!1):e=this.value},c.prototype={constructor:c,"delete":function(e){return r(e,this.__ce__,!0),n},get:function(t){r(t,this.__ce__,!1);var n=e;return e=undefined,n},has:function(e){return r(e,this.__ce__,!1),n},set:function(e,t){return r(e,this.__ce__,!0),e.addEventListener(this.__ce__.type,new i(t),!1),this}},c}();function n(){}function o(e,t,n){function r(e){r.once&&(e.currentTarget.removeEventListener(e.type,t,r),r.removed=!0),r.passive&&(e.preventDefault=o.preventDefault),"function"==typeof r.callback?r.callback.call(this,e):r.callback&&r.callback.handleEvent(e),r.passive&&delete e.preventDefault}return r.type=e,r.callback=t,r.capture=!!n.capture,r.passive=!!n.passive,r.once=!!n.once,r.removed=!1,r}n.prototype=(Object.create||Object)(null),o.preventDefault=function(){};var r,i,a=e.CustomEvent,c=e.dispatchEvent,l=e.addEventListener,d=e.removeEventListener,u=0,s=function(){u++},p=[].indexOf||function(e){for(var t=this.length;t--&&this[t]!==e;);return t},m=function(e){return"".concat(e.capture?"1":"0",e.passive?"1":"0",e.once?"1":"0")};try{l("_",s,{once:!0}),c(new a("_")),c(new a("_")),d("_",s,{once:!0})}catch(f){}1!==u&&(i=new t,r=function(e){if(e){var t=e.prototype;t.addEventListener=function(e){return function(t,r,a){if(a&&"boolean"!=typeof a){var c,l,d,u=i.get(this),s=m(a);u||i.set(this,u=new n),t in u||(u[t]={handler:[],wrap:[]}),l=u[t],(c=p.call(l.handler,r))<0?(c=l.handler.push(r)-1,l.wrap[c]=d=new n):d=l.wrap[c],s in d||(d[s]=o(t,r,a),e.call(this,t,d[s],d[s].capture))}else e.call(this,t,r,a)}}(t.addEventListener),t.removeEventListener=function(e){return function(t,n,o){if(o&&"boolean"!=typeof o){var r,a,c,l,d=i.get(this);if(d&&t in d&&(c=d[t],-1<(a=p.call(c.handler,n))&&(r=m(o))in(l=c.wrap[a]))){for(r in e.call(this,t,l[r],l[r].capture),delete l[r],l)return;c.handler.splice(a,1),c.wrap.splice(a,1),0===c.handler.length&&delete d[t]}}else e.call(this,t,n,o)}}(t.removeEventListener)}},e.EventTarget?r(EventTarget):(r(e.Text),r(e.Element||e.HTMLElement),r(e.HTMLDocument),r(e.Window||{prototype:e}),r(e.XMLHttpRequest)))}(window)},function(e,t,n){"use strict";!function(e){if("undefined"!=typeof e.setAttribute){var t=function(e){return e.replace(/-[a-z]/g,(function(e){return e[1].toUpperCase()}))};e.setProperty=function(e,n){var o=t(e);if(!n)return this.removeAttribute(o);var r=String(n);return this.setAttribute(o,r)},e.getPropertyValue=function(e){var n=t(e);return this.getAttribute(n)||null},e.removeProperty=function(e){var n=t(e),o=this.getAttribute(n);return this.removeAttribute(n),o}}}(CSSStyleDeclaration.prototype)},function(e,t,n){"use strict";window.Int32Array||(window.Int32Array=Array)},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";(function(e){var o=void 0!==e&&e||"undefined"!=typeof self&&self||window,r=Function.prototype.apply;function i(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new i(r.call(setTimeout,o,arguments),clearTimeout)},t.setInterval=function(){return new i(r.call(setInterval,o,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(o,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(419),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||void 0,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||void 0}).call(this,n(74))},function(e,t,n){"use strict";(function(e,t){!function(e,n){if(!e.setImmediate){var o,r,i,a,c,l=1,d={},u=!1,s=e.document,p=Object.getPrototypeOf&&Object.getPrototypeOf(e);p=p&&p.setTimeout?p:e,"[object process]"==={}.toString.call(e.process)?o=function(e){t.nextTick((function(){f(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((i=new MessageChannel).port1.onmessage=function(e){f(e.data)},o=function(e){i.port2.postMessage(e)}):s&&"onreadystatechange"in s.createElement("script")?(r=s.documentElement,o=function(e){var t=s.createElement("script");t.onreadystatechange=function(){f(e),t.onreadystatechange=null,r.removeChild(t),t=null},r.appendChild(t)}):o=function(e){setTimeout(f,0,e)}:(a="setImmediate$"+Math.random()+"$",c=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(a)&&f(+t.data.slice(a.length))},e.addEventListener?e.addEventListener("message",c,!1):e.attachEvent("onmessage",c),o=function(t){e.postMessage(a+t,"*")}),p.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n<t.length;n++)t[n]=arguments[n+1];var r={callback:e,args:t};return d[l]=r,o(l),l++},p.clearImmediate=m}function m(e){delete d[e]}function f(e){if(u)setTimeout(f,0,e);else{var t=d[e];if(t){u=!0;try{!function(e){var t=e.callback,n=e.args;switch(n.length){case 0:t();break;case 1:t(n[0]);break;case 2:t(n[0],n[1]);break;case 3:t(n[0],n[1],n[2]);break;default:t.apply(void 0,n)}}(t)}finally{m(e),u=!1}}}}}("undefined"==typeof self?void 0===e?void 0:e:self)}).call(this,n(74),n(420))},function(e,t,n){"use strict";var o,r,i=e.exports={};function a(){throw new Error("setTimeout has not been defined")}function c(){throw new Error("clearTimeout has not been defined")}function l(e){if(o===setTimeout)return setTimeout(e,0);if((o===a||!o)&&setTimeout)return o=setTimeout,setTimeout(e,0);try{return o(e,0)}catch(t){try{return o.call(null,e,0)}catch(t){return o.call(this,e,0)}}}!function(){try{o="function"==typeof setTimeout?setTimeout:a}catch(e){o=a}try{r="function"==typeof clearTimeout?clearTimeout:c}catch(e){r=c}}();var d,u=[],s=!1,p=-1;function m(){s&&d&&(s=!1,d.length?u=d.concat(u):p=-1,u.length&&f())}function f(){if(!s){var e=l(m);s=!0;for(var t=u.length;t;){for(d=u,u=[];++p<t;)d&&d[p].run();p=-1,t=u.length}d=null,s=!1,function(e){if(r===clearTimeout)return clearTimeout(e);if((r===c||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}(e)}}function h(e,t){this.fun=e,this.array=t}function C(){}i.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];u.push(new h(e,t)),1!==u.length||s||l(f)},h.prototype.run=function(){this.fun.apply(null,this.array)},i.title="browser",i.browser=!0,i.env={},i.argv=[],i.version="",i.versions={},i.on=C,i.addListener=C,i.once=C,i.off=C,i.removeListener=C,i.removeAllListeners=C,i.emit=C,i.prependListener=C,i.prependOnceListener=C,i.listeners=function(e){return[]},i.binding=function(e){throw new Error("process.binding is not supported")},i.cwd=function(){return"/"},i.chdir=function(e){throw new Error("process.chdir is not supported")},i.umask=function(){return 0}},function(e,t,n){"use strict";t.__esModule=!0,t.storage=t.STORAGE_INDEXED_DB=t.STORAGE_LOCAL_STORAGE=t.STORAGE_NONE=void 0;t.STORAGE_NONE=0;t.STORAGE_LOCAL_STORAGE=1;t.STORAGE_INDEXED_DB=2;var o=function(){try{return Boolean(window.localStorage&&window.localStorage.getItem)}catch(e){return!1}}()&&{get:function(e){var t=localStorage.getItem(e);if("string"==typeof t)return JSON.parse(t)},set:function(e,t){localStorage.setItem(e,JSON.stringify(t))},remove:function(e){localStorage.removeItem(e)},clear:function(){localStorage.clear()},engine:1}||function(){var e={};return{get:function(t){return e[t]},set:function(t,n){e[t]=n},remove:function(t){e[t]=undefined},clear:function(){e={}},engine:0}}();t.storage=o},function(e,t,n){"use strict";t.__esModule=!0,t.combineReducers=t.applyMiddleware=t.createStore=void 0;var o=n(30);function r(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return i(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return i(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}t.createStore=function a(e,t){if(t)return t(a)(e);var n,o=[],r=function(t){n=e(n,t),o.forEach((function(e){return e()}))};return r({type:"@@INIT"}),{dispatch:r,subscribe:function(e){o.push(e)},getState:function(){return n}}};t.applyMiddleware=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){return function(n){for(var r=arguments.length,i=new Array(r>1?r-1:0),a=1;a<r;a++)i[a-1]=arguments[a];var c=e.apply(void 0,[n].concat(i)),l=function(){throw new Error("Dispatching while constructing your middleware is not allowed.")},d={getState:c.getState,dispatch:function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];return l.apply(void 0,[e].concat(n))}},u=t.map((function(e){return e(d)}));return l=o.compose.apply(void 0,u)(c.dispatch),Object.assign({},c,{dispatch:l})}}};t.combineReducers=function(e){var t=Object.keys(e),n=!1;return function(o,i){for(var a,c=Object.assign({},o),l=r(t);!(a=l()).done;){var d=a.value,u=e[d],s=o[d],p=u(s,i);s!==p&&(n=!0,c[d]=p)}return n?c:o}}},function(e,t,n){"use strict";(function(e){var n;n=void 0!==e?e:void 0,t.loadCSS=function(e,t,o,r){var i,a=n.document,c=a.createElement("link");if(t)i=t;else{var l=(a.body||a.getElementsByTagName("head")[0]).childNodes;i=l[l.length-1]}var d=a.styleSheets;if(r)for(var u in r)r.hasOwnProperty(u)&&c.setAttribute(u,r[u]);c.rel="stylesheet",c.href=e,c.media="only x",function m(e){if(a.body)return e();setTimeout((function(){m(e)}))}((function(){i.parentNode.insertBefore(c,t?i:i.nextSibling)}));var s=function f(e){for(var t=c.href,n=d.length;n--;)if(d[n].href===t)return e();setTimeout((function(){f(e)}))};function p(){c.addEventListener&&c.removeEventListener("load",p),c.media=o||"all"}return c.addEventListener&&c.addEventListener("load",p),c.onloadcssdefined=s,s(p),c}}).call(this,n(74))},function(e,t,n){"use strict";t.__esModule=!0,t.getRoutedComponent=void 0;var o=n(0),r=n(1),i=(n(121),n(2)),a=n(446),c=function(e,t){return function(){return(0,o.createComponentVNode)(2,i.Window,{resizable:!0,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:["notFound"===e&&(0,o.createVNode)(1,"div",null,[(0,o.createTextVNode)("Interface "),(0,o.createVNode)(1,"b",null,t,0),(0,o.createTextVNode)(" was not found.")],4),"missingExport"===e&&(0,o.createVNode)(1,"div",null,[(0,o.createTextVNode)("Interface "),(0,o.createVNode)(1,"b",null,t,0),(0,o.createTextVNode)(" is missing an export.")],4)]})})}},l=function(){return(0,o.createComponentVNode)(2,i.Window,{resizable:!0,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0})})};t.getRoutedComponent=function(e){var t=(0,r.selectBackend)(e),n=t.suspended,o=t.config;if(n)return l;var i,d=null==o?void 0:o["interface"];try{i=a("./"+d+".js")}catch(s){if("MODULE_NOT_FOUND"===s.code)return c("notFound",d);throw s}var u=i[d];return u||c("missingExport",d)}},function(e,t,n){"use strict";var o,r;t.__esModule=!0,t.VNodeFlags=t.ChildFlags=void 0,t.VNodeFlags=o,function(e){e[e.HtmlElement=1]="HtmlElement",e[e.ComponentUnknown=2]="ComponentUnknown",e[e.ComponentClass=4]="ComponentClass",e[e.ComponentFunction=8]="ComponentFunction",e[e.Text=16]="Text",e[e.SvgElement=32]="SvgElement",e[e.InputElement=64]="InputElement",e[e.TextareaElement=128]="TextareaElement",e[e.SelectElement=256]="SelectElement",e[e.Void=512]="Void",e[e.Portal=1024]="Portal",e[e.ReCreate=2048]="ReCreate",e[e.ContentEditable=4096]="ContentEditable",e[e.Fragment=8192]="Fragment",e[e.InUse=16384]="InUse",e[e.ForwardRef=32768]="ForwardRef",e[e.Normalized=65536]="Normalized",e[e.ForwardRefComponent=32776]="ForwardRefComponent",e[e.FormElement=448]="FormElement",e[e.Element=481]="Element",e[e.Component=14]="Component",e[e.DOMRef=2033]="DOMRef",e[e.InUseOrNormalized=81920]="InUseOrNormalized",e[e.ClearInUse=-16385]="ClearInUse",e[e.ComponentKnown=12]="ComponentKnown"}(o||(t.VNodeFlags=o={})),t.ChildFlags=r,function(e){e[e.UnknownChildren=0]="UnknownChildren",e[e.HasInvalidChildren=1]="HasInvalidChildren",e[e.HasVNodeChildren=2]="HasVNodeChildren",e[e.HasNonKeyedChildren=4]="HasNonKeyedChildren",e[e.HasKeyedChildren=8]="HasKeyedChildren",e[e.HasTextChildren=16]="HasTextChildren",e[e.MultipleChildren=12]="MultipleChildren"}(r||(t.ChildFlags=r={}))},function(e,t,n){"use strict";t.__esModule=!0,t.NtosWindow=void 0;var o=n(0),r=n(60),i=n(1),a=n(3),c=n(122),l=n(176),d=function(e,t){var n=e.title,d=e.width,u=void 0===d?575:d,s=e.height,p=void 0===s?700:s,m=e.resizable,f=e.theme,h=void 0===f?"ntos":f,C=e.children,g=(0,i.useBackend)(t),b=g.act,N=g.data,v=N.PC_device_theme,V=N.PC_batteryicon,y=N.PC_showbatteryicon,k=N.PC_batterypercent,x=N.PC_ntneticon,_=N.PC_apclinkicon,w=N.PC_stationtime,B=N.PC_programheaders,S=void 0===B?[]:B,L=N.PC_showexitprogram;return(0,o.createComponentVNode)(2,l.Window,{title:n,width:u,height:p,theme:h,resizable:m,children:(0,o.createVNode)(1,"div","NtosWindow",[(0,o.createVNode)(1,"div","NtosWindow__header NtosHeader",[(0,o.createVNode)(1,"div","NtosHeader__left",[(0,o.createComponentVNode)(2,a.Box,{inline:!0,bold:!0,mr:2,children:w}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,italic:!0,mr:2,opacity:.33,children:["ntos"===v&&"NtOS","syndicate"===v&&"Syndix"]})],4),(0,o.createVNode)(1,"div","NtosHeader__right",[S.map((function(e){return(0,o.createComponentVNode)(2,a.Box,{inline:!0,mr:1,children:(0,o.createVNode)(1,"img","NtosHeader__icon",null,1,{src:(0,r.resolveAsset)(e.icon)})},e.icon)})),(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:x&&(0,o.createVNode)(1,"img","NtosHeader__icon",null,1,{src:(0,r.resolveAsset)(x)})}),!!y&&V&&(0,o.createComponentVNode)(2,a.Box,{inline:!0,mr:1,children:[V&&(0,o.createVNode)(1,"img","NtosHeader__icon",null,1,{src:(0,r.resolveAsset)(V)}),k&&k]}),_&&(0,o.createComponentVNode)(2,a.Box,{inline:!0,mr:1,children:(0,o.createVNode)(1,"img","NtosHeader__icon",null,1,{src:(0,r.resolveAsset)(_)})}),!!L&&(0,o.createComponentVNode)(2,a.Button,{width:"26px",lineHeight:"22px",textAlign:"center",color:"transparent",icon:"window-minimize-o",tooltip:"Minimize",tooltipPosition:"bottom",onClick:function(){return b("PC_minimize")}}),!!L&&(0,o.createComponentVNode)(2,a.Button,{mr:"-3px",width:"26px",lineHeight:"22px",textAlign:"center",color:"transparent",icon:"window-close-o",tooltip:"Close",tooltipPosition:"bottom-left",onClick:function(){return b("PC_exit")}}),!L&&(0,o.createComponentVNode)(2,a.Button,{mr:"-3px",width:"26px",lineHeight:"22px",textAlign:"center",color:"transparent",icon:"power-off",tooltip:"Power off",tooltipPosition:"bottom-left",onClick:function(){return b("PC_shutdown")}})],0)],4,{onMouseDown:function(){(0,c.refocusLayout)()}}),C],0)})};t.NtosWindow=d;d.Content=function(e){return(0,o.createVNode)(1,"div","NtosWindow__content",(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.Window.Content,Object.assign({},e))),2)}},function(e,t,n){"use strict";t.__esModule=!0,t.BlockQuote=void 0;var o=n(0),r=n(6),i=n(17);t.BlockQuote=function(e){var t=e.className,n=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,["className"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({className:(0,r.classes)(["BlockQuote",t])},n)))}},function(e,t,n){"use strict";t.__esModule=!0,t.ByondUi=void 0;var o=n(0),r=n(6),i=n(429),a=n(44),c=n(17);function l(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var d=(0,a.createLogger)("ByondUi"),u=[];window.addEventListener("beforeunload",(function(){for(var e=0;e<u.length;e++){var t=u[e];"string"==typeof t&&(d.log("unmounting '"+t+"' (beforeunload)"),u[e]=null,Byond.winset(t,{parent:""}))}}));var s=function(e){var t,n;function a(t){var n,r;return(r=e.call(this,t)||this).containerRef=(0,o.createRef)(),r.byondUiElement=function(e){var t=u.length;u.push(null);var n=e||"byondui_"+t;return d.log("allocated '"+n+"'"),{render:function(e){d.log("rendering '"+n+"'"),u[t]=n,Byond.winset(n,e)},unmount:function(){d.log("unmounting '"+n+"'"),u[t]=null,Byond.winset(n,{parent:""})}}}(null==(n=t.params)?void 0:n.id),r.handleResize=(0,i.debounce)((function(){r.forceUpdate()}),100),r}n=e,(t=a).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var s=a.prototype;return s.shouldComponentUpdate=function(e){var t=this.props,n=t.params,o=void 0===n?{}:n,i=l(t,["params"]),a=e.params,c=void 0===a?{}:a,d=l(e,["params"]);return(0,r.shallowDiffers)(o,c)||(0,r.shallowDiffers)(i,d)},s.componentDidMount=function(){Byond.IS_LTE_IE10||(window.addEventListener("resize",this.handleResize),this.componentDidUpdate(),this.handleResize())},s.componentDidUpdate=function(){if(!Byond.IS_LTE_IE10){var e,t,n=this.props.params,o=void 0===n?{}:n,r=(e=this.containerRef.current,{pos:[(t=e.getBoundingClientRect()).left,t.top],size:[t.right-t.left,t.bottom-t.top]});d.log("bounding box",r),this.byondUiElement.render(Object.assign({parent:window.__windowId__},o,{pos:r.pos[0]+","+r.pos[1],size:r.size[0]+"x"+r.size[1]}))}},s.componentWillUnmount=function(){Byond.IS_LTE_IE10||(window.removeEventListener("resize",this.handleResize),this.byondUiElement.unmount())},s.render=function(){var e=this.props,t=e.params,n=l(e,["params"]),r=(null==t||t.type,(0,c.computeBoxProps)(n));return(0,o.normalizeProps)((0,o.createVNode)(1,"div",null,(0,o.createVNode)(1,"div",null,null,1,{style:{"min-height":"22px"}}),0,Object.assign({},r),null,this.containerRef))},a}(o.Component);t.ByondUi=s},function(e,t,n){"use strict";t.__esModule=!0,t.debounce=void 0;t.debounce=function(e,t,n){var o;return void 0===n&&(n=!1),function(){for(var r=arguments.length,i=new Array(r),a=0;a<r;a++)i[a]=arguments[a];var c=function(){o=null,n||e.apply(void 0,i)},l=n&&!o;clearTimeout(o),o=setTimeout(c,t),l&&e.apply(void 0,i)}}},function(e,t,n){"use strict";t.__esModule=!0,t.Chart=void 0;var o=n(0),r=n(15),i=n(6),a=n(17);var c=function(e){var t,n;function i(t){var n;return(n=e.call(this,t)||this).ref=(0,o.createRef)(),n.state={viewBox:[600,200]},n.handleResize=function(){var e=n.ref.current;n.setState({viewBox:[e.offsetWidth,e.offsetHeight]})},n}n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var c=i.prototype;return c.componentDidMount=function(){window.addEventListener("resize",this.handleResize),this.handleResize()},c.componentWillUnmount=function(){window.removeEventListener("resize",this.handleResize)},c.render=function(){var e=this,t=this.props,n=t.data,i=void 0===n?[]:n,c=t.rangeX,l=t.rangeY,d=t.fillColor,u=void 0===d?"none":d,s=t.strokeColor,p=void 0===s?"#ffffff":s,m=t.strokeWidth,f=void 0===m?2:m,h=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(t,["data","rangeX","rangeY","fillColor","strokeColor","strokeWidth"]),C=this.state.viewBox,g=function(e,t,n,o){if(0===e.length)return[];var i=(0,r.zipWith)(Math.min).apply(void 0,e),a=(0,r.zipWith)(Math.max).apply(void 0,e);return n!==undefined&&(i[0]=n[0],a[0]=n[1]),o!==undefined&&(i[1]=o[0],a[1]=o[1]),(0,r.map)((function(e){return(0,r.zipWith)((function(e,t,n,o){return(e-t)/(n-t)*o}))(e,i,a,t)}))(e)}(i,C,c,l);if(g.length>0){var b=g[0],N=g[g.length-1];g.push([C[0]+f,N[1]]),g.push([C[0]+f,-f]),g.push([-f,-f]),g.push([-f,b[1]])}var v=function(e){for(var t="",n=0;n<e.length;n++){var o=e[n];t+=o[0]+","+o[1]+" "}return t}(g);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({position:"relative"},h,{children:function(t){return(0,o.normalizeProps)((0,o.createVNode)(1,"div",null,(0,o.createVNode)(32,"svg",null,(0,o.createVNode)(32,"polyline",null,null,1,{transform:"scale(1, -1) translate(0, -"+C[1]+")",fill:u,stroke:p,"stroke-width":f,points:v}),2,{viewBox:"0 0 "+C[0]+" "+C[1],preserveAspectRatio:"none",style:{position:"absolute",top:0,left:0,right:0,bottom:0,overflow:"hidden"}}),2,Object.assign({},t),null,e.ref))}})))},i}(o.Component);c.defaultHooks=i.pureComponentHooks;var l={Line:Byond.IS_LTE_IE8?function(e){return null}:c};t.Chart=l},function(e,t,n){"use strict";t.__esModule=!0,t.Collapsible=void 0;var o=n(0),r=n(17),i=n(124);var a=function(e){var t,n;function a(t){var n;n=e.call(this,t)||this;var o=t.open;return n.state={open:o||!1},n}return n=e,(t=a).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n,a.prototype.render=function(){var e=this,t=this.props,n=this.state.open,a=t.children,c=t.color,l=void 0===c?"default":c,d=t.title,u=t.buttons,s=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(t,["children","color","title","buttons"]);return(0,o.createComponentVNode)(2,r.Box,{mb:1,children:[(0,o.createVNode)(1,"div","Table",[(0,o.createVNode)(1,"div","Table__cell",(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Button,Object.assign({fluid:!0,color:l,icon:n?"chevron-down":"chevron-right",onClick:function(){return e.setState({open:!n})}},s,{children:d}))),2),u&&(0,o.createVNode)(1,"div","Table__cell Table__cell--collapsing",u,0)],0),n&&(0,o.createComponentVNode)(2,r.Box,{mt:1,children:a})]})},a}(o.Component);t.Collapsible=a},function(e,t,n){"use strict";t.__esModule=!0,t.ColorBox=void 0;var o=n(0),r=n(6),i=n(17);var a=function(e){var t=e.content,n=(e.children,e.className),a=e.color,c=e.backgroundColor,l=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,["content","children","className","color","backgroundColor"]);return l.color=t?null:"transparent",l.backgroundColor=a||c,(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["ColorBox",n,(0,i.computeBoxClassName)(l)]),t||".",0,Object.assign({},(0,i.computeBoxProps)(l))))};t.ColorBox=a,a.defaultHooks=r.pureComponentHooks},function(e,t,n){"use strict";t.__esModule=!0,t.Dropdown=void 0;var o=n(0),r=n(6),i=n(17),a=n(125);function c(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var l=function(e){var t,n;function l(t){var n;return(n=e.call(this,t)||this).state={selected:t.selected,open:!1},n.handleClick=function(){n.state.open&&n.setOpen(!1)},n}n=e,(t=l).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var d=l.prototype;return d.componentWillUnmount=function(){window.removeEventListener("click",this.handleClick)},d.setOpen=function(e){var t=this;this.setState({open:e}),e?(setTimeout((function(){return window.addEventListener("click",t.handleClick)})),this.menuRef.focus()):window.removeEventListener("click",this.handleClick)},d.setSelected=function(e){this.setState({selected:e}),this.setOpen(!1),this.props.onSelected(e)},d.buildMenu=function(){var e=this,t=this.props.options,n=(void 0===t?[]:t).map((function(t){return(0,o.createVNode)(1,"div","Dropdown__menuentry",t,0,{onClick:function(){e.setSelected(t)}},t)}));return n.length?n:"No Options Found"},d.render=function(){var e=this,t=this.props,n=t.color,l=void 0===n?"default":n,d=t.over,u=t.noscroll,s=t.nochevron,p=t.width,m=(t.onClick,t.selected,t.disabled),f=c(t,["color","over","noscroll","nochevron","width","onClick","selected","disabled"]),h=f.className,C=c(f,["className"]),g=d?!this.state.open:this.state.open,b=this.state.open?(0,o.createVNode)(1,"div",(0,r.classes)([u?"Dropdown__menu-noscroll":"Dropdown__menu",d&&"Dropdown__over"]),this.buildMenu(),0,{tabIndex:"-1",style:{width:p}},null,(function(t){e.menuRef=t})):null;return(0,o.createVNode)(1,"div","Dropdown",[(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({width:p,className:(0,r.classes)(["Dropdown__control","Button","Button--color--"+l,m&&"Button--disabled",h])},C,{onClick:function(){m&&!e.state.open||e.setOpen(!e.state.open)},children:[(0,o.createVNode)(1,"span","Dropdown__selected-text",this.state.selected,0),!!s||(0,o.createVNode)(1,"span","Dropdown__arrow-button",(0,o.createComponentVNode)(2,a.Icon,{name:g?"chevron-up":"chevron-down"}),2)]}))),b],0)},l}(o.Component);t.Dropdown=l},function(e,t,n){"use strict";t.__esModule=!0,t.GridColumn=t.Grid=void 0;var o=n(0),r=n(174),i=n(6);function a(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var c=function(e){var t=e.children,n=a(e,["children"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Table,Object.assign({},n,{children:(0,o.createComponentVNode)(2,r.Table.Row,{children:t})})))};t.Grid=c,c.defaultHooks=i.pureComponentHooks;var l=function(e){var t=e.size,n=void 0===t?1:t,i=e.style,c=a(e,["size","style"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Table.Cell,Object.assign({style:Object.assign({width:n+"%"},i)},c)))};t.GridColumn=l,c.defaultHooks=i.pureComponentHooks,c.Column=l},function(e,t,n){"use strict";t.__esModule=!0,t.Input=void 0;var o=n(0),r=n(6),i=n(17);function a(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var c=function(e){return(0,r.isFalsy)(e)?"":e},l=function(e){var t,n;function l(){var t;return(t=e.call(this)||this).inputRef=(0,o.createRef)(),t.state={editing:!1},t.handleInput=function(e){var n=t.state.editing,o=t.props.onInput;n||t.setEditing(!0),o&&o(e,e.target.value)},t.handleFocus=function(e){t.state.editing||t.setEditing(!0)},t.handleBlur=function(e){var n=t.state.editing,o=t.props.onChange;n&&(t.setEditing(!1),o&&o(e,e.target.value))},t.handleKeyDown=function(e){var n=t.props,o=n.onInput,r=n.onChange,i=n.onEnter;return 13===e.keyCode?(t.setEditing(!1),r&&r(e,e.target.value),o&&o(e,e.target.value),i&&i(e,e.target.value),void(t.props.selfClear?e.target.value="":e.target.blur())):27===e.keyCode?(t.setEditing(!1),e.target.value=c(t.props.value),void e.target.blur()):void 0},t}n=e,(t=l).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var d=l.prototype;return d.componentDidMount=function(){var e=this.props.value,t=this.inputRef.current;t&&(t.value=c(e)),this.props.autoFocus&&setTimeout((function(){return t.focus()}),1)},d.componentDidUpdate=function(e,t){var n=this.state.editing,o=e.value,r=this.props.value,i=this.inputRef.current;i&&!n&&o!==r&&(i.value=c(r))},d.setEditing=function(e){this.setState({editing:e})},d.render=function(){var e=this.props,t=(e.selfClear,e.onInput,e.onChange,e.onEnter,e.value,e.maxLength),n=e.placeholder,c=a(e,["selfClear","onInput","onChange","onEnter","value","maxLength","placeholder"]),l=c.className,d=c.fluid,u=a(c,["className","fluid"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({className:(0,r.classes)(["Input",d&&"Input--fluid",l])},u,{children:[(0,o.createVNode)(1,"div","Input__baseline",".",16),(0,o.createVNode)(64,"input","Input__input",null,1,{placeholder:n,onInput:this.handleInput,onFocus:this.handleFocus,onBlur:this.handleBlur,onKeyDown:this.handleKeyDown,maxLength:t},null,this.inputRef)]})))},l}(o.Component);t.Input=l},function(e,t,n){"use strict";t.__esModule=!0,t.Knob=void 0;var o=n(0),r=n(16),i=n(6),a=n(17),c=n(126),l=n(128);t.Knob=function(e){if(Byond.IS_LTE_IE8)return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.NumberInput,Object.assign({},e)));var t=e.animated,n=e.format,d=e.maxValue,u=e.minValue,s=e.onChange,p=e.onDrag,m=e.step,f=e.stepPixelSize,h=e.suppressFlicker,C=e.unit,g=e.value,b=e.className,N=e.style,v=e.fillValue,V=e.color,y=e.ranges,k=void 0===y?{}:y,x=e.size,_=e.bipolar,w=(e.children,function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,["animated","format","maxValue","minValue","onChange","onDrag","step","stepPixelSize","suppressFlicker","unit","value","className","style","fillValue","color","ranges","size","bipolar","children"]));return(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.DraggableControl,Object.assign({dragMatrix:[0,-1]},{animated:t,format:n,maxValue:d,minValue:u,onChange:s,onDrag:p,step:m,stepPixelSize:f,suppressFlicker:h,unit:C,value:g},{children:function(e){var t=e.dragging,n=(e.editing,e.value),c=e.displayValue,l=e.displayElement,s=e.inputElement,p=e.handleDragStart,m=(0,r.scale)(null!=v?v:c,u,d),f=(0,r.scale)(c,u,d),h=V||(0,r.keyOfMatchingRange)(null!=v?v:n,k)||"default",C=270*(f-.5);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,i.classes)(["Knob","Knob--color--"+h,_&&"Knob--bipolar",b,(0,a.computeBoxClassName)(w)]),[(0,o.createVNode)(1,"div","Knob__circle",(0,o.createVNode)(1,"div","Knob__cursorBox",(0,o.createVNode)(1,"div","Knob__cursor"),2,{style:{transform:"rotate("+C+"deg)"}}),2),t&&(0,o.createVNode)(1,"div","Knob__popupValue",l,0),(0,o.createVNode)(32,"svg","Knob__ring Knob__ringTrackPivot",(0,o.createVNode)(32,"circle","Knob__ringTrack",null,1,{cx:"50",cy:"50",r:"50"}),2,{viewBox:"0 0 100 100"}),(0,o.createVNode)(32,"svg","Knob__ring Knob__ringFillPivot",(0,o.createVNode)(32,"circle","Knob__ringFill",null,1,{style:{"stroke-dashoffset":((_?2.75:2)-1.5*m)*Math.PI*50},cx:"50",cy:"50",r:"50"}),2,{viewBox:"0 0 100 100"}),s],0,Object.assign({},(0,a.computeBoxProps)(Object.assign({style:Object.assign({"font-size":x+"rem"},N)},w)),{onMouseDown:p})))}})))}},function(e,t,n){"use strict";t.__esModule=!0,t.LabeledControls=void 0;var o=n(0),r=n(127);function i(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var a=function(e){var t=e.children,n=i(e,["children"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Flex,Object.assign({mx:-.5,align:"stretch",justify:"space-between"},n,{children:t})))};t.LabeledControls=a;a.Item=function(e){var t=e.label,n=e.children,a=i(e,["label","children"]);return(0,o.createComponentVNode)(2,r.Flex.Item,{mx:1,children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Flex,Object.assign({minWidth:"52px",height:"100%",direction:"column",align:"center",textAlign:"center",justify:"space-between"},a,{children:[(0,o.createComponentVNode)(2,r.Flex.Item),(0,o.createComponentVNode)(2,r.Flex.Item,{children:n}),(0,o.createComponentVNode)(2,r.Flex.Item,{color:"label",children:t})]})))})}},function(e,t,n){"use strict";t.__esModule=!0,t.Modal=void 0;var o=n(0),r=n(6),i=n(17),a=n(172);t.Modal=function(e){var t=e.className,n=e.children,c=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,["className","children"]);return(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Modal",t,(0,i.computeBoxClassName)(c)]),n,0,Object.assign({},(0,i.computeBoxProps)(c))))})}},function(e,t,n){"use strict";t.__esModule=!0,t.NoticeBox=void 0;var o=n(0),r=n(6),i=n(17);var a=function(e){var t=e.className,n=e.color,a=e.info,c=(e.warning,e.success),l=e.danger,d=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,["className","color","info","warning","success","danger"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({className:(0,r.classes)(["NoticeBox",n&&"NoticeBox--color--"+n,a&&"NoticeBox--type--info",c&&"NoticeBox--type--success",l&&"NoticeBox--type--danger",t])},d)))};t.NoticeBox=a,a.defaultHooks=r.pureComponentHooks},function(e,t,n){"use strict";t.__esModule=!0,t.ProgressBar=void 0;var o=n(0),r=n(16),i=n(6),a=n(17);var c=function(e){var t=e.className,n=e.value,c=e.minValue,l=void 0===c?0:c,d=e.maxValue,u=void 0===d?1:d,s=e.color,p=e.ranges,m=void 0===p?{}:p,f=e.children,h=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,["className","value","minValue","maxValue","color","ranges","children"]),C=(0,r.scale)(n,l,u),g=f!==undefined,b=s||(0,r.keyOfMatchingRange)(n,m)||"default";return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,i.classes)(["ProgressBar","ProgressBar--color--"+b,t,(0,a.computeBoxClassName)(h)]),[(0,o.createVNode)(1,"div","ProgressBar__fill ProgressBar__fill--animated",null,1,{style:{width:100*(0,r.clamp01)(C)+"%"}}),(0,o.createVNode)(1,"div","ProgressBar__content",g?f:(0,r.toFixed)(100*C)+"%",0)],4,Object.assign({},(0,a.computeBoxProps)(h))))};t.ProgressBar=c,c.defaultHooks=i.pureComponentHooks},function(e,t,n){"use strict";t.__esModule=!0,t.Section=void 0;var o=n(0),r=n(6),i=n(17);var a=function(e){var t=e.className,n=e.title,a=e.level,c=void 0===a?1:a,l=e.buttons,d=e.fill,u=e.children,s=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,["className","title","level","buttons","fill","children"]),p=!(0,r.isFalsy)(n)||!(0,r.isFalsy)(l),m=!(0,r.isFalsy)(u);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Section","Section--level--"+c,d&&"Section--fill",t].concat((0,i.computeBoxClassName)(s))),[p&&(0,o.createVNode)(1,"div","Section__title",[(0,o.createVNode)(1,"span","Section__titleText",n,0),(0,o.createVNode)(1,"div","Section__buttons",l,0)],4),m&&(0,o.createVNode)(1,"div","Section__content",u,0)],0,Object.assign({},(0,i.computeBoxProps)(s))))};t.Section=a,a.defaultHooks=r.pureComponentHooks},function(e,t,n){"use strict";t.__esModule=!0,t.Slider=void 0;var o=n(0),r=n(16),i=n(6),a=n(17),c=n(126),l=n(128);t.Slider=function(e){if(Byond.IS_LTE_IE8)return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.NumberInput,Object.assign({},e)));var t=e.animated,n=e.format,d=e.maxValue,u=e.minValue,s=e.onChange,p=e.onDrag,m=e.step,f=e.stepPixelSize,h=e.suppressFlicker,C=e.unit,g=e.value,b=e.className,N=e.fillValue,v=e.color,V=e.ranges,y=void 0===V?{}:V,k=e.children,x=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,["animated","format","maxValue","minValue","onChange","onDrag","step","stepPixelSize","suppressFlicker","unit","value","className","fillValue","color","ranges","children"]),_=k!==undefined;return(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.DraggableControl,Object.assign({dragMatrix:[1,0]},{animated:t,format:n,maxValue:d,minValue:u,onChange:s,onDrag:p,step:m,stepPixelSize:f,suppressFlicker:h,unit:C,value:g},{children:function(e){var t=e.dragging,n=(e.editing,e.value),c=e.displayValue,l=e.displayElement,s=e.inputElement,p=e.handleDragStart,m=N!==undefined&&null!==N,f=((0,r.scale)(n,u,d),(0,r.scale)(null!=N?N:c,u,d)),h=(0,r.scale)(c,u,d),C=v||(0,r.keyOfMatchingRange)(null!=N?N:n,y)||"default";return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,i.classes)(["Slider","ProgressBar","ProgressBar--color--"+C,b,(0,a.computeBoxClassName)(x)]),[(0,o.createVNode)(1,"div",(0,i.classes)(["ProgressBar__fill",m&&"ProgressBar__fill--animated"]),null,1,{style:{width:100*(0,r.clamp01)(f)+"%",opacity:.4}}),(0,o.createVNode)(1,"div","ProgressBar__fill",null,1,{style:{width:100*(0,r.clamp01)(Math.min(f,h))+"%"}}),(0,o.createVNode)(1,"div","Slider__cursorOffset",[(0,o.createVNode)(1,"div","Slider__cursor"),(0,o.createVNode)(1,"div","Slider__pointer"),t&&(0,o.createVNode)(1,"div","Slider__popupValue",l,0)],0,{style:{width:100*(0,r.clamp01)(h)+"%"}}),(0,o.createVNode)(1,"div","ProgressBar__content",_?k:l,0),s],0,Object.assign({},(0,a.computeBoxProps)(x),{onMouseDown:p})))}})))}},function(e,t,n){"use strict";t.__esModule=!0,t.TextArea=void 0;var o=n(0),r=n(6),i=n(17);function a(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var c=function(e){return(0,r.isFalsy)(e)?"":e},l=function(e){var t,n;function l(t,n){var r;(r=e.call(this,t,n)||this).textareaRef=(0,o.createRef)(),r.fillerRef=(0,o.createRef)(),r.state={editing:!1};var i=t.dontUseTabForIndent,a=void 0!==i&&i;return r.autoresize=function(){r.fillerRef&&r.textareaRef},r.handleOnInput=function(e){var t=r.state.editing,n=r.props.onInput;t||r.setEditing(!0),n&&n(e,e.target.value),r.autoresize()},r.handleOnChange=function(e){var t=r.state.editing,n=r.props.onChange;t&&r.setEditing(!1),n&&n(e,e.target.value),r.autoresize()},r.handleKeyPress=function(e){var t=r.state.editing,n=r.props.onKeyPress;t||r.setEditing(!0),n&&n(e,e.target.value),r.autoresize()},r.handleKeyDown=function(e){var t=r.state.editing,n=r.props.onKeyDown;if((t||r.setEditing(!0),!a)&&9===(e.keyCode||e.which)){e.preventDefault();var o=e.target.selectionStart;e.target.value=e.target.value.substring(0,e.target.selectionStart)+"\t"+e.target.value.substring(e.target.selectionEnd),e.target.selectionEnd=o+1}n&&n(e,e.target.value),r.autoresize()},r.handleFocus=function(e){r.state.editing||r.setEditing(!0)},r.handleBlur=function(e){var t=r.state.editing,n=r.props.onChange;t&&(r.setEditing(!1),n&&n(e,e.target.value))},r}n=e,(t=l).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var d=l.prototype;return d.componentDidMount=function(){var e=this.props.value,t=this.textareaRef.current;t&&(t.value=c(e),this.autoresize())},d.componentDidUpdate=function(e,t){var n=this.state.editing,o=e.value,r=this.props.value,i=this.textareaRef.current;i&&!n&&o!==r&&(i.value=c(r),this.autoresize())},d.setEditing=function(e){this.setState({editing:e})},d.getValue=function(){return this.textareaRef.current&&this.textareaRef.current.value},d.render=function(){this.props;var e=this.props,t=(e.onChange,e.onKeyDown,e.onKeyPress,e.onInput,e.onFocus,e.onBlur,e.onEnter,e.value),n=e.placeholder,c=a(e,["onChange","onKeyDown","onKeyPress","onInput","onFocus","onBlur","onEnter","value","placeholder"]),l=c.className,d=c.fluid,u=a(c,["className","fluid"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({className:(0,r.classes)(["TextArea",d&&"TextArea--fluid",l])},u,{children:(0,o.createVNode)(128,"textarea","TextArea__textarea",null,1,{value:t,placeholder:n,onChange:this.handleOnChange,onKeyDown:this.handleKeyDown,onKeyPress:this.handleKeyPress,onInput:this.handleOnInput,onFocus:this.handleFocus,onBlur:this.handleBlur},null,this.textareaRef)})))},l}(o.Component);t.TextArea=l},function(e,t,n){"use strict";t.__esModule=!0,t.Tabs=void 0;var o=n(0),r=n(6),i=n(17),a=n(124);function c(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var l=function(e){var t=e.className,n=e.vertical,a=e.children,l=c(e,["className","vertical","children"]);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Tabs",n?"Tabs--vertical":"Tabs--horizontal",t,(0,i.computeBoxClassName)(l)]),(0,o.createVNode)(1,"div","Tabs__tabBox",a,0),2,Object.assign({},(0,i.computeBoxProps)(l))))};t.Tabs=l;l.Tab=function(e){var t=e.className,n=e.selected,i=e.altSelection,l=c(e,["className","selected","altSelection"]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Button,Object.assign({className:(0,r.classes)(["Tabs__tab",n&&"Tabs__tab--selected",i&&n&&"Tabs__tab--altSelection",t]),selected:!i&&n,color:"transparent"},l)))}},function(e,t,n){"use strict";t.__esModule=!0,t.TimeDisplay=void 0;var o=n(16),r=n(0);var i=function(e){return"number"==typeof e&&Number.isFinite(e)&&!Number.isNaN(e)},a=function(e){var t,n;function r(t){var n;return(n=e.call(this,t)||this).timer=null,n.last_seen_value=undefined,n.state={value:0},i(t.value)&&(n.state.value=Number(t.value),n.last_seen_value=Number(t.value)),n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var a=r.prototype;return a.componentDidUpdate=function(){var e=this;this.props.auto!==undefined&&(clearInterval(this.timer),this.timer=setInterval((function(){return e.tick()}),1e3))},a.tick=function(){var e=Number(this.state.value);this.props.value!==this.last_seen_value&&(this.last_seen_value=this.props.value,e=this.props.value);var t="up"===this.props.auto?10:-10,n=Math.max(0,e+t);this.setState({value:n})},a.componentDidMount=function(){var e=this;this.props.auto!==undefined&&(this.timer=setInterval((function(){return e.tick()}),1e3))},a.componentWillUnmount=function(){clearInterval(this.timer)},a.render=function(){var e=this.state.value;if(!i(e))return this.state.value||null;var t=(0,o.toFixed)(Math.floor(e/10%60)).padStart(2,"0"),n=(0,o.toFixed)(Math.floor(e/600%60)).padStart(2,"0");return(0,o.toFixed)(Math.floor(e/36e3%24)).padStart(2,"0")+":"+n+":"+t},r}(r.Component);t.TimeDisplay=a},function(e,t,n){var o={"./AbductorConsole.js":447,"./Achievements.js":448,"./AiAirlock.js":449,"./AiRestorer.js":177,"./AirAlarm.js":450,"./AirlockElectronics.js":452,"./Apc.js":453,"./ApcControl.js":454,"./AtmosAlertConsole.js":455,"./AtmosControlConsole.js":456,"./AtmosFilter.js":457,"./AtmosMixer.js":458,"./AtmosPump.js":459,"./AutomatedAnnouncement.js":460,"./BankMachine.js":461,"./Bepis.js":462,"./Biogenerator.js":463,"./BlackMarketUplink.js":464,"./BluespaceArtillery.js":465,"./BluespaceLocator.js":466,"./BorgPanel.js":467,"./BrigTimer.js":468,"./CameraConsole.js":469,"./Canister.js":470,"./Canvas.js":471,"./Cargo.js":179,"./CargoBountyConsole.js":472,"./CargoExpress.js":473,"./CargoHoldTerminal.js":474,"./CellularEmporium.js":475,"./CentcomPodLauncher.js":476,"./ChemAcclimator.js":477,"./ChemDebugSynthesizer.js":478,"./ChemDispenser.js":479,"./ChemFilter.js":480,"./ChemHeater.js":481,"./ChemMaster.js":482,"./ChemPress.js":483,"./ChemReactionChamber.js":484,"./ChemSplitter.js":485,"./ChemSynthesizer.js":486,"./CivCargoHoldTerminal.js":487,"./CodexGigas.js":488,"./ComputerFabricator.js":489,"./Crayon.js":490,"./CrewConsole.js":491,"./Cryo.js":492,"./DecalPainter.js":493,"./DisposalUnit.js":494,"./DnaConsole.js":495,"./DnaVault.js":496,"./EightBallVote.js":497,"./Electrolyzer.js":498,"./Electropack.js":499,"./EmergencyShuttleConsole.js":500,"./EngravedMessage.js":501,"./ExosuitControlConsole.js":502,"./ExosuitFabricator.js":503,"./ForbiddenLore.js":504,"./Gateway.js":505,"./GlandDispenser.js":506,"./Gps.js":507,"./GravityGenerator.js":508,"./GulagItemReclaimer.js":509,"./GulagTeleporterConsole.js":510,"./Holodeck.js":511,"./Holopad.js":512,"./HypnoChair.js":513,"./ImplantChair.js":514,"./InfraredEmitter.js":515,"./Intellicard.js":516,"./Jukebox.js":517,"./KeycardAuth.js":518,"./LaborClaimConsole.js":519,"./LanguageMenu.js":520,"./LaunchpadConsole.js":181,"./LaunchpadRemote.js":521,"./MafiaPanel.js":522,"./MalfunctionModulePicker.js":523,"./MechBayPowerConsole.js":524,"./MedicalKiosk.js":525,"./MiningVendor.js":526,"./Mule.js":527,"./NaniteChamberControl.js":528,"./NaniteCloudControl.js":529,"./NaniteProgramHub.js":530,"./NaniteProgrammer.js":531,"./NaniteRemote.js":532,"./NotificationPreferences.js":533,"./NtnetRelay.js":534,"./NtosAiRestorer.js":535,"./NtosArcade.js":536,"./NtosAtmos.js":537,"./NtosBountyConsole.js":538,"./NtosCard.js":539,"./NtosConfiguration.js":540,"./NtosCrewManifest.js":541,"./NtosCyborgRemoteMonitor.js":182,"./NtosCyborgRemoteMonitorSyndicate.js":542,"./NtosFileManager.js":543,"./NtosJobManager.js":544,"./NtosMain.js":545,"./NtosNetChat.js":546,"./NtosNetDos.js":547,"./NtosNetDownloader.js":548,"./NtosNetMonitor.js":549,"./NtosPowerMonitor.js":550,"./NtosRadar.js":183,"./NtosRadarSyndicate.js":551,"./NtosRequestKiosk.js":552,"./NtosRevelation.js":553,"./NtosRoboControl.js":554,"./NtosShipping.js":555,"./NtosStationAlertConsole.js":556,"./NtosSupermatterMonitor.js":557,"./NuclearBomb.js":558,"./OperatingComputer.js":559,"./Orbit.js":560,"./OreBox.js":561,"./OreRedemptionMachine.js":562,"./Pandemic.js":563,"./PaperSheet.js":564,"./ParticleAccelerator.js":567,"./PersonalCrafting.js":568,"./PortableChemMixer.js":569,"./PortableGenerator.js":570,"./PortablePump.js":571,"./PortableScrubber.js":572,"./PortableTurret.js":573,"./PowerMonitor.js":130,"./ProbingConsole.js":574,"./ProximitySensor.js":575,"./Radio.js":576,"./RadioactiveMicrolaser.js":577,"./RapidPipeDispenser.js":578,"./RemoteRobotControl.js":579,"./RequestKiosk.js":184,"./RoboticsControlConsole.js":580,"./Roulette.js":581,"./SatelliteControl.js":582,"./ScannerGate.js":583,"./SeedExtractor.js":584,"./ShuttleManipulator.js":585,"./Signaler.js":586,"./SkillPanel.js":587,"./SkillStation.js":588,"./Sleeper.js":589,"./SlimeBodySwapper.js":590,"./SmartVend.js":591,"./Smes.js":592,"./SmokeMachine.js":593,"./SolarControl.js":594,"./SpaceHeater.js":595,"./SpawnersMenu.js":596,"./StationAlertConsole.js":185,"./SuitStorageUnit.js":597,"./SyndContractor.js":598,"./TachyonArray.js":599,"./Tank.js":600,"./TankDispenser.js":601,"./Telecomms.js":602,"./Teleporter.js":603,"./ThermoMachine.js":604,"./Timer.js":605,"./TransferValve.js":606,"./TurbineComputer.js":607,"./TurretControl.js":608,"./Uplink.js":129,"./VaultController.js":609,"./Vendatray.js":610,"./Vending.js":611,"./Wires.js":612};function r(e){var t=i(e);return n(t)}function i(e){if(!n.o(o,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return o[e]}r.keys=function(){return Object.keys(o)},r.resolve=i,e.exports=r,r.id=446},function(e,t,n){"use strict";t.__esModule=!0,t.AbductorConsole=void 0;var o=n(0),r=n(129),i=n(1),a=n(3),c=n(2);t.AbductorConsole=function(e,t){var n=(0,i.useSharedState)(t,"tab",1),r=n[0],s=n[1];return(0,o.createComponentVNode)(2,c.Window,{theme:"abductor",width:600,height:532,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"list",lineHeight:"23px",selected:1===r,onClick:function(){return s(1)},children:"Abductsoft 3000"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"list",lineHeight:"23px",selected:2===r,onClick:function(){return s(2)},children:"Mission Settings"})]}),1===r&&(0,o.createComponentVNode)(2,l),2===r&&(0,o.createFragment)([(0,o.createComponentVNode)(2,d),(0,o.createComponentVNode)(2,u)],4)]})})};var l=function(e,t){var n=(0,i.useBackend)(t),c=(n.act,n.data),l=c.experiment,d=c.points,u=c.credits;return l?(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Collected Samples",children:d})})}),(0,o.createComponentVNode)(2,r.GenericUplink,{currencyAmount:u,currencySymbol:"Credits"})],4):(0,o.createComponentVNode)(2,a.NoticeBox,{danger:!0,children:"No Experiment Machine Detected"})},d=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data,l=c.pad,d=c.gizmo;return l?(0,o.createComponentVNode)(2,a.Section,{title:"Emergency Teleport",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"exclamation-circle",content:"Activate",color:"bad",onClick:function(){return r("teleporter_send")}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Mark Retrieval",children:(0,o.createComponentVNode)(2,a.Button,{icon:d?"user-plus":"user-slash",content:d?"Retrieve":"No Mark",disabled:!d,onClick:function(){return r("teleporter_retrieve")}})})})}):(0,o.createComponentVNode)(2,a.NoticeBox,{danger:!0,children:"No Telepad Detected"})},u=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data,l=c.vest,d=c.vest_mode,u=c.vest_lock;return l?(0,o.createComponentVNode)(2,a.Section,{title:"Agent Vest Settings",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:u?"lock":"unlock",content:u?"Locked":"Unlocked",onClick:function(){return r("toggle_vest")}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Mode",children:(0,o.createComponentVNode)(2,a.Button,{icon:1===d?"eye-slash":"fist-raised",content:1===d?"Stealth":"Combat",onClick:function(){return r("flip_vest")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Disguise",children:(0,o.createComponentVNode)(2,a.Button,{icon:"user-secret",content:"Select",onClick:function(){return r("select_disguise")}})})]})}):(0,o.createComponentVNode)(2,a.NoticeBox,{danger:!0,children:"No Agent Vest Detected"})}},function(e,t,n){"use strict";t.__esModule=!0,t.Achievements=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Achievements=function(e,t){var n=(0,r.useBackend)(t).data,l=n.categories,u=(0,r.useLocalState)(t,"category",l[0]),s=u[0],p=u[1],m=n.achievements.filter((function(e){return e.category===s}));return(0,o.createComponentVNode)(2,a.Window,{title:"Achievements",width:540,height:680,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Tabs,{children:[l.map((function(e){return(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:s===e,onClick:function(){return p(e)},children:e},e)})),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:"High Scores"===s,onClick:function(){return p("High Scores")},children:"High Scores"})]}),"High Scores"===s&&(0,o.createComponentVNode)(2,d)||(0,o.createComponentVNode)(2,c,{achievements:m})]})})};var c=function(e,t){var n=e.achievements;return(0,o.createComponentVNode)(2,i.Table,{children:n.map((function(e){return(0,o.createComponentVNode)(2,l,{achievement:e},e.name)}))})},l=function(e){var t=e.achievement,n=t.name,r=t.desc,a=t.icon_class,c=t.value,l=t.score;return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:(0,o.createComponentVNode)(2,i.Box,{m:1,className:a})}),(0,o.createComponentVNode)(2,i.Table.Cell,{verticalAlign:"top",children:[(0,o.createVNode)(1,"h1",null,n,0),r,l&&(0,o.createComponentVNode)(2,i.Box,{color:c>0?"good":"bad",children:c>0?"Earned "+c+" times":"Locked"})||(0,o.createComponentVNode)(2,i.Box,{color:c?"good":"bad",children:c?"Unlocked":"Locked"})]})]},n)},d=function(e,t){var n=(0,r.useBackend)(t).data,a=n.highscore,c=n.user_ckey,l=(0,r.useLocalState)(t,"highscore",0),d=l[0],u=l[1],s=a[d];if(!s)return null;var p=Object.keys(s.scores).map((function(e){return{ckey:e,value:s.scores[e]}}));return(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Tabs,{vertical:!0,children:a.map((function(e,t){return(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:d===t,onClick:function(){return u(t)},children:e.name},e.name)}))})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{textAlign:"center",children:"#"}),(0,o.createComponentVNode)(2,i.Table.Cell,{textAlign:"center",children:"Key"}),(0,o.createComponentVNode)(2,i.Table.Cell,{textAlign:"center",children:"Score"})]}),p.map((function(e,t){return(0,o.createComponentVNode)(2,i.Table.Row,{className:"candystripe",m:2,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{color:"label",textAlign:"center",children:t+1}),(0,o.createComponentVNode)(2,i.Table.Cell,{color:e.ckey===c&&"green",textAlign:"center",children:[0===t&&(0,o.createComponentVNode)(2,i.Icon,{name:"crown",color:"yellow",mr:2}),e.ckey,0===t&&(0,o.createComponentVNode)(2,i.Icon,{name:"crown",color:"yellow",ml:2})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{textAlign:"center",children:e.value})]},e.ckey)}))]})})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.AiAirlock=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c={2:{color:"good",localStatusText:"Offline"},1:{color:"average",localStatusText:"Caution"},0:{color:"bad",localStatusText:"Optimal"}};t.AiAirlock=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=c[d.power.main]||c[0],s=c[d.power.backup]||c[0],p=c[d.shock]||c[0];return(0,o.createComponentVNode)(2,a.Window,{width:500,height:390,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Power Status",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Main",color:u.color,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"lightbulb-o",disabled:!d.power.main,content:"Disrupt",onClick:function(){return l("disrupt-main")}}),children:[d.power.main?"Online":"Offline"," ",d.wires.main_1&&d.wires.main_2?d.power.main_timeleft>0&&"["+d.power.main_timeleft+"s]":"[Wires have been cut!]"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Backup",color:s.color,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"lightbulb-o",disabled:!d.power.backup,content:"Disrupt",onClick:function(){return l("disrupt-backup")}}),children:[d.power.backup?"Online":"Offline"," ",d.wires.backup_1&&d.wires.backup_2?d.power.backup_timeleft>0&&"["+d.power.backup_timeleft+"s]":"[Wires have been cut!]"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Electrify",color:p.color,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"wrench",disabled:!(d.wires.shock&&0===d.shock),content:"Restore",onClick:function(){return l("shock-restore")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"bolt",disabled:!d.wires.shock,content:"Temporary",onClick:function(){return l("shock-temp")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"bolt",disabled:!d.wires.shock,content:"Permanent",onClick:function(){return l("shock-perm")}})],4),children:[2===d.shock?"Safe":"Electrified"," ",(d.wires.shock?d.shock_timeleft>0&&"["+d.shock_timeleft+"s]":"[Wires have been cut!]")||-1===d.shock_timeleft&&"[Permanent]"]})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Access and Door Control",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"ID Scan",color:"bad",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.id_scanner?"power-off":"times",content:d.id_scanner?"Enabled":"Disabled",selected:d.id_scanner,disabled:!d.wires.id_scanner,onClick:function(){return l("idscan-toggle")}}),children:!d.wires.id_scanner&&"[Wires have been cut!]"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Emergency Access",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.emergency?"power-off":"times",content:d.emergency?"Enabled":"Disabled",selected:d.emergency,onClick:function(){return l("emergency-toggle")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Divider),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door Bolts",color:"bad",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.locked?"lock":"unlock",content:d.locked?"Lowered":"Raised",selected:d.locked,disabled:!d.wires.bolts,onClick:function(){return l("bolt-toggle")}}),children:!d.wires.bolts&&"[Wires have been cut!]"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door Bolt Lights",color:"bad",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.lights?"power-off":"times",content:d.lights?"Enabled":"Disabled",selected:d.lights,disabled:!d.wires.lights,onClick:function(){return l("light-toggle")}}),children:!d.wires.lights&&"[Wires have been cut!]"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door Force Sensors",color:"bad",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.safe?"power-off":"times",content:d.safe?"Enabled":"Disabled",selected:d.safe,disabled:!d.wires.safe,onClick:function(){return l("safe-toggle")}}),children:!d.wires.safe&&"[Wires have been cut!]"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door Timing Safety",color:"bad",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.speed?"power-off":"times",content:d.speed?"Enabled":"Disabled",selected:d.speed,disabled:!d.wires.timing,onClick:function(){return l("speed-toggle")}}),children:!d.wires.timing&&"[Wires have been cut!]"}),(0,o.createComponentVNode)(2,i.LabeledList.Divider),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door Control",color:"bad",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.opened?"sign-out-alt":"sign-in-alt",content:d.opened?"Open":"Closed",selected:d.opened,disabled:d.locked||d.welded,onClick:function(){return l("open-close")}}),children:!(!d.locked&&!d.welded)&&(0,o.createVNode)(1,"span",null,[(0,o.createTextVNode)("[Door is "),d.locked?"bolted":"",d.locked&&d.welded?" and ":"",d.welded?"welded":"",(0,o.createTextVNode)("!]")],0)})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.AirAlarm=void 0;var o=n(0),r=n(16),i=(n(19),n(1)),a=n(3),c=(n(34),n(2)),l=n(61),d=n(451);t.AirAlarm=function(e,t){var n=(0,i.useBackend)(t),r=(n.act,n.data),a=r.locked&&!r.siliconUser;return(0,o.createComponentVNode)(2,c.Window,{width:440,height:650,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,l.InterfaceLockNoticeBox),(0,o.createComponentVNode)(2,u),!a&&(0,o.createComponentVNode)(2,p)]})})};var u=function(e,t){var n=(0,i.useBackend)(t).data,c=(n.environment_data||[]).filter((function(e){return e.value>=.01})),l={0:{color:"good",localStatusText:"Optimal"},1:{color:"average",localStatusText:"Caution"},2:{color:"bad",localStatusText:"Danger (Internals Required)"}},d=l[n.danger_level]||l[0];return(0,o.createComponentVNode)(2,a.Section,{title:"Air Status",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[c.length>0&&(0,o.createFragment)([c.map((function(e){var t=l[e.danger_level]||l[0];return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:e.name,color:t.color,children:[(0,r.toFixed)(e.value,2),e.unit]},e.name)})),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Local status",color:d.color,children:d.localStatusText}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Area status",color:n.atmos_alarm||n.fire_alarm?"bad":"good",children:(n.atmos_alarm?"Atmosphere Alarm":n.fire_alarm&&"Fire Alarm")||"Nominal"})],0)||(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Warning",color:"bad",children:"Cannot obtain air sample for analysis."}),!!n.emagged&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Warning",color:"bad",children:"Safety measures offline. Device may exhibit abnormal behavior."})]})})},s={home:{title:"Air Controls",component:function(){return m}},vents:{title:"Vent Controls",component:function(){return f}},scrubbers:{title:"Scrubber Controls",component:function(){return h}},modes:{title:"Operating Mode",component:function(){return C}},thresholds:{title:"Alarm Thresholds",component:function(){return g}}},p=function(e,t){var n=(0,i.useLocalState)(t,"screen"),r=n[0],c=n[1],l=s[r]||s.home,d=l.component();return(0,o.createComponentVNode)(2,a.Section,{title:l.title,buttons:r&&(0,o.createComponentVNode)(2,a.Button,{icon:"arrow-left",content:"Back",onClick:function(){return c()}}),children:(0,o.createComponentVNode)(2,d)})},m=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data,l=(0,i.useLocalState)(t,"screen"),d=(l[0],l[1]),u=c.mode,s=c.atmos_alarm;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:s?"exclamation-triangle":"exclamation",color:s&&"caution",content:"Area Atmosphere Alarm",onClick:function(){return r(s?"reset":"alarm")}}),(0,o.createComponentVNode)(2,a.Box,{mt:1}),(0,o.createComponentVNode)(2,a.Button,{icon:3===u?"exclamation-triangle":"exclamation",color:3===u&&"danger",content:"Panic Siphon",onClick:function(){return r("mode",{mode:3===u?1:3})}}),(0,o.createComponentVNode)(2,a.Box,{mt:2}),(0,o.createComponentVNode)(2,a.Button,{icon:"sign-out-alt",content:"Vent Controls",onClick:function(){return d("vents")}}),(0,o.createComponentVNode)(2,a.Box,{mt:1}),(0,o.createComponentVNode)(2,a.Button,{icon:"filter",content:"Scrubber Controls",onClick:function(){return d("scrubbers")}}),(0,o.createComponentVNode)(2,a.Box,{mt:1}),(0,o.createComponentVNode)(2,a.Button,{icon:"cog",content:"Operating Mode",onClick:function(){return d("modes")}}),(0,o.createComponentVNode)(2,a.Box,{mt:1}),(0,o.createComponentVNode)(2,a.Button,{icon:"chart-bar",content:"Alarm Thresholds",onClick:function(){return d("thresholds")}})],4)},f=function(e,t){var n=(0,i.useBackend)(t).data.vents;return n&&0!==n.length?n.map((function(e){return(0,o.createComponentVNode)(2,d.Vent,{vent:e},e.id_tag)})):"Nothing to show"},h=function(e,t){var n=(0,i.useBackend)(t).data.scrubbers;return n&&0!==n.length?n.map((function(e){return(0,o.createComponentVNode)(2,d.Scrubber,{scrubber:e},e.id_tag)})):"Nothing to show"},C=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data.modes;return c&&0!==c.length?c.map((function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:e.selected?"check-square-o":"square-o",selected:e.selected,color:e.selected&&e.danger&&"danger",content:e.name,onClick:function(){return r("mode",{mode:e.mode})}}),(0,o.createComponentVNode)(2,a.Box,{mt:1})],4,e.mode)})):"Nothing to show"},g=function(e,t){var n=(0,i.useBackend)(t),c=n.act,l=n.data.thresholds;return(0,o.createVNode)(1,"table","LabeledList",[(0,o.createVNode)(1,"thead",null,(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td"),(0,o.createVNode)(1,"td","color-bad","min2",16),(0,o.createVNode)(1,"td","color-average","min1",16),(0,o.createVNode)(1,"td","color-average","max1",16),(0,o.createVNode)(1,"td","color-bad","max2",16)],4),2),(0,o.createVNode)(1,"tbody",null,l.map((function(e){return(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td","LabeledList__label",e.name,0),e.settings.map((function(e){return(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,a.Button,{content:(0,r.toFixed)(e.selected,2),onClick:function(){return c("threshold",{env:e.env,"var":e.val})}}),2,null,e.val)}))],0,null,e.name)})),0)],4,{style:{width:"100%"}})}},function(e,t,n){"use strict";t.__esModule=!0,t.Scrubber=t.Vent=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(34);t.Vent=function(e,t){var n=e.vent,c=(0,i.useBackend)(t).act,l=n.id_tag,d=n.long_name,u=n.power,s=n.checks,p=n.excheck,m=n.incheck,f=n.direction,h=n.external,C=n.internal,g=n.extdefault,b=n.intdefault;return(0,o.createComponentVNode)(2,a.Section,{level:2,title:(0,r.decodeHtmlEntities)(d),buttons:(0,o.createComponentVNode)(2,a.Button,{icon:u?"power-off":"times",selected:u,content:u?"On":"Off",onClick:function(){return c("power",{id_tag:l,val:Number(!u)})}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Mode",children:(0,o.createComponentVNode)(2,a.Button,{icon:"sign-in-alt",content:f?"Pressurizing":"Scrubbing",color:!f&&"danger",onClick:function(){return c("direction",{id_tag:l,val:Number(!f)})}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pressure Regulator",children:[(0,o.createComponentVNode)(2,a.Button,{icon:"sign-in-alt",content:"Internal",selected:m,onClick:function(){return c("incheck",{id_tag:l,val:s})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"sign-out-alt",content:"External",selected:p,onClick:function(){return c("excheck",{id_tag:l,val:s})}})]}),!!m&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Internal Target",children:[(0,o.createComponentVNode)(2,a.NumberInput,{value:Math.round(C),unit:"kPa",width:"75px",minValue:0,step:10,maxValue:5066,onChange:function(e,t){return c("set_internal_pressure",{id_tag:l,value:t})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"undo",disabled:b,content:"Reset",onClick:function(){return c("reset_internal_pressure",{id_tag:l})}})]}),!!p&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"External Target",children:[(0,o.createComponentVNode)(2,a.NumberInput,{value:Math.round(h),unit:"kPa",width:"75px",minValue:0,step:10,maxValue:5066,onChange:function(e,t){return c("set_external_pressure",{id_tag:l,value:t})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"undo",disabled:g,content:"Reset",onClick:function(){return c("reset_external_pressure",{id_tag:l})}})]})]})})};t.Scrubber=function(e,t){var n=e.scrubber,l=(0,i.useBackend)(t).act,d=n.long_name,u=n.power,s=n.scrubbing,p=n.id_tag,m=n.widenet,f=n.filter_types;return(0,o.createComponentVNode)(2,a.Section,{level:2,title:(0,r.decodeHtmlEntities)(d),buttons:(0,o.createComponentVNode)(2,a.Button,{icon:u?"power-off":"times",content:u?"On":"Off",selected:u,onClick:function(){return l("power",{id_tag:p,val:Number(!u)})}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Mode",children:[(0,o.createComponentVNode)(2,a.Button,{icon:s?"filter":"sign-in-alt",color:s||"danger",content:s?"Scrubbing":"Siphoning",onClick:function(){return l("scrubbing",{id_tag:p,val:Number(!s)})}}),(0,o.createComponentVNode)(2,a.Button,{icon:m?"expand":"compress",selected:m,content:m?"Expanded range":"Normal range",onClick:function(){return l("widenet",{id_tag:p,val:Number(!m)})}})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Filters",children:s&&f.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{icon:e.enabled?"check-square-o":"square-o",content:(0,c.getGasLabel)(e.gas_id,e.gas_name),title:e.gas_name,selected:e.enabled,onClick:function(){return l("toggle_filter",{id_tag:p,val:e.gas_id})}},e.gas_id)}))||"N/A"})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.AirlockElectronics=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(178);t.AirlockElectronics=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.oneAccess,s=d.unres_direction,p=d.regions||[],m=d.accesses||[];return(0,o.createComponentVNode)(2,a.Window,{width:420,height:485,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Main",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Access Required",children:(0,o.createComponentVNode)(2,i.Button,{icon:u?"unlock":"lock",content:u?"One":"All",onClick:function(){return l("one_access")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Unrestricted Access",children:[(0,o.createComponentVNode)(2,i.Button,{icon:1&s?"check-square-o":"square-o",content:"North",selected:1&s,onClick:function(){return l("direc_set",{unres_direction:"1"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:2&s?"check-square-o":"square-o",content:"South",selected:2&s,onClick:function(){return l("direc_set",{unres_direction:"2"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:4&s?"check-square-o":"square-o",content:"East",selected:4&s,onClick:function(){return l("direc_set",{unres_direction:"4"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:8&s?"check-square-o":"square-o",content:"West",selected:8&s,onClick:function(){return l("direc_set",{unres_direction:"8"})}})]})]})}),(0,o.createComponentVNode)(2,c.AccessList,{accesses:p,selectedList:m,accessMod:function(e){return l("set",{access:e})},grantAll:function(){return l("grant_all")},denyAll:function(){return l("clear_all")},grantDep:function(e){return l("grant_region",{region:e})},denyDep:function(e){return l("deny_region",{region:e})}})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Apc=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(61);t.Apc=function(e,t){return(0,o.createComponentVNode)(2,a.Window,{width:450,height:445,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,u)})})};var l={2:{color:"good",externalPowerText:"External Power",chargingText:"Fully Charged"},1:{color:"average",externalPowerText:"Low External Power",chargingText:"Charging"},0:{color:"bad",externalPowerText:"No External Power",chargingText:"Not Charging"}},d={1:{icon:"terminal",content:"Override Programming",action:"hack"},2:{icon:"caret-square-down",content:"Shunt Core Process",action:"occupy"},3:{icon:"caret-square-left",content:"Return to Main Core",action:"deoccupy"},4:{icon:"caret-square-down",content:"Shunt Core Process",action:"occupy"}},u=function(e,t){var n=(0,r.useBackend)(t),a=n.act,u=n.data,s=u.locked&&!u.siliconUser,p=l[u.externalPower]||l[0],m=l[u.chargingStatus]||l[0],f=u.powerChannels||[],h=d[u.malfStatus]||d[0],C=u.powerCellStatus/100;return u.failTime>0?(0,o.createComponentVNode)(2,i.NoticeBox,{children:[(0,o.createVNode)(1,"b",null,(0,o.createVNode)(1,"h3",null,"SYSTEM FAILURE",16),2),(0,o.createVNode)(1,"i",null,"I/O regulators malfunction detected! Waiting for system reboot...",16),(0,o.createVNode)(1,"br"),"Automatic reboot in ",u.failTime," seconds...",(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Reboot Now",onClick:function(){return a("reboot")}})]}):(0,o.createFragment)([(0,o.createComponentVNode)(2,c.InterfaceLockNoticeBox),(0,o.createComponentVNode)(2,i.Section,{title:"Power Status",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Main Breaker",color:p.color,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u.isOperating?"power-off":"times",content:u.isOperating?"On":"Off",selected:u.isOperating&&!s,disabled:s,onClick:function(){return a("breaker")}}),children:["[ ",p.externalPowerText," ]"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power Cell",children:(0,o.createComponentVNode)(2,i.ProgressBar,{color:"good",value:C})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Charge Mode",color:m.color,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u.chargeMode?"sync":"close",content:u.chargeMode?"Auto":"Off",disabled:s,onClick:function(){return a("charge")}}),children:["[ ",m.chargingText," ]"]})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Power Channels",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[f.map((function(e){var t=e.topicParams;return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.title,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{inline:!0,mx:2,color:e.status>=2?"good":"bad",children:e.status>=2?"On":"Off"}),(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Auto",selected:!s&&(1===e.status||3===e.status),disabled:s,onClick:function(){return a("channel",t.auto)}}),(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",content:"On",selected:!s&&2===e.status,disabled:s,onClick:function(){return a("channel",t.on)}}),(0,o.createComponentVNode)(2,i.Button,{icon:"times",content:"Off",selected:!s&&0===e.status,disabled:s,onClick:function(){return a("channel",t.off)}})],4),children:e.powerLoad},e.title)})),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Total Load",children:(0,o.createVNode)(1,"b",null,u.totalLoad,0)})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Misc",buttons:!!u.siliconUser&&(0,o.createFragment)([!!u.malfStatus&&(0,o.createComponentVNode)(2,i.Button,{icon:h.icon,content:h.content,color:"bad",onClick:function(){return a(h.action)}}),(0,o.createComponentVNode)(2,i.Button,{icon:"lightbulb-o",content:"Overload",onClick:function(){return a("overload")}})],0),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cover Lock",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u.coverLocked?"lock":"unlock",content:u.coverLocked?"Engaged":"Disengaged",disabled:s,onClick:function(){return a("cover")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Emergency Lighting",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"lightbulb-o",content:u.emergencyLights?"Enabled":"Disabled",disabled:s,onClick:function(){return a("emergency_lighting")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Night Shift Lighting",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"lightbulb-o",content:u.nightshiftLights?"Enabled":"Disabled",onClick:function(){return a("toggle_nightshift")}})})]})})],4)}},function(e,t,n){"use strict";t.__esModule=!0,t.ApcControl=void 0;var o=n(0),r=n(15),i=n(30),a=n(6),c=n(1),l=n(3),d=n(2),u=n(130);t.ApcControl=function(e,t){var n=(0,c.useBackend)(t).data;return(0,o.createComponentVNode)(2,d.Window,{title:"APC Controller",width:550,height:500,resizable:!0,children:[1===n.authenticated&&(0,o.createComponentVNode)(2,p),0===n.authenticated&&(0,o.createComponentVNode)(2,s)]})};var s=function(e,t){var n=(0,c.useBackend)(t),r=n.act,i=n.data.emagged,a=1===i?"Open":"Log In";return(0,o.createComponentVNode)(2,d.Window.Content,{children:(0,o.createComponentVNode)(2,l.Button,{fluid:!0,color:1===i?"":"good",content:a,onClick:function(){return r("log-in")}})})},p=function(e,t){var n=(0,c.useBackend)(t),r=n.act,i=n.data.restoring,a=(0,c.useLocalState)(t,"tab-index",1),u=a[0],s=a[1];return(0,o.createFragment)([(0,o.createComponentVNode)(2,l.Tabs,{children:[(0,o.createComponentVNode)(2,l.Tabs.Tab,{selected:1===u,onClick:function(){s(1),r("check-apcs")},children:"APC Control Panel"}),(0,o.createComponentVNode)(2,l.Tabs.Tab,{selected:2===u,onClick:function(){s(2),r("check-logs")},children:"Log View Panel"})]}),1===i&&(0,o.createComponentVNode)(2,l.Dimmer,{fontSize:"32px",children:[(0,o.createComponentVNode)(2,l.Icon,{name:"cog",spin:!0})," Resetting..."]}),1===u&&(0,o.createFragment)([(0,o.createComponentVNode)(2,m),(0,o.createComponentVNode)(2,l.Box,{fillPositionedParent:!0,top:"53px",children:(0,o.createComponentVNode)(2,d.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,f)})})],4),2===u&&(0,o.createComponentVNode)(2,l.Box,{fillPositionedParent:!0,top:"20px",children:(0,o.createComponentVNode)(2,d.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,h)})})],0)},m=function(e,t){var n=(0,c.useBackend)(t),r=n.act,i=n.data,a=i.emagged,d=i.logging,u=(0,c.useLocalState)(t,"sortByField",null),s=u[0],p=u[1];return(0,o.createComponentVNode)(2,l.Flex,{children:[(0,o.createComponentVNode)(2,l.Flex.Item,{children:[(0,o.createComponentVNode)(2,l.Box,{inline:!0,mr:2,color:"label",children:"Sort by:"}),(0,o.createComponentVNode)(2,l.Button.Checkbox,{checked:"name"===s,content:"Name",onClick:function(){return p("name"!==s&&"name")}}),(0,o.createComponentVNode)(2,l.Button.Checkbox,{checked:"charge"===s,content:"Charge",onClick:function(){return p("charge"!==s&&"charge")}}),(0,o.createComponentVNode)(2,l.Button.Checkbox,{checked:"draw"===s,content:"Draw",onClick:function(){return p("draw"!==s&&"draw")}})]}),(0,o.createComponentVNode)(2,l.Flex.Item,{grow:1}),(0,o.createComponentVNode)(2,l.Flex.Item,{children:[1===a&&(0,o.createFragment)([(0,o.createComponentVNode)(2,l.Button,{color:1===d?"bad":"good",content:1===d?"Stop Logging":"Restore Logging",onClick:function(){return r("toggle-logs")}}),(0,o.createComponentVNode)(2,l.Button,{content:"Reset Console",onClick:function(){return r("restore-console")}})],4),(0,o.createComponentVNode)(2,l.Button,{color:"bad",content:"Log Out",onClick:function(){return r("log-out")}})]})]})},f=function(e,t){var n=(0,c.useBackend)(t),a=n.data,d=n.act,s=(0,c.useLocalState)(t,"sortByField",null)[0],p=(0,i.flow)([(0,r.map)((function(e,t){return Object.assign({},e,{id:e.name+t})})),"name"===s&&(0,r.sortBy)((function(e){return e.name})),"charge"===s&&(0,r.sortBy)((function(e){return-e.charge})),"draw"===s&&(0,r.sortBy)((function(e){return-(0,u.powerRank)(e.load)}),(function(e){return-parseFloat(e.load)}))])(a.apcs);return(0,o.createComponentVNode)(2,l.Table,{children:[(0,o.createComponentVNode)(2,l.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,l.Table.Cell,{children:"On/Off"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Area"}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,children:"Charge"}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,textAlign:"right",children:"Draw"}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,title:"Equipment",children:"Eqp"}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,title:"Lighting",children:"Lgt"}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,title:"Environment",children:"Env"})]}),p.map((function(e,t){return(0,o.createVNode)(1,"tr","Table__row candystripe",[(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,l.Button,{icon:e.operating?"power-off":"times",color:e.operating?"good":"bad",onClick:function(){return d("breaker",{ref:e.ref})}}),2),(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,l.Button,{onClick:function(){return d("access-apc",{ref:e.ref})},children:e.name}),2),(0,o.createVNode)(1,"td","Table__cell text-right text-nowrap",(0,o.createComponentVNode)(2,u.AreaCharge,{charging:e.charging,charge:e.charge}),2),(0,o.createVNode)(1,"td","Table__cell text-right text-nowrap",e.load,0),(0,o.createVNode)(1,"td","Table__cell text-center text-nowrap",(0,o.createComponentVNode)(2,C,{target:"equipment",status:e.eqp,apc:e,act:d}),2),(0,o.createVNode)(1,"td","Table__cell text-center text-nowrap",(0,o.createComponentVNode)(2,C,{target:"lighting",status:e.lgt,apc:e,act:d}),2),(0,o.createVNode)(1,"td","Table__cell text-center text-nowrap",(0,o.createComponentVNode)(2,C,{target:"environ",status:e.env,apc:e,act:d}),2)],4,null,e.id)}))]})},h=function(e,t){var n=(0,c.useBackend)(t).data,a=(0,i.flow)([(0,r.map)((function(e,t){return Object.assign({},e,{id:e.entry+t})})),function(e){return e.reverse()}])(n.logs);return(0,o.createComponentVNode)(2,l.Box,{m:-.5,children:a.map((function(e){return(0,o.createComponentVNode)(2,l.Box,{p:.5,className:"candystripe",bold:!0,children:e.entry},e.id)}))})},C=function(e){var t=e.target,n=e.status,r=e.apc,i=e.act,a=Boolean(2&n),c=Boolean(1&n);return(0,o.createComponentVNode)(2,l.Button,{icon:c?"sync":"power-off",color:a?"good":"bad",onClick:function(){return i("toggle-minor",{type:t,value:g(n),ref:r.ref})}})},g=function(e){return 0===e?2:2===e?3:0};C.defaultHooks=a.pureComponentHooks},function(e,t,n){"use strict";t.__esModule=!0,t.AtmosAlertConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.AtmosAlertConsole=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.priority||[],u=l.minor||[];return(0,o.createComponentVNode)(2,a.Window,{width:350,height:300,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Alarms",children:(0,o.createVNode)(1,"ul",null,[0===d.length&&(0,o.createVNode)(1,"li","color-good","No Priority Alerts",16),d.map((function(e){return(0,o.createVNode)(1,"li",null,(0,o.createComponentVNode)(2,i.Button,{icon:"times",content:e,color:"bad",onClick:function(){return c("clear",{zone:e})}}),2,null,e)})),0===u.length&&(0,o.createVNode)(1,"li","color-good","No Minor Alerts",16),u.map((function(e){return(0,o.createVNode)(1,"li",null,(0,o.createComponentVNode)(2,i.Button,{icon:"times",content:e,color:"average",onClick:function(){return c("clear",{zone:e})}}),2,null,e)}))],0)})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.AtmosControlConsole=void 0;var o=n(0),r=n(15),i=n(16),a=n(1),c=n(3),l=n(2);t.AtmosControlConsole=function(e,t){var n,d=(0,a.useBackend)(t),u=d.act,s=d.data,p=s.sensors||[];return(0,o.createComponentVNode)(2,l.Window,{width:500,height:315,resizable:!0,children:(0,o.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,c.Section,{title:!!s.tank&&(null==(n=p[0])?void 0:n.long_name),children:p.map((function(e){var t=e.gases||{};return(0,o.createComponentVNode)(2,c.Section,{title:!s.tank&&e.long_name,level:2,children:(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Pressure",children:(0,i.toFixed)(e.pressure,2)+" kPa"}),!!e.temperature&&(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Temperature",children:(0,i.toFixed)(e.temperature,2)+" K"}),(0,r.map)((function(e,t){return(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:t,children:(0,i.toFixed)(e,2)+"%"})}))(t)]})},e.id_tag)}))}),s.tank&&(0,o.createComponentVNode)(2,c.Section,{title:"Controls",buttons:(0,o.createComponentVNode)(2,c.Button,{icon:"undo",content:"Reconnect",onClick:function(){return u("reconnect")}}),children:(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Input Injector",children:(0,o.createComponentVNode)(2,c.Button,{icon:s.inputting?"power-off":"times",content:s.inputting?"Injecting":"Off",selected:s.inputting,onClick:function(){return u("input")}})}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Input Rate",children:(0,o.createComponentVNode)(2,c.NumberInput,{value:s.inputRate,unit:"L/s",width:"63px",minValue:0,maxValue:200,suppressFlicker:2e3,onChange:function(e,t){return u("rate",{rate:t})}})}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Output Regulator",children:(0,o.createComponentVNode)(2,c.Button,{icon:s.outputting?"power-off":"times",content:s.outputting?"Open":"Closed",selected:s.outputting,onClick:function(){return u("output")}})}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Output Pressure",children:(0,o.createComponentVNode)(2,c.NumberInput,{value:parseFloat(s.outputPressure),unit:"kPa",width:"75px",minValue:0,maxValue:4500,step:10,suppressFlicker:2e3,onChange:function(e,t){return u("pressure",{pressure:t})}})})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.AtmosFilter=void 0;var o=n(0),r=n(1),i=n(3),a=n(34),c=n(2);t.AtmosFilter=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.filter_types||[];return(0,o.createComponentVNode)(2,c.Window,{width:390,height:187,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.Button,{icon:d.on?"power-off":"times",content:d.on?"On":"Off",selected:d.on,onClick:function(){return l("power")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Transfer Rate",children:[(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:parseFloat(d.rate),width:"63px",unit:"L/s",minValue:0,maxValue:200,onDrag:function(e,t){return l("rate",{rate:t})}}),(0,o.createComponentVNode)(2,i.Button,{ml:1,icon:"plus",content:"Max",disabled:d.rate===d.max_rate,onClick:function(){return l("rate",{rate:"max"})}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Filter",children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{selected:e.selected,content:(0,a.getGasLabel)(e.id,e.name),onClick:function(){return l("filter",{mode:e.id})}},e.id)}))})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.AtmosMixer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.AtmosMixer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:370,height:165,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.Button,{icon:l.on?"power-off":"times",content:l.on?"On":"Off",selected:l.on,onClick:function(){return c("power")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Output Pressure",children:[(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:parseFloat(l.set_pressure),unit:"kPa",width:"75px",minValue:0,maxValue:4500,step:10,onChange:function(e,t){return c("pressure",{pressure:t})}}),(0,o.createComponentVNode)(2,i.Button,{ml:1,icon:"plus",content:"Max",disabled:l.set_pressure===l.max_pressure,onClick:function(){return c("pressure",{pressure:"max"})}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Node 1",children:(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:l.node1_concentration,unit:"%",width:"60px",minValue:0,maxValue:100,stepPixelSize:2,onDrag:function(e,t){return c("node1",{concentration:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Node 2",children:(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:l.node2_concentration,unit:"%",width:"60px",minValue:0,maxValue:100,stepPixelSize:2,onDrag:function(e,t){return c("node2",{concentration:t})}})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.AtmosPump=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.AtmosPump=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:335,height:115,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.Button,{icon:l.on?"power-off":"times",content:l.on?"On":"Off",selected:l.on,onClick:function(){return c("power")}})}),l.max_rate?(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Transfer Rate",children:[(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:parseFloat(l.rate),width:"63px",unit:"L/s",minValue:0,maxValue:200,onChange:function(e,t){return c("rate",{rate:t})}}),(0,o.createComponentVNode)(2,i.Button,{ml:1,icon:"plus",content:"Max",disabled:l.rate===l.max_rate,onClick:function(){return c("rate",{rate:"max"})}})]}):(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Output Pressure",children:[(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:parseFloat(l.pressure),unit:"kPa",width:"75px",minValue:0,maxValue:4500,step:10,onChange:function(e,t){return c("pressure",{pressure:t})}}),(0,o.createComponentVNode)(2,i.Button,{ml:1,icon:"plus",content:"Max",disabled:l.pressure===l.max_pressure,onClick:function(){return c("pressure",{pressure:"max"})}})]})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.AutomatedAnnouncement=void 0;var o=n(0),r=(n(19),n(1)),i=n(3),a=n(2),c="%PERSON will be replaced with their name.\n%RANK with their job.";t.AutomatedAnnouncement=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.arrivalToggle,s=d.arrival,p=d.newheadToggle,m=d.newhead;return(0,o.createComponentVNode)(2,a.Window,{title:"Automated Announcement System",width:500,height:225,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Arrival Announcement",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u?"power-off":"times",selected:u,content:u?"On":"Off",onClick:function(){return l("ArrivalToggle")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Message",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"info",tooltip:c,tooltipPosition:"left"}),children:(0,o.createComponentVNode)(2,i.Input,{fluid:!0,value:s,onChange:function(e,t){return l("ArrivalText",{newText:t})}})})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Departmental Head Announcement",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:p?"power-off":"times",selected:p,content:p?"On":"Off",onClick:function(){return l("NewheadToggle")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Message",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"info",tooltip:c,tooltipPosition:"left"}),children:(0,o.createComponentVNode)(2,i.Input,{fluid:!0,value:m,onChange:function(e,t){return l("NewheadText",{newText:t})}})})})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.BankMachine=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.BankMachine=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.current_balance,u=l.siphoning,s=l.station_name;return(0,o.createComponentVNode)(2,a.Window,{width:335,height:160,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:s+" Vault",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Balance",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u?"times":"sync",content:u?"Stop Siphoning":"Siphon Credits",selected:u,onClick:function(){return c(u?"halt":"siphon")}}),children:d+" cr"})})}),(0,o.createComponentVNode)(2,i.NoticeBox,{textAlign:"center",children:"Authorized personnel only"})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Bepis=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Bepis=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.amount;return(0,o.createComponentVNode)(2,a.Window,{width:500,height:480,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Business Exploration Protocol Incubation Sink",children:[(0,o.createComponentVNode)(2,i.Section,{title:"Information",backgroundColor:"#450F44",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",content:l.manual_power?"Off":"On",selected:!l.manual_power,onClick:function(){return c("toggle_power")}}),children:"All you need to know about the B.E.P.I.S. and you! The B.E.P.I.S. performs hundreds of tests a second using electrical and financial resources to invent new products, or discover new technologies otherwise overlooked for being too risky or too niche to produce!"}),(0,o.createComponentVNode)(2,i.Section,{title:"Payer's Account",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"redo-alt",content:"Reset Account",onClick:function(){return c("account_reset")}}),children:["Console is currently being operated by ",l.account_owner?l.account_owner:"no one","."]}),(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{size:1.5,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Stored Data and Statistics",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Deposited Credits",children:l.stored_cash}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Investment Variability",children:[l.accuracy_percentage,"%"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Innovation Bonus",children:l.positive_cash_offset}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Risk Offset",color:"bad",children:l.negative_cash_offset}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Deposit Amount",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:d,unit:"Credits",minValue:100,maxValue:3e4,step:100,stepPixelSize:2,onChange:function(e,t){return c("amount",{amount:t})}})})]})}),(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"donate",content:"Deposit Credits",disabled:1===l.manual_power||1===l.silicon_check,onClick:function(){return c("deposit_cash")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Withdraw Credits",disabled:1===l.manual_power,onClick:function(){return c("withdraw_cash")}})]})]}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Market Data and Analysis",children:[(0,o.createComponentVNode)(2,i.Box,{children:["Average technology cost: ",l.mean_value]}),(0,o.createComponentVNode)(2,i.Box,{children:["Current chance of Success: Est. ",l.success_estimate,"%"]}),l.error_name&&(0,o.createComponentVNode)(2,i.Box,{color:"bad",children:"Previous Failure Reason: Deposited cash value too low. Please insert more money for future success."}),(0,o.createComponentVNode)(2,i.Box,{m:1}),(0,o.createComponentVNode)(2,i.Button,{icon:"microscope",disabled:1===l.manual_power,onClick:function(){return c("begin_experiment")},content:"Begin Testing"})]})})]})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.BiogeneratorContent=t.Biogenerator=void 0;var o=n(0),r=n(6),i=n(19),a=n(1),c=n(3),l=n(40),d=n(2);t.Biogenerator=function(e,t){var n=(0,a.useBackend)(t).data,r=n.beaker,i=n.processing;return(0,o.createComponentVNode)(2,d.Window,{width:550,height:380,resizable:!0,children:[!!i&&(0,o.createComponentVNode)(2,c.Dimmer,{fontSize:"32px",children:[(0,o.createComponentVNode)(2,c.Icon,{name:"cog",spin:1})," Processing..."]}),(0,o.createComponentVNode)(2,d.Window.Content,{scrollable:!0,children:[!r&&(0,o.createComponentVNode)(2,c.NoticeBox,{children:"No Container"}),!!r&&(0,o.createComponentVNode)(2,u)]})]})};var u=function(e,t){var n,r,d=(0,a.useBackend)(t),u=d.act,p=d.data,m=p.biomass,f=p.can_process,h=p.categories,C=void 0===h?[]:h,g=(0,a.useLocalState)(t,"searchText",""),b=g[0],N=g[1],v=(0,a.useLocalState)(t,"category",null==(n=C[0])?void 0:n.name),V=v[0],y=v[1],k=(0,i.createSearch)(b,(function(e){return e.name})),x=b.length>0&&C.flatMap((function(e){return e.items||[]})).filter(k).filter((function(e,t){return t<25}))||(null==(r=C.find((function(e){return e.name===V})))?void 0:r.items)||[];return(0,o.createComponentVNode)(2,c.Section,{title:(0,o.createComponentVNode)(2,c.Box,{inline:!0,color:m>0?"good":"bad",children:[(0,l.formatMoney)(m)," Biomass"]}),buttons:(0,o.createFragment)([(0,o.createTextVNode)("Search"),(0,o.createComponentVNode)(2,c.Input,{autoFocus:!0,value:b,onInput:function(e,t){return N(t)},mx:1}),(0,o.createComponentVNode)(2,c.Button,{icon:"eject",content:"Eject",onClick:function(){return u("detach")}}),(0,o.createComponentVNode)(2,c.Button,{icon:"cog",content:"Activate",disabled:!f,onClick:function(){return u("activate")}})],4),children:(0,o.createComponentVNode)(2,c.Flex,{children:[0===b.length&&(0,o.createComponentVNode)(2,c.Flex.Item,{children:(0,o.createComponentVNode)(2,c.Tabs,{vertical:!0,children:C.map((function(e){var t;return(0,o.createComponentVNode)(2,c.Tabs.Tab,{selected:e.name===V,onClick:function(){return y(e.name)},children:[e.name," (",(null==(t=e.items)?void 0:t.length)||0,")"]},e.name)}))})}),(0,o.createComponentVNode)(2,c.Flex.Item,{grow:1,basis:0,children:[0===x.length&&(0,o.createComponentVNode)(2,c.NoticeBox,{children:0===b.length?"No items in this category.":"No results found."}),(0,o.createComponentVNode)(2,c.Table,{children:(0,o.createComponentVNode)(2,s,{biomass:m,items:x})})]})]})})};t.BiogeneratorContent=u;var s=function(e,t){var n=(0,a.useBackend)(t).act,i=(0,a.useLocalState)(t,"hoveredItem",{}),l=i[0],d=i[1],u=l&&l.cost||0;return e.items.map((function(n){var o=(0,a.useLocalState)(t,"amount"+n.name,1),r=o[0],i=o[1],c=l&&l.name!==n.name,d=e.biomass-u*l.amount<n.cost*r,s=c&&d,p=e.biomass<n.cost*r||s;return Object.assign({},n,{disabled:p,amount:r,setAmount:i})})).map((function(e){return(0,o.createComponentVNode)(2,c.Table.Row,{children:[(0,o.createComponentVNode)(2,c.Table.Cell,{children:[(0,o.createVNode)(1,"span",(0,r.classes)(["design32x32",e.id]),null,1,{style:{"vertical-align":"middle"}})," ",(0,o.createVNode)(1,"b",null,e.name,0)]}),(0,o.createComponentVNode)(2,c.Table.Cell,{collapsing:!0,children:(0,o.createComponentVNode)(2,c.NumberInput,{value:Math.round(e.amount),width:"35px",minValue:1,maxValue:10,onChange:function(t,n){return e.setAmount(n)}})}),(0,o.createComponentVNode)(2,c.Table.Cell,{collapsing:!0,children:(0,o.createComponentVNode)(2,c.Button,{style:{"text-align":"right"},fluid:!0,content:e.cost*e.amount+" BIO",disabled:e.disabled,onmouseover:function(){return d(e)},onmouseout:function(){return d({})},onClick:function(){return n("create",{id:e.id,amount:e.amount})}})})]},e.id)}))}},function(e,t,n){"use strict";t.__esModule=!0,t.BlackMarketUplink=void 0;var o=n(0),r=n(1),i=n(3),a=n(40),c=n(2);t.BlackMarketUplink=function(e,t){var n=(0,r.useBackend)(t),d=n.act,u=n.data,s=u.categories,p=void 0===s?[]:s,m=u.markets,f=void 0===m?[]:m,h=u.items,C=void 0===h?[]:h,g=u.money,b=u.viewing_market,N=u.viewing_category;return(0,o.createComponentVNode)(2,c.Window,{width:600,height:480,theme:"hackerman",resizable:!0,children:[(0,o.createComponentVNode)(2,l),(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Black Market Uplink",buttons:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:g,format:function(e){return(0,a.formatMoney)(e)+" cr"}})})}),(0,o.createComponentVNode)(2,i.Tabs,{children:f.map((function(e){return(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:e.id===b,onClick:function(){return d("set_market",{market:e.id})},children:e.name},e.id)}))}),(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Tabs,{vertical:!0,children:p.map((function(e){return(0,o.createComponentVNode)(2,i.Tabs.Tab,{mt:.5,selected:N===e,onClick:function(){return d("set_category",{category:e})},children:e},e)}))})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:C.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{className:"candystripe",p:1,pb:2,children:[(0,o.createComponentVNode)(2,i.Flex,{spacing:1,align:"baseline",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{bold:!0,grow:1,children:e.name}),(0,o.createComponentVNode)(2,i.Flex.Item,{color:"label",children:e.amount?e.amount+" in stock":"Out of stock"}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,a.formatMoney)(e.cost)+" cr"}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Buy",disabled:!e.amount||e.cost>g,onClick:function(){return d("select",{item:e.id})}})})]}),e.desc]},e.name)}))})]})]})]})};var l=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.buying,u=l.ltsrbt_built,s=l.money;if(!d)return null;var p=l.delivery_methods.map((function(e){var t=l.delivery_method_description[e.name];return Object.assign({},e,{description:t})}));return(0,o.createComponentVNode)(2,i.Modal,{textAlign:"center",children:[(0,o.createComponentVNode)(2,i.Flex,{mb:1,children:p.map((function(e){return"LTSRBT"!==e.name||u?(0,o.createComponentVNode)(2,i.Flex.Item,{mx:1,width:"250px",children:[(0,o.createComponentVNode)(2,i.Box,{fontSize:"30px",children:e.name}),(0,o.createComponentVNode)(2,i.Box,{mt:1,children:e.description}),(0,o.createComponentVNode)(2,i.Button,{mt:2,content:(0,a.formatMoney)(e.price)+" cr",disabled:s<e.price,onClick:function(){return c("buy",{method:e.name})}})]},e.name):null}))}),(0,o.createComponentVNode)(2,i.Button,{content:"Cancel",color:"bad",onClick:function(){return c("cancel")}})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.BluespaceArtillery=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.BluespaceArtillery=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.notice,u=l.connected,s=l.unlocked,p=l.target;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:220,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[!!d&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:d}),u?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Target",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"crosshairs",disabled:!s,onClick:function(){return c("recalibrate")}}),children:(0,o.createComponentVNode)(2,i.Box,{color:p?"average":"bad",fontSize:"25px",children:p||"No Target Set"})}),(0,o.createComponentVNode)(2,i.Section,{children:s?(0,o.createComponentVNode)(2,i.Box,{style:{margin:"auto"},children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"FIRE",color:"bad",disabled:!p,fontSize:"30px",textAlign:"center",lineHeight:"46px",onClick:function(){return c("fire")}})}):(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{color:"bad",fontSize:"18px",children:"Bluespace artillery is currently locked."}),(0,o.createComponentVNode)(2,i.Box,{mt:1,children:"Awaiting authorization via keycard reader from at minimum two station heads."})],4)})],4):(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Maintenance",children:(0,o.createComponentVNode)(2,i.Button,{icon:"wrench",content:"Complete Deployment",onClick:function(){return c("build")}})})})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.BluespaceLocator=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c={north:0,northeast:45,east:90,southeast:135,south:180,southwest:225,west:270,northwest:315};t.BluespaceLocator=function(e,t){var n=(0,r.useSharedState)(t,"tab","implant"),c=n[0],u=n[1];return(0,o.createComponentVNode)(2,a.Window,{width:300,height:300,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Tabs,{children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:"implant"===c,onClick:function(){return u("implant")},children:"Implants"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:"beacon"===c,onClick:function(){return u("beacon")},children:"Teleporter Beacons"})]}),"beacon"===c&&(0,o.createComponentVNode)(2,l)||"implant"===c&&(0,o.createComponentVNode)(2,d)]})})};var l=function(e,t){return(0,r.useBackend)(t).data.telebeacons.map((function(e){return(0,o.createComponentVNode)(2,u,{name:e.name,distance:e.distance,direction:c[e.direction]},e.name)}))},d=function(e,t){return(0,r.useBackend)(t).data.trackimplants.map((function(e){return(0,o.createComponentVNode)(2,u,{name:e.name,distance:e.distance,direction:c[e.direction]},e.name)}))},u=function(e,t){var n=(0,r.useBackend)(t).data.trackingrange,a=e.name,c=e.direction,l=e.distance;return(0,o.createComponentVNode)(2,i.ProgressBar,{mb:1,value:n-l,minValue:0,maxValue:n,ranges:{red:[0,n/3],yellow:[n/3,n/3*2],green:[n/3*2,n]},children:[a,(0,o.createComponentVNode)(2,i.Icon,{ml:2,name:"arrow-up",rotation:c})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.BorgPanel=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.BorgPanel=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.borg||{},u=l.cell||{},s=u.charge/u.maxcharge,p=l.channels||[],m=l.modules||[],f=l.upgrades||[],h=l.ais||[],C=l.laws||[];return(0,o.createComponentVNode)(2,a.Window,{title:"Borg Panel",width:700,height:700,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:d.name,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"pencil-alt",content:"Rename",onClick:function(){return c("rename")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:[(0,o.createComponentVNode)(2,i.Button,{icon:d.emagged?"check-square-o":"square-o",content:"Emagged",selected:d.emagged,onClick:function(){return c("toggle_emagged")}}),(0,o.createComponentVNode)(2,i.Button,{icon:d.lockdown?"check-square-o":"square-o",content:"Locked Down",selected:d.lockdown,onClick:function(){return c("toggle_lockdown")}}),(0,o.createComponentVNode)(2,i.Button,{icon:d.scrambledcodes?"check-square-o":"square-o",content:"Scrambled Codes",selected:d.scrambledcodes,onClick:function(){return c("toggle_scrambledcodes")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Charge",children:[u.missing?(0,o.createVNode)(1,"span","color-bad","No cell installed",16):(0,o.createComponentVNode)(2,i.ProgressBar,{value:s,children:u.charge+" / "+u.maxcharge}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Button,{icon:"pencil-alt",content:"Set",onClick:function(){return c("set_charge")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Change",onClick:function(){return c("change_cell")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"trash",content:"Remove",color:"bad",onClick:function(){return c("remove_cell")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Radio Channels",children:p.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{icon:e.installed?"check-square-o":"square-o",content:e.name,selected:e.installed,onClick:function(){return c("toggle_radio",{channel:e.name})}},e.name)}))}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Module",children:m.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{icon:d.active_module===e.type?"check-square-o":"square-o",content:e.name,selected:d.active_module===e.type,onClick:function(){return c("setmodule",{module:e.type})}},e.type)}))}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Upgrades",children:f.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{icon:e.installed?"check-square-o":"square-o",content:e.name,selected:e.installed,onClick:function(){return c("toggle_upgrade",{upgrade:e.type})}},e.type)}))}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Master AI",children:h.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{icon:e.connected?"check-square-o":"square-o",content:e.name,selected:e.connected,onClick:function(){return c("slavetoai",{slavetoai:e.ref})}},e.ref)}))})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Laws",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d.lawupdate?"check-square-o":"square-o",content:"Lawsync",selected:d.lawupdate,onClick:function(){return c("toggle_lawupdate")}}),children:C.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:e},e)}))})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.BrigTimer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.BrigTimer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:300,height:138,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Cell Timer",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"clock-o",content:l.timing?"Stop":"Start",selected:l.timing,onClick:function(){return c(l.timing?"stop":"start")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"lightbulb-o",content:l.flash_charging?"Recharging":"Flash",disabled:l.flash_charging,onClick:function(){return c("flash")}})],4),children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",onClick:function(){return c("time",{adjust:-600})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"backward",onClick:function(){return c("time",{adjust:-100})}})," ",String(l.minutes).padStart(2,"0"),":",String(l.seconds).padStart(2,"0")," ",(0,o.createComponentVNode)(2,i.Button,{icon:"forward",onClick:function(){return c("time",{adjust:100})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",onClick:function(){return c("time",{adjust:600})}}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Button,{icon:"hourglass-start",content:"Short",onClick:function(){return c("preset",{preset:"short"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"hourglass-start",content:"Medium",onClick:function(){return c("preset",{preset:"medium"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"hourglass-start",content:"Long",onClick:function(){return c("preset",{preset:"long"})}})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.CameraConsoleContent=t.CameraConsole=void 0;var o=n(0),r=n(15),i=n(30),a=n(6),c=n(19),l=n(1),d=n(3),u=n(2),s=function(e,t){void 0===t&&(t="");var n=(0,c.createSearch)(t,(function(e){return e.name}));return(0,i.flow)([(0,r.filter)((function(e){return null==e?void 0:e.name})),t&&(0,r.filter)(n),(0,r.sortBy)((function(e){return e.name}))])(e)};t.CameraConsole=function(e,t){var n=(0,l.useBackend)(t),r=n.act,i=n.data,a=(n.config,i.mapRef),c=i.activeCamera,m=function(e,t){var n,o;if(!t)return[];var r=e.findIndex((function(e){return e.name===t.name}));return[null==(n=e[r-1])?void 0:n.name,null==(o=e[r+1])?void 0:o.name]}(s(i.cameras),c),f=m[0],h=m[1];return(0,o.createComponentVNode)(2,u.Window,{width:870,height:708,resizable:!0,children:[(0,o.createVNode)(1,"div","CameraConsole__left",(0,o.createComponentVNode)(2,u.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,p)}),2),(0,o.createVNode)(1,"div","CameraConsole__right",[(0,o.createVNode)(1,"div","CameraConsole__toolbar",[(0,o.createVNode)(1,"b",null,"Camera: ",16),c&&c.name||"\u2014"],0),(0,o.createVNode)(1,"div","CameraConsole__toolbarRight",[(0,o.createComponentVNode)(2,d.Button,{icon:"chevron-left",disabled:!f,onClick:function(){return r("switch_camera",{name:f})}}),(0,o.createComponentVNode)(2,d.Button,{icon:"chevron-right",disabled:!h,onClick:function(){return r("switch_camera",{name:h})}})],4),(0,o.createComponentVNode)(2,d.ByondUi,{className:"CameraConsole__map",params:{id:a,type:"map"}})],4)]})};var p=function(e,t){var n=(0,l.useBackend)(t),r=n.act,i=n.data,c=(0,l.useLocalState)(t,"searchText",""),p=c[0],m=c[1],f=i.activeCamera,h=s(i.cameras,p);return(0,o.createFragment)([(0,o.createComponentVNode)(2,d.Input,{autoFocus:!0,fluid:!0,mb:1,placeholder:"Search for a camera",onInput:function(e,t){return m(t)}}),(0,o.createComponentVNode)(2,d.Section,{children:h.map((function(e){return(0,o.createVNode)(1,"div",(0,a.classes)(["Button","Button--fluid","Button--color--transparent","Button--ellipsis",f&&e.name===f.name&&"Button--selected"]),e.name,0,{title:e.name,onClick:function(){(0,u.refocusLayout)(),r("switch_camera",{name:e.name})}},e.name)}))})],4)};t.CameraConsoleContent=p},function(e,t,n){"use strict";t.__esModule=!0,t.Canister=void 0;var o=n(0),r=n(16),i=n(1),a=n(3),c=n(40),l=n(2);t.Canister=function(e,t){var n=(0,i.useBackend)(t),d=n.act,u=n.data,s=u.portConnected,p=u.tankPressure,m=u.releasePressure,f=u.defaultReleasePressure,h=u.minReleasePressure,C=u.maxReleasePressure,g=u.valveOpen,b=u.isPrototype,N=u.hasHoldingTank,v=u.holdingTank,V=u.restricted;return(0,o.createComponentVNode)(2,l.Window,{width:300,height:232,children:(0,o.createComponentVNode)(2,l.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Canister",buttons:(0,o.createFragment)([!!b&&(0,o.createComponentVNode)(2,a.Button,{mr:1,icon:V?"lock":"unlock",color:"caution",content:V?"Engineering":"Public",onClick:function(){return d("restricted")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"pencil-alt",content:"Relabel",onClick:function(){return d("relabel")}})],0),children:(0,o.createComponentVNode)(2,a.LabeledControls,{children:[(0,o.createComponentVNode)(2,a.LabeledControls.Item,{minWidth:"66px",label:"Pressure",children:(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:p,format:function(e){return e<1e4?(0,r.toFixed)(e)+" kPa":(0,c.formatSiUnit)(1e3*e,1,"Pa")}})}),(0,o.createComponentVNode)(2,a.LabeledControls.Item,{label:"Regulator",children:(0,o.createComponentVNode)(2,a.Box,{position:"relative",left:"-8px",children:[(0,o.createComponentVNode)(2,a.Knob,{size:1.25,color:!!g&&"yellow",value:m,unit:"kPa",minValue:h,maxValue:C,step:5,stepPixelSize:1,onDrag:function(e,t){return d("pressure",{pressure:t})}}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,position:"absolute",top:"-2px",right:"-20px",color:"transparent",icon:"fast-forward",onClick:function(){return d("pressure",{pressure:C})}}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,position:"absolute",top:"16px",right:"-20px",color:"transparent",icon:"undo",onClick:function(){return d("pressure",{pressure:f})}})]})}),(0,o.createComponentVNode)(2,a.LabeledControls.Item,{label:"Valve",children:(0,o.createComponentVNode)(2,a.Button,{my:.5,width:"50px",lineHeight:2,fontSize:"11px",color:g?N?"caution":"danger":null,content:g?"Open":"Closed",onClick:function(){return d("valve")}})}),(0,o.createComponentVNode)(2,a.LabeledControls.Item,{mr:1,label:"Port",children:(0,o.createComponentVNode)(2,a.Box,{position:"relative",children:[(0,o.createComponentVNode)(2,a.Icon,{size:1.25,name:s?"plug":"times",color:s?"good":"bad"}),(0,o.createComponentVNode)(2,a.Tooltip,{content:s?"Connected":"Disconnected",position:"top"})]})})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Holding Tank",buttons:!!N&&(0,o.createComponentVNode)(2,a.Button,{icon:"eject",color:g&&"danger",content:"Eject",onClick:function(){return d("eject")}}),children:[!!N&&(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Label",children:v.name}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pressure",children:[(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:v.tankPressure})," kPa"]})]}),!N&&(0,o.createComponentVNode)(2,a.Box,{color:"average",children:"No Holding Tank"})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Canvas=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);var c=function(e){var t,n;function r(t){var n;return(n=e.call(this,t)||this).canvasRef=(0,o.createRef)(),n.onCVClick=t.onCanvasClick,n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var i=r.prototype;return i.componentDidMount=function(){this.drawCanvas(this.props)},i.componentDidUpdate=function(){this.drawCanvas(this.props)},i.drawCanvas=function(e){var t=this.canvasRef.current.getContext("2d"),n=e.value,o=n.length;if(o){var r=n[0].length,i=Math.round(this.canvasRef.current.width/o),a=Math.round(this.canvasRef.current.height/r);t.save(),t.scale(i,a);for(var c=0;c<n.length;c++)for(var l=n[c],d=0;d<l.length;d++){var u=l[d];t.fillStyle=u,t.fillRect(c,d,1,1)}t.restore()}},i.clickwrapper=function(e){var t=this.props.value.length;if(t){var n=this.props.value[0].length,o=this.canvasRef.current.width/t,r=this.canvasRef.current.height/n,i=Math.floor(e.offsetX/o)+1,a=Math.floor(e.offsetY/r)+1;this.onCVClick(i,a)}},i.render=function(){var e=this,t=this.props,n=(t.res,t.value),r=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(t,["res","value"]),i=l(n),a=i[0],c=i[1];return(0,o.normalizeProps)((0,o.createVNode)(1,"canvas",null,"Canvas failed to render.",16,Object.assign({width:28*a||300,height:28*c||300},r,{onClick:function(t){return e.clickwrapper(t)}}),null,this.canvasRef))},r}(o.Component),l=function(e){var t=e.length;return[t,0!==t?e[0].length:0]};t.Canvas=function(e,t){var n=(0,r.useBackend)(t),d=n.act,u=n.data,s=l(u.grid),p=s[0],m=s[1];return(0,o.createComponentVNode)(2,a.Window,{width:Math.min(400,28*p*32+24),height:Math.min(400,28*m*32+24),resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Box,{textAlign:"center",children:[(0,o.createComponentVNode)(2,c,{value:u.grid,onCanvasClick:function(e,t){return d("paint",{x:e,y:t})}}),(0,o.createComponentVNode)(2,i.Box,{children:[!u.finalized&&(0,o.createComponentVNode)(2,i.Button.Confirm,{onClick:function(){return d("finalize")},content:"Finalize"}),u.name]})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.CargoBountyConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(40),c=n(2);t.CargoBountyConsole=function(e,t){var n=(0,r.useBackend)(t),a=n.act,d=n.data.bountydata,u=void 0===d?[]:d;return(0,o.createComponentVNode)(2,c.Window,{width:750,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:(0,o.createComponentVNode)(2,l),buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"print",content:"Print Bounty List",onClick:function(){return a("Print")}}),children:(0,o.createComponentVNode)(2,i.Table,{border:!0,children:[(0,o.createComponentVNode)(2,i.Table.Row,{bold:!0,italic:!0,color:"label",fontSize:1.25,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Bounty Object"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Description"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Progress"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Value"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Claim"})]}),u.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{backgroundColor:1===e.priority?"rgba(252, 152, 3, 0.25)":"",children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,children:e.name}),(0,o.createComponentVNode)(2,i.Table.Cell,{italic:!0,textAlign:"center",p:1,children:e.description}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,textAlign:"center",children:[1===e.priority?(0,o.createComponentVNode)(2,i.Box,{children:"High Priority"}):"",e.completion_string]}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,textAlign:"center",children:e.reward_string}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,textAlign:"center",icon:1===e.claimed?"check":"",content:1===e.claimed?"Claimed":"Claim",disabled:1===e.claimed,color:1===e.can_claim?"green":"red",onClick:function(){return a("ClaimBounty",{bounty:e.bounty_ref})}})})]},e.name)}))]})})})})};var l=function(e,t){var n=(0,r.useBackend)(t),c=(n.act,n.data.stored_cash);return(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:c,format:function(e){return(0,a.formatMoney)(e)}})," credits"]})}},function(e,t,n){"use strict";t.__esModule=!0,t.CargoExpress=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(179),l=n(61);t.CargoExpress=function(e,t){var n=(0,r.useBackend)(t),i=(n.act,n.data);return(0,o.createComponentVNode)(2,a.Window,{width:600,height:700,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,l.InterfaceLockNoticeBox,{accessText:"a QM-level ID card"}),!i.locked&&(0,o.createComponentVNode)(2,d)]})})};var d=function(e,t){var n=(0,r.useBackend)(t),a=n.act,l=n.data;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Cargo Express",buttons:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:Math.round(l.points)})," credits"]}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Landing Location",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Cargo Bay",selected:!l.usingBeacon,onClick:function(){return a("LZCargo")}}),(0,o.createComponentVNode)(2,i.Button,{selected:l.usingBeacon,disabled:!l.hasBeacon,onClick:function(){return a("LZBeacon")},children:[l.beaconzone," (",l.beaconName,")"]}),(0,o.createComponentVNode)(2,i.Button,{content:l.printMsg,disabled:!l.canBuyBeacon,onClick:function(){return a("printBeacon")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Notice",children:l.message})]})}),(0,o.createComponentVNode)(2,c.CargoCatalog,{express:!0})],4)}},function(e,t,n){"use strict";t.__esModule=!0,t.CargoHoldTerminal=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.CargoHoldTerminal=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.points,u=l.pad,s=l.sending,p=l.status_report;return(0,o.createComponentVNode)(2,a.Window,{width:600,height:230,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Cargo Value",children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:Math.round(d)})," credits"]})})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Cargo Pad",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Recalculate Value",disabled:!u,onClick:function(){return c("recalc")}}),(0,o.createComponentVNode)(2,i.Button,{icon:s?"times":"arrow-up",content:s?"Stop Sending":"Send Goods",selected:s,disabled:!u,onClick:function(){return c(s?"stop":"send")}})],4),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",color:u?"good":"bad",children:u?"Online":"Not Found"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cargo Report",children:p})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.CellularEmporium=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.CellularEmporium=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.abilities;return(0,o.createComponentVNode)(2,a.Window,{width:900,height:480,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Genetic Points",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"undo",content:"Readapt",disabled:!l.can_readapt,onClick:function(){return c("readapt")}}),children:l.genetic_points_remaining})})}),(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:d.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{className:"candystripe",label:e.name,buttons:(0,o.createFragment)([e.dna_cost," ",(0,o.createComponentVNode)(2,i.Button,{content:e.owned?"Evolved":"Evolve",selected:e.owned,onClick:function(){return c("evolve",{name:e.name})}})],0),children:[e.desc,(0,o.createComponentVNode)(2,i.Box,{color:"good",children:e.helptext})]},e.name)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.CentcomPodLauncherContent=t.CentcomPodLauncher=void 0;var o=n(0),r=(n(19),n(1)),i=n(3),a=n(2);t.CentcomPodLauncher=function(){return(0,o.createComponentVNode)(2,a.Window,{title:"Config/Launch Supply Pod",width:700,height:700,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.NoticeBox,{children:"To use this, simply spawn the atoms you want in one of the five Centcom Supplypod Bays. Items in the bay will then be launched inside your supplypod, one turf-full at a time! You can optionally use the following buttons to configure how the supplypod acts."}),(0,o.createComponentVNode)(2,i.Section,{title:"Centcom Pod Customization (To be used against Helen Weinstein)",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Supply Bay",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Bay #1",selected:1===c.bayNumber,onClick:function(){return a("bay1")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Bay #2",selected:2===c.bayNumber,onClick:function(){return a("bay2")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Bay #3",selected:3===c.bayNumber,onClick:function(){return a("bay3")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Bay #4",selected:4===c.bayNumber,onClick:function(){return a("bay4")}}),(0,o.createComponentVNode)(2,i.Button,{content:"ERT Bay",selected:5===c.bayNumber,tooltip:"This bay is located on the western edge of CentCom. Its the\nglass room directly west of where ERT spawn, and south of the\nCentCom ferry. Useful for launching ERT/Deathsquads/etc. onto\nthe station via drop pods.",onClick:function(){return a("bay5")}})]}),!!c.effectReverse&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Reverse Drop",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Pick Dropoff Location",selected:c.picking_dropoff_turf,disabled:!c.effectReverse,tooltip:"[NOTE: ONLY WORKS WHEN REVERSE MODE IS ACTIVE]\nThis will allow you to select a dropoff turf. After\nselecting a turf, any pod in 'Reverse Mode' will drop off\nit's newly gotten cargo on this turf. Can be used to\ntransport things or people around the station in a neat,\nIC way. Try doing this with the 'Seethrough Pod' style\nenabled for extra fun!",onClick:function(){return a("pickDropoffTurf")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Clear Dropoff Location",disabled:!c.dropoff_turf,tooltip:"Clears the selected dropoff turf for reverse mode.",onClick:function(){return a("clearDropoffTurf")}}),(0,o.createVNode)(1,"p",null,[(0,o.createTextVNode)("Reverse Drop-off Location:"),c.dropoff_turf?c.dropoff_turf:"None"],0)]}),!c.effectReverse&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Reverse Drop",children:(0,o.createVNode)(1,"p",null,"[Enable Reverse Mode for this feature]",16)}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Teleport to",children:[(0,o.createComponentVNode)(2,i.Button,{content:c.bay,onClick:function(){return a("teleportCentcom")}}),(0,o.createComponentVNode)(2,i.Button,{content:c.oldArea?c.oldArea:"Where you were",disabled:!c.oldArea,onClick:function(){return a("teleportBack")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Item Mode",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Clone Items",selected:c.launchClone,tooltip:"Choosing this will create a duplicate of the item to be\nlaunched in Centcom, allowing you to send one type of item\nmultiple times. Either way, the atoms are forceMoved into\nthe supplypod after it lands (but before it opens).",onClick:function(){return a("launchClone")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Random Items",selected:c.launchRandomItem,tooltip:"Choosing this will pick a random item from the selected turf\ninstead of the entire turfs contents. Best combined with\nsingle/random turf.",onClick:function(){return a("launchRandomItem")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Launch style",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Ordered",selected:1===c.launchChoice,tooltip:'Instead of launching everything in the bay at once, this\nwill "scan" things (one turf-full at a time) in order, left\nto right and top to bottom. undoing will reset the "scanner"\nto the top-leftmost position.',onClick:function(){return a("launchOrdered")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Random Turf",selected:2===c.launchChoice,tooltip:"Instead of launching everything in the bay at once, this\nwill launch one random turf of items at a time.",onClick:function(){return a("launchRandomTurf")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Explosion",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Custom Size",selected:1===c.explosionChoice,tooltip:"This will cause an explosion of whatever size you like\n(including flame range) to occur as soon as the supplypod\nlands. Dont worry, supply-pods are explosion-proof!",onClick:function(){return a("explosionCustom")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Adminbus",selected:2===c.explosionChoice,tooltip:"This will cause a maxcap explosion (dependent on server\nconfig) to occur as soon as the supplypod lands. Dont worry,\nsupply-pods are explosion-proof!",onClick:function(){return a("explosionBus")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Damage",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Custom Damage",selected:1===c.damageChoice,tooltip:"Anyone caught under the pod when it lands will be dealt\nthis amount of brute damage. Sucks to be them!",onClick:function(){return a("damageCustom")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Gib",selected:2===c.damageChoice,tooltip:"This will attempt to gib any mob caught under the pod when\nit lands, as well as dealing a nice 5000 brute damage. Ya\nknow, just to be sure!",onClick:function(){return a("damageGib")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Effects",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Projectile Cloud",selected:c.effectShrapnel,tooltip:"This will create a cloud of shrapnel on landing,\nof any projectile you'd like!",onClick:function(){return a("effectShrapnel")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Stun",selected:c.effectStun,tooltip:"Anyone who is on the turf when the supplypod is launched\nwill be stunned until the supplypod lands. They cant get\naway that easy!",onClick:function(){return a("effectStun")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Delimb",selected:c.effectLimb,tooltip:"This will cause anyone caught under the pod to lose a limb,\nexcluding their head.",onClick:function(){return a("effectLimb")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Yeet Organs",selected:c.effectOrgans,tooltip:"This will cause anyone caught under the pod to lose all\ntheir limbs and organs in a spectacular fashion.",onClick:function(){return a("effectOrgans")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Movement",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Bluespace",selected:c.effectBluespace,tooltip:"Gives the supplypod an advanced Bluespace Recyling Device.\nAfter opening, the supplypod will be warped directly to the\nsurface of a nearby NT-designated trash planet (/r/ss13).",onClick:function(){return a("effectBluespace")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Stealth",selected:c.effectStealth,tooltip:'This hides the red target icon from appearing when you\nlaunch the supplypod. Combos well with the "Invisible"\nstyle. Sneak attack, go!',onClick:function(){return a("effectStealth")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Quiet",selected:c.effectQuiet,tooltip:"This will keep the supplypod from making any sounds, except\nfor those specifically set by admins in the Sound section.",onClick:function(){return a("effectQuiet")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Reverse Mode",selected:c.effectReverse,tooltip:"This pod will not send any items. Instead, after landing,\nthe supplypod will close (similar to a normal closet closing),\nand then launch back to the right centcom bay to drop off any\nnew contents.",onClick:function(){return a("effectReverse")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Missile Mode",selected:c.effectMissile,tooltip:"This pod will not send any items. Instead, it will immediately\ndelete after landing (Similar visually to setting openDelay\n& departDelay to 0, but this looks nicer). Useful if you just\nwanna fuck some shit up. Combos well with the Missile style.",onClick:function(){return a("effectMissile")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Any Descent Angle",selected:c.effectCircle,tooltip:"This will make the supplypod come in from any angle. Im not\nsure why this feature exists, but here it is.",onClick:function(){return a("effectCircle")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Machine Gun Mode",selected:c.effectBurst,tooltip:"This will make each click launch 5 supplypods inaccuratly\naround the target turf (a 3x3 area). Combos well with the\nMissile Mode if you dont want shit lying everywhere after.",onClick:function(){return a("effectBurst")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Specific Target",selected:c.effectTarget,tooltip:"This will make the supplypod target a specific atom, instead\nof the mouses position. Smiting does this automatically!",onClick:function(){return a("effectTarget")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name/Desc",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Custom Name/Desc",selected:c.effectName,tooltip:"Allows you to add a custom name and description.",onClick:function(){return a("effectName")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Alert Ghosts",selected:c.effectAnnounce,tooltip:"Alerts ghosts when a pod is launched. Useful if some dumb\nshit is aboutta come outta the pod.",onClick:function(){return a("effectAnnounce")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Sound",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Custom Falling Sound",selected:c.fallingSound,tooltip:"Choose a sound to play as the pod falls. Note that for this\nto work right you should know the exact length of the sound,\nin seconds.",onClick:function(){return a("fallSound")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Custom Landing Sound",selected:c.landingSound,tooltip:"Choose a sound to play when the pod lands.",onClick:function(){return a("landingSound")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Custom Opening Sound",selected:c.openingSound,tooltip:"Choose a sound to play when the pod opens.",onClick:function(){return a("openingSound")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Custom Leaving Sound",selected:c.leavingSound,tooltip:"Choose a sound to play when the pod departs (whether that be\ndelection in the case of a bluespace pod, or leaving for\ncentcom for a reversing pod).",onClick:function(){return a("leavingSound")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Admin Sound Volume",selected:c.soundVolume,tooltip:"Choose the volume for the sound to play at. Default values\nare between 1 and 100, but hey, do whatever. Im a tooltip,\nnot a cop.",onClick:function(){return a("soundVolume")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Timers",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Custom Falling Duration",selected:4!==c.fallDuration,tooltip:"Set how long the animation for the pod falling lasts. Create\ndramatic, slow falling pods!",onClick:function(){return a("fallDuration")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Custom Landing Time",selected:20!==c.landingDelay,tooltip:"Choose the amount of time it takes for the supplypod to hit\nthe station. By default this value is 0.5 seconds.",onClick:function(){return a("landingDelay")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Custom Opening Time",selected:30!==c.openingDelay,tooltip:"Choose the amount of time it takes for the supplypod to open\nafter landing. Useful for giving whatevers inside the pod a\nnice dramatic entrance! By default this value is 3 seconds.",onClick:function(){return a("openingDelay")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Custom Leaving Time",selected:30!==c.departureDelay,tooltip:"Choose the amount of time it takes for the supplypod to leave\nafter landing. By default this value is 3 seconds.",onClick:function(){return a("departureDelay")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Style",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.styleChoice,tooltip:"Same color scheme as the normal station-used supplypods",onClick:function(){return a("styleStandard")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Advanced",selected:2===c.styleChoice,tooltip:"The same as the stations upgraded blue-and-white\nBluespace Supplypods",onClick:function(){return a("styleBluespace")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Syndicate",selected:4===c.styleChoice,tooltip:"A menacing black and blood-red. Great for sending meme-ops\nin style!",onClick:function(){return a("styleSyndie")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Deathsquad",selected:5===c.styleChoice,tooltip:"A menacing black and dark blue. Great for sending deathsquads\nin style!",onClick:function(){return a("styleBlue")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Cult Pod",selected:6===c.styleChoice,tooltip:"A blood and rune covered cult pod!",onClick:function(){return a("styleCult")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Missile",selected:7===c.styleChoice,tooltip:"A large missile. Combos well with a missile mode, so the\nmissile doesnt stick around after landing.",onClick:function(){return a("styleMissile")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Syndicate Missile",selected:8===c.styleChoice,tooltip:"A large blood-red missile. Combos well with missile mode,\nso the missile doesnt stick around after landing.",onClick:function(){return a("styleSMissile")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Supply Crate",selected:9===c.styleChoice,tooltip:"A large, dark-green military supply crate.",onClick:function(){return a("styleBox")}}),(0,o.createComponentVNode)(2,i.Button,{content:"HONK",selected:10===c.styleChoice,tooltip:"A colorful, clown inspired look.",onClick:function(){return a("styleHONK")}}),(0,o.createComponentVNode)(2,i.Button,{content:"~Fruit",selected:11===c.styleChoice,tooltip:"For when an orange is angry",onClick:function(){return a("styleFruit")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Invisible",selected:12===c.styleChoice,tooltip:'Makes the supplypod invisible! Useful for when you want to\nuse this feature with a gateway or something. Combos well\nwith the "Stealth" and "Quiet Landing" effects.',onClick:function(){return a("styleInvisible")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Gondola",selected:13===c.styleChoice,tooltip:"This gondola can control when he wants to deliver his supplies\nif he has a smart enough mind, so offer up his body to ghosts\nfor maximum enjoyment. (Make sure to turn off bluespace and\nset an arbitrarily high open-time if you do!",onClick:function(){return a("styleGondola")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Show Contents (See Through Pod)",selected:14===c.styleChoice,tooltip:"By selecting this, the pod will instead look like whatevers\ninside it (as if it were the contents falling by themselves,\nwithout a pod). Useful for launching mechs at the station\nand standing tall as they soar in from the heavens.",onClick:function(){return a("styleSeeThrough")}})]})]})}),(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:c.numObjects+" turfs in "+c.bay,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{content:"undo Pod Bay",tooltip:"Manually undoes the possible things to launch in the\npod bay.",onClick:function(){return a("undo")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Enter Launch Mode",selected:c.giveLauncher,tooltip:"THE CODEX ASTARTES CALLS THIS MANEUVER: STEEL RAIN",onClick:function(){return a("giveLauncher")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Clear Selected Bay",color:"bad",tooltip:"This will delete all objs and mobs from the selected bay.",tooltipPosition:"left",onClick:function(){return a("clearBay")}})],4)})})})],4)};t.CentcomPodLauncherContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.ChemAcclimator=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ChemAcclimator=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:320,height:271,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Acclimator",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Temperature",children:[l.chem_temp," K"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Target Temperature",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:l.target_temperature,unit:"K",width:"59px",minValue:0,maxValue:1e3,step:5,stepPixelSize:2,onChange:function(e,t){return c("set_target_temperature",{temperature:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Acceptable Temp. Difference",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:l.allowed_temperature_difference,unit:"K",width:"59px",minValue:1,maxValue:l.target_temperature,stepPixelSize:2,onChange:function(e,t){c("set_allowed_temperature_difference",{temperature:t})}})})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Status",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",content:l.enabled?"On":"Off",selected:l.enabled,onClick:function(){return c("toggle_power")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Volume",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:l.max_volume,unit:"u",width:"50px",minValue:l.reagent_volume,maxValue:200,step:2,stepPixelSize:2,onChange:function(e,t){return c("change_volume",{volume:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Operation",children:l.acclimate_state}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current State",children:l.emptying?"Emptying":"Filling"})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemDebugSynthesizer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ChemDebugSynthesizer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.amount,u=l.beakerCurrentVolume,s=l.beakerMaxVolume,p=l.isBeakerLoaded,m=l.beakerContents,f=void 0===m?[]:m;return(0,o.createComponentVNode)(2,a.Window,{width:390,height:330,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Recipient",buttons:p?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",onClick:function(){return c("ejectBeaker")}}),(0,o.createComponentVNode)(2,i.NumberInput,{value:d,unit:"u",minValue:1,maxValue:s,step:1,stepPixelSize:2,onChange:function(e,t){return c("amount",{amount:t})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"plus",content:"Input",onClick:function(){return c("input")}})],4):(0,o.createComponentVNode)(2,i.Button,{icon:"plus",content:"Create Beaker",onClick:function(){return c("makecup")}}),children:p?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:u})," / "+s+" u"]}),f.length>0?(0,o.createComponentVNode)(2,i.LabeledList,{children:f.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,children:[e.volume," u"]},e.name)}))}):(0,o.createComponentVNode)(2,i.Box,{color:"bad",children:"Recipient Empty"})],0):(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"No Recipient"})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemDispenser=void 0;var o=n(0),r=n(16),i=n(19),a=n(1),c=n(3),l=n(2);t.ChemDispenser=function(e,t){var n=(0,a.useBackend)(t),d=n.act,u=n.data,s=!!u.recordingRecipe,p=Object.keys(u.recipes).map((function(e){return{name:e,contents:u.recipes[e]}})),m=u.beakerTransferAmounts||[],f=s&&Object.keys(u.recordingRecipe).map((function(e){return{id:e,name:(0,i.toTitleCase)(e.replace(/_/," ")),volume:u.recordingRecipe[e]}}))||u.beakerContents||[];return(0,o.createComponentVNode)(2,l.Window,{width:565,height:620,resizable:!0,children:(0,o.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,c.Section,{title:"Status",buttons:s&&(0,o.createComponentVNode)(2,c.Box,{inline:!0,mx:1,color:"red",children:[(0,o.createComponentVNode)(2,c.Icon,{name:"circle",mr:1}),"Recording"]}),children:(0,o.createComponentVNode)(2,c.LabeledList,{children:(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Energy",children:(0,o.createComponentVNode)(2,c.ProgressBar,{value:u.energy/u.maxEnergy,children:(0,r.toFixed)(u.energy)+" units"})})})}),(0,o.createComponentVNode)(2,c.Section,{title:"Recipes",buttons:(0,o.createFragment)([!s&&(0,o.createComponentVNode)(2,c.Box,{inline:!0,mx:1,children:(0,o.createComponentVNode)(2,c.Button,{color:"transparent",content:"Clear recipes",onClick:function(){return d("clear_recipes")}})}),!s&&(0,o.createComponentVNode)(2,c.Button,{icon:"circle",disabled:!u.isBeakerLoaded,content:"Record",onClick:function(){return d("record_recipe")}}),s&&(0,o.createComponentVNode)(2,c.Button,{icon:"ban",color:"transparent",content:"Discard",onClick:function(){return d("cancel_recording")}}),s&&(0,o.createComponentVNode)(2,c.Button,{icon:"save",color:"green",content:"Save",onClick:function(){return d("save_recording")}})],0),children:(0,o.createComponentVNode)(2,c.Box,{mr:-1,children:[p.map((function(e){return(0,o.createComponentVNode)(2,c.Button,{icon:"tint",width:"129.5px",lineHeight:1.75,content:e.name,onClick:function(){return d("dispense_recipe",{recipe:e.name})}},e.name)})),0===p.length&&(0,o.createComponentVNode)(2,c.Box,{color:"light-gray",children:"No recipes."})]})}),(0,o.createComponentVNode)(2,c.Section,{title:"Dispense",buttons:m.map((function(e){return(0,o.createComponentVNode)(2,c.Button,{icon:"plus",selected:e===u.amount,content:e,onClick:function(){return d("amount",{target:e})}},e)})),children:(0,o.createComponentVNode)(2,c.Box,{mr:-1,children:u.chemicals.map((function(e){return(0,o.createComponentVNode)(2,c.Button,{icon:"tint",width:"129.5px",lineHeight:1.75,content:e.title,onClick:function(){return d("dispense",{reagent:e.id})}},e.id)}))})}),(0,o.createComponentVNode)(2,c.Section,{title:"Beaker",buttons:m.map((function(e){return(0,o.createComponentVNode)(2,c.Button,{icon:"minus",disabled:s,content:e,onClick:function(){return d("remove",{amount:e})}},e)})),children:(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Beaker",buttons:!!u.isBeakerLoaded&&(0,o.createComponentVNode)(2,c.Button,{icon:"eject",content:"Eject",disabled:!u.isBeakerLoaded,onClick:function(){return d("eject")}}),children:(s?"Virtual beaker":u.isBeakerLoaded&&(0,o.createFragment)([(0,o.createComponentVNode)(2,c.AnimatedNumber,{initial:0,value:u.beakerCurrentVolume}),(0,o.createTextVNode)("/"),u.beakerMaxVolume,(0,o.createTextVNode)(" units")],0))||"No beaker"}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Contents",children:[(0,o.createComponentVNode)(2,c.Box,{color:"label",children:u.isBeakerLoaded||s?0===f.length&&"Nothing":"N/A"}),f.map((function(e){return(0,o.createComponentVNode)(2,c.Box,{color:"label",children:[(0,o.createComponentVNode)(2,c.AnimatedNumber,{initial:0,value:e.volume})," ","units of ",e.name]},e.name)}))]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemFilter=t.ChemFilterPane=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=function(e,t){var n=(0,r.useBackend)(t).act,a=e.title,c=e.list,l=e.reagentName,d=e.onReagentInput,u=a.toLowerCase();return(0,o.createComponentVNode)(2,i.Section,{title:a,minHeight:"240px",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Input,{placeholder:"Reagent",width:"140px",onInput:function(e,t){return d(t)}}),(0,o.createComponentVNode)(2,i.Button,{ml:1,icon:"plus",onClick:function(){return n("add",{which:u,name:l})}})],4),children:c.map((function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"minus",content:e,onClick:function(){return n("remove",{which:u,reagent:e})}})],4,e)}))})};t.ChemFilterPane=c;t.ChemFilter=function(e,t){var n=(0,r.useBackend)(t),l=(n.act,n.data),d=l.left,u=void 0===d?[]:d,s=l.right,p=void 0===s?[]:s,m=(0,r.useLocalState)(t,"leftName",""),f=m[0],h=m[1],C=(0,r.useLocalState)(t,"rightName",""),g=C[0],b=C[1];return(0,o.createComponentVNode)(2,a.Window,{width:500,height:300,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Flex,{spacing:1,children:[(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,c,{title:"Left",list:u,reagentName:f,onReagentInput:function(e){return h(e)}})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,c,{title:"Right",list:p,reagentName:g,onReagentInput:function(e){return b(e)}})})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemHeater=void 0;var o=n(0),r=n(16),i=n(1),a=n(3),c=n(2),l=n(180);t.ChemHeater=function(e,t){var n=(0,i.useBackend)(t),d=n.act,u=n.data,s=u.targetTemp,p=u.isActive,m=u.isBeakerLoaded,f=u.currentTemp,h=u.beakerCurrentVolume,C=u.beakerMaxVolume,g=u.beakerContents,b=void 0===g?[]:g;return(0,o.createComponentVNode)(2,c.Window,{width:275,height:320,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{title:"Thermostat",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:p?"power-off":"times",selected:p,content:p?"On":"Off",onClick:function(){return d("power")}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Target",children:(0,o.createComponentVNode)(2,a.NumberInput,{width:"65px",unit:"K",step:10,stepPixelSize:3,value:(0,r.round)(s),minValue:0,maxValue:1e3,onDrag:function(e,t){return d("temperature",{target:t})}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Reading",children:(0,o.createComponentVNode)(2,a.Box,{width:"60px",textAlign:"right",children:m&&(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:f,format:function(e){return(0,r.toFixed)(e)+" K"}})||"\u2014"})})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Beaker",buttons:!!m&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"label",mr:2,children:[h," / ",C," units"]}),(0,o.createComponentVNode)(2,a.Button,{icon:"eject",content:"Eject",onClick:function(){return d("eject")}})],4),children:(0,o.createComponentVNode)(2,l.BeakerContents,{beakerLoaded:m,beakerContents:b})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemMaster=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ChemMaster=function(e,t){var n=(0,r.useBackend)(t).data.screen;return(0,o.createComponentVNode)(2,a.Window,{width:465,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:"analyze"===n&&(0,o.createComponentVNode)(2,p)||(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,u=c.screen,m=c.beakerContents,f=void 0===m?[]:m,h=c.bufferContents,C=void 0===h?[]:h,g=c.beakerCurrentVolume,b=c.beakerMaxVolume,N=c.isBeakerLoaded,v=c.isPillBottleLoaded,V=c.pillBottleCurrentAmount,y=c.pillBottleMaxAmount;return"analyze"===u?(0,o.createComponentVNode)(2,p):(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Beaker",buttons:!!c.isBeakerLoaded&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"label",mr:2,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:g,initial:0})," / "+b+" units"]}),(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",onClick:function(){return a("eject")}})],4),children:[!N&&(0,o.createComponentVNode)(2,i.Box,{color:"label",mt:"3px",mb:"5px",children:"No beaker loaded."}),!!N&&0===f.length&&(0,o.createComponentVNode)(2,i.Box,{color:"label",mt:"3px",mb:"5px",children:"Beaker is empty."}),(0,o.createComponentVNode)(2,l,{children:f.map((function(e){return(0,o.createComponentVNode)(2,d,{chemical:e,transferTo:"buffer"},e.id)}))})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Buffer",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"label",mr:1,children:"Mode:"}),(0,o.createComponentVNode)(2,i.Button,{color:c.mode?"good":"bad",icon:c.mode?"exchange-alt":"times",content:c.mode?"Transfer":"Destroy",onClick:function(){return a("toggleMode")}})],4),children:[0===C.length&&(0,o.createComponentVNode)(2,i.Box,{color:"label",mt:"3px",mb:"5px",children:"Buffer is empty."}),(0,o.createComponentVNode)(2,l,{children:C.map((function(e){return(0,o.createComponentVNode)(2,d,{chemical:e,transferTo:"beaker"},e.id)}))})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Packaging",children:(0,o.createComponentVNode)(2,s)}),!!v&&(0,o.createComponentVNode)(2,i.Section,{title:"Pill Bottle",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"label",mr:2,children:[V," / ",y," pills"]}),(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",onClick:function(){return a("ejectPillBottle")}})],4)})],0)},l=i.Table,d=function(e,t){var n=(0,r.useBackend)(t).act,a=e.chemical,c=e.transferTo;return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{color:"label",children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:a.volume,initial:0})," units of "+a.name]}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:[(0,o.createComponentVNode)(2,i.Button,{content:"1",onClick:function(){return n("transfer",{id:a.id,amount:1,to:c})}}),(0,o.createComponentVNode)(2,i.Button,{content:"5",onClick:function(){return n("transfer",{id:a.id,amount:5,to:c})}}),(0,o.createComponentVNode)(2,i.Button,{content:"10",onClick:function(){return n("transfer",{id:a.id,amount:10,to:c})}}),(0,o.createComponentVNode)(2,i.Button,{content:"All",onClick:function(){return n("transfer",{id:a.id,amount:1e3,to:c})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"ellipsis-h",title:"Custom amount",onClick:function(){return n("transfer",{id:a.id,amount:-1,to:c})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"question",title:"Analyze",onClick:function(){return n("analyze",{id:a.id})}})]})]},a.id)},u=function(e){var t=e.label,n=e.amountUnit,r=e.amount,a=e.onChangeAmount,c=e.onCreate,l=e.sideNote;return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:t,children:[(0,o.createComponentVNode)(2,i.NumberInput,{width:"84px",unit:n,step:1,stepPixelSize:15,value:r,minValue:1,maxValue:10,onChange:a}),(0,o.createComponentVNode)(2,i.Button,{ml:1,content:"Create",onClick:c}),(0,o.createComponentVNode)(2,i.Box,{inline:!0,ml:1,color:"label",children:l})]})},s=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=(0,r.useSharedState)(t,"pillAmount",1),d=l[0],s=l[1],p=(0,r.useSharedState)(t,"patchAmount",1),m=p[0],f=p[1],h=(0,r.useSharedState)(t,"bottleAmount",1),C=h[0],g=h[1],b=(0,r.useSharedState)(t,"packAmount",1),N=b[0],v=b[1],V=c.condi,y=c.chosenPillStyle,k=c.pillStyles,x=void 0===k?[]:k;return(0,o.createComponentVNode)(2,i.LabeledList,{children:[!V&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Pill type",children:x.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{width:"30px",selected:e.id===y,textAlign:"center",color:"transparent",onClick:function(){return a("pillStyle",{id:e.id})},children:(0,o.createComponentVNode)(2,i.Box,{mx:-1,className:e.className})},e.id)}))}),!V&&(0,o.createComponentVNode)(2,u,{label:"Pills",amount:d,amountUnit:"pills",sideNote:"max 50u",onChangeAmount:function(e,t){return s(t)},onCreate:function(){return a("create",{type:"pill",amount:d,volume:"auto"})}}),!V&&(0,o.createComponentVNode)(2,u,{label:"Patches",amount:m,amountUnit:"patches",sideNote:"max 40u",onChangeAmount:function(e,t){return f(t)},onCreate:function(){return a("create",{type:"patch",amount:m,volume:"auto"})}}),!V&&(0,o.createComponentVNode)(2,u,{label:"Bottles",amount:C,amountUnit:"bottles",sideNote:"max 30u",onChangeAmount:function(e,t){return g(t)},onCreate:function(){return a("create",{type:"bottle",amount:C,volume:"auto"})}}),!!V&&(0,o.createComponentVNode)(2,u,{label:"Packs",amount:N,amountUnit:"packs",sideNote:"max 10u",onChangeAmount:function(e,t){return v(t)},onCreate:function(){return a("create",{type:"condimentPack",amount:N,volume:"auto"})}}),!!V&&(0,o.createComponentVNode)(2,u,{label:"Bottles",amount:C,amountUnit:"bottles",sideNote:"max 50u",onChangeAmount:function(e,t){return g(t)},onCreate:function(){return a("create",{type:"condimentBottle",amount:C,volume:"auto"})}})]})},p=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data.analyzeVars;return(0,o.createComponentVNode)(2,i.Section,{title:"Analysis Results",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"arrow-left",content:"Back",onClick:function(){return a("goScreen",{screen:"home"})}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",children:c.name}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"State",children:c.state}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Color",children:[(0,o.createComponentVNode)(2,i.ColorBox,{color:c.color,mr:1}),c.color]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Description",children:c.description}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Metabolization Rate",children:[c.metaRate," u/minute"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Overdose Threshold",children:c.overD}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Addiction Threshold",children:c.addicD})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemPress=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ChemPress=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.current_volume,u=l.product_name,s=l.pill_style,p=l.pill_styles,m=void 0===p?[]:p,f=l.product,h=l.min_volume,C=l.max_volume;return(0,o.createComponentVNode)(2,a.Window,{width:300,height:227,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Product",children:[(0,o.createComponentVNode)(2,i.Button.Checkbox,{content:"Pills",checked:"pill"===f,onClick:function(){return c("change_product",{product:"pill"})}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{content:"Patches",checked:"patch"===f,onClick:function(){return c("change_product",{product:"patch"})}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{content:"Bottles",checked:"bottle"===f,onClick:function(){return c("change_product",{product:"bottle"})}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Volume",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:d,unit:"u",width:"43px",minValue:h,maxValue:C,step:1,stepPixelSize:2,onChange:function(e,t){return c("change_current_volume",{volume:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",children:[(0,o.createComponentVNode)(2,i.Input,{value:u,placeholder:u,onChange:function(e,t){return c("change_product_name",{name:t})}}),(0,o.createComponentVNode)(2,i.Box,{as:"span",children:f})]}),"pill"===f&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Style",children:m.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{width:"30px",selected:e.id===s,textAlign:"center",color:"transparent",onClick:function(){return c("change_pill_style",{id:e.id})},children:(0,o.createComponentVNode)(2,i.Box,{mx:-1,className:e.class_name})},e.id)}))})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemReactionChamber=void 0;var o=n(0),r=n(15),i=n(6),a=n(1),c=n(3),l=n(2);t.ChemReactionChamber=function(e,t){var n=(0,a.useBackend)(t),d=n.act,u=n.data,s=(0,a.useLocalState)(t,"reagentName",""),p=s[0],m=s[1],f=(0,a.useLocalState)(t,"reagentQuantity",1),h=f[0],C=f[1],g=u.emptying,b=u.reagents||[];return(0,o.createComponentVNode)(2,l.Window,{width:250,height:225,resizable:!0,children:(0,o.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c.Section,{title:"Reagents",buttons:(0,o.createComponentVNode)(2,c.Box,{inline:!0,bold:!0,color:g?"bad":"good",children:g?"Emptying":"Filling"}),children:(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createVNode)(1,"tr","LabledList__row",[(0,o.createVNode)(1,"td","LabeledList__cell",(0,o.createComponentVNode)(2,c.Input,{fluid:!0,value:"",placeholder:"Reagent Name",onInput:function(e,t){return m(t)}}),2,{colSpan:"2"}),(0,o.createVNode)(1,"td",(0,i.classes)(["LabeledList__buttons","LabeledList__cell"]),[(0,o.createComponentVNode)(2,c.NumberInput,{value:h,minValue:1,maxValue:100,step:1,stepPixelSize:3,width:"39px",onDrag:function(e,t){return C(t)}}),(0,o.createComponentVNode)(2,c.Box,{inline:!0,mr:1}),(0,o.createComponentVNode)(2,c.Button,{icon:"plus",onClick:function(){return d("add",{chem:p,amount:h})}})],4)],4),(0,r.map)((function(e,t){return(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:t,buttons:(0,o.createComponentVNode)(2,c.Button,{icon:"minus",color:"bad",onClick:function(){return d("remove",{chem:t})}}),children:e},t)}))(b)]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemSplitter=void 0;var o=n(0),r=n(16),i=n(1),a=n(3),c=n(2);t.ChemSplitter=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.straight,s=d.side,p=d.max_transfer;return(0,o.createComponentVNode)(2,c.Window,{width:220,height:105,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Straight",children:(0,o.createComponentVNode)(2,a.NumberInput,{value:u,unit:"u",width:"55px",minValue:1,maxValue:p,format:function(e){return(0,r.toFixed)(e,2)},step:.05,stepPixelSize:4,onChange:function(e,t){return l("set_amount",{target:"straight",amount:t})}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Side",children:(0,o.createComponentVNode)(2,a.NumberInput,{value:s,unit:"u",width:"55px",minValue:1,maxValue:p,format:function(e){return(0,r.toFixed)(e,2)},step:.05,stepPixelSize:4,onChange:function(e,t){return l("set_amount",{target:"side",amount:t})}})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ChemSynthesizer=void 0;var o=n(0),r=n(16),i=n(1),a=n(3),c=n(2);t.ChemSynthesizer=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.amount,s=d.current_reagent,p=d.chemicals,m=void 0===p?[]:p,f=d.possible_amounts,h=void 0===f?[]:f;return(0,o.createComponentVNode)(2,c.Window,{width:300,height:375,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Box,{children:h.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{icon:"plus",content:(0,r.toFixed)(e,0),selected:e===u,onClick:function(){return l("amount",{target:e})}},(0,r.toFixed)(e,0))}))}),(0,o.createComponentVNode)(2,a.Box,{mt:1,children:m.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{icon:"tint",content:e.title,width:"129px",selected:e.id===s,onClick:function(){return l("select",{reagent:e.id})}},e.id)}))})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.CivCargoHoldTerminal=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.CivCargoHoldTerminal=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.pad,s=d.sending,p=d.status_report,m=d.id_inserted,f=d.id_bounty_info;d.id_bounty_value,d.id_bounty_num;return(0,o.createComponentVNode)(2,a.Window,{resizable:!0,width:500,height:375,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createComponentVNode)(2,i.NoticeBox,{color:m?"blue":"default",children:m?"Welcome valued employee.":"To begin, insert your ID into the console."}),(0,o.createComponentVNode)(2,i.Section,{title:"Cargo Pad",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",color:u?"good":"bad",children:u?"Online":"Not Found"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cargo Report",children:p})]})}),(0,o.createComponentVNode)(2,c)]}),(0,o.createComponentVNode)(2,i.Flex.Item,{m:1,children:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"sync",content:"Check Contents",disabled:!u||!m,onClick:function(){return l("recalc")}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:s?"times":"arrow-up",content:s?"Stop Sending":"Send Goods",selected:s,disabled:!u||!m,onClick:function(){return l(s?"stop":"send")}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:f?"recycle":"pen",color:f?"green":"default",content:f?"Replace Bounty":"New Bounty",disabled:!m,onClick:function(){return l("bounty")}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"download",content:"Eject",disabled:!m,onClick:function(){return l("eject")}})],4)})]})})})};var c=function(e,t){var n=(0,r.useBackend)(t).data,a=n.id_bounty_info,c=n.id_bounty_value,l=n.id_bounty_num;return(0,o.createComponentVNode)(2,i.Section,{title:"Bounty Info",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Description",children:a||"N/A, please add a new bounty."}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Quantity",children:a?l:"N/A"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Value",children:a?c:"N/A"})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.CodexGigas=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=["Dark","Hellish","Fallen","Fiery","Sinful","Blood","Fluffy"],l=["Lord","Prelate","Count","Viscount","Vizier","Elder","Adept"],d=["hal","ve","odr","neit","ci","quon","mya","folth","wren","geyr","hil","niet","twou","phi","coa"],u=["the Red","the Soulless","the Master","the Lord of all things","Jr."];t.CodexGigas=function(e,t){var n=(0,r.useBackend)(t),s=n.act,p=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:450,height:450,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:[p.name,(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Prefix",children:c.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e,disabled:1!==p.currentSection,onClick:function(){return s(e+" ")}},e.toLowerCase())}))}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Title",children:l.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e,disabled:p.currentSection>2,onClick:function(){return s(e+" ")}},e.toLowerCase())}))}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",children:d.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e,disabled:p.currentSection>4,onClick:function(){return s(e)}},e.toLowerCase())}))}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Suffix",children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e,disabled:4!==p.currentSection,onClick:function(){return s(" "+e)}},e.toLowerCase())}))}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Submit",children:(0,o.createComponentVNode)(2,i.Button,{content:"Search",disabled:p.currentSection<4,onClick:function(){return s("search")}})})]})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ComputerFabricator=void 0;var o=n(0),r=(n(19),n(1)),i=n(3),a=n(2);t.ComputerFabricator=function(e,t){var n=(0,r.useBackend)(t),s=n.act,p=n.data;return(0,o.createComponentVNode)(2,a.Window,{title:"Personal Computer Vendor",width:500,height:400,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{italic:!0,fontSize:"20px",children:"Your perfect device, only three steps away..."}),0!==p.state&&(0,o.createComponentVNode)(2,i.Button,{fluid:!0,mb:1,icon:"circle",content:"Clear Order",onClick:function(){return s("clean_order")}}),0===p.state&&(0,o.createComponentVNode)(2,c),1===p.state&&(0,o.createComponentVNode)(2,l),2===p.state&&(0,o.createComponentVNode)(2,d),3===p.state&&(0,o.createComponentVNode)(2,u)]})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act;n.data;return(0,o.createComponentVNode)(2,i.Section,{title:"Step 1",minHeight:"306px",children:[(0,o.createComponentVNode)(2,i.Box,{mt:5,bold:!0,textAlign:"center",fontSize:"40px",children:"Choose your Device"}),(0,o.createComponentVNode)(2,i.Box,{mt:3,children:(0,o.createComponentVNode)(2,i.Grid,{width:"100%",children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"laptop",content:"Laptop",textAlign:"center",fontSize:"30px",lineHeight:2,onClick:function(){return a("pick_device",{pick:"1"})}})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"tablet-alt",content:"Tablet",textAlign:"center",fontSize:"30px",lineHeight:2,onClick:function(){return a("pick_device",{pick:"2"})}})})]})})]})},l=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data;return(0,o.createComponentVNode)(2,i.Section,{title:"Step 2: Customize your device",minHeight:"282px",buttons:(0,o.createComponentVNode)(2,i.Box,{bold:!0,color:"good",children:[c.totalprice," cr"]}),children:[(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,position:"relative",children:["Battery:",(0,o.createComponentVNode)(2,i.Tooltip,{content:"Allows your device to operate without external utility power\nsource. Advanced batteries increase battery life.",position:"right"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.hw_battery,onClick:function(){return a("hw_battery",{battery:"1"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Upgraded",selected:2===c.hw_battery,onClick:function(){return a("hw_battery",{battery:"2"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Advanced",selected:3===c.hw_battery,onClick:function(){return a("hw_battery",{battery:"3"})}})})]}),(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,position:"relative",children:["Hard Drive:",(0,o.createComponentVNode)(2,i.Tooltip,{content:"Stores file on your device. Advanced drives can store more\nfiles, but use more power, shortening battery life.",position:"right"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.hw_disk,onClick:function(){return a("hw_disk",{disk:"1"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Upgraded",selected:2===c.hw_disk,onClick:function(){return a("hw_disk",{disk:"2"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Advanced",selected:3===c.hw_disk,onClick:function(){return a("hw_disk",{disk:"3"})}})})]}),(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,position:"relative",children:["Network Card:",(0,o.createComponentVNode)(2,i.Tooltip,{content:"Allows your device to wirelessly connect to stationwide NTNet\nnetwork. Basic cards are limited to on-station use, while\nadvanced cards can operate anywhere near the station, which\nincludes asteroid outposts",position:"right"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"None",selected:0===c.hw_netcard,onClick:function(){return a("hw_netcard",{netcard:"0"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.hw_netcard,onClick:function(){return a("hw_netcard",{netcard:"1"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Advanced",selected:2===c.hw_netcard,onClick:function(){return a("hw_netcard",{netcard:"2"})}})})]}),(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,position:"relative",children:["Nano Printer:",(0,o.createComponentVNode)(2,i.Tooltip,{content:"A device that allows for various paperwork manipulations,\nsuch as, scanning of documents or printing new ones.\nThis device was certified EcoFriendlyPlus and is capable of\nrecycling existing paper for printing purposes.",position:"right"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"None",selected:0===c.hw_nanoprint,onClick:function(){return a("hw_nanoprint",{print:"0"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.hw_nanoprint,onClick:function(){return a("hw_nanoprint",{print:"1"})}})})]}),(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,position:"relative",children:["Card Reader:",(0,o.createComponentVNode)(2,i.Tooltip,{content:"Adds a slot that allows you to manipulate RFID cards.\nPlease note that this is not necessary to allow the device\nto read your identification, it is just necessary to\nmanipulate other cards.",position:"right"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"None",selected:0===c.hw_card,onClick:function(){return a("hw_card",{card:"0"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.hw_card,onClick:function(){return a("hw_card",{card:"1"})}})})]}),2!==c.devtype&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,position:"relative",children:["Processor Unit:",(0,o.createComponentVNode)(2,i.Tooltip,{content:"A component critical for your device's functionality.\nIt allows you to run programs from your hard drive.\nAdvanced CPUs use more power, but allow you to run\nmore programs on background at once.",position:"right"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.hw_cpu,onClick:function(){return a("hw_cpu",{cpu:"1"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Advanced",selected:2===c.hw_cpu,onClick:function(){return a("hw_cpu",{cpu:"2"})}})})]}),(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,position:"relative",children:["Tesla Relay:",(0,o.createComponentVNode)(2,i.Tooltip,{content:"An advanced wireless power relay that allows your device\nto connect to nearby area power controller to provide\nalternative power source. This component is currently\nunavailable on tablet computers due to size restrictions.",position:"right"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"None",selected:0===c.hw_tesla,onClick:function(){return a("hw_tesla",{tesla:"0"})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{content:"Standard",selected:1===c.hw_tesla,onClick:function(){return a("hw_tesla",{tesla:"1"})}})})]})],4)]}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,mt:3,content:"Confirm Order",color:"good",textAlign:"center",fontSize:"18px",lineHeight:2,onClick:function(){return a("confirm_order")}})]})},d=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data;return(0,o.createComponentVNode)(2,i.Section,{title:"Step 3: Payment",minHeight:"282px",children:[(0,o.createComponentVNode)(2,i.Box,{italic:!0,textAlign:"center",fontSize:"20px",children:"Your device is ready for fabrication..."}),(0,o.createComponentVNode)(2,i.Box,{bold:!0,mt:2,textAlign:"center",fontSize:"16px",children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:"Please insert the required"})," ",(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"good",children:[c.totalprice," cr"]})]}),(0,o.createComponentVNode)(2,i.Box,{bold:!0,mt:1,textAlign:"center",fontSize:"18px",children:"Current:"}),(0,o.createComponentVNode)(2,i.Box,{bold:!0,mt:.5,textAlign:"center",fontSize:"18px",color:c.credits>=c.totalprice?"good":"bad",children:[c.credits," cr"]}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Purchase",disabled:c.credits<c.totalprice,mt:8,color:"good",textAlign:"center",fontSize:"20px",lineHeight:2,onClick:function(){return a("purchase")}})]})},u=function(e,t){return(0,o.createComponentVNode)(2,i.Section,{minHeight:"282px",children:[(0,o.createComponentVNode)(2,i.Box,{bold:!0,textAlign:"center",fontSize:"28px",mt:10,children:"Thank you for your purchase!"}),(0,o.createComponentVNode)(2,i.Box,{italic:!0,mt:1,textAlign:"center",children:"If you experience any difficulties with your new device, please contact your local network administrator."})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.Crayon=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Crayon=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.has_cap||l.can_change_colour,u=l.drawables||[];return(0,o.createComponentVNode)(2,a.Window,{width:600,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[!!d&&(0,o.createComponentVNode)(2,i.Section,{title:"Basic",children:[(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cap",children:(0,o.createComponentVNode)(2,i.Button,{icon:l.is_capped?"power-off":"times",content:l.is_capped?"On":"Off",selected:l.is_capped,onClick:function(){return c("toggle_cap")}})})}),(0,o.createComponentVNode)(2,i.Button,{content:"Select New Color",onClick:function(){return c("select_colour")}})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Stencil",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:u.map((function(e){var t=e.items||[];return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,children:t.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e.item,selected:e.item===l.selected_stencil,onClick:function(){return c("select_stencil",{item:e.item})}},e.item)}))},e.name)}))})}),(0,o.createComponentVNode)(2,i.Section,{title:"Text",children:[(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Buffer",children:l.text_buffer})}),(0,o.createComponentVNode)(2,i.Button,{content:"New Text",onClick:function(){return c("enter_text")}})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.CrewConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(34),c=n(2),l=["#17d568","#2ecc71","#e67e22","#ed5100","#e74c3c","#ed2814"],d=function(e){return 0===e?a.COLORS.department.captain:e>=10&&e<20?a.COLORS.department.security:e>=20&&e<30?a.COLORS.department.medbay:e>=30&&e<40?a.COLORS.department.science:e>=40&&e<50?a.COLORS.department.engineering:e>=50&&e<60?a.COLORS.department.cargo:e>=200&&e<230?a.COLORS.department.centcom:a.COLORS.department.other},u=function(e){var t=e.type,n=e.value;return(0,o.createComponentVNode)(2,i.Box,{inline:!0,width:2,color:a.COLORS.damageType[t],textAlign:"center",children:n})};t.CrewConsole=function(){return(0,o.createComponentVNode)(2,c.Window,{title:"Crew Monitor",width:800,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{minHeight:"540px",children:(0,o.createComponentVNode)(2,s)})})})};var s=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,s=c.sensors||[];return(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,children:"Name"}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,collapsing:!0}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,collapsing:!0,textAlign:"center",children:"Vitals"}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,children:"Position"}),!!c.link_allowed&&(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,collapsing:!0,children:"Tracking"})]}),s.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:(f=e.ijob,f%10==0),color:d(e.ijob),children:[e.name," (",e.assignment,")"]}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,textAlign:"center",children:(0,o.createComponentVNode)(2,i.ColorBox,{color:(t=e.oxydam,n=e.toxdam,r=e.burndam,s=e.brutedam,p=t+n+r+s,m=Math.min(Math.max(Math.ceil(p/25),0),5),l[m])})}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,textAlign:"center",children:null!==e.oxydam?(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:[(0,o.createComponentVNode)(2,u,{type:"oxy",value:e.oxydam}),"/",(0,o.createComponentVNode)(2,u,{type:"toxin",value:e.toxdam}),"/",(0,o.createComponentVNode)(2,u,{type:"burn",value:e.burndam}),"/",(0,o.createComponentVNode)(2,u,{type:"brute",value:e.brutedam})]}):e.life_status?"Alive":"Dead"}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:null!==e.pos_x?e.area:"N/A"}),!!c.link_allowed&&(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:(0,o.createComponentVNode)(2,i.Button,{content:"Track",disabled:!e.can_track,onClick:function(){return a("select_person",{name:e.name})}})})]},e.name);var t,n,r,s,p,m,f}))]})}},function(e,t,n){"use strict";t.__esModule=!0,t.Cryo=void 0;var o=n(0),r=n(1),i=n(3),a=n(180),c=n(2),l=[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}];t.Cryo=function(){return(0,o.createComponentVNode)(2,c.Window,{width:400,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,d)})})};var d=function(e,t){var n=(0,r.useBackend)(t),c=n.act,d=n.data;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Occupant",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Occupant",children:d.occupant.name||"No Occupant"}),!!d.hasOccupant&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"State",color:d.occupant.statstate,children:d.occupant.stat}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Temperature",color:d.occupant.temperaturestatus,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:d.occupant.bodyTemperature})," K"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Health",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:d.occupant.health/d.occupant.maxHealth,color:d.occupant.health>0?"good":"average",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:d.occupant.health})})}),l.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.label,children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:d.occupant[e.type]/100,children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:d.occupant[e.type]})})},e.id)}))],0)]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Cell",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.Button,{icon:d.isOperating?"power-off":"times",disabled:d.isOpen,onClick:function(){return c("power")},color:d.isOperating&&"green",children:d.isOperating?"On":"Off"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Temperature",children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:d.cellTemperature})," K"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door",children:[(0,o.createComponentVNode)(2,i.Button,{icon:d.isOpen?"unlock":"lock",onClick:function(){return c("door")},content:d.isOpen?"Open":"Closed"}),(0,o.createComponentVNode)(2,i.Button,{icon:d.autoEject?"sign-out-alt":"sign-in-alt",onClick:function(){return c("autoeject")},content:d.autoEject?"Auto":"Manual"})]})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Beaker",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",disabled:!d.isBeakerLoaded,onClick:function(){return c("ejectbeaker")},content:"Eject"}),children:(0,o.createComponentVNode)(2,a.BeakerContents,{beakerLoaded:d.isBeakerLoaded,beakerContents:d.beakerContents})})],4)}},function(e,t,n){"use strict";t.__esModule=!0,t.DecalPainter=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.DecalPainter=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.decal_list||[],u=l.color_list||[],s=l.dir_list||[];return(0,o.createComponentVNode)(2,a.Window,{width:500,height:400,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Decal Type",children:d.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e.name,selected:e.decal===l.decal_style,onClick:function(){return c("select decal",{decals:e.decal})}},e.decal)}))}),(0,o.createComponentVNode)(2,i.Section,{title:"Decal Color",children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:"red"===e.colors?"Red":"white"===e.colors?"White":"Yellow",selected:e.colors===l.decal_color,onClick:function(){return c("select color",{colors:e.colors})}},e.colors)}))}),(0,o.createComponentVNode)(2,i.Section,{title:"Decal Direction",children:s.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:1===e.dirs?"North":2===e.dirs?"South":4===e.dirs?"East":"West",selected:e.dirs===l.decal_direction,onClick:function(){return c("selected direction",{dirs:e.dirs})}},e.dirs)}))})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.DisposalUnit=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.DisposalUnit=function(e,t){var n,c,l=(0,r.useBackend)(t),d=l.act,u=l.data;return u.full_pressure?(n="good",c="Ready"):u.panel_open?(n="bad",c="Power Disabled"):u.pressure_charging?(n="average",c="Pressurizing"):(n="bad",c="Off"),(0,o.createComponentVNode)(2,a.Window,{width:300,height:180,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"State",color:n,children:c}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Pressure",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:u.per,color:"good"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Handle",children:(0,o.createComponentVNode)(2,i.Button,{icon:u.flush?"toggle-on":"toggle-off",disabled:u.isai||u.panel_open,content:u.flush?"Disengage":"Engage",onClick:function(){return d(u.flush?"handle-0":"handle-1")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Eject",children:(0,o.createComponentVNode)(2,i.Button,{icon:"sign-out-alt",disabled:u.isai,content:"Eject Contents",onClick:function(){return d("eject")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",disabled:u.panel_open,selected:u.pressure_charging,onClick:function(){return d(u.pressure_charging?"pump-0":"pump-1")}})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.DnaConsoleCommands=t.DnaConsole=void 0;var o=n(0),r=n(15),i=n(30),a=n(6),c=n(19),l=n(60),d=n(1),u=n(3),s=n(2);var p=["A","T","C","G"],m={A:"green",T:"green",G:"blue",C:"blue",X:"grey"},f={1:"good",2:"bad",4:"average"},h=function(e,t){return e.Alias===t.Alias&&e.AppliedChromo===t.AppliedChromo};t.DnaConsole=function(e,t){var n=(0,d.useBackend)(t),r=n.data,i=(n.act,r.isPulsingRads),a=r.radPulseSeconds,c=r.view.consoleMode;return(0,o.createComponentVNode)(2,s.Window,{title:"DNA Console",width:539,height:710,resizable:!0,children:[!!i&&(0,o.createComponentVNode)(2,u.Dimmer,{fontSize:"14px",textAlign:"center",children:[(0,o.createComponentVNode)(2,u.Icon,{mr:1,name:"spinner",spin:!0}),"Radiation pulse in progress...",(0,o.createComponentVNode)(2,u.Box,{mt:1}),a,"s"]}),(0,o.createComponentVNode)(2,s.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,C),(0,o.createComponentVNode)(2,v),"storage"===c&&(0,o.createComponentVNode)(2,y),"sequencer"===c&&(0,o.createComponentVNode)(2,B),"enzymes"===c&&(0,o.createComponentVNode)(2,T)]})]})};var C=function(e,t){return(0,o.createComponentVNode)(2,u.Section,{title:"DNA Scanner",buttons:(0,o.createComponentVNode)(2,g),children:(0,o.createComponentVNode)(2,N)})},g=function(e,t){var n=(0,d.useBackend)(t),r=n.data,i=n.act,a=r.hasDelayedAction,c=r.isPulsingRads,l=r.isScannerConnected,s=r.isScrambleReady,p=r.isViableSubject,m=r.scannerLocked,f=r.scannerOpen,h=r.scrambleSeconds;return l?(0,o.createFragment)([!!a&&(0,o.createComponentVNode)(2,u.Button,{content:"Cancel Delayed Action",onClick:function(){return i("cancel_delay")}}),!!p&&(0,o.createComponentVNode)(2,u.Button,{disabled:!s||c,onClick:function(){return i("scramble_dna")},children:["Scramble DNA",!s&&" ("+h+"s)"]}),(0,o.createComponentVNode)(2,u.Box,{inline:!0,mr:1}),(0,o.createComponentVNode)(2,u.Button,{icon:m?"lock":"lock-open",color:m&&"bad",disabled:f,content:m?"Locked":"Unlocked",onClick:function(){return i("toggle_lock")}}),(0,o.createComponentVNode)(2,u.Button,{disabled:m,content:f?"Close":"Open",onClick:function(){return i("toggle_door")}})],0):(0,o.createComponentVNode)(2,u.Button,{content:"Connect Scanner",onClick:function(){return i("connect_scanner")}})},b=function(e,t){var n=e.status;return 0===n?(0,o.createComponentVNode)(2,u.Box,{inline:!0,color:"good",children:"Conscious"}):2===n?(0,o.createComponentVNode)(2,u.Box,{inline:!0,color:"average",children:"Unconscious"}):1===n?(0,o.createComponentVNode)(2,u.Box,{inline:!0,color:"average",children:"Critical"}):3===n?(0,o.createComponentVNode)(2,u.Box,{inline:!0,color:"bad",children:"Dead"}):4===n?(0,o.createComponentVNode)(2,u.Box,{inline:!0,color:"bad",children:"Transforming"}):(0,o.createComponentVNode)(2,u.Box,{inline:!0,children:"Unknown"})},N=function(e,t){var n=(0,d.useBackend)(t),r=n.data,i=(n.act,r.subjectName),a=r.isScannerConnected,c=r.isViableSubject,l=r.subjectHealth,s=r.subjectRads,p=r.subjectStatus;return a?c?(0,o.createComponentVNode)(2,u.LabeledList,{children:[(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Status",children:[i,(0,o.createComponentVNode)(2,u.Icon,{mx:1,color:"label",name:"long-arrow-alt-right"}),(0,o.createComponentVNode)(2,b,{status:p})]}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Health",children:(0,o.createComponentVNode)(2,u.ProgressBar,{value:l,minValue:0,maxValue:100,ranges:{olive:[101,Infinity],good:[70,101],average:[30,70],bad:[-Infinity,30]},children:[l,"%"]})}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Radiation",children:(0,o.createComponentVNode)(2,u.ProgressBar,{value:s,minValue:0,maxValue:100,ranges:{bad:[71,Infinity],average:[30,71],good:[0,30],olive:[-Infinity,0]},children:[s,"%"]})})]}):(0,o.createComponentVNode)(2,u.Box,{color:"average",children:"No viable subject found in DNA Scanner."}):(0,o.createComponentVNode)(2,u.Box,{color:"bad",children:"DNA Scanner is not connected."})},v=function(e,t){var n=(0,d.useBackend)(t),r=n.data,i=n.act,a=r.hasDisk,c=r.isInjectorReady,l=r.injectorSeconds,s=r.view.consoleMode;return(0,o.createComponentVNode)(2,u.Section,{title:"DNA Console",buttons:!c&&(0,o.createComponentVNode)(2,u.Box,{lineHeight:"20px",color:"label",children:["Injector on cooldown (",l,"s)"]}),children:(0,o.createComponentVNode)(2,u.LabeledList,{children:[(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Mode",children:[(0,o.createComponentVNode)(2,u.Button,{content:"Storage",selected:"storage"===s,onClick:function(){return i("set_view",{consoleMode:"storage"})}}),(0,o.createComponentVNode)(2,u.Button,{content:"Sequencer",disabled:!r.isViableSubject,selected:"sequencer"===s,onClick:function(){return i("set_view",{consoleMode:"sequencer"})}}),(0,o.createComponentVNode)(2,u.Button,{content:"Enzymes",selected:"enzymes"===s,onClick:function(){return i("set_view",{consoleMode:"enzymes"})}})]}),!!a&&(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Disk",children:(0,o.createComponentVNode)(2,u.Button,{icon:"eject",content:"Eject",onClick:function(){i("eject_disk"),i("set_view",{storageMode:"console"})}})})]})})};t.DnaConsoleCommands=v;var V=function(e,t){var n=(0,d.useBackend)(t),r=n.data,i=n.act,a=r.hasDisk,c=r.view,l=c.storageMode,s=c.storageConsSubMode,p=c.storageDiskSubMode;return(0,o.createFragment)(["console"===l&&(0,o.createFragment)([(0,o.createComponentVNode)(2,u.Button,{selected:"mutations"===s,content:"Mutations",onClick:function(){return i("set_view",{storageConsSubMode:"mutations"})}}),(0,o.createComponentVNode)(2,u.Button,{selected:"chromosomes"===s,content:"Chromosomes",onClick:function(){return i("set_view",{storageConsSubMode:"chromosomes"})}})],4),"disk"===l&&(0,o.createFragment)([(0,o.createComponentVNode)(2,u.Button,{selected:"mutations"===p,content:"Mutations",onClick:function(){return i("set_view",{storageDiskSubMode:"mutations"})}}),(0,o.createComponentVNode)(2,u.Button,{selected:"diskenzymes"===p,content:"Enzymes",onClick:function(){return i("set_view",{storageDiskSubMode:"diskenzymes"})}})],4),(0,o.createComponentVNode)(2,u.Box,{inline:!0,mr:1}),(0,o.createComponentVNode)(2,u.Button,{content:"Console",selected:"console"===l,onClick:function(){return i("set_view",{storageMode:"console",storageConsSubMode:"mutations"})}}),(0,o.createComponentVNode)(2,u.Button,{content:"Disk",disabled:!a,selected:"disk"===l,onClick:function(){return i("set_view",{storageMode:"disk",storageDiskSubMode:"mutations"})}}),(0,o.createComponentVNode)(2,u.Button,{content:"Adv. Injector",selected:"injector"===l,onClick:function(){return i("set_view",{storageMode:"injector"})}})],0)},y=function(e,t){var n=(0,d.useBackend)(t),r=n.data,i=n.act,a=r.view,c=a.storageMode,l=a.storageConsSubMode,s=a.storageDiskSubMode,p=r.diskMakeupBuffer,m=r.diskHasMakeup,f=r.storage[c];return(0,o.createComponentVNode)(2,u.Section,{title:"Storage",buttons:(0,o.createComponentVNode)(2,V),children:["console"===c&&"mutations"===l&&(0,o.createComponentVNode)(2,k,{mutations:f}),"console"===c&&"chromosomes"===l&&(0,o.createComponentVNode)(2,x),"disk"===c&&"mutations"===s&&(0,o.createComponentVNode)(2,k,{mutations:f}),"disk"===c&&"diskenzymes"===s&&(0,o.createFragment)([(0,o.createComponentVNode)(2,R,{makeup:p}),(0,o.createComponentVNode)(2,u.Button,{icon:"times",color:"red",disabled:!m,content:"Delete",onClick:function(){return i("del_makeup_disk")}})],4),"injector"===c&&(0,o.createComponentVNode)(2,F)]})},k=function(e,t){var n=e.customMode,r=void 0===n?"":n,i=(0,d.useBackend)(t),a=i.data,l=i.act,s=e.mutations||[],p=a.view.storageMode+r,m=a.view["storage"+p+"MutationRef"],f=s.find((function(e){return e.ByondRef===m}));return!f&&s.length>0&&(f=s[0],m=f.ByondRef),(0,o.createComponentVNode)(2,u.Flex,{children:[(0,o.createComponentVNode)(2,u.Flex.Item,{width:"140px",children:(0,o.createComponentVNode)(2,u.Section,{title:(0,c.capitalize)(a.view.storageMode)+" Storage",level:2,children:s.map((function(e){return(0,o.createComponentVNode)(2,u.Button,{fluid:!0,ellipsis:!0,color:"transparent",selected:e.ByondRef===m,content:e.Name,onClick:function(){var t;return l("set_view",((t={})["storage"+p+"MutationRef"]=e.ByondRef,t))}},e.ByondRef)}))})}),(0,o.createComponentVNode)(2,u.Flex.Item,{children:(0,o.createComponentVNode)(2,u.Divider,{vertical:!0})}),(0,o.createComponentVNode)(2,u.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,u.Section,{title:"Mutation Info",level:2,children:(0,o.createComponentVNode)(2,_,{mutation:f})})})]})},x=function(e,t){var n,i=(0,d.useBackend)(t),a=i.data,c=i.act,l=null!=(n=a.chromoStorage)?n:[],s=(0,r.uniqBy)((function(e){return e.Name}))(l),p=a.view.storageChromoName,m=l.find((function(e){return e.Name===p}));return(0,o.createComponentVNode)(2,u.Flex,{children:[(0,o.createComponentVNode)(2,u.Flex.Item,{width:"140px",children:(0,o.createComponentVNode)(2,u.Section,{title:"Console Storage",level:2,children:s.map((function(e){return(0,o.createComponentVNode)(2,u.Button,{fluid:!0,ellipsis:!0,color:"transparent",selected:e.Name===p,content:e.Name,onClick:function(){return c("set_view",{storageChromoName:e.Name})}},e.Index)}))})}),(0,o.createComponentVNode)(2,u.Flex.Item,{children:(0,o.createComponentVNode)(2,u.Divider,{vertical:!0})}),(0,o.createComponentVNode)(2,u.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,u.Section,{title:"Chromosome Info",level:2,children:!m&&(0,o.createComponentVNode)(2,u.Box,{color:"label",children:"Nothing to show."})||(0,o.createFragment)([(0,o.createComponentVNode)(2,u.LabeledList,{children:[(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Name",children:m.Name}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Description",children:m.Description}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Amount",children:l.filter((function(e){return e.Name===m.Name})).length})]}),(0,o.createComponentVNode)(2,u.Button,{mt:2,icon:"eject",content:"Eject Chromosome",onClick:function(){return c("eject_chromo",{chromo:m.Name})}})],4)})})]})},_=function(e,t){var n,a,c,l=e.mutation,s=(0,d.useBackend)(t),p=s.data,m=s.act,C=p.diskCapacity,g=p.diskReadOnly,b=p.hasDisk,N=p.isInjectorReady,v=null!=(n=p.storage.disk)?n:[],V=null!=(a=p.storage.console)?a:[],y=null!=(c=p.storage.injector)?c:[];if(!l)return(0,o.createComponentVNode)(2,u.Box,{color:"label",children:"Nothing to show."});if("occupant"===l.Source&&!l.Discovered)return(0,o.createComponentVNode)(2,u.LabeledList,{children:(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Name",children:l.Alias})});var k=V.find((function(e){return h(e,l)})),x=v.find((function(e){return h(e,l)})),_=(0,i.flow)([(0,r.uniqBy)((function(e){return e.Name})),(0,r.filter)((function(e){return e.Name!==l.Name}))])([].concat(v,V));return(0,o.createFragment)([(0,o.createComponentVNode)(2,u.LabeledList,{children:[(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Name",children:(0,o.createComponentVNode)(2,u.Box,{inline:!0,color:f[l.Quality],children:l.Name})}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Description",children:l.Description}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Instability",children:l.Instability})]}),(0,o.createComponentVNode)(2,u.Divider),(0,o.createComponentVNode)(2,u.Box,{children:["disk"===l.Source&&(0,o.createComponentVNode)(2,j,{disabled:!b||C<=0||g,mutations:_,source:l}),"console"===l.Source&&(0,o.createComponentVNode)(2,j,{mutations:_,source:l}),["occupant","disk","console"].includes(l.Source)&&(0,o.createFragment)([(0,o.createComponentVNode)(2,u.Dropdown,{width:"240px",options:y.map((function(e){return e.name})),disabled:0===y.length||!l.Active,selected:"Add to advanced injector",onSelected:function(e){return m("add_advinj_mut",{mutref:l.ByondRef,advinj:e,source:l.Source})}}),(0,o.createComponentVNode)(2,u.Button,{icon:"syringe",disabled:!N||!l.Active,content:"Print Activator",onClick:function(){return m("print_injector",{mutref:l.ByondRef,is_activator:1,source:l.Source})}}),(0,o.createComponentVNode)(2,u.Button,{icon:"syringe",disabled:!N||!l.Active,content:"Print Mutator",onClick:function(){return m("print_injector",{mutref:l.ByondRef,is_activator:0,source:l.Source})}})],4)]}),["disk","occupant"].includes(l.Source)&&(0,o.createComponentVNode)(2,u.Button,{icon:"save",disabled:k||!l.Active,content:"Save to Console",onClick:function(){return m("save_console",{mutref:l.ByondRef,source:l.Source})}}),["console","occupant"].includes(l.Source)&&(0,o.createComponentVNode)(2,u.Button,{icon:"save",disabled:x||!b||C<=0||g||!l.Active,content:"Save to Disk",onClick:function(){return m("save_disk",{mutref:l.ByondRef,source:l.Source})}}),["console","disk","injector"].includes(l.Source)&&(0,o.createComponentVNode)(2,u.Button,{icon:"times",color:"red",content:"Delete from "+l.Source,onClick:function(){return m("delete_"+l.Source+"_mut",{mutref:l.ByondRef})}}),(2===l.Class||!!l.Scrambled&&"occupant"===l.Source)&&(0,o.createComponentVNode)(2,u.Button,{content:"Nullify",onClick:function(){return m("nullify",{mutref:l.ByondRef})}}),(0,o.createComponentVNode)(2,u.Divider),(0,o.createComponentVNode)(2,w,{disabled:"occupant"!==l.Source,mutation:l})],0)},w=function(e,t){var n=e.mutation,r=e.disabled,i=(0,d.useBackend)(t),a=(i.data,i.act);return 0===n.CanChromo?(0,o.createComponentVNode)(2,u.Box,{color:"label",children:"No compatible chromosomes"}):1===n.CanChromo?r?(0,o.createComponentVNode)(2,u.Box,{color:"label",children:"No chromosome applied."}):(0,o.createFragment)([(0,o.createComponentVNode)(2,u.Dropdown,{width:"240px",options:n.ValidStoredChromos,disabled:0===n.ValidStoredChromos.length,selected:0===n.ValidStoredChromos.length?"No Suitable Chromosomes":"Select a chromosome",onSelected:function(e){return a("apply_chromo",{chromo:e,mutref:n.ByondRef})}}),(0,o.createComponentVNode)(2,u.Box,{color:"label",mt:1,children:["Compatible with: ",n.ValidChromos]})],4):2===n.CanChromo?(0,o.createComponentVNode)(2,u.Box,{color:"label",children:["Applied chromosome: ",n.AppliedChromo]}):null},B=function(e,t){var n,r,i=(0,d.useBackend)(t),a=i.data,c=i.act,s=null!=(n=null==(r=a.storage)?void 0:r.occupant)?n:[],p=a.isJokerReady,m=a.isMonkey,f=a.jokerSeconds,h=a.subjectStatus,C=a.view,g=C.sequencerMutation,b=C.jokerActive,N=s.find((function(e){return e.Alias===g}));return(0,o.createFragment)([(0,o.createComponentVNode)(2,u.Flex,{spacing:1,mb:1,children:[(0,o.createComponentVNode)(2,u.Flex.Item,{width:s.length<=8?"154px":"174px",children:(0,o.createComponentVNode)(2,u.Section,{title:"Sequences",height:"214px",overflowY:s.length>8&&"scroll",children:s.map((function(e){return(0,o.createComponentVNode)(2,S,{url:(0,l.resolveAsset)(e.Image),selected:e.Alias===g,onClick:function(){c("set_view",{sequencerMutation:e.Alias}),c("check_discovery",{alias:e.Alias})}},e.Alias)}))})}),(0,o.createComponentVNode)(2,u.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,u.Section,{title:"Sequence Info",minHeight:"100%",children:(0,o.createComponentVNode)(2,_,{mutation:N})})})]}),3===h&&(0,o.createComponentVNode)(2,u.Section,{color:"bad",children:"Genetic sequence corrupted. Subject diagnostic report: DECEASED."})||m&&"Monkified"!==(null==N?void 0:N.Name)&&(0,o.createComponentVNode)(2,u.Section,{color:"bad",children:"Genetic sequence corrupted. Subject diagnostic report: MONKEY."})||4===h&&(0,o.createComponentVNode)(2,u.Section,{color:"bad",children:"Genetic sequence corrupted. Subject diagnostic report: TRANSFORMING."})||(0,o.createComponentVNode)(2,u.Section,{title:"Genome Sequencer\u2122",buttons:!p&&(0,o.createComponentVNode)(2,u.Box,{lineHeight:"20px",color:"label",children:["Joker on cooldown (",f,"s)"]})||b&&(0,o.createFragment)([(0,o.createComponentVNode)(2,u.Box,{mr:1,inline:!0,color:"label",children:"Click on a gene to reveal it."}),(0,o.createComponentVNode)(2,u.Button,{content:"Cancel Joker",onClick:function(){return c("set_view",{jokerActive:""})}})],4)||(0,o.createComponentVNode)(2,u.Button,{icon:"crown",color:"purple",content:"Use Joker",onClick:function(){return c("set_view",{jokerActive:"1"})}}),children:(0,o.createComponentVNode)(2,I,{mutation:N})})],0)},S=function(e,t){var n,r=e.url,i=e.selected,a=e.onClick;return i&&(n="2px solid #22aa00"),(0,o.createComponentVNode)(2,u.Box,{as:"img",src:r,style:{width:"64px",margin:"2px","margin-left":"4px",outline:n},onClick:a})},L=function(e,t){var n=e.gene,r=e.onChange,i=e.disabled,a=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,["gene","onChange","disabled"]),c=p.length,l=p.indexOf(n),d=i&&m.X||m[n];return(0,o.normalizeProps)((0,o.createComponentVNode)(2,u.Button,Object.assign({},a,{color:d,onClick:function(e){if(e.preventDefault(),r)if(-1!==l){var t=p[(l+1)%c];r(e,t)}else r(e,p[0])},oncontextmenu:function(e){if(e.preventDefault(),r)if(-1!==l){var t=p[(l-1+c)%c];r(e,t)}else r(e,p[c-1])},children:n})))},I=function(e,t){var n=e.mutation,r=(0,d.useBackend)(t),i=r.data,c=r.act,l=i.view.jokerActive;if(!n)return(0,o.createComponentVNode)(2,u.Box,{color:"average",children:"No genome selected for sequencing."});if(n.Scrambled)return(0,o.createComponentVNode)(2,u.Box,{color:"average",children:"Sequence unreadable due to unpredictable mutation."});for(var s=n.Sequence,p=n.DefaultSeq,m=[],f=function(e){var t=s.charAt(e),r=(0,o.createComponentVNode)(2,L,{width:"22px",textAlign:"center",disabled:!!n.Scrambled||1!==n.Class,className:"X"===(null==p?void 0:p.charAt(e))&&!n.Active&&(0,a.classes)(["outline-solid","outline-color-orange"]),gene:t,onChange:function(t,o){if(!t.ctrlKey)return l?(c("pulse_gene",{pos:e+1,gene:"J",alias:n.Alias}),void c("set_view",{jokerActive:""})):void c("pulse_gene",{pos:e+1,gene:o,alias:n.Alias});c("pulse_gene",{pos:e+1,gene:"X",alias:n.Alias})}});m.push(r)},h=0;h<s.length;h++)f(h);for(var C=[],g=0;g<m.length;g+=2){var b=(0,o.createComponentVNode)(2,u.Box,{inline:!0,m:.5,children:[m[g],(0,o.createComponentVNode)(2,u.Box,{mt:"-2px",ml:"10px",width:"2px",height:"8px",backgroundColor:"label"}),m[g+1]]},g);g%8==0&&0!==g&&C.push((0,o.createComponentVNode)(2,u.Box,{inline:!0,position:"relative",top:"-17px",left:"-1px",width:"8px",height:"2px",backgroundColor:"label"},g+"_divider")),C.push(b)}return(0,o.createFragment)([(0,o.createComponentVNode)(2,u.Box,{m:-.5,children:C}),(0,o.createComponentVNode)(2,u.Box,{color:"label",mt:1,children:[(0,o.createVNode)(1,"b",null,"Tip:",16)," Ctrl+Click on the gene to set it to X. Right Click to cycle in reverse."]})],4)},T=function(e,t){var n=(0,d.useBackend)(t),r=n.data,i=(n.act,r.isScannerConnected);r.stdDevAcc,r.stdDevStr;return i?(0,o.createFragment)([(0,o.createComponentVNode)(2,u.Flex,{spacing:1,mb:1,children:[(0,o.createComponentVNode)(2,u.Flex.Item,{width:"155px",children:(0,o.createComponentVNode)(2,A)}),(0,o.createComponentVNode)(2,u.Flex.Item,{width:"140px",children:(0,o.createComponentVNode)(2,E)}),(0,o.createComponentVNode)(2,u.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,M)})]}),(0,o.createComponentVNode)(2,P)],4):(0,o.createComponentVNode)(2,u.Section,{color:"bad",children:"DNA Scanner is not connected."})},A=function(e,t){var n=(0,d.useBackend)(t),r=n.data,i=n.act,a=r.radStrength,c=r.radDuration;return(0,o.createComponentVNode)(2,u.Section,{title:"Radiation Emitter",minHeight:"100%",children:(0,o.createComponentVNode)(2,u.LabeledList,{children:[(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Output level",children:(0,o.createComponentVNode)(2,u.NumberInput,{animated:!0,width:"32px",stepPixelSize:10,value:a,minValue:1,maxValue:15,onDrag:function(e,t){return i("set_pulse_strength",{val:t})}})}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Pulse duration",children:(0,o.createComponentVNode)(2,u.NumberInput,{animated:!0,width:"32px",stepPixelSize:10,value:c,minValue:1,maxValue:30,onDrag:function(e,t){return i("set_pulse_duration",{val:t})}})})]})})},E=function(e,t){var n=(0,d.useBackend)(t).data,r=n.stdDevAcc,i=n.stdDevStr;return(0,o.createComponentVNode)(2,u.Section,{title:"Probabilities",minHeight:"100%",children:(0,o.createComponentVNode)(2,u.LabeledList,{children:[(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Accuracy",textAlign:"right",children:r}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"P(\xb1"+i+")",textAlign:"right",children:"68 %"}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"P(\xb1"+2*i+")",textAlign:"right",children:"95 %"})]})})},M=function(e,t){for(var n=(0,d.useBackend)(t),r=n.data,i=n.act,a=r.subjectUNI,c=void 0===a?[]:a,l=[],s=[],p=function(e){var t=c.charAt(e),n=(0,o.createComponentVNode)(2,u.Button,{fluid:!0,textAlign:"center",content:t,onClick:function(){return i("makeup_pulse",{index:e+1})}},e);if(s.push(n),s.length>=3){var r=(0,o.createComponentVNode)(2,u.Box,{inline:!0,width:"22px",mx:"1px",children:s});l.push(r),s=[]}},m=0;m<c.length;m++)p(m);return(0,o.createComponentVNode)(2,u.Section,{title:"Unique Enzymes",minHeight:"100%",position:"relative",children:(0,o.createComponentVNode)(2,u.Box,{mx:"-1px",children:l})})},P=function(e,t){for(var n=(0,d.useBackend)(t),r=n.data,i=n.act,a=r.diskHasMakeup,c=r.hasDisk,l=r.isViableSubject,s=r.makeupCapacity,p=void 0===s?3:s,m=r.makeupStorage,f=[],h=function(e){var t=m[e],n=(0,o.createComponentVNode)(2,u.Collapsible,{title:t?t.label||t.name:"Slot "+e,buttons:(0,o.createFragment)([!(!c||!a)&&(0,o.createComponentVNode)(2,u.Button,{mr:1,disabled:!c||!a,content:"Import from disk",onClick:function(){return i("load_makeup_disk",{index:e})}}),(0,o.createComponentVNode)(2,u.Button,{disabled:!l,content:"Save",onClick:function(){return i("save_makeup_console",{index:e})}}),(0,o.createComponentVNode)(2,u.Button,{ml:1,icon:"times",color:"red",disabled:!t,onClick:function(){return i("del_makeup_console",{index:e})}})],0),children:(0,o.createComponentVNode)(2,O,{index:e,makeup:t})});f.push(n)},C=1;C<=p;C++)h(C);return(0,o.createComponentVNode)(2,u.Section,{title:"Genetic Makeup Buffers",children:f})},R=function(e,t){var n=e.makeup;return(0,o.createComponentVNode)(2,u.Section,{title:"Enzyme Information",children:(0,o.createComponentVNode)(2,u.LabeledList,{children:[(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Name",children:n.name||"None"}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Blood Type",children:n.blood_type||"None"}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Unique Enzyme",children:n.UE||"None"}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Unique Identifier",children:n.UI||"None"})]})})},O=function(e,t){var n=e.index,r=e.makeup,i=(0,d.useBackend)(t),a=i.act,c=i.data,l=c.isViableSubject,s=c.hasDisk,p=c.diskReadOnly,m=c.isInjectorReady,f=l?"makeup_apply":"makeup_delay";return r?(0,o.createFragment)([(0,o.createComponentVNode)(2,R,{makeup:r}),(0,o.createComponentVNode)(2,u.Divider),(0,o.createComponentVNode)(2,u.Box,{bold:!0,color:"label",mb:1,children:"Makeup Actions"}),(0,o.createComponentVNode)(2,u.LabeledList,{children:[(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Enzymes",children:[(0,o.createComponentVNode)(2,u.Button,{icon:"syringe",disabled:!m,content:"Print",onClick:function(){return a("makeup_injector",{index:n,type:"ue"})}}),(0,o.createComponentVNode)(2,u.Button,{icon:"exchange-alt",onClick:function(){return a(f,{index:n,type:"ue"})},children:["Transfer",!l&&" (Delayed)"]})]}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Identity",children:[(0,o.createComponentVNode)(2,u.Button,{icon:"syringe",disabled:!m,content:"Print",onClick:function(){return a("makeup_injector",{index:n,type:"ui"})}}),(0,o.createComponentVNode)(2,u.Button,{icon:"exchange-alt",onClick:function(){return a(f,{index:n,type:"ui"})},children:["Transfer",!l&&" (Delayed)"]})]}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{label:"Full Makeup",children:[(0,o.createComponentVNode)(2,u.Button,{icon:"syringe",disabled:!m,content:"Print",onClick:function(){return a("makeup_injector",{index:n,type:"mixed"})}}),(0,o.createComponentVNode)(2,u.Button,{icon:"exchange-alt",onClick:function(){return a(f,{index:n,type:"mixed"})},children:["Transfer",!l&&" (Delayed)"]})]}),(0,o.createComponentVNode)(2,u.LabeledList.Item,{children:(0,o.createComponentVNode)(2,u.Button,{icon:"save",disabled:!s||p,content:"Export To Disk",onClick:function(){return a("save_makeup_disk",{index:n})}})})]})],4):(0,o.createComponentVNode)(2,u.Box,{color:"average",children:"No stored subject data."})},F=function(e,t){var n,r=(0,d.useBackend)(t),i=r.act,a=r.data,c=a.maxAdvInjectors,l=a.isInjectorReady,s=null!=(n=a.storage.injector)?n:[];return(0,o.createComponentVNode)(2,u.Section,{title:"Advanced Injectors",children:[s.map((function(e){return(0,o.createComponentVNode)(2,u.Collapsible,{title:e.name,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,u.Button,{icon:"syringe",disabled:!l,content:"Print",onClick:function(){return i("print_adv_inj",{name:e.name})}}),(0,o.createComponentVNode)(2,u.Button,{ml:1,color:"red",icon:"times",onClick:function(){return i("del_adv_inj",{name:e.name})}})],4),children:(0,o.createComponentVNode)(2,k,{mutations:e.mutations,customMode:"advinj"+s.findIndex((function(t){return e.name===t.name}))})},e.name)})),(0,o.createComponentVNode)(2,u.Box,{mt:2,children:(0,o.createComponentVNode)(2,u.Button.Input,{minWidth:"200px",content:"Create new injector",disabled:s.length>=c,onCommit:function(e,t){return i("new_adv_inj",{name:t})}})})]})},j=function(e,t){var n=e.mutations,r=void 0===n?[]:n,i=e.source,a=(0,d.useBackend)(t),c=a.act;a.data;return(0,o.createComponentVNode)(2,u.Dropdown,{width:"240px",options:r.map((function(e){return e.Name})),disabled:0===r.length,selected:"Combine mutations",onSelected:function(e){return c("combine_"+i.Source,{firstref:(t=e,null==(n=r.find((function(e){return e.Name===t})))?void 0:n.ByondRef),secondref:i.ByondRef});var t,n}},i.ByondRef)}},function(e,t,n){"use strict";t.__esModule=!0,t.DnaVault=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.DnaVault=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.completed,u=l.used,s=l.choiceA,p=l.choiceB,m=l.dna,f=l.dna_max,h=l.plants,C=l.plants_max,g=l.animals,b=l.animals_max;return(0,o.createComponentVNode)(2,a.Window,{width:350,height:400,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"DNA Vault Database",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Human DNA",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:m/f,children:m+" / "+f+" Samples"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Plant DNA",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:h/C,children:h+" / "+C+" Samples"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Animal DNA",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:g/g,children:g+" / "+b+" Samples"})})]})}),!(!d||u)&&(0,o.createComponentVNode)(2,i.Section,{title:"Personal Gene Therapy",children:[(0,o.createComponentVNode)(2,i.Box,{bold:!0,textAlign:"center",mb:1,children:"Applicable Gene Therapy Treatments"}),(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,bold:!0,content:s,textAlign:"center",onClick:function(){return c("gene",{choice:s})}})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,bold:!0,content:p,textAlign:"center",onClick:function(){return c("gene",{choice:p})}})})]})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.EightBallVote=void 0;var o=n(0),r=n(1),i=n(3),a=n(19),c=n(2);t.EightBallVote=function(e,t){var n=(0,r.useBackend)(t),a=(n.act,n.data.shaking);return(0,o.createComponentVNode)(2,c.Window,{width:400,height:600,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:!a&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No question is currently being asked."})||(0,o.createComponentVNode)(2,l)})})};var l=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.question,u=l.answers,s=void 0===u?[]:u;return(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.Box,{bold:!0,textAlign:"center",fontSize:"16px",m:1,children:['"',d,'"']}),(0,o.createComponentVNode)(2,i.Grid,{children:s.map((function(e){return(0,o.createComponentVNode)(2,i.Grid.Column,{children:[(0,o.createComponentVNode)(2,i.Button,{fluid:!0,bold:!0,content:(0,a.toTitleCase)(e.answer),selected:e.selected,fontSize:"16px",lineHeight:"24px",textAlign:"center",mb:1,onClick:function(){return c("vote",{answer:e.answer})}}),(0,o.createComponentVNode)(2,i.Box,{bold:!0,textAlign:"center",fontSize:"30px",children:e.amount})]},e.answer)}))})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.Electrolyzer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Electrolyzer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:305,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Power",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject Cell",disabled:!l.hasPowercell||!l.open,onClick:function(){return c("eject")}}),(0,o.createComponentVNode)(2,i.Button,{icon:l.on?"power-off":"times",content:l.on?"On":"Off",selected:l.on,disabled:!l.hasPowercell,onClick:function(){return c("power")}})],4),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cell",color:!l.hasPowercell&&"bad",children:l.hasPowercell&&(0,o.createComponentVNode)(2,i.ProgressBar,{value:l.powerLevel/100,content:l.powerLevel+"%",ranges:{good:[.6,Infinity],average:[.3,.6],bad:[-Infinity,.3]}})||"None"})})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Electropack=void 0;var o=n(0),r=n(16),i=n(1),a=n(3),c=n(2);t.Electropack=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.power,s=d.code,p=d.frequency,m=d.minFrequency,f=d.maxFrequency;return(0,o.createComponentVNode)(2,c.Window,{width:260,height:137,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,a.Button,{icon:u?"power-off":"times",content:u?"On":"Off",selected:u,onClick:function(){return l("power")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Frequency",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"sync",content:"Reset",onClick:function(){return l("reset",{reset:"freq"})}}),children:(0,o.createComponentVNode)(2,a.NumberInput,{animate:!0,unit:"kHz",step:.2,stepPixelSize:6,minValue:m/10,maxValue:f/10,value:p/10,format:function(e){return(0,r.toFixed)(e,1)},width:"80px",onDrag:function(e,t){return l("freq",{freq:t})}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Code",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"sync",content:"Reset",onClick:function(){return l("reset",{reset:"code"})}}),children:(0,o.createComponentVNode)(2,a.NumberInput,{animate:!0,step:1,stepPixelSize:6,minValue:1,maxValue:100,value:s,width:"80px",onDrag:function(e,t){return l("code",{code:t})}})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.EmergencyShuttleConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.EmergencyShuttleConsole=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.timer_str,u=l.enabled,s=l.emagged,p=l.engines_started,m=l.authorizations_remaining,f=l.authorizations,h=void 0===f?[]:f;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:350,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.Box,{bold:!0,fontSize:"40px",textAlign:"center",fontFamily:"monospace",children:d}),(0,o.createComponentVNode)(2,i.Box,{textAlign:"center",fontSize:"16px",mb:1,children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,children:"ENGINES:"}),(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:p?"good":"average",ml:1,children:p?"Online":"Idle"})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Early Launch Authorization",level:2,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"times",content:"Repeal All",color:"bad",disabled:!u,onClick:function(){return c("abort")}}),children:[(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"exclamation-triangle",color:"good",content:"AUTHORIZE",disabled:!u,onClick:function(){return c("authorize")}})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"minus",content:"REPEAL",disabled:!u,onClick:function(){return c("repeal")}})})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Authorizations",level:3,minHeight:"150px",buttons:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,color:s?"bad":"good",children:s?"ERROR":"Remaining: "+m}),children:h.length>0?h.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{bold:!0,fontSize:"16px",className:"candystripe",children:[e.name," (",e.job,")"]},e.name)})):(0,o.createComponentVNode)(2,i.Box,{bold:!0,textAlign:"center",fontSize:"16px",color:"average",children:"No Active Authorizations"})})]})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.EngravedMessage=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(2);t.EngravedMessage=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.admin_mode,s=d.creator_key,p=d.creator_name,m=d.has_liked,f=d.has_disliked,h=d.hidden_message,C=d.is_creator,g=d.num_likes,b=d.num_dislikes,N=d.realdate;return(0,o.createComponentVNode)(2,c.Window,{width:600,height:300,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Box,{bold:!0,textAlign:"center",fontSize:"20px",mb:2,children:(0,r.decodeHtmlEntities)(h)}),(0,o.createComponentVNode)(2,a.Grid,{children:[(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,icon:"arrow-up",content:" "+g,disabled:C,selected:m,textAlign:"center",fontSize:"16px",lineHeight:"24px",onClick:function(){return l("like")}})}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,icon:"circle",disabled:C,selected:!f&&!m,textAlign:"center",fontSize:"16px",lineHeight:"24px",onClick:function(){return l("neutral")}})}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,icon:"arrow-down",content:" "+b,disabled:C,selected:f,textAlign:"center",fontSize:"16px",lineHeight:"24px",onClick:function(){return l("dislike")}})})]})]}),(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Created On",children:N})})}),(0,o.createComponentVNode)(2,a.Section),!!u&&(0,o.createComponentVNode)(2,a.Section,{title:"Admin Panel",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"times",content:"Delete",color:"bad",onClick:function(){return l("delete")}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Creator Ckey",children:s}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Creator Character Name",children:p})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ExosuitControlConsole=void 0;var o=n(0),r=n(16),i=n(1),a=n(3),c=n(2);t.ExosuitControlConsole=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data.mechs,u=void 0===d?[]:d;return(0,o.createComponentVNode)(2,c.Window,{width:500,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[0===u.length&&(0,o.createComponentVNode)(2,a.NoticeBox,{children:"No exosuits detected"}),u.map((function(e){return(0,o.createComponentVNode)(2,a.Section,{title:e.name,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"envelope",content:"Send Message",disabled:!e.pilot,onClick:function(){return l("send_message",{tracker_ref:e.tracker_ref})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"wifi",content:e.emp_recharging?"Recharging...":"EMP Burst",color:"bad",disabled:e.emp_recharging,onClick:function(){return l("shock",{tracker_ref:e.tracker_ref})}})],4),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Integrity",children:(0,o.createComponentVNode)(2,a.Box,{color:(e.integrity<=30?"bad":e.integrity<=70&&"average")||"good",children:[e.integrity,"%"]})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Charge",children:(0,o.createComponentVNode)(2,a.Box,{color:(e.charge<=30?"bad":e.charge<=70&&"average")||"good",children:"number"==typeof e.charge&&e.charge+"%"||"Not Found"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Airtank",children:"number"==typeof e.airtank&&(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:e.airtank,format:function(e){return(0,r.toFixed)(e,2)+" kPa"}})||"Not Equipped"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pilot",children:e.pilot||"None"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Location",children:e.location||"Unknown"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Active Equipment",children:e.active_equipment||"None"}),e.cargo_space>=0&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Used Cargo Space",children:(0,o.createComponentVNode)(2,a.Box,{color:(e.cargo_space<=30?"good":e.cargo_space<=70&&"average")||"bad",children:[e.cargo_space,"%"]})})]})},e.tracker_ref)}))]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ExosuitFabricator=void 0;var o,r=n(0),i=n(6),a=n(15),c=n(1),l=n(40),d=n(3),u=n(2),s=n(19);function p(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return m(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return m(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}var f={iron:"sheet-metal_3",glass:"sheet-glass_3",silver:"sheet-silver_3",gold:"sheet-gold_3",diamond:"sheet-diamond",plasma:"sheet-plasma_3",uranium:"sheet-uranium",bananium:"sheet-bananium",titanium:"sheet-titanium_3","bluespace crystal":"polycrystal",plastic:"sheet-plastic_3"},h=((o={})[0]=!1,o[1]="average",o[2]="bad",o),C=function(e,t,n){return e>n?{color:2,deficit:e-n}:t>n?{color:1,deficit:e}:e+t>n?{color:1,deficit:e+t-n}:{color:0,deficit:0}},g=function(e,t,n){var o={textColor:0};return Object.keys(n.cost).forEach((function(r){o[r]=C(n.cost[r],t[r],e[r]),o[r].color>o.textColor&&(o.textColor=o[r].color)})),o};t.ExosuitFabricator=function(e,t){var n,o,i=(0,c.useBackend)(t),a=i.act,l=i.data,s=l.queue||[],p=(n=l.materials||[],o={},n.forEach((function(e){o[e.name]=e.amount})),o),m=function(e,t){var n={},o={},r={},i={};return t.forEach((function(t,a){i[a]=0,Object.keys(t.cost).forEach((function(c){n[c]=n[c]||0,r[c]=r[c]||0,o[c]=C(t.cost[c],n[c],e[c]),0!==o[c].color?i[a]<o[c].color&&(i[a]=o[c].color):n[c]+=t.cost[c],r[c]+=o[c].deficit}))})),{materialTally:n,missingMatTally:r,textColors:i,matFormat:o}}(p,s),f=m.materialTally,h=m.missingMatTally,g=m.textColors,b=(0,c.useSharedState)(t,"display_mats",!1),v=b[0],k=b[1];return(0,r.createComponentVNode)(2,u.Window,{resizable:!0,title:"Exosuit Fabricator",width:1100,height:640,children:(0,r.createComponentVNode)(2,u.Window.Content,{scrollable:!0,children:(0,r.createComponentVNode)(2,d.Flex,{fillPositionedParent:!0,direction:"column",children:[(0,r.createComponentVNode)(2,d.Flex,{children:[(0,r.createComponentVNode)(2,d.Flex.Item,{ml:1,mr:1,mt:1,basis:"content",grow:1,children:(0,r.createComponentVNode)(2,d.Section,{title:"Materials",children:(0,r.createComponentVNode)(2,N)})}),(0,r.createComponentVNode)(2,d.Flex.Item,{mt:1,mr:1,children:(0,r.createComponentVNode)(2,d.Section,{title:"Settings",height:"100%",children:(0,r.createComponentVNode)(2,d.Button.Checkbox,{onClick:function(){return k(!v)},checked:v,children:"Display Material Costs"})})})]}),(0,r.createComponentVNode)(2,d.Flex.Item,{grow:1,m:1,children:(0,r.createComponentVNode)(2,d.Flex,{spacing:1,height:"100%",overflowY:"hide",children:[(0,r.createComponentVNode)(2,d.Flex.Item,{position:"relative",basis:"content",children:(0,r.createComponentVNode)(2,d.Section,{height:"100%",overflowY:"auto",title:"Categories",buttons:(0,r.createComponentVNode)(2,d.Button,{content:"R&D Sync",onClick:function(){return a("sync_rnd")}}),children:(0,r.createComponentVNode)(2,V)})}),(0,r.createComponentVNode)(2,d.Flex.Item,{position:"relative",grow:1,children:(0,r.createComponentVNode)(2,d.Box,{fillPositionedParent:!0,overflowY:"auto",children:(0,r.createComponentVNode)(2,y,{queueMaterials:f,materials:p})})}),(0,r.createComponentVNode)(2,d.Flex.Item,{width:"420px",position:"relative",children:(0,r.createComponentVNode)(2,x,{queueMaterials:f,missingMaterials:h,textColors:g})})]})})]})})})};var b=function(e,t){var n=(0,c.useBackend)(t).act,o=e.material,i=o.name,a=o.removable,l=o.sheets,u=o.ref,s=(0,c.useSharedState)(t,"remove_mats_"+i,1),p=s[0],m=s[1];return p>1&&l<p&&m(l||1),(0,r.createFragment)([(0,r.createComponentVNode)(2,d.NumberInput,{width:"30px",animated:!0,value:p,minValue:1,maxValue:l||1,initial:1,onDrag:function(e,t){var n=parseInt(t,10);Number.isInteger(n)&&m(n)}}),(0,r.createComponentVNode)(2,d.Button,{icon:"eject",disabled:!a,onClick:function(){return n("remove_mat",{ref:u,amount:p})}})],4)},N=function(e,t){var n=(0,c.useBackend)(t).data.materials||[];return(0,r.createComponentVNode)(2,d.Flex,{wrap:"wrap",children:n.map((function(e){return(0,r.createComponentVNode)(2,d.Flex.Item,{width:"80px",children:[(0,r.createComponentVNode)(2,v,{name:e.name,amount:e.amount,formatsi:!0}),(0,r.createComponentVNode)(2,d.Box,{mt:1,style:{"text-align":"center"},children:(0,r.createComponentVNode)(2,b,{material:e})})]},e.name)}))})},v=function(e,t){var n=e.name,o=e.amount,a=e.formatsi,c=e.formatmoney,u=e.color,s=e.style;return(0,r.createComponentVNode)(2,d.Flex,{direction:"column",align:"center",children:[(0,r.createComponentVNode)(2,d.Flex.Item,{children:(0,r.createComponentVNode)(2,d.Box,{className:(0,i.classes)(["sheetmaterials32x32",f[n]]),style:s})}),(0,r.createComponentVNode)(2,d.Flex.Item,{children:(0,r.createComponentVNode)(2,d.Box,{textColor:u,style:{"text-align":"center"},children:a&&(0,l.formatSiUnit)(o,0)||c&&(0,l.formatMoney)(o)||o})})]})},V=function(e,t){var n=(0,c.useBackend)(t).data,o=n.partSets||[],i=n.buildableParts||{},a=(0,c.useSharedState)(t,"part_tab",o.length?i[0]:""),l=a[0],u=a[1];return(0,r.createComponentVNode)(2,d.Tabs,{vertical:!0,children:o.map((function(e){return!!i[e]&&(0,r.createComponentVNode)(2,d.Tabs.Tab,{selected:e===l,disabled:!i[e],onClick:function(){return u(e)},children:e},e)}))})},y=function(e,t){var n,o=(0,c.useBackend)(t).data,i=function(e){for(var t,n=p(e);!(t=n()).done;){var o=t.value;if(u[o])return o}return null},l=o.partSets||[],u=o.buildableParts||[],m=e.queueMaterials,f=e.materials,h=(0,c.useSharedState)(t,"part_tab",i(l)),C=h[0],b=h[1],N=(0,c.useSharedState)(t,"search_text",""),v=N[0],V=N[1];if(!C||!u[C]){var y=i(l);if(!y)return;b(y)}return v?(n=[],function(e,t){var n=[];if(e.length){var o=(0,s.createSearch)(e,(function(e){return(e.name||"")+(e.desc||"")+(e.searchMeta||"")}));return Object.keys(t).forEach((function(e){t[e].filter(o).forEach((function(e){n.push(e)}))})),n=(0,a.uniqBy)((function(e){return e.name}))(n)}}(v,u).forEach((function(e){e.format=g(f,m,e),n.push(e)}))):(n={Parts:[]},u[C].forEach((function(e){e.format=g(f,m,e),e.subCategory?(e.subCategory in n||(n[e.subCategory]=[]),n[e.subCategory].push(e)):n.Parts.push(e)}))),(0,r.createFragment)([(0,r.createComponentVNode)(2,d.Section,{children:(0,r.createComponentVNode)(2,d.Flex,{children:[(0,r.createComponentVNode)(2,d.Flex.Item,{mr:1,children:(0,r.createComponentVNode)(2,d.Icon,{name:"search"})}),(0,r.createComponentVNode)(2,d.Flex.Item,{grow:1,children:(0,r.createComponentVNode)(2,d.Input,{fluid:!0,placeholder:"Search for...",onInput:function(e,t){return V(t)}})})]})}),!!v&&(0,r.createComponentVNode)(2,k,{name:"Search Results",parts:n,forceShow:!0,placeholder:"No matching results..."})||Object.keys(n).map((function(e){return(0,r.createComponentVNode)(2,k,{name:e,parts:n[e]},e)}))],0)},k=function(e,t){var n=(0,c.useBackend)(t),o=n.act,i=n.data.buildingPart,a=e.parts,l=e.name,u=e.forceShow,s=e.placeholder,p=(0,c.useSharedState)(t,"display_mats",!1)[0];return(!!a.length||u)&&(0,r.createComponentVNode)(2,d.Section,{title:l,buttons:(0,r.createComponentVNode)(2,d.Button,{disabled:!a.length,color:"good",content:"Queue All",icon:"plus-circle",onClick:function(){return o("add_queue_set",{part_list:a.map((function(e){return e.id}))})}}),children:[!a.length&&s,a.map((function(e){return(0,r.createFragment)([(0,r.createComponentVNode)(2,d.Flex,{align:"center",children:[(0,r.createComponentVNode)(2,d.Flex.Item,{children:(0,r.createComponentVNode)(2,d.Button,{disabled:i||2===e.format.textColor,color:"good",height:"20px",mr:1,icon:"play",onClick:function(){return o("build_part",{id:e.id})}})}),(0,r.createComponentVNode)(2,d.Flex.Item,{children:(0,r.createComponentVNode)(2,d.Button,{color:"average",height:"20px",mr:1,icon:"plus-circle",onClick:function(){return o("add_queue_part",{id:e.id})}})}),(0,r.createComponentVNode)(2,d.Flex.Item,{children:(0,r.createComponentVNode)(2,d.Box,{inline:!0,textColor:h[e.format.textColor],children:e.name})}),(0,r.createComponentVNode)(2,d.Flex.Item,{grow:1}),(0,r.createComponentVNode)(2,d.Flex.Item,{children:(0,r.createComponentVNode)(2,d.Button,{icon:"question-circle",transparent:!0,height:"20px",tooltip:"Build Time: "+e.printTime+"s. "+(e.desc||""),tooltipPosition:"left"})})]}),p&&(0,r.createComponentVNode)(2,d.Flex,{mb:2,children:Object.keys(e.cost).map((function(t){return(0,r.createComponentVNode)(2,d.Flex.Item,{width:"50px",color:h[e.format[t].color],children:(0,r.createComponentVNode)(2,v,{formatmoney:!0,style:{transform:"scale(0.75) translate(0%, 10%)"},name:t,amount:e.cost[t]})},t)}))})],0,e.name)}))]})},x=function(e,t){var n=(0,c.useBackend)(t),o=n.act,i=n.data,a=i.isProcessingQueue,l=i.queue||[],u=e.queueMaterials,s=e.missingMaterials,p=e.textColors;return(0,r.createComponentVNode)(2,d.Flex,{height:"100%",width:"100%",direction:"column",children:[(0,r.createComponentVNode)(2,d.Flex.Item,{height:0,grow:1,children:(0,r.createComponentVNode)(2,d.Section,{height:"100%",title:"Queue",overflowY:"auto",buttons:(0,r.createFragment)([(0,r.createComponentVNode)(2,d.Button.Confirm,{disabled:!l.length,color:"bad",icon:"minus-circle",content:"Clear Queue",onClick:function(){return o("clear_queue")}}),!!a&&(0,r.createComponentVNode)(2,d.Button,{disabled:!l.length,content:"Stop",icon:"stop",onClick:function(){return o("stop_queue")}})||(0,r.createComponentVNode)(2,d.Button,{disabled:!l.length,content:"Build Queue",icon:"play",onClick:function(){return o("build_queue")}})],0),children:(0,r.createComponentVNode)(2,d.Flex,{direction:"column",height:"100%",children:[(0,r.createComponentVNode)(2,d.Flex.Item,{children:(0,r.createComponentVNode)(2,B)}),(0,r.createComponentVNode)(2,d.Flex.Item,{children:(0,r.createComponentVNode)(2,w,{textColors:p})})]})})}),!!l.length&&(0,r.createComponentVNode)(2,d.Flex.Item,{mt:1,children:(0,r.createComponentVNode)(2,d.Section,{title:"Material Cost",children:(0,r.createComponentVNode)(2,_,{queueMaterials:u,missingMaterials:s})})})]})},_=function(e,t){var n=e.queueMaterials,o=e.missingMaterials;return(0,r.createComponentVNode)(2,d.Flex,{wrap:"wrap",children:Object.keys(n).map((function(e){return(0,r.createComponentVNode)(2,d.Flex.Item,{width:"12%",children:[(0,r.createComponentVNode)(2,v,{formatmoney:!0,name:e,amount:n[e]}),!!o[e]&&(0,r.createComponentVNode)(2,d.Box,{textColor:"bad",style:{"text-align":"center"},children:(0,l.formatMoney)(o[e])})]},e)}))})},w=function(e,t){var n=(0,c.useBackend)(t),o=n.act,i=n.data,a=e.textColors,l=i.queue||[];return l.length?l.map((function(e,t){return(0,r.createComponentVNode)(2,d.Box,{children:(0,r.createComponentVNode)(2,d.Flex,{mb:.5,direction:"column",justify:"center",wrap:"wrap",height:"20px",inline:!0,children:[(0,r.createComponentVNode)(2,d.Flex.Item,{basis:"content",children:(0,r.createComponentVNode)(2,d.Button,{height:"20px",mr:1,icon:"minus-circle",color:"bad",onClick:function(){return o("del_queue_part",{index:t+1})}})}),(0,r.createComponentVNode)(2,d.Flex.Item,{children:(0,r.createComponentVNode)(2,d.Box,{inline:!0,textColor:h[a[t]],children:e.name})})]})},e.name)})):(0,r.createFragment)([(0,r.createTextVNode)("No parts in queue.")],4)},B=function(e,t){var n=(0,c.useBackend)(t).data,o=n.buildingPart,i=n.storedPart;if(i){var a=i.name;return(0,r.createComponentVNode)(2,d.Box,{children:(0,r.createComponentVNode)(2,d.ProgressBar,{minValue:0,maxValue:1,value:1,color:"average",children:(0,r.createComponentVNode)(2,d.Flex,{children:[(0,r.createComponentVNode)(2,d.Flex.Item,{children:a}),(0,r.createComponentVNode)(2,d.Flex.Item,{grow:1}),(0,r.createComponentVNode)(2,d.Flex.Item,{children:"Fabricator outlet obstructed..."})]})})})}if(o){var l=o.name,u=o.duration,s=o.printTime,p=Math.ceil(u/10);return(0,r.createComponentVNode)(2,d.Box,{children:(0,r.createComponentVNode)(2,d.ProgressBar,{minValue:0,maxValue:s,value:u,children:(0,r.createComponentVNode)(2,d.Flex,{children:[(0,r.createComponentVNode)(2,d.Flex.Item,{children:l}),(0,r.createComponentVNode)(2,d.Flex.Item,{grow:1}),(0,r.createComponentVNode)(2,d.Flex.Item,{children:p>=0&&p+"s"||"Dispensing..."})]})})})}}},function(e,t,n){"use strict";t.__esModule=!0,t.ForbiddenLore=void 0;var o=n(0),r=n(15),i=n(30),a=n(1),c=n(3),l=n(2);t.ForbiddenLore=function(e,t){var n=(0,a.useBackend)(t),d=n.act,u=n.data,s=u.charges,p=(0,i.flow)([(0,r.sortBy)((function(e){return"Research"!==e.state}),(function(e){return"Side"===e.path}))])(u.to_know||[]);return(0,o.createComponentVNode)(2,l.Window,{width:500,height:900,resizable:!0,children:(0,o.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c.Section,{title:"Research Eldritch Knowledge",children:["Charges left : ",s,null!==p?p.map((function(e){return(0,o.createComponentVNode)(2,c.Section,{title:e.name,level:2,children:[(0,o.createComponentVNode)(2,c.Box,{bold:!0,my:1,children:[e.path," path"]}),(0,o.createComponentVNode)(2,c.Box,{my:1,children:[(0,o.createComponentVNode)(2,c.Button,{content:e.state,disabled:e.disabled,onClick:function(){return d("research",{name:e.name,cost:e.cost})}})," ","Cost : ",e.cost]}),(0,o.createComponentVNode)(2,c.Box,{italic:!0,my:1,children:e.flavour}),(0,o.createComponentVNode)(2,c.Box,{my:1,children:e.desc})]},e.name)})):(0,o.createComponentVNode)(2,c.Box,{children:"No more knowledge can be found"})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Gateway=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Gateway=function(){return(0,o.createComponentVNode)(2,a.Window,{resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.gateway_present,d=void 0!==l&&l,u=c.gateway_status,s=void 0!==u&&u,p=c.current_target,m=void 0===p?null:p,f=c.destinations,h=void 0===f?[]:f;return d?m?(0,o.createComponentVNode)(2,i.Section,{title:m.name,children:[(0,o.createComponentVNode)(2,i.Icon,{name:"rainbow",size:4,color:"green"}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,onClick:function(){return a("deactivate")},children:"Deactivate"})]}):h.length?(0,o.createFragment)([!s&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Gateway Unpowered"}),h.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name,children:e.availible&&(0,o.createComponentVNode)(2,i.Button,{fluid:!0,onClick:function(){return a("activate",{destination:e.ref})},children:"Activate"})||(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{m:1,textColor:"bad",children:e.reason}),!!e.timeout&&(0,o.createComponentVNode)(2,i.ProgressBar,{value:e.timeout,children:"Calibrating..."})],0)},e.ref)}))],0):(0,o.createComponentVNode)(2,i.Section,{children:"No gateway nodes detected."}):(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No linked gateway"}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,onClick:function(){return a("linkup")},children:"Linkup"})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.GlandDispenser=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.GlandDispenser=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data.glands,d=void 0===l?[]:l;return(0,o.createComponentVNode)(2,a.Window,{width:300,height:338,theme:"abductor",children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:d.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{width:"60px",height:"60px",m:.75,textAlign:"center",lineHeight:"55px",icon:"eject",backgroundColor:e.color,content:e.amount||"0",disabled:!e.amount,onClick:function(){return c("dispense",{gland_id:e.id})}},e.id)}))})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Gps=void 0;var o=n(0),r=n(15),i=n(30),a=n(16),c=n(120),l=n(1),d=n(3),u=n(2),s=function(e){return(0,r.map)(parseFloat)(e.split(", "))};t.Gps=function(e,t){var n=(0,l.useBackend)(t),p=n.act,m=n.data,f=m.currentArea,h=m.currentCoords,C=m.globalmode,g=m.power,b=m.tag,N=m.updating,v=(0,i.flow)([(0,r.map)((function(e,t){var n=e.dist&&Math.round((0,c.vecLength)((0,c.vecSubtract)(s(h),s(e.coords))));return Object.assign({},e,{dist:n,index:t})})),(0,r.sortBy)((function(e){return e.dist===undefined}),(function(e){return e.entrytag}))])(m.signals||[]);return(0,o.createComponentVNode)(2,u.Window,{title:"Global Positioning System",width:470,height:700,resizable:!0,children:(0,o.createComponentVNode)(2,u.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,d.Section,{title:"Control",buttons:(0,o.createComponentVNode)(2,d.Button,{icon:"power-off",content:g?"On":"Off",selected:g,onClick:function(){return p("power")}}),children:(0,o.createComponentVNode)(2,d.LabeledList,{children:[(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Tag",children:(0,o.createComponentVNode)(2,d.Button,{icon:"pencil-alt",content:b,onClick:function(){return p("rename")}})}),(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Scan Mode",children:(0,o.createComponentVNode)(2,d.Button,{icon:N?"unlock":"lock",content:N?"AUTO":"MANUAL",color:!N&&"bad",onClick:function(){return p("updating")}})}),(0,o.createComponentVNode)(2,d.LabeledList.Item,{label:"Range",children:(0,o.createComponentVNode)(2,d.Button,{icon:"sync",content:C?"MAXIMUM":"LOCAL",selected:!C,onClick:function(){return p("globalmode")}})})]})}),!!g&&(0,o.createFragment)([(0,o.createComponentVNode)(2,d.Section,{title:"Current Location",children:(0,o.createComponentVNode)(2,d.Box,{fontSize:"18px",children:[f," (",h,")"]})}),(0,o.createComponentVNode)(2,d.Section,{title:"Detected Signals",children:(0,o.createComponentVNode)(2,d.Table,{children:[(0,o.createComponentVNode)(2,d.Table.Row,{bold:!0,children:[(0,o.createComponentVNode)(2,d.Table.Cell,{content:"Name"}),(0,o.createComponentVNode)(2,d.Table.Cell,{collapsing:!0,content:"Direction"}),(0,o.createComponentVNode)(2,d.Table.Cell,{collapsing:!0,content:"Coordinates"})]}),v.map((function(e){return(0,o.createComponentVNode)(2,d.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,d.Table.Cell,{bold:!0,color:"label",children:e.entrytag}),(0,o.createComponentVNode)(2,d.Table.Cell,{collapsing:!0,opacity:e.dist!==undefined&&(0,a.clamp)(1.2/Math.log(Math.E+e.dist/20),.4,1),children:[e.degrees!==undefined&&(0,o.createComponentVNode)(2,d.Icon,{mr:1,size:1.2,name:"arrow-up",rotation:e.degrees}),e.dist!==undefined&&e.dist+"m"]}),(0,o.createComponentVNode)(2,d.Table.Cell,{collapsing:!0,children:e.coords})]},e.entrytag+e.coords+e.index)}))]})})],4)]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.GravityGenerator=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.GravityGenerator=function(e,t){var n=(0,r.useBackend)(t),l=(n.act,n.data),d=l.charging_state,u=l.operational;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:165,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[!u&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No data available"}),!!u&&0!==d&&(0,o.createComponentVNode)(2,i.NoticeBox,{danger:!0,children:"WARNING - Radiation detected"}),!!u&&0===d&&(0,o.createComponentVNode)(2,i.NoticeBox,{success:!0,children:"No radiation detected"}),!!u&&(0,o.createComponentVNode)(2,c)]})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.breaker,d=c.charge_count,u=c.charging_state,s=c.on,p=c.operational;return(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.Button,{icon:l?"power-off":"times",content:l?"On":"Off",selected:l,disabled:!p,onClick:function(){return a("gentoggle")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Gravity Charge",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:d/100,ranges:{good:[.7,Infinity],average:[.3,.7],bad:[-Infinity,.3]}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Charge Mode",children:[0===u&&(s&&(0,o.createComponentVNode)(2,i.Box,{color:"good",children:"Fully Charged"})||(0,o.createComponentVNode)(2,i.Box,{color:"bad",children:"Not Charging"})),1===u&&(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"Charging"}),2===u&&(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"Discharging"})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.GulagItemReclaimer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.GulagItemReclaimer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.mobs,u=void 0===d?[]:d;return(0,o.createComponentVNode)(2,a.Window,{width:325,height:400,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[0===u.length&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No stored items"}),u.length>0&&(0,o.createComponentVNode)(2,i.Section,{title:"Stored Items",children:(0,o.createComponentVNode)(2,i.Table,{children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:e.name}),(0,o.createComponentVNode)(2,i.Table.Cell,{textAlign:"right",children:(0,o.createComponentVNode)(2,i.Button,{content:"Retrieve Items",disabled:!l.can_reclaim,onClick:function(){return c("release_items",{mobref:e.mob})}})})]},e.mob)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.GulagTeleporterConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.GulagTeleporterConsole=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.teleporter,u=l.teleporter_lock,s=l.teleporter_state_open,p=l.teleporter_location,m=l.beacon,f=l.beacon_location,h=l.id,C=l.id_name,g=l.can_teleport,b=l.goal,N=void 0===b?0:b,v=l.prisoner,V=void 0===v?{}:v;return(0,o.createComponentVNode)(2,a.Window,{width:350,height:295,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Teleporter Console",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{content:s?"Open":"Closed",disabled:u,selected:s,onClick:function(){return c("toggle_open")}}),(0,o.createComponentVNode)(2,i.Button,{icon:u?"lock":"unlock",content:u?"Locked":"Unlocked",selected:u,disabled:s,onClick:function(){return c("teleporter_lock")}})],4),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Teleporter Unit",color:d?"good":"bad",buttons:!d&&(0,o.createComponentVNode)(2,i.Button,{content:"Reconnect",onClick:function(){return c("scan_teleporter")}}),children:d?p:"Not Connected"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Receiver Beacon",color:m?"good":"bad",buttons:!m&&(0,o.createComponentVNode)(2,i.Button,{content:"Reconnect",onClick:function(){return c("scan_beacon")}}),children:m?f:"Not Connected"})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Prisoner Details",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Prisoner ID",children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:h?C:"No ID",onClick:function(){return c("handle_id")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Point Goal",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:N,width:"48px",minValue:1,maxValue:1e3,onChange:function(e,t){return c("set_goal",{value:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Occupant",children:V.name||"No Occupant"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Criminal Status",children:V.crimstat||"No Status"})]})}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Process Prisoner",disabled:!g,textAlign:"center",color:"bad",onClick:function(){return c("teleport")}})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Holodeck=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Holodeck=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.can_toggle_safety,u=l.default_programs,s=void 0===u?[]:u,p=l.emag_programs,m=void 0===p?[]:p,f=l.emagged,h=l.program;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Default Programs",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:f?"unlock":"lock",content:"Safeties",color:"bad",disabled:!d,selected:!f,onClick:function(){return c("safety")}}),children:s.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:e.name.substring(11),textAlign:"center",selected:e.type===h,onClick:function(){return c("load_program",{type:e.type})}},e.type)}))}),!!f&&(0,o.createComponentVNode)(2,i.Section,{title:"Dangerous Programs",children:m.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:e.name.substring(11),color:"bad",textAlign:"center",selected:e.type===h,onClick:function(){return c("load_program",{type:e.type})}},e.type)}))})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Holopad=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Holopad=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data.calling;return(0,o.createComponentVNode)(2,a.Window,{width:440,height:245,resizable:!0,children:[!!d&&(0,o.createComponentVNode)(2,i.Modal,{fontSize:"36px",fontFamily:"monospace",children:[(0,o.createComponentVNode)(2,i.Flex,{align:"center",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{mr:2,mt:2,children:(0,o.createComponentVNode)(2,i.Icon,{name:"phone-alt",rotation:25})}),(0,o.createComponentVNode)(2,i.Flex.Item,{mr:2,children:"Dialing..."})]}),(0,o.createComponentVNode)(2,i.Box,{mt:2,textAlign:"center",fontSize:"24px",children:(0,o.createComponentVNode)(2,i.Button,{lineHeight:"40px",icon:"times",content:"Hang Up",color:"bad",onClick:function(){return l("hang_up")}})})]}),(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})]})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.on_network,d=c.on_cooldown,u=c.allowed,s=c.disk,p=c.disk_record,m=c.replay_mode,f=c.loop_mode,h=c.record_mode,C=c.holo_calls,g=void 0===C?[]:C;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Holopad",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"bell",content:d?"AI Presence Requested":"Request AI Presence",disabled:!l||d,onClick:function(){return a("AIrequest")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Communicator",children:(0,o.createComponentVNode)(2,i.Button,{icon:"phone-alt",content:u?"Connect To Holopad":"Call Holopad",disabled:!l,onClick:function(){return a("holocall",{headcall:u})}})}),g.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.connected?"Current Call":"Incoming Call",children:(0,o.createComponentVNode)(2,i.Button,{icon:e.connected?"phone-slash":"phone-alt",content:e.connected?"Disconnect call from "+e.caller:"Answer call from "+e.caller,color:e.connected?"bad":"good",disabled:!l,onClick:function(){return a(e.connected?"disconnectcall":"connectcall",{holopad:e.ref})}})},e.ref)}))]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Holodisk",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",disabled:!s||m||h,onClick:function(){return a("disk_eject")}}),children:!s&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No holodisk"})||(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Disk Player",children:[(0,o.createComponentVNode)(2,i.Button,{icon:m?"pause":"play",content:m?"Stop":"Replay",selected:m,disabled:h||!p,onClick:function(){return a("replay_mode")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:f?"Looping":"Loop",selected:f,disabled:h||!p,onClick:function(){return a("loop_mode")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"exchange-alt",content:"Change Offset",disabled:!m,onClick:function(){return a("offset")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Recorder",children:[(0,o.createComponentVNode)(2,i.Button,{icon:h?"pause":"video",content:h?"End Recording":"Record",selected:h,disabled:p&&!h||m,onClick:function(){return a("record_mode")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"trash",content:"Clear Recording",color:"bad",disabled:!p||m||h,onClick:function(){return a("record_clear")}})]})]})})],4)}},function(e,t,n){"use strict";t.__esModule=!0,t.HypnoChair=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.HypnoChair=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:375,height:480,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Information",backgroundColor:"#450F44",children:"The Enhanced Interrogation Chamber is designed to induce a deep-rooted trance trigger into the subject. Once the procedure is complete, by using the implanted trigger phrase, the authorities are able to ensure immediate and complete obedience and truthfulness."}),(0,o.createComponentVNode)(2,i.Section,{title:"Occupant Information",textAlign:"center",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",children:l.occupant.name?l.occupant.name:"No Occupant"}),!!l.occupied&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",color:0===l.occupant.stat?"good":1===l.occupant.stat?"average":"bad",children:0===l.occupant.stat?"Conscious":1===l.occupant.stat?"Unconcious":"Dead"})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Operations",textAlign:"center",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door",children:(0,o.createComponentVNode)(2,i.Button,{icon:l.open?"unlock":"lock",color:l.open?"default":"red",content:l.open?"Open":"Closed",onClick:function(){return c("door")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Phrase",children:(0,o.createComponentVNode)(2,i.Input,{value:l.trigger,onChange:function(e,t){return c("set_phrase",{phrase:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Interrogate Occupant",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"code-branch",content:l.interrogating?"Interrupt Interrogation":"Begin Enhanced Interrogation",onClick:function(){return c("interrogate")}}),1===l.interrogating&&(0,o.createComponentVNode)(2,i.Icon,{name:"cog",color:"orange",spin:!0})]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ImplantChair=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ImplantChair=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:375,height:280,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Occupant Information",textAlign:"center",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",children:l.occupant.name||"No Occupant"}),!!l.occupied&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",color:0===l.occupant.stat?"good":1===l.occupant.stat?"average":"bad",children:0===l.occupant.stat?"Conscious":1===l.occupant.stat?"Unconcious":"Dead"})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Operations",textAlign:"center",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door",children:(0,o.createComponentVNode)(2,i.Button,{icon:l.open?"unlock":"lock",color:l.open?"default":"red",content:l.open?"Open":"Closed",onClick:function(){return c("door")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Implant Occupant",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"code-branch",content:l.ready?l.special_name||"Implant":"Recharging",onClick:function(){return c("implant")}}),0===l.ready&&(0,o.createComponentVNode)(2,i.Icon,{name:"cog",color:"orange",spin:!0})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Implants Remaining",children:[l.ready_implants,1===l.replenishing&&(0,o.createComponentVNode)(2,i.Icon,{name:"sync",color:"red",spin:!0})]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.InfraredEmitter=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.InfraredEmitter=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.on,u=l.visible;return(0,o.createComponentVNode)(2,a.Window,{width:225,height:110,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:(0,o.createComponentVNode)(2,i.Button,{icon:d?"power-off":"times",content:d?"On":"Off",selected:d,onClick:function(){return c("power")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Visibility",children:(0,o.createComponentVNode)(2,i.Button,{icon:u?"eye":"eye-slash",content:u?"Visible":"Invisible",selected:u,onClick:function(){return c("visibility")}})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Intellicard=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Intellicard=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.name,u=l.isDead,s=l.isBraindead,p=l.health,m=l.wireless,f=l.radio,h=l.wiping,C=l.laws,g=void 0===C?[]:C,b=u||s;return(0,o.createComponentVNode)(2,a.Window,{width:500,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:d||"Empty Card",buttons:!!d&&(0,o.createComponentVNode)(2,i.Button,{icon:"trash",content:h?"Stop Wiping":"Wipe",disabled:u,onClick:function(){return c("wipe")}}),children:!!d&&(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",color:b?"bad":"good",children:b?"Offline":"Operation"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Software Integrity",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:p,minValue:0,maxValue:100,ranges:{good:[70,Infinity],average:[50,70],bad:[-Infinity,50]}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Settings",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"signal",content:"Wireless Activity",selected:m,onClick:function(){return c("wireless")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"microphone",content:"Subspace Radio",selected:f,onClick:function(){return c("radio")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Laws",children:g.map((function(e){return(0,o.createComponentVNode)(2,i.BlockQuote,{children:e},e)}))})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Jukebox=void 0;var o=n(0),r=n(15),i=n(30),a=n(1),c=n(3),l=n(2);t.Jukebox=function(e,t){var n=(0,a.useBackend)(t),d=n.act,u=n.data,s=u.active,p=u.track_selected,m=u.track_length,f=u.track_beat,h=u.volume,C=(0,i.flow)([(0,r.sortBy)((function(e){return e.name}))])(u.songs||[]);return(0,o.createComponentVNode)(2,l.Window,{width:370,height:313,children:(0,o.createComponentVNode)(2,l.Window.Content,{children:[(0,o.createComponentVNode)(2,c.Section,{title:"Song Player",buttons:(0,o.createComponentVNode)(2,c.Button,{icon:s?"pause":"play",content:s?"Stop":"Play",selected:s,onClick:function(){return d("toggle")}}),children:(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Track Selected",children:(0,o.createComponentVNode)(2,c.Dropdown,{"overflow-y":"scroll",width:"240px",options:C.map((function(e){return e.name})),disabled:s,selected:p||"Select a Track",onSelected:function(e){return d("select_track",{track:e})}})}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Track Length",children:p?m:"No Track Selected"}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Track Beat",children:[p?f:"No Track Selected",1===f?" beat":" beats"]})]})}),(0,o.createComponentVNode)(2,c.Section,{title:"Machine Settings",children:(0,o.createComponentVNode)(2,c.LabeledControls,{justify:"center",children:(0,o.createComponentVNode)(2,c.LabeledControls.Item,{label:"Volume",children:(0,o.createComponentVNode)(2,c.Box,{position:"relative",children:[(0,o.createComponentVNode)(2,c.Knob,{size:3.2,color:h>=50?"red":"green",value:h,unit:"%",minValue:0,maxValue:100,step:1,stepPixelSize:1,disabled:s,onDrag:function(e,t){return d("set_volume",{volume:t})}}),(0,o.createComponentVNode)(2,c.Button,{fluid:!0,position:"absolute",top:"-2px",right:"-22px",color:"transparent",icon:"fast-backward",onClick:function(){return d("set_volume",{volume:"min"})}}),(0,o.createComponentVNode)(2,c.Button,{fluid:!0,position:"absolute",top:"16px",right:"-22px",color:"transparent",icon:"fast-forward",onClick:function(){return d("set_volume",{volume:"max"})}}),(0,o.createComponentVNode)(2,c.Button,{fluid:!0,position:"absolute",top:"34px",right:"-22px",color:"transparent",icon:"undo",onClick:function(){return d("set_volume",{volume:"reset"})}})]})})})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.KeycardAuth=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.KeycardAuth=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:375,height:125,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.Box,{children:1===l.waiting&&(0,o.createVNode)(1,"span",null,"Waiting for another device to confirm your request...",16)}),(0,o.createComponentVNode)(2,i.Box,{children:0===l.waiting&&(0,o.createFragment)([!!l.auth_required&&(0,o.createComponentVNode)(2,i.Button,{icon:"check-square",color:"red",textAlign:"center",lineHeight:"60px",fluid:!0,onClick:function(){return c("auth_swipe")},content:"Authorize"}),0===l.auth_required&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"exclamation-triangle",fluid:!0,onClick:function(){return c("red_alert")},content:"Red Alert"}),(0,o.createComponentVNode)(2,i.Button,{icon:"wrench",fluid:!0,onClick:function(){return c("emergency_maint")},content:"Emergency Maintenance Access"}),(0,o.createComponentVNode)(2,i.Button,{icon:"meteor",fluid:!0,onClick:function(){return c("bsa_unlock")},content:"Bluespace Artillery Unlock"})],4)],0)})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.LaborClaimConsole=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(2);t.LaborClaimConsole=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.can_go_home,s=d.id_points,p=d.ores,m=d.status_info,f=d.unclaimed_points;return(0,o.createComponentVNode)(2,c.Window,{width:315,height:430,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Status",children:m}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Shuttle controls",children:(0,o.createComponentVNode)(2,a.Button,{content:"Move shuttle",disabled:!u,onClick:function(){return l("move_shuttle")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Points",children:s}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Unclaimed points",buttons:(0,o.createComponentVNode)(2,a.Button,{content:"Claim points",disabled:!f,onClick:function(){return l("claim_points")}}),children:f})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Material values",children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:"Material"}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:"Value"})]}),p.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,r.toTitleCase)(e.ore)}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:(0,o.createComponentVNode)(2,a.Box,{color:"label",inline:!0,children:e.value})})]},e.ore)}))]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.LanguageMenu=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.LanguageMenu=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.admin_mode,u=l.is_living,s=l.omnitongue,p=l.languages,m=void 0===p?[]:p,f=l.unknown_languages,h=void 0===f?[]:f;return(0,o.createComponentVNode)(2,a.Window,{title:"Language Menu",width:700,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Known Languages",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:m.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,buttons:(0,o.createFragment)([!!u&&(0,o.createComponentVNode)(2,i.Button,{content:e.is_default?"Default Language":"Select as Default",disabled:!e.can_speak,selected:e.is_default,onClick:function(){return c("select_default",{language_name:e.name})}}),!!d&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{content:"Grant",onClick:function(){return c("grant_language",{language_name:e.name})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Remove",onClick:function(){return c("remove_language",{language_name:e.name})}})],4)],0),children:[e.desc," ","Key: ,",e.key," ",e.can_understand?"Can understand.":"Cannot understand."," ",e.can_speak?"Can speak.":"Cannot speak."]},e.name)}))})}),!!d&&(0,o.createComponentVNode)(2,i.Section,{title:"Unknown Languages",buttons:(0,o.createComponentVNode)(2,i.Button,{content:"Omnitongue "+(s?"Enabled":"Disabled"),selected:s,onClick:function(){return c("toggle_omnitongue")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:h.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,buttons:(0,o.createComponentVNode)(2,i.Button,{content:"Grant",onClick:function(){return c("grant_language",{language_name:e.name})}}),children:[e.desc," ","Key: ,",e.key," ",!!e.shadow&&"(gained from mob)"," ",e.can_speak?"Can speak.":"Cannot speak."]},e.name)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.LaunchpadRemote=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(181);t.LaunchpadRemote=function(e,t){var n=(0,r.useBackend)(t).data,l=n.has_pad,d=n.pad_closed;return(0,o.createComponentVNode)(2,a.Window,{title:"Briefcase Launchpad Remote",width:300,height:240,theme:"syndicate",children:(0,o.createComponentVNode)(2,a.Window.Content,{children:!l&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No Launchpad Connected"})||d&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Launchpad Closed"})||(0,o.createComponentVNode)(2,c.LaunchpadControl,{topLevel:!0})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.MafiaPanel=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.MafiaPanel=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.players,u=l.actions,s=l.phase,p=l.roleinfo,m=l.role_theme,f=l.admin_controls,h=l.judgement_phase,C=l.timeleft,g=l.all_roles;return(0,o.createComponentVNode)(2,a.Window,{title:"Mafia",theme:m,width:650,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[!!f&&(0,o.createComponentVNode)(2,i.Section,{title:"ADMIN CONTROLS",backgroundColor:"red",children:["THESE ARE DEBUG, THEY WILL BREAK THE GAME, DO NOT TOUCH ",(0,o.createVNode)(1,"br"),"Also because an admin did it: do not gib/delete/etc anyone! It will runtime the game to death! ",(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Button,{icon:"arrow-right",onClick:function(){return c("next_phase")},children:"Next Phase"}),(0,o.createComponentVNode)(2,i.Button,{icon:"home",onClick:function(){return c("players_home")},children:"Send All Players Home"}),(0,o.createComponentVNode)(2,i.Button,{icon:"radiation",onClick:function(){return c("new_game")},children:"New Game"}),(0,o.createVNode)(1,"br"),"This makes the next game what you input. Resets after one round automatically.",(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Button,{icon:"exclamation-circle",onClick:function(){return c("debug_setup")},children:"Create Custom Setup"}),(0,o.createComponentVNode)(2,i.Button,{icon:"arrow-left",onClick:function(){return c("cancel_setup")},children:"Reset Custom Setup"}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Button,{icon:"skull",onClick:function(){return c("nuke")},color:"black",children:"Nuke (delete datum + landmarks, hope it fixes everything!)"})]}),(0,o.createComponentVNode)(2,i.Section,{title:s,children:!!p&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.TimeDisplay,{auto:"down",value:C})}),(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createVNode)(1,"b",null,[(0,o.createTextVNode)("You are a "),p.role],0)}),(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createVNode)(1,"b",null,p.desc,0)})],4)}),(0,o.createComponentVNode)(2,i.Flex,{children:!!u&&u.map((function(e){return(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return c("mf_action",{atype:e})},children:e})},e)}))}),(0,o.createComponentVNode)(2,i.Section,{title:"Players",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:!!d&&d.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{className:"candystripe",label:e.name,children:[!e.alive&&(0,o.createComponentVNode)(2,i.Box,{color:"red",children:"DEAD"}),e.votes!==undefined&&!!e.alive&&(0,o.createFragment)([(0,o.createTextVNode)("Votes : "),e.votes,(0,o.createTextVNode)(" ")],0),!!e.actions&&e.actions.map((function(t){return(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return c("mf_targ_action",{atype:t,target:e.ref})},children:t},t)}))]},e.ref)}))})}),!!h&&(0,o.createComponentVNode)(2,i.Section,{title:"JUDGEMENT",children:(0,o.createComponentVNode)(2,i.Flex,{justify:"space-around",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"smile-beam",color:"good",onClick:function(){return c("vote_innocent")},children:"INNOCENT!"}),"Use these buttons to vote the accused innocent or guilty!",(0,o.createComponentVNode)(2,i.Button,{icon:"angry",color:"bad",onClick:function(){return c("vote_guilty")},children:"GUILTY!"})]})}),(0,o.createComponentVNode)(2,i.Flex,{mt:1,spacing:1,children:[(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Roles",minHeight:10,children:!!g&&g.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.Flex,{justify:"space-between",children:[e,(0,o.createComponentVNode)(2,i.Button,{content:"?",onClick:function(){return c("mf_lookup",{atype:e.slice(0,-3)})}})]})},e)}))})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:2,basis:0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Notes",minHeight:10,children:p!==undefined&&!!p.action_log&&p.action_log.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:e},e)}))})})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.MalfunctionModulePicker=void 0;var o=n(0),r=n(1),i=n(2),a=n(129);t.MalfunctionModulePicker=function(e,t){var n=(0,r.useBackend)(t),c=(n.act,n.data.processingTime);return(0,o.createComponentVNode)(2,i.Window,{width:620,height:525,theme:"malfunction",resizable:!0,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.GenericUplink,{currencyAmount:c,currencySymbol:"PT"})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.MechBayPowerConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.MechBayPowerConsole=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data.recharge_port,d=l&&l.mech,u=d&&d.cell;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:200,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Mech status",textAlign:"center",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Sync",onClick:function(){return c("reconnect")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Integrity",children:!l&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No power port detected. Please re-sync."})||!d&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No mech detected."})||(0,o.createComponentVNode)(2,i.ProgressBar,{value:d.health/d.maxhealth,ranges:{good:[.7,Infinity],average:[.3,.7],bad:[-Infinity,.3]}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:!l&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No power port detected. Please re-sync."})||!d&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No mech detected."})||!u&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No cell is installed."})||(0,o.createComponentVNode)(2,i.ProgressBar,{value:u.charge/u.maxcharge,ranges:{good:[.7,Infinity],average:[.3,.7],bad:[-Infinity,.3]},children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:u.charge})," / "+u.maxcharge]})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.MedicalKiosk=void 0;var o=n(0),r=(n(19),n(1)),i=n(3),a=n(2);t.MedicalKiosk=function(e,t){var n=(0,r.useBackend)(t),m=(n.act,n.data),f=(0,r.useSharedState)(t,"scanIndex")[0],h=m.active_status_1,C=m.active_status_2,g=m.active_status_3,b=m.active_status_4;return(0,o.createComponentVNode)(2,a.Window,{width:575,height:420,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Flex,{mb:1,children:[(0,o.createComponentVNode)(2,i.Flex.Item,{mr:1,children:(0,o.createComponentVNode)(2,i.Section,{minHeight:"100%",children:[(0,o.createComponentVNode)(2,c,{index:1,icon:"procedures",name:"General Health Scan",description:"Reads back exact values of your general health scan."}),(0,o.createComponentVNode)(2,c,{index:2,icon:"heartbeat",name:"Symptom Based Checkup",description:"Provides information based on various non-obvious symptoms,\nlike blood levels or disease status."}),(0,o.createComponentVNode)(2,c,{index:3,icon:"radiation-alt",name:"Neurological/Radiological Scan",description:"Provides information about brain trauma and radiation."}),(0,o.createComponentVNode)(2,c,{index:4,icon:"mortar-pestle",name:"Chemical and Psychoactive Scan",description:"Provides a list of consumed chemicals, as well as potential\nside effects."})]})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,l)})]}),!!h&&1===f&&(0,o.createComponentVNode)(2,d),!!C&&2===f&&(0,o.createComponentVNode)(2,u),!!g&&3===f&&(0,o.createComponentVNode)(2,s),!!b&&4===f&&(0,o.createComponentVNode)(2,p)]})})};var c=function(e,t){var n=e.index,a=e.name,c=e.description,l=e.icon,d=(0,r.useBackend)(t),u=d.act,s=d.data,p=(0,r.useSharedState)(t,"scanIndex"),m=p[0],f=p[1],h=s["active_status_"+n];return(0,o.createComponentVNode)(2,i.Flex,{spacing:1,align:"baseline",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{width:"16px",textAlign:"center",children:(0,o.createComponentVNode)(2,i.Icon,{name:h?"check":"dollar-sign",color:h?"green":"grey"})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:l,selected:h&&m===n,tooltip:c,tooltipPosition:"right",content:a,onClick:function(){h||u("beginScan_"+n),f(n)}})})]})},l=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.kiosk_cost,d=c.patient_name;return(0,o.createComponentVNode)(2,i.Section,{minHeight:"100%",children:[(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:["Greetings Valued Employee! Please select a desired automatic health check procedure. Diagnosis costs ",(0,o.createVNode)(1,"b",null,[l,(0,o.createTextVNode)(" credits.")],0)]}),(0,o.createComponentVNode)(2,i.Box,{mt:1,children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"label",mr:1,children:"Patient:"}),d]}),(0,o.createComponentVNode)(2,i.Button,{mt:1,tooltip:"Resets the current scanning target, cancelling current scans.",icon:"sync",color:"average",onClick:function(){return a("clearTarget")},content:"Reset Scanner"})]})},d=function(e,t){var n=(0,r.useBackend)(t).data,a=n.patient_health,c=n.brute_health,l=n.burn_health,d=n.suffocation_health,u=n.toxin_health;return(0,o.createComponentVNode)(2,i.Section,{title:"Patient Health",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Total Health",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:a/100,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:a}),"%"]})}),(0,o.createComponentVNode)(2,i.LabeledList.Divider),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Brute Damage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:c/100,color:"bad",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:c})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Burn Damage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:l/100,color:"bad",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:l})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Oxygen Damage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:d/100,color:"bad",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:d})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Toxin Damage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:u/100,color:"bad",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:u})})})]})})},u=function(e,t){var n=(0,r.useBackend)(t).data,a=n.patient_status,c=n.patient_illness,l=n.illness_info,d=n.bleed_status,u=n.blood_levels,s=n.blood_status;return(0,o.createComponentVNode)(2,i.Section,{title:"Symptom Based Checkup",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Patient Status",color:"good",children:a}),(0,o.createComponentVNode)(2,i.LabeledList.Divider),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Disease Status",children:c}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Disease information",children:l}),(0,o.createComponentVNode)(2,i.LabeledList.Divider),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Blood Levels",children:[(0,o.createComponentVNode)(2,i.ProgressBar,{value:u/100,color:"bad",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:u})}),(0,o.createComponentVNode)(2,i.Box,{mt:1,color:"label",children:d})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Blood Information",children:s})]})})},s=function(e,t){var n=(0,r.useBackend)(t).data,a=n.clone_health,c=n.brain_damage,l=n.brain_health,d=n.rad_contamination_status,u=n.rad_contamination_value,s=n.rad_sickness_status,p=n.rad_sickness_value,m=n.trauma_status;return(0,o.createComponentVNode)(2,i.Section,{title:"Patient Neurological and Radiological Health",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cellular Damage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:a/100,color:"good",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:a})})}),(0,o.createComponentVNode)(2,i.LabeledList.Divider),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Brain Damage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:c/100,color:"good",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:c})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Brain Status",color:"health-0",children:l}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Brain Trauma Status",children:m}),(0,o.createComponentVNode)(2,i.LabeledList.Divider),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Radiation Sickness Status",children:s}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Radiation Sickness Percentage",children:[p,"%"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Radiation Contamination Status",children:d}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Radiation Contamination Percentage",children:[u,"%"]})]})})},p=function(e,t){var n=(0,r.useBackend)(t).data,a=n.chemical_list,c=void 0===a?[]:a,l=n.overdose_list,d=void 0===l?[]:l,u=n.addict_list,s=void 0===u?[]:u,p=n.hallucinating_status;return(0,o.createComponentVNode)(2,i.Section,{title:"Chemical and Psychoactive Analysis",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Chemical Contents",children:[0===c.length&&(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"No reagents detected."}),c.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{color:"good",children:[e.volume," units of ",e.name]},e.id)}))]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Overdose Status",color:"bad",children:[0===d.length&&(0,o.createComponentVNode)(2,i.Box,{color:"good",children:"Patient is not overdosing."}),d.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:["Overdosing on ",e.name]},e.id)}))]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Addiction Status",color:"bad",children:[0===s.length&&(0,o.createComponentVNode)(2,i.Box,{color:"good",children:"Patient has no addictions."}),s.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:["Addicted to ",e.name]},e.id)}))]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Psychoactive Status",children:p})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.MiningVendor=void 0;var o=n(0),r=n(6),i=n(1),a=n(3),c=n(2);t.MiningVendor=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=[].concat(d.product_records);return(0,o.createComponentVNode)(2,c.Window,{width:425,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{title:"User",children:d.user&&(0,o.createComponentVNode)(2,a.Box,{children:["Welcome, ",(0,o.createVNode)(1,"b",null,d.user.name||"Unknown",0),","," ",(0,o.createVNode)(1,"b",null,d.user.job||"Unemployed",0),"!",(0,o.createVNode)(1,"br"),"Your balance is ",(0,o.createVNode)(1,"b",null,[d.user.points,(0,o.createTextVNode)(" mining points")],0),"."]})||(0,o.createComponentVNode)(2,a.Box,{color:"light-gray",children:["No registered ID card!",(0,o.createVNode)(1,"br"),"Please contact your local HoP!"]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Equipment",children:(0,o.createComponentVNode)(2,a.Table,{children:u.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:[(0,o.createVNode)(1,"span",(0,r.classes)(["vending32x32",e.path]),null,1,{style:{"vertical-align":"middle"}})," ",(0,o.createVNode)(1,"b",null,e.name,0)]}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,a.Button,{style:{"min-width":"95px","text-align":"center"},disabled:!d.user||e.price>d.user.points,content:e.price+" points",onClick:function(){return l("purchase",{ref:e.ref})}})})]},e.name)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Mule=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(61);t.Mule=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.on,s=d.cell,p=d.cellPercent,m=d.load,f=d.mode,h=d.modeStatus,C=d.haspai,g=d.autoReturn,b=d.autoPickup,N=d.reportDelivery,v=d.destination,V=d.home,y=d.id,k=d.destinations,x=void 0===k?[]:k,_=d.locked&&!d.siliconUser;return(0,o.createComponentVNode)(2,a.Window,{width:350,height:425,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,c.InterfaceLockNoticeBox),(0,o.createComponentVNode)(2,i.Section,{title:"Status",minHeight:"110px",buttons:!_&&(0,o.createComponentVNode)(2,i.Button,{icon:u?"power-off":"times",content:u?"On":"Off",selected:u,onClick:function(){return l("power")}}),children:[(0,o.createComponentVNode)(2,i.ProgressBar,{value:s?p/100:0,color:s?"good":"bad"}),(0,o.createComponentVNode)(2,i.Flex,{mt:1,children:[(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Mode",color:h,children:f})})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Load",color:m?"good":"average",children:m||"None"})})})]})]}),!_&&(0,o.createComponentVNode)(2,i.Section,{title:"Controls",buttons:(0,o.createFragment)([!!m&&(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Unload",onClick:function(){return l("unload")}}),!!C&&(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject PAI",onClick:function(){return l("ejectpai")}})],0),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"ID",children:(0,o.createComponentVNode)(2,i.Input,{value:y,onChange:function(e,t){return l("setid",{value:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Destination",children:[(0,o.createComponentVNode)(2,i.Dropdown,{over:!0,selected:v||"None",options:x,width:"150px",onSelected:function(e){return l("destination",{value:e})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"stop",content:"Stop",onClick:function(){return l("stop")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"play",content:"Go",onClick:function(){return l("go")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Home",children:[(0,o.createComponentVNode)(2,i.Dropdown,{over:!0,selected:V,options:x,width:"150px",onSelected:function(e){return l("destination",{value:e})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"home",content:"Go Home",onClick:function(){return l("home")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Settings",children:[(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:g,content:"Auto-Return",onClick:function(){return l("autored")}}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:b,content:"Auto-Pickup",onClick:function(){return l("autopick")}}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:N,content:"Report Delivery",onClick:function(){return l("report")}})]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NaniteChamberControlContent=t.NaniteChamberControl=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NaniteChamberControl=function(e,t){return(0,o.createComponentVNode)(2,a.Window,{width:380,height:570,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.status_msg,d=c.locked,u=c.occupant_name,s=c.has_nanites,p=c.nanite_volume,m=c.regen_rate,f=c.safety_threshold,h=c.cloud_id,C=c.scan_level;if(l)return(0,o.createComponentVNode)(2,i.NoticeBox,{textAlign:"center",children:l});var g=c.mob_programs||[];return(0,o.createComponentVNode)(2,i.Section,{title:"Chamber: "+u,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d?"lock":"lock-open",content:d?"Locked":"Unlocked",color:d?"bad":"default",onClick:function(){return a("toggle_lock")}}),children:s?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Status",level:2,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"exclamation-triangle",content:"Destroy Nanites",color:"bad",onClick:function(){return a("remove_nanites")}}),children:(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Nanite Volume",children:p}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Growth Rate",children:m})]})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Safety Threshold",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:f,minValue:0,maxValue:500,width:"39px",onChange:function(e,t){return a("set_safety",{value:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cloud ID",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:h,minValue:0,maxValue:100,step:1,stepPixelSize:3,width:"39px",onChange:function(e,t){return a("set_cloud",{value:t})}})})]})})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Programs",level:2,children:g.map((function(e){var t=e.extra_settings||[],n=e.rules||[];return(0,o.createComponentVNode)(2,i.Collapsible,{title:e.name,children:(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:e.desc}),C>=2&&(0,o.createComponentVNode)(2,i.Grid.Column,{size:.6,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Activation Status",children:(0,o.createComponentVNode)(2,i.Box,{color:e.activated?"good":"bad",children:e.activated?"Active":"Inactive"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Nanites Consumed",children:[e.use_rate,"/s"]})]})})]}),C>=2&&(0,o.createComponentVNode)(2,i.Grid,{children:[!!e.can_trigger&&(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Triggers",level:2,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Cost",children:e.trigger_cost}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Cooldown",children:e.trigger_cooldown}),!!e.timer_trigger_delay&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Delay",children:[e.timer_trigger_delay," s"]}),!!e.timer_trigger&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Repeat Timer",children:[e.timer_trigger," s"]})]})})}),!(!e.timer_restart&&!e.timer_shutdown)&&(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[e.timer_restart&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Restart Timer",children:[e.timer_restart," s"]}),e.timer_shutdown&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Shutdown Timer",children:[e.timer_shutdown," s"]})]})})})]}),C>=3&&!!e.has_extra_settings&&(0,o.createComponentVNode)(2,i.Section,{title:"Extra Settings",level:2,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:t.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,children:e.value},e.name)}))})}),C>=4&&(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Codes",level:2,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[!!e.activation_code&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Activation",children:e.activation_code}),!!e.deactivation_code&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Deactivation",children:e.deactivation_code}),!!e.kill_code&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Kill",children:e.kill_code}),!!e.can_trigger&&!!e.trigger_code&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger",children:e.trigger_code})]})})}),e.has_rules&&(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Rules",level:2,children:n.map((function(e){return(0,o.createFragment)([e.display,(0,o.createVNode)(1,"br")],0,e.display)}))})})]})]})},e.name)}))})],4):(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{bold:!0,color:"bad",textAlign:"center",fontSize:"30px",mb:1,children:"No Nanites Detected"}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,bold:!0,icon:"syringe",content:" Implant Nanites",color:"green",textAlign:"center",fontSize:"30px",lineHeight:"50px",onClick:function(){return a("nanite_injection")}})],4)})};t.NaniteChamberControlContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.NaniteCloudControl=t.NaniteCloudBackupDetails=t.NaniteCloudBackupList=t.NaniteInfoBox=t.NaniteDiskBox=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=function(e,t){var n=(0,r.useBackend)(t).data,a=n.has_disk,c=n.has_program,d=n.disk;return a?c?(0,o.createComponentVNode)(2,l,{program:d}):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Inserted disk has no program"}):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No disk inserted"})};t.NaniteDiskBox=c;var l=function(e,t){var n=e.program,r=n.name,a=n.desc,c=n.activated,l=n.use_rate,d=n.can_trigger,u=n.trigger_cost,s=n.trigger_cooldown,p=n.activation_code,m=n.deactivation_code,f=n.kill_code,h=n.trigger_code,C=n.timer_restart,g=n.timer_shutdown,b=n.timer_trigger,N=n.timer_trigger_delay,v=n.extra_settings||[];return(0,o.createComponentVNode)(2,i.Section,{title:r,level:2,buttons:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,color:c?"good":"bad",children:c?"Activated":"Deactivated"}),children:[(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{mr:1,children:a}),(0,o.createComponentVNode)(2,i.Grid.Column,{size:.5,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Use Rate",children:l}),!!d&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Cost",children:u}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Cooldown",children:s})],4)]})})]}),(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Codes",level:3,mr:1,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Activation",children:p}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Deactivation",children:m}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Kill",children:f}),!!d&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger",children:h})]})})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Delays",level:3,mr:1,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Restart",children:[C," s"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Shutdown",children:[g," s"]}),!!d&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger",children:[b," s"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Delay",children:[N," s"]})],4)]})})})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Extra Settings",level:3,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:v.map((function(e){var t={number:(0,o.createFragment)([e.value,e.unit],0),text:e.value,type:e.value,boolean:e.value?e.true_text:e.false_text};return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,children:t[e.type]},e.name)}))})})]})};t.NaniteInfoBox=l;var d=function(e,t){var n=(0,r.useBackend)(t),a=n.act;return(n.data.cloud_backups||[]).map((function(e){return(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Backup #"+e.cloud_id,textAlign:"center",onClick:function(){return a("set_view",{view:e.cloud_id})}},e.cloud_id)}))};t.NaniteCloudBackupList=d;var u=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,d=c.current_view,u=c.disk,s=c.has_program,p=c.cloud_backup,m=u&&u.can_rule||!1;if(!p)return(0,o.createComponentVNode)(2,i.NoticeBox,{children:"ERROR: Backup not found"});var f=c.cloud_programs||[];return(0,o.createComponentVNode)(2,i.Section,{title:"Backup #"+d,level:2,buttons:!!s&&(0,o.createComponentVNode)(2,i.Button,{icon:"upload",content:"Upload From Disk",color:"good",onClick:function(){return a("upload_program")}}),children:f.map((function(e){var t=e.rules||[];return(0,o.createComponentVNode)(2,i.Collapsible,{title:e.name,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"minus-circle",color:"bad",onClick:function(){return a("remove_program",{program_id:e.id})}}),children:(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,l,{program:e}),(!!m||!!e.has_rules)&&(0,o.createComponentVNode)(2,i.Section,{mt:-2,title:"Rules",level:2,buttons:!!m&&(0,o.createComponentVNode)(2,i.Button,{icon:"plus",content:"Add Rule from Disk",color:"good",onClick:function(){return a("add_rule",{program_id:e.id})}}),children:e.has_rules?t.map((function(t){return(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"minus-circle",color:"bad",onClick:function(){return a("remove_rule",{program_id:e.id,rule_id:t.id})}})," "+t.display]},t.display)})):(0,o.createComponentVNode)(2,i.Box,{color:"bad",children:"No Active Rules"})})]})},e.name)}))})};t.NaniteCloudBackupDetails=u;t.NaniteCloudControl=function(e,t){var n=(0,r.useBackend)(t),l=n.act,s=n.data,p=s.has_disk,m=s.current_view,f=s.new_backup_id;return(0,o.createComponentVNode)(2,a.Window,{width:375,height:700,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Program Disk",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",disabled:!p,onClick:function(){return l("eject")}}),children:(0,o.createComponentVNode)(2,c)}),(0,o.createComponentVNode)(2,i.Section,{title:"Cloud Storage",buttons:m?(0,o.createComponentVNode)(2,i.Button,{icon:"arrow-left",content:"Return",onClick:function(){return l("set_view",{view:0})}}):(0,o.createFragment)(["New Backup: ",(0,o.createComponentVNode)(2,i.NumberInput,{value:f,minValue:1,maxValue:100,stepPixelSize:4,width:"39px",onChange:function(e,t){return l("update_new_backup_value",{value:t})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"plus",onClick:function(){return l("create_backup")}})],0),children:s.current_view?(0,o.createComponentVNode)(2,u):(0,o.createComponentVNode)(2,d)})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NaniteProgramHub=void 0;var o=n(0),r=n(15),i=n(1),a=n(3),c=n(2);t.NaniteProgramHub=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.detail_view,s=d.disk,p=d.has_disk,m=d.has_program,f=d.programs,h=void 0===f?{}:f,C=(0,i.useSharedState)(t,"category"),g=C[0],b=C[1],N=h&&h[g]||[];return(0,o.createComponentVNode)(2,c.Window,{width:500,height:700,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{title:"Program Disk",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"eject",content:"Eject",onClick:function(){return l("eject")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"minus-circle",content:"Delete Program",onClick:function(){return l("clear")}})],4),children:p?m?(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Program Name",children:s.name}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Description",children:s.desc})]}):(0,o.createComponentVNode)(2,a.NoticeBox,{children:"No Program Installed"}):(0,o.createComponentVNode)(2,a.NoticeBox,{children:"Insert Disk"})}),(0,o.createComponentVNode)(2,a.Section,{title:"Programs",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:u?"info":"list",content:u?"Detailed":"Compact",onClick:function(){return l("toggle_details")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"sync",content:"Sync Research",onClick:function(){return l("refresh")}})],4),children:null!==h?(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{minWidth:"110px",children:(0,o.createComponentVNode)(2,a.Tabs,{vertical:!0,children:(0,r.map)((function(e,t){var n=t.substring(0,t.length-8);return(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:t===g,onClick:function(){return b(t)},children:n},t)}))(h)})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,basis:0,children:u?N.map((function(e){return(0,o.createComponentVNode)(2,a.Section,{title:e.name,level:2,buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"download",content:"Download",disabled:!p,onClick:function(){return l("download",{program_id:e.id})}}),children:e.desc},e.id)})):(0,o.createComponentVNode)(2,a.LabeledList,{children:N.map((function(e){return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:e.name,buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"download",content:"Download",disabled:!p,onClick:function(){return l("download",{program_id:e.id})}})},e.id)}))})})]}):(0,o.createComponentVNode)(2,a.NoticeBox,{children:"No nanite programs are currently researched."})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NaniteProgrammerContent=t.NaniteProgrammer=t.NaniteExtraBoolean=t.NaniteExtraType=t.NaniteExtraText=t.NaniteExtraNumber=t.NaniteExtraEntry=t.NaniteDelays=t.NaniteCodes=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data;return(0,o.createComponentVNode)(2,i.Section,{title:"Codes",level:3,mr:1,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Activation",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.activation_code,width:"47px",minValue:0,maxValue:9999,onChange:function(e,t){return a("set_code",{target_code:"activation",code:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Deactivation",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.deactivation_code,width:"47px",minValue:0,maxValue:9999,onChange:function(e,t){return a("set_code",{target_code:"deactivation",code:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Kill",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.kill_code,width:"47px",minValue:0,maxValue:9999,onChange:function(e,t){return a("set_code",{target_code:"kill",code:t})}})}),!!c.can_trigger&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.trigger_code,width:"47px",minValue:0,maxValue:9999,onChange:function(e,t){return a("set_code",{target_code:"trigger",code:t})}})})]})})};t.NaniteCodes=c;var l=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data;return(0,o.createComponentVNode)(2,i.Section,{title:"Delays",level:3,ml:1,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Restart Timer",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.timer_restart,unit:"s",width:"57px",minValue:0,maxValue:3600,onChange:function(e,t){return a("set_restart_timer",{delay:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Shutdown Timer",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.timer_shutdown,unit:"s",width:"57px",minValue:0,maxValue:3600,onChange:function(e,t){return a("set_shutdown_timer",{delay:t})}})}),!!c.can_trigger&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Repeat Timer",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.timer_trigger,unit:"s",width:"57px",minValue:0,maxValue:3600,onChange:function(e,t){return a("set_trigger_timer",{delay:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Delay",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:c.timer_trigger_delay,unit:"s",width:"57px",minValue:0,maxValue:3600,onChange:function(e,t){return a("set_timer_trigger_delay",{delay:t})}})})],4)]})})};t.NaniteDelays=l;var d=function(e,t){var n=e.extra_setting,r=n.name,a=n.type,c={number:(0,o.createComponentVNode)(2,u,{extra_setting:n}),text:(0,o.createComponentVNode)(2,s,{extra_setting:n}),type:(0,o.createComponentVNode)(2,p,{extra_setting:n}),boolean:(0,o.createComponentVNode)(2,m,{extra_setting:n})};return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:r,children:c[a]})};t.NaniteExtraEntry=d;var u=function(e,t){var n=e.extra_setting,a=(0,r.useBackend)(t).act,c=n.name,l=n.value,d=n.min,u=n.max,s=n.unit;return(0,o.createComponentVNode)(2,i.NumberInput,{value:l,width:"64px",minValue:d,maxValue:u,unit:s,onChange:function(e,t){return a("set_extra_setting",{target_setting:c,value:t})}})};t.NaniteExtraNumber=u;var s=function(e,t){var n=e.extra_setting,a=(0,r.useBackend)(t).act,c=n.name,l=n.value;return(0,o.createComponentVNode)(2,i.Input,{value:l,width:"200px",onInput:function(e,t){return a("set_extra_setting",{target_setting:c,value:t})}})};t.NaniteExtraText=s;var p=function(e,t){var n=e.extra_setting,a=(0,r.useBackend)(t).act,c=n.name,l=n.value,d=n.types;return(0,o.createComponentVNode)(2,i.Dropdown,{over:!0,selected:l,width:"150px",options:d,onSelected:function(e){return a("set_extra_setting",{target_setting:c,value:e})}})};t.NaniteExtraType=p;var m=function(e,t){var n=e.extra_setting,a=(0,r.useBackend)(t).act,c=n.name,l=n.value,d=n.true_text,u=n.false_text;return(0,o.createComponentVNode)(2,i.Button.Checkbox,{content:l?d:u,checked:l,onClick:function(){return a("set_extra_setting",{target_setting:c})}})};t.NaniteExtraBoolean=m;t.NaniteProgrammer=function(e,t){return(0,o.createComponentVNode)(2,a.Window,{width:420,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,f)})})};var f=function(e,t){var n=(0,r.useBackend)(t),a=n.act,u=n.data,s=u.has_disk,p=u.has_program,m=u.name,f=u.desc,h=u.use_rate,C=u.can_trigger,g=u.trigger_cost,b=u.trigger_cooldown,N=u.activated,v=u.has_extra_settings,V=u.extra_settings,y=void 0===V?{}:V;return s?p?(0,o.createComponentVNode)(2,i.Section,{title:m,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",onClick:function(){return a("eject")}}),children:[(0,o.createComponentVNode)(2,i.Section,{title:"Info",level:2,children:(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:f}),(0,o.createComponentVNode)(2,i.Grid.Column,{size:.7,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Use Rate",children:h}),!!C&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Cost",children:g}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Trigger Cooldown",children:b})],4)]})})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Settings",level:2,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:N?"power-off":"times",content:N?"Active":"Inactive",selected:N,color:"bad",bold:!0,onClick:function(){return a("toggle_active")}}),children:[(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,c)}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,l)})]}),!!v&&(0,o.createComponentVNode)(2,i.Section,{title:"Special",level:3,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:y.map((function(e){return(0,o.createComponentVNode)(2,d,{extra_setting:e},e.name)}))})})]})]}):(0,o.createComponentVNode)(2,i.Section,{title:"Blank Disk",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",onClick:function(){return a("eject")}})}):(0,o.createComponentVNode)(2,i.NoticeBox,{textAlign:"center",children:"Insert a nanite program disk"})};t.NaniteProgrammerContent=f},function(e,t,n){"use strict";t.__esModule=!0,t.NaniteRemoteContent=t.NaniteRemote=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NaniteRemote=function(e,t){return(0,o.createComponentVNode)(2,a.Window,{width:420,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.code,d=c.locked,u=c.mode,s=c.program_name,p=c.relay_code,m=c.comms,f=c.message,h=c.saved_settings,C=void 0===h?[]:h;return d?(0,o.createComponentVNode)(2,i.NoticeBox,{children:"This interface is locked."}):(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Nanite Control",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"lock",content:"Lock Interface",onClick:function(){return a("lock")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",children:[(0,o.createComponentVNode)(2,i.Input,{value:s,maxLength:14,width:"130px",onChange:function(e,t){return a("update_name",{name:t})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"save",content:"Save",onClick:function(){return a("save")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:m?"Comm Code":"Signal Code",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:l,minValue:0,maxValue:9999,width:"47px",step:1,stepPixelSize:2,onChange:function(e,t){return a("set_code",{code:t})}})}),!!m&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Message",children:(0,o.createComponentVNode)(2,i.Input,{value:f,width:"270px",onChange:function(e,t){return a("set_message",{value:t})}})}),"Relay"===u&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Relay Code",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:p,minValue:0,maxValue:9999,width:"47px",step:1,stepPixelSize:2,onChange:function(e,t){return a("set_relay_code",{code:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Signal Mode",children:["Off","Local","Targeted","Area","Relay"].map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e,selected:u===e,onClick:function(){return a("select_mode",{mode:e})}},e)}))})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Saved Settings",children:C.length>0?(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{width:"35%",children:"Name"}),(0,o.createComponentVNode)(2,i.Table.Cell,{width:"20%",children:"Mode"}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:"Code"}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:"Relay"})]}),C.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,color:"label",children:[e.name,":"]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:e.mode}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:e.code}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:"Relay"===e.mode&&e.relay_code}),(0,o.createComponentVNode)(2,i.Table.Cell,{textAlign:"right",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"upload",color:"good",onClick:function(){return a("load",{save_id:e.id})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"minus",color:"bad",onClick:function(){return a("remove_save",{save_id:e.id})}})]})]},e.id)}))]}):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No settings currently saved"})})],4)};t.NaniteRemoteContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.NotificationPreferences=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NotificationPreferences=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=(n.data.ignore||[]).sort((function(e,t){var n=e.desc.toLowerCase(),o=t.desc.toLowerCase();return n<o?-1:n>o?1:0}));return(0,o.createComponentVNode)(2,a.Window,{title:"Notification Preferences",width:270,height:360,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Ghost Role Notifications",children:l.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:e.enabled?"times":"check",content:e.desc,color:e.enabled?"bad":"good",onClick:function(){return c("toggle_ignore",{key:e.key})}},e.key)}))})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtnetRelay=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtnetRelay=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.enabled,u=l.dos_capacity,s=l.dos_overload,p=l.dos_crashed;return(0,o.createComponentVNode)(2,a.Window,{title:"NtNet Quantum Relay",width:400,height:300,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Network Buffer",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",selected:d,content:d?"ENABLED":"DISABLED",onClick:function(){return c("toggle")}}),children:p?(0,o.createComponentVNode)(2,i.Box,{fontFamily:"monospace",children:[(0,o.createComponentVNode)(2,i.Box,{fontSize:"20px",children:"NETWORK BUFFER OVERFLOW"}),(0,o.createComponentVNode)(2,i.Box,{fontSize:"16px",children:"OVERLOAD RECOVERY MODE"}),(0,o.createComponentVNode)(2,i.Box,{children:"This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."}),(0,o.createComponentVNode)(2,i.Box,{fontSize:"20px",color:"bad",children:"ADMINISTRATOR OVERRIDE"}),(0,o.createComponentVNode)(2,i.Box,{fontSize:"16px",color:"bad",children:"CAUTION - DATA LOSS MAY OCCUR"}),(0,o.createComponentVNode)(2,i.Button,{icon:"signal",content:"PURGE BUFFER",mt:1,color:"bad",onClick:function(){return c("restart")}})]}):(0,o.createComponentVNode)(2,i.ProgressBar,{value:s,minValue:0,maxValue:u,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:s})," GQ"," / ",u," GQ"]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosAiRestorer=void 0;var o=n(0),r=n(2),i=n(177);t.NtosAiRestorer=function(){return(0,o.createComponentVNode)(2,r.NtosWindow,{width:370,height:400,resizable:!0,children:(0,o.createComponentVNode)(2,r.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.AiRestorerContent)})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosArcade=void 0;var o=n(0),r=n(60),i=n(1),a=n(3),c=n(2);t.NtosArcade=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data;return(0,o.createComponentVNode)(2,c.NtosWindow,{width:450,height:350,children:(0,o.createComponentVNode)(2,c.NtosWindow.Content,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Outbomb Cuban Pete Ultra",textAlign:"center",children:[(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Grid,{children:[(0,o.createComponentVNode)(2,a.Grid.Column,{size:2,children:[(0,o.createComponentVNode)(2,a.Box,{m:1}),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Player Health",children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:d.PlayerHitpoints,minValue:0,maxValue:30,ranges:{olive:[31,Infinity],good:[20,31],average:[10,20],bad:[-Infinity,10]},children:[d.PlayerHitpoints,"HP"]})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Player Magic",children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:d.PlayerMP,minValue:0,maxValue:10,ranges:{purple:[11,Infinity],violet:[3,11],bad:[-Infinity,3]},children:[d.PlayerMP,"MP"]})})]}),(0,o.createComponentVNode)(2,a.Box,{my:1,mx:4}),(0,o.createComponentVNode)(2,a.Section,{backgroundColor:1===d.PauseState?"#1b3622":"#471915",children:d.Status})]}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:[(0,o.createComponentVNode)(2,a.ProgressBar,{value:d.Hitpoints,minValue:0,maxValue:45,ranges:{good:[30,Infinity],average:[5,30],bad:[-Infinity,5]},children:[(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:d.Hitpoints}),"HP"]}),(0,o.createComponentVNode)(2,a.Box,{m:1}),(0,o.createComponentVNode)(2,a.Section,{inline:!0,width:"156px",textAlign:"center",children:(0,o.createVNode)(1,"img",null,null,1,{src:(0,r.resolveAsset)(d.BossID)})})]})]}),(0,o.createComponentVNode)(2,a.Box,{my:1,mx:4}),(0,o.createComponentVNode)(2,a.Button,{icon:"fist-raised",tooltip:"Go in for the kill!",tooltipPosition:"top",disabled:0===d.GameActive||1===d.PauseState,onClick:function(){return l("Attack")},content:"Attack!"}),(0,o.createComponentVNode)(2,a.Button,{icon:"band-aid",tooltip:"Heal yourself!",tooltipPosition:"top",disabled:0===d.GameActive||1===d.PauseState,onClick:function(){return l("Heal")},content:"Heal!"}),(0,o.createComponentVNode)(2,a.Button,{icon:"magic",tooltip:"Recharge your magic!",tooltipPosition:"top",disabled:0===d.GameActive||1===d.PauseState,onClick:function(){return l("Recharge_Power")},content:"Recharge!"})]}),(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"sync-alt",tooltip:"One more game couldn't hurt.",tooltipPosition:"top",disabled:1===d.GameActive,onClick:function(){return l("Start_Game")},content:"Begin Game"}),(0,o.createComponentVNode)(2,a.Button,{icon:"ticket-alt",tooltip:"Claim at your local Arcade Computer for Prizes!",tooltipPosition:"top",disabled:1===d.GameActive,onClick:function(){return l("Dispense_Tickets")},content:"Claim Tickets"})]}),(0,o.createComponentVNode)(2,a.Box,{color:d.TicketCount>=1?"good":"normal",children:["Earned Tickets: ",d.TicketCount]})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosAtmos=void 0;var o=n(0),r=n(15),i=n(30),a=n(16),c=n(1),l=n(3),d=n(34),u=n(2);t.NtosAtmos=function(e,t){var n=(0,c.useBackend)(t),s=(n.act,n.data),p=s.AirTemp,m=s.AirPressure,f=(0,i.flow)([(0,r.filter)((function(e){return e.percentage>=.01})),(0,r.sortBy)((function(e){return-e.percentage}))])(s.AirData||[]),h=Math.max.apply(Math,[1].concat(f.map((function(e){return e.percentage}))));return(0,o.createComponentVNode)(2,u.NtosWindow,{width:300,height:350,resizable:!0,children:(0,o.createComponentVNode)(2,u.NtosWindow.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,l.Section,{children:(0,o.createComponentVNode)(2,l.LabeledList,{children:[(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:"Temperature",children:[p,"\xb0C"]}),(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:"Pressure",children:[m," kPa"]})]})}),(0,o.createComponentVNode)(2,l.Section,{children:(0,o.createComponentVNode)(2,l.LabeledList,{children:f.map((function(e){return(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:(0,d.getGasLabel)(e.name),children:(0,o.createComponentVNode)(2,l.ProgressBar,{color:(0,d.getGasColor)(e.name),value:e.percentage,minValue:0,maxValue:h,children:(0,a.toFixed)(e.percentage,2)+"%"})},e.name)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosBountyConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(40),c=n(2);t.NtosBountyConsole=function(e,t){var n=(0,r.useBackend)(t),a=n.act,d=n.data.bountydata,u=void 0===d?[]:d;return(0,o.createComponentVNode)(2,c.NtosWindow,{width:750,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,c.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:(0,o.createComponentVNode)(2,l),buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"print",content:"Print Bounty List",onClick:function(){return a("Print")}}),children:(0,o.createComponentVNode)(2,i.Table,{border:!0,children:[(0,o.createComponentVNode)(2,i.Table.Row,{bold:!0,italic:!0,color:"label",fontSize:1.25,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Bounty Object"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Description"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Progress"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Value"}),(0,o.createComponentVNode)(2,i.Table.Cell,{p:1,textAlign:"center",children:"Claim"})]}),u.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{backgroundColor:1===e.priority?"rgba(252, 152, 3, 0.25)":"",children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,children:e.name}),(0,o.createComponentVNode)(2,i.Table.Cell,{italic:!0,textAlign:"center",p:1,children:e.description}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,textAlign:"center",children:[1===e.priority?(0,o.createComponentVNode)(2,i.Box,{children:"High Priority"}):"",e.completion_string]}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,textAlign:"center",children:e.reward_string}),(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,p:1,children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,textAlign:"center",icon:1===e.claimed?"check":"",content:1===e.claimed?"Claimed":"Claim",disabled:1===e.claimed,color:1===e.can_claim?"green":"red",onClick:function(){return a("ClaimBounty",{bounty:e.bounty_ref})}})})]},e.name)}))]})})})})};var l=function(e,t){var n=(0,r.useBackend)(t),c=(n.act,n.data.stored_cash);return(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:c,format:function(e){return(0,a.formatMoney)(e)}})," credits"]})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosCardContent=t.NtosCard=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(178);t.NtosCard=function(e,t){return(0,o.createComponentVNode)(2,a.NtosWindow,{width:450,height:520,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,l)})})};var l=function(e,t){var n=(0,r.useBackend)(t),a=n.act,l=n.data,d=(0,r.useLocalState)(t,"tab",1),u=d[0],s=d[1],p=l.authenticated,m=l.regions,f=void 0===m?[]:m,h=l.access_on_card,C=void 0===h?[]:h,g=l.jobs,b=void 0===g?{}:g,N=l.id_rank,v=l.id_owner,V=l.has_id,y=l.have_printer,k=l.have_id_slot,x=l.id_name,_=(0,r.useLocalState)(t,"department",Object.keys(b)[0]),w=_[0],B=_[1];if(!k)return(0,o.createComponentVNode)(2,i.NoticeBox,{children:"This program requires an ID slot in order to function"});var S=b[w]||[];return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:V&&p?(0,o.createComponentVNode)(2,i.Input,{value:v,width:"250px",onInput:function(e,t){return a("PRG_edit",{name:t})}}):v||"No Card Inserted",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"print",content:"Print",disabled:!y||!V,onClick:function(){return a("PRG_print")}}),(0,o.createComponentVNode)(2,i.Button,{icon:p?"sign-out-alt":"sign-in-alt",content:p?"Log Out":"Log In",color:p?"bad":"good",onClick:function(){a(p?"PRG_logout":"PRG_authenticate")}})],4),children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"eject",content:x,onClick:function(){return a("PRG_eject")}})}),!!V&&!!p&&(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.Tabs,{children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:1===u,onClick:function(){return s(1)},children:"Access"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:2===u,onClick:function(){return s(2)},children:"Jobs"})]}),1===u&&(0,o.createComponentVNode)(2,c.AccessList,{accesses:f,selectedList:C,accessMod:function(e){return a("PRG_access",{access_target:e})},grantAll:function(){return a("PRG_grantall")},denyAll:function(){return a("PRG_denyall")},grantDep:function(e){return a("PRG_grantregion",{region:e})},denyDep:function(e){return a("PRG_denyregion",{region:e})}}),2===u&&(0,o.createComponentVNode)(2,i.Section,{title:N,buttons:(0,o.createComponentVNode)(2,i.Button.Confirm,{icon:"exclamation-triangle",content:"Terminate",color:"bad",onClick:function(){return a("PRG_terminate")}}),children:[(0,o.createComponentVNode)(2,i.Button.Input,{fluid:!0,content:"Custom...",onCommit:function(e,t){return a("PRG_assign",{assign_target:"Custom",custom_name:t})}}),(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Tabs,{vertical:!0,children:Object.keys(b).map((function(e){return(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:e===w,onClick:function(){return B(e)},children:e},e)}))})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,children:S.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:e.display_name,onClick:function(){return a("PRG_assign",{assign_target:e.job})}},e.job)}))})]})]})]})],0)};t.NtosCardContent=l},function(e,t,n){"use strict";t.__esModule=!0,t.NtosConfiguration=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosConfiguration=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.PC_device_theme,u=l.power_usage,s=l.battery_exists,p=l.battery,m=void 0===p?{}:p,f=l.disk_size,h=l.disk_used,C=l.hardware,g=void 0===C?[]:C;return(0,o.createComponentVNode)(2,a.NtosWindow,{theme:d,width:420,height:630,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Power Supply",buttons:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,mr:1,children:["Power Draw: ",u,"W"]}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Battery Status",color:!s&&"average",children:s?(0,o.createComponentVNode)(2,i.ProgressBar,{value:m.charge,minValue:0,maxValue:m.max,ranges:{good:[m.max/2,Infinity],average:[m.max/4,m.max/2],bad:[-Infinity,m.max/4]},children:[m.charge," / ",m.max]}):"Not Available"})})}),(0,o.createComponentVNode)(2,i.Section,{title:"File System",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:h,minValue:0,maxValue:f,color:"good",children:[h," GQ / ",f," GQ"]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Hardware Components",children:g.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name,level:2,buttons:(0,o.createFragment)([!e.critical&&(0,o.createComponentVNode)(2,i.Button.Checkbox,{content:"Enabled",checked:e.enabled,mr:1,onClick:function(){return c("PC_toggle_component",{name:e.name})}}),(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,mr:1,children:["Power Usage: ",e.powerusage,"W"]})],0),children:e.desc},e.name)}))})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosCrewManifest=void 0;var o=n(0),r=n(15),i=n(1),a=n(3),c=n(2);t.NtosCrewManifest=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.have_printer,s=d.manifest,p=void 0===s?{}:s;return(0,o.createComponentVNode)(2,c.NtosWindow,{width:400,height:480,resizable:!0,children:(0,o.createComponentVNode)(2,c.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:"Crew Manifest",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"print",content:"Print",disabled:!u,onClick:function(){return l("PRG_print")}}),children:(0,r.map)((function(e,t){return(0,o.createComponentVNode)(2,a.Section,{level:2,title:t,children:(0,o.createComponentVNode)(2,a.Table,{children:e.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,a.Table.Cell,{bold:!0,children:e.name}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:["(",e.rank,")"]})]},e.name)}))})},t)}))(p)})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosCyborgRemoteMonitorSyndicate=void 0;var o=n(0),r=n(2),i=n(182);t.NtosCyborgRemoteMonitorSyndicate=function(e,t){return(0,o.createComponentVNode)(2,r.NtosWindow,{width:600,height:800,theme:"syndicate",children:(0,o.createComponentVNode)(2,r.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.NtosCyborgRemoteMonitorContent)})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosFileManager=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosFileManager=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.PC_device_theme,s=d.usbconnected,p=d.files,m=void 0===p?[]:p,f=d.usbfiles,h=void 0===f?[]:f;return(0,o.createComponentVNode)(2,a.NtosWindow,{resizable:!0,theme:u,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,c,{files:m,usbconnected:s,onUpload:function(e){return l("PRG_copytousb",{name:e})},onDelete:function(e){return l("PRG_deletefile",{name:e})},onRename:function(e,t){return l("PRG_rename",{name:e,new_name:t})},onDuplicate:function(e){return l("PRG_clone",{file:e})}})}),s&&(0,o.createComponentVNode)(2,i.Section,{title:"Data Disk",children:(0,o.createComponentVNode)(2,c,{usbmode:!0,files:h,usbconnected:s,onUpload:function(e){return l("PRG_copyfromusb",{name:e})},onDelete:function(e){return l("PRG_deletefile",{name:e})},onRename:function(e,t){return l("PRG_rename",{name:e,new_name:t})},onDuplicate:function(e){return l("PRG_clone",{file:e})}})})]})})};var c=function(e){var t=e.files,n=void 0===t?[]:t,r=e.usbconnected,a=e.usbmode,c=e.onUpload,l=e.onDelete,d=e.onRename;return(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:"File"}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:"Type"}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:"Size"})]}),n.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:e.undeletable?e.name:(0,o.createComponentVNode)(2,i.Button.Input,{fluid:!0,content:e.name,currentValue:e.name,tooltip:"Rename",onCommit:function(t,n){return d(e.name,n)}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:e.type}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:e.size}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:!e.undeletable&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button.Confirm,{icon:"trash",confirmIcon:"times",confirmContent:"",tooltip:"Delete",onClick:function(){return l(e.name)}}),!!r&&(a?(0,o.createComponentVNode)(2,i.Button,{icon:"download",tooltip:"Download",onClick:function(){return c(e.name)}}):(0,o.createComponentVNode)(2,i.Button,{icon:"upload",tooltip:"Upload",onClick:function(){return c(e.name)}}))],0)})]},e.name)}))]})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosJobManagerContent=t.NtosJobManager=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosJobManager=function(e,t){return(0,o.createComponentVNode)(2,a.NtosWindow,{width:400,height:620,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.authed,d=c.cooldown,u=c.slots,s=void 0===u?[]:u,p=c.prioritized,m=void 0===p?[]:p;return l?(0,o.createComponentVNode)(2,i.Section,{children:[d>0&&(0,o.createComponentVNode)(2,i.Dimmer,{children:(0,o.createComponentVNode)(2,i.Box,{bold:!0,textAlign:"center",fontSize:"20px",children:["On Cooldown: ",d,"s"]})}),(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:"Prioritized"}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:"Slots"})]}),s.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,children:(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,content:e.title,disabled:e.total<=0,checked:e.total>0&&m.includes(e.title),onClick:function(){return a("PRG_priority",{target:e.title})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:[e.current," / ",e.total]}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,children:[(0,o.createComponentVNode)(2,i.Button,{content:"Open",disabled:!e.status_open,onClick:function(){return a("PRG_open_job",{target:e.title})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Close",disabled:!e.status_close,onClick:function(){return a("PRG_close_job",{target:e.title})}})]})]},e.title)}))]})]}):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Current ID does not have access permissions to change job slots."})};t.NtosJobManagerContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.NtosMain=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c={compconfig:"cog",ntndownloader:"download",filemanager:"folder",smmonitor:"radiation",alarmmonitor:"bell",cardmod:"id-card",arcade:"gamepad",ntnrc_client:"comment-alt",nttransfer:"exchange-alt",powermonitor:"plug",job_manage:"address-book",crewmani:"clipboard-list",robocontrol:"robot",atmosscan:"thermometer-half",shipping:"tags"};t.NtosMain=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.device_theme,s=d.programs,p=void 0===s?[]:s,m=d.has_light,f=d.light_on,h=d.comp_light_color;return(0,o.createComponentVNode)(2,a.NtosWindow,{title:"syndicate"===u?"Syndix Main Menu":"NtOS Main Menu",theme:u,width:400,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:[!!m&&(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.Button,{width:"144px",icon:"lightbulb",selected:f,onClick:function(){return l("PC_toggle_light")},children:["Flashlight: ",f?"ON":"OFF"]}),(0,o.createComponentVNode)(2,i.Button,{ml:1,onClick:function(){return l("PC_light_color")},children:["Color:",(0,o.createComponentVNode)(2,i.ColorBox,{ml:1,color:h})]})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Programs",children:(0,o.createComponentVNode)(2,i.Table,{children:p.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Button,{fluid:!0,color:"transparent",icon:c[e.name]||"window-maximize-o",content:e.desc,onClick:function(){return l("PC_runprogram",{name:e.name})}})}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,width:"18px",children:!!e.running&&(0,o.createComponentVNode)(2,i.Button,{color:"transparent",icon:"times",tooltip:"Close program",tooltipPosition:"left",onClick:function(){return l("PC_killprogram",{name:e.name})}})})]},e.name)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosNetChat=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosNetChat=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.can_admin,u=l.adminmode,s=l.authed,p=l.username,m=l.active_channel,f=l.is_operator,h=l.all_channels,C=void 0===h?[]:h,g=l.clients,b=void 0===g?[]:g,N=l.messages,v=void 0===N?[]:N,V=null!==m,y=s||u;return(0,o.createComponentVNode)(2,a.NtosWindow,{width:900,height:675,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{children:(0,o.createComponentVNode)(2,i.Section,{height:"600px",children:(0,o.createComponentVNode)(2,i.Table,{height:"580px",children:(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{verticalAlign:"top",style:{width:"200px"},children:[(0,o.createComponentVNode)(2,i.Box,{height:"537px",overflowY:"scroll",children:[(0,o.createComponentVNode)(2,i.Button.Input,{fluid:!0,content:"New Channel...",onCommit:function(e,t){return c("PRG_newchannel",{new_channel_name:t})}}),C.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:e.chan,selected:e.id===m,color:"transparent",onClick:function(){return c("PRG_joinchannel",{id:e.id})}},e.chan)}))]}),(0,o.createComponentVNode)(2,i.Button.Input,{fluid:!0,mt:1,content:p+"...",currentValue:p,onCommit:function(e,t){return c("PRG_changename",{new_name:t})}}),!!d&&(0,o.createComponentVNode)(2,i.Button,{fluid:!0,bold:!0,content:"ADMIN MODE: "+(u?"ON":"OFF"),color:u?"bad":"good",onClick:function(){return c("PRG_toggleadmin")}})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[(0,o.createComponentVNode)(2,i.Box,{height:"560px",overflowY:"scroll",children:V&&(y?v.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:e.msg},e.msg)})):(0,o.createComponentVNode)(2,i.Box,{textAlign:"center",children:[(0,o.createComponentVNode)(2,i.Icon,{name:"exclamation-triangle",mt:4,fontSize:"40px"}),(0,o.createComponentVNode)(2,i.Box,{mt:1,bold:!0,fontSize:"18px",children:"THIS CHANNEL IS PASSWORD PROTECTED"}),(0,o.createComponentVNode)(2,i.Box,{mt:1,children:"INPUT PASSWORD TO ACCESS"})]}))}),(0,o.createComponentVNode)(2,i.Input,{fluid:!0,selfClear:!0,mt:1,onEnter:function(e,t){return c("PRG_speak",{message:t})}})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{verticalAlign:"top",style:{width:"150px"},children:[(0,o.createComponentVNode)(2,i.Box,{height:"477px",overflowY:"scroll",children:b.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:e.name},e.name)}))}),V&&y&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button.Input,{fluid:!0,content:"Save log...",defaultValue:"new_log",onCommit:function(e,t){return c("PRG_savelog",{log_name:t})}}),(0,o.createComponentVNode)(2,i.Button.Confirm,{fluid:!0,content:"Leave Channel",onClick:function(){return c("PRG_leavechannel")}})],4),!!f&&s&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button.Confirm,{fluid:!0,content:"Delete Channel",onClick:function(){return c("PRG_deletechannel")}}),(0,o.createComponentVNode)(2,i.Button.Input,{fluid:!0,content:"Rename Channel...",onCommit:function(e,t){return c("PRG_renamechannel",{new_name:t})}}),(0,o.createComponentVNode)(2,i.Button.Input,{fluid:!0,content:"Set Password...",onCommit:function(e,t){return c("PRG_setpassword",{new_password:t})}})],4)]})]})})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosNetDosContent=t.NtosNetDos=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosNetDos=function(e,t){return(0,o.createComponentVNode)(2,a.NtosWindow,{width:400,height:250,theme:"syndicate",children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{children:(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.relays,d=void 0===l?[]:l,u=c.focus,s=c.target,p=c.speed,m=c.overload,f=c.capacity,h=c.error;if(h)return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.NoticeBox,{children:h}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Reset",textAlign:"center",onClick:function(){return a("PRG_reset")}})],4);var C=function(e){for(var t="",n=m/f;t.length<e;)Math.random()>n?t+="0":t+="1";return t};return s?(0,o.createComponentVNode)(2,i.Section,{fontFamily:"monospace",textAlign:"center",children:[(0,o.createComponentVNode)(2,i.Box,{children:["CURRENT SPEED: ",p," GQ/s"]}),(0,o.createComponentVNode)(2,i.Box,{children:C(45)}),(0,o.createComponentVNode)(2,i.Box,{children:C(45)}),(0,o.createComponentVNode)(2,i.Box,{children:C(45)}),(0,o.createComponentVNode)(2,i.Box,{children:C(45)}),(0,o.createComponentVNode)(2,i.Box,{children:C(45)})]}):(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Target",children:d.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{content:e.id,selected:u===e.id,onClick:function(){return a("PRG_target_relay",{targid:e.id})}},e.id)}))})}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,bold:!0,content:"EXECUTE",color:"bad",textAlign:"center",disabled:!u,mt:1,onClick:function(){return a("PRG_execute")}})]})};t.NtosNetDosContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.NtosNetDownloader=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosNetDownloader=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.PC_device_theme,s=d.disk_size,p=d.disk_used,m=d.downloadable_programs,f=void 0===m?[]:m,h=d.error,C=d.hacked_programs,g=void 0===C?[]:C,b=d.hackedavailable;return(0,o.createComponentVNode)(2,a.NtosWindow,{theme:u,width:480,height:735,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:[!!h&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:[(0,o.createComponentVNode)(2,i.Box,{mb:1,children:h}),(0,o.createComponentVNode)(2,i.Button,{content:"Reset",onClick:function(){return l("PRG_reseterror")}})]}),(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Disk usage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:p,minValue:0,maxValue:s,children:p+" GQ / "+s+" GQ"})})})}),(0,o.createComponentVNode)(2,i.Section,{children:f.map((function(e){return(0,o.createComponentVNode)(2,c,{program:e},e.filename)}))}),!!b&&(0,o.createComponentVNode)(2,i.Section,{title:"UNKNOWN Software Repository",children:[(0,o.createComponentVNode)(2,i.NoticeBox,{mb:1,children:"Please note that Nanotrasen does not recommend download of software from non-official servers."}),g.map((function(e){return(0,o.createComponentVNode)(2,c,{program:e},e.filename)}))]})]})})};var c=function(e,t){var n=e.program,a=(0,r.useBackend)(t),c=a.act,l=a.data,d=l.disk_size,u=l.disk_used,s=l.downloadcompletion,p=l.downloading,m=l.downloadname,f=l.downloadsize,h=d-u;return(0,o.createComponentVNode)(2,i.Box,{mb:3,children:[(0,o.createComponentVNode)(2,i.Flex,{align:"baseline",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{bold:!0,grow:1,children:n.filedesc}),(0,o.createComponentVNode)(2,i.Flex.Item,{color:"label",nowrap:!0,children:[n.size," GQ"]}),(0,o.createComponentVNode)(2,i.Flex.Item,{ml:2,width:"94px",textAlign:"center",children:n.filename===m&&(0,o.createComponentVNode)(2,i.ProgressBar,{color:"green",minValue:0,maxValue:f,value:s})||(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"download",content:"Download",disabled:p||n.size>h,onClick:function(){return c("PRG_downloadfile",{filename:n.filename})}})})]}),"Compatible"!==n.compatibility&&(0,o.createComponentVNode)(2,i.Box,{mt:1,italic:!0,fontSize:"12px",position:"relative",children:[(0,o.createComponentVNode)(2,i.Icon,{mx:1,color:"red",name:"times"}),"Incompatible!"]}),n.size>h&&(0,o.createComponentVNode)(2,i.Box,{mt:1,italic:!0,fontSize:"12px",position:"relative",children:[(0,o.createComponentVNode)(2,i.Icon,{mx:1,color:"red",name:"times"}),"Not enough disk space!"]}),(0,o.createComponentVNode)(2,i.Box,{mt:1,italic:!0,color:"label",fontSize:"12px",children:n.fileinfo})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosNetMonitor=void 0;var o=n(0),r=n(3),i=n(1),a=n(2);t.NtosNetMonitor=function(e,t){var n=(0,i.useBackend)(t),c=n.act,l=n.data,d=l.ntnetrelays,u=l.ntnetstatus,s=l.config_softwaredownload,p=l.config_peertopeer,m=l.config_communication,f=l.config_systemcontrol,h=l.idsalarm,C=l.idsstatus,g=l.ntnetmaxlogs,b=l.maxlogs,N=l.minlogs,v=l.ntnetlogs,V=void 0===v?[]:v;return(0,o.createComponentVNode)(2,a.NtosWindow,{resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,r.NoticeBox,{children:"WARNING: Disabling wireless transmitters when using a wireless device may prevent you from reenabling them!"}),(0,o.createComponentVNode)(2,r.Section,{title:"Wireless Connectivity",buttons:(0,o.createComponentVNode)(2,r.Button.Confirm,{icon:u?"power-off":"times",content:u?"ENABLED":"DISABLED",selected:u,onClick:function(){return c("toggleWireless")}}),children:d?(0,o.createComponentVNode)(2,r.LabeledList,{children:(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Active NTNet Relays",children:d})}):"No Relays Connected"}),(0,o.createComponentVNode)(2,r.Section,{title:"Firewall Configuration",children:(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Software Downloads",buttons:(0,o.createComponentVNode)(2,r.Button,{icon:s?"power-off":"times",content:s?"ENABLED":"DISABLED",selected:s,onClick:function(){return c("toggle_function",{id:"1"})}})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Peer to Peer Traffic",buttons:(0,o.createComponentVNode)(2,r.Button,{icon:p?"power-off":"times",content:p?"ENABLED":"DISABLED",selected:p,onClick:function(){return c("toggle_function",{id:"2"})}})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Communication Systems",buttons:(0,o.createComponentVNode)(2,r.Button,{icon:m?"power-off":"times",content:m?"ENABLED":"DISABLED",selected:m,onClick:function(){return c("toggle_function",{id:"3"})}})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Remote System Control",buttons:(0,o.createComponentVNode)(2,r.Button,{icon:f?"power-off":"times",content:f?"ENABLED":"DISABLED",selected:f,onClick:function(){return c("toggle_function",{id:"4"})}})})]})}),(0,o.createComponentVNode)(2,r.Section,{title:"Security Systems",children:[!!h&&(0,o.createFragment)([(0,o.createComponentVNode)(2,r.NoticeBox,{children:"NETWORK INCURSION DETECTED"}),(0,o.createComponentVNode)(2,r.Box,{italics:!0,children:"Abnormal activity has been detected in the network. Check system logs for more information"})],4),(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"IDS Status",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Button,{icon:C?"power-off":"times",content:C?"ENABLED":"DISABLED",selected:C,onClick:function(){return c("toggleIDS")}}),(0,o.createComponentVNode)(2,r.Button,{icon:"sync",content:"Reset",color:"bad",onClick:function(){return c("resetIDS")}})],4)}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Max Log Count",buttons:(0,o.createComponentVNode)(2,r.NumberInput,{value:g,minValue:N,maxValue:b,width:"39px",onChange:function(e,t){return c("updatemaxlogs",{new_number:t})}})})]}),(0,o.createComponentVNode)(2,r.Section,{title:"System Log",level:2,buttons:(0,o.createComponentVNode)(2,r.Button.Confirm,{icon:"trash",content:"Clear Logs",onClick:function(){return c("purgelogs")}}),children:V.map((function(e){return(0,o.createComponentVNode)(2,r.Box,{className:"candystripe",children:e.entry},e.entry)}))})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosPowerMonitor=void 0;var o=n(0),r=n(2),i=n(130);t.NtosPowerMonitor=function(){return(0,o.createComponentVNode)(2,r.NtosWindow,{width:550,height:700,resizable:!0,children:(0,o.createComponentVNode)(2,r.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.PowerMonitorContent)})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosRadarSyndicate=void 0;var o=n(0),r=n(2),i=n(183);t.NtosRadarSyndicate=function(e,t){return(0,o.createComponentVNode)(2,r.NtosWindow,{width:800,height:600,theme:"syndicate",children:(0,o.createComponentVNode)(2,i.NtosRadarContent)})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosRequestKiosk=void 0;var o=n(0),r=n(184),i=n(2);t.NtosRequestKiosk=function(e,t){return(0,o.createComponentVNode)(2,i.NtosWindow,{width:550,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,i.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,r.RequestKioskContent)})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosRevelation=void 0;var o=n(0),r=n(3),i=n(1),a=n(2);t.NtosRevelation=function(e,t){var n=(0,i.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.NtosWindow,{width:400,height:250,theme:"syndicate",children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{children:(0,o.createComponentVNode)(2,r.Section,{children:[(0,o.createComponentVNode)(2,r.Button.Input,{fluid:!0,content:"Obfuscate Name...",onCommit:function(e,t){return c("PRG_obfuscate",{new_name:t})},mb:1}),(0,o.createComponentVNode)(2,r.LabeledList,{children:(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Payload Status",buttons:(0,o.createComponentVNode)(2,r.Button,{content:l.armed?"ARMED":"DISARMED",color:l.armed?"bad":"average",onClick:function(){return c("PRG_arm")}})})}),(0,o.createComponentVNode)(2,r.Button,{fluid:!0,bold:!0,content:"ACTIVATE",textAlign:"center",color:"bad",disabled:!l.armed})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosRoboControl=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosRoboControl=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.bots,s=d.id_owner,p=d.has_id;return(0,o.createComponentVNode)(2,a.NtosWindow,{width:550,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Robot Control Console",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Id Card",children:[s,!!p&&(0,o.createComponentVNode)(2,i.Button,{ml:2,icon:"eject",content:"Eject",onClick:function(){return l("ejectcard")}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Bots in range",children:d.botcount})]})}),null==u?void 0:u.map((function(e){return(0,o.createComponentVNode)(2,c,{robot:e},e.bot_ref)}))]})})};var c=function(e,t){var n=e.robot,a=(0,r.useBackend)(t),c=a.act,l=a.data,d=l.mules||[],u=!!n.mule_check&&function(e,t){return null==e?void 0:e.find((function(e){return e.mule_ref===t}))}(d,n.bot_ref),s=1===n.mule_check?"rgba(110, 75, 14, 1)":"rgba(74, 59, 140, 1)";return(0,o.createComponentVNode)(2,i.Section,{title:n.name,style:{border:"4px solid "+s},buttons:u&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"play",tooltip:"Go to Destination.",onClick:function(){return c("go",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"pause",tooltip:"Stop Moving.",onClick:function(){return c("stop",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"home",tooltip:"Travel Home.",tooltipPosition:"bottom-left",onClick:function(){return c("home",{robot:u.mule_ref})}})],4),children:(0,o.createComponentVNode)(2,i.Flex,{spacing:1,children:[(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Model",children:n.model}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Location",children:n.locat}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:n.mode}),u&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Loaded Cargo",children:l.load||"N/A"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Home",children:u.home}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Destination",children:u.dest||"N/A"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:u.power,minValue:0,maxValue:100,ranges:{good:[60,Infinity],average:[20,60],bad:[-Infinity,20]}})})],4)]})}),(0,o.createComponentVNode)(2,i.Flex.Item,{width:"150px",children:[u&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Set Destination",onClick:function(){return c("destination",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Set ID",onClick:function(){return c("setid",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Set Home",onClick:function(){return c("sethome",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Unload Cargo",onClick:function(){return c("unload",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,content:"Auto Return",checked:u.autoReturn,onClick:function(){return c("autoret",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,content:"Auto Pickup",checked:u.autoPickup,onClick:function(){return c("autopick",{robot:u.mule_ref})}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,content:"Delivery Report",checked:u.reportDelivery,onClick:function(){return c("report",{robot:u.mule_ref})}})],4),!u&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Stop Patrol",onClick:function(){return c("patroloff",{robot:n.bot_ref})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Start Patrol",onClick:function(){return c("patrolon",{robot:n.bot_ref})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Summon",onClick:function(){return c("summon",{robot:n.bot_ref})}}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"Eject PAi",onClick:function(){return c("ejectpai",{robot:n.bot_ref})}})],4)]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosShipping=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.NtosShipping=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.NtosWindow,{width:450,height:350,resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"NTOS Shipping Hub.",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject Id",onClick:function(){return c("ejectid")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current User",children:l.current_user||"N/A"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Inserted Card",children:l.card_owner||"N/A"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Available Paper",children:l.has_printer?l.paperamt:"N/A"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Profit on Sale",children:[l.barcode_split,"%"]})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Shipping Options",children:[(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.Button,{icon:"id-card",tooltip:"The currently ID card will become the current user.",tooltipPosition:"right",disabled:!l.has_id_slot,onClick:function(){return c("selectid")},content:"Set Current ID"})}),(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.Button,{icon:"print",tooltip:"Print a barcode to use on a wrapped package.",tooltipPosition:"right",disabled:!l.has_printer||!l.current_user,onClick:function(){return c("print")},content:"Print Barcode"})}),(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.Button,{icon:"tags",tooltip:"Set how much profit you'd like on your package.",tooltipPosition:"right",onClick:function(){return c("setsplit")},content:"Set Profit Margin"})}),(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.Button,{icon:"sync-alt",content:"Reset ID",onClick:function(){return c("resetid")}})})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosStationAlertConsole=void 0;var o=n(0),r=n(2),i=n(185);t.NtosStationAlertConsole=function(){return(0,o.createComponentVNode)(2,r.NtosWindow,{width:315,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,r.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.StationAlertConsoleContent)})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NtosSupermatterMonitorContent=t.NtosSupermatterMonitor=void 0;var o=n(0),r=n(15),i=n(30),a=n(16),c=n(1),l=n(3),d=n(34),u=n(2),s=function(e){return Math.log2(16+Math.max(0,e))-4};t.NtosSupermatterMonitor=function(e,t){return(0,o.createComponentVNode)(2,u.NtosWindow,{width:600,height:350,resizable:!0,children:(0,o.createComponentVNode)(2,u.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,p)})})};var p=function(e,t){var n=(0,c.useBackend)(t),u=n.act,p=n.data,f=p.active,h=p.SM_integrity,C=p.SM_power,g=p.SM_ambienttemp,b=p.SM_ambientpressure;if(!f)return(0,o.createComponentVNode)(2,m);var N=(0,i.flow)([function(e){return e.filter((function(e){return e.amount>=.01}))},(0,r.sortBy)((function(e){return-e.amount}))])(p.gases||[]),v=Math.max.apply(Math,[1].concat(N.map((function(e){return e.amount}))));return(0,o.createComponentVNode)(2,l.Flex,{spacing:1,children:[(0,o.createComponentVNode)(2,l.Flex.Item,{width:"270px",children:(0,o.createComponentVNode)(2,l.Section,{title:"Metrics",children:(0,o.createComponentVNode)(2,l.LabeledList,{children:[(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:"Integrity",children:(0,o.createComponentVNode)(2,l.ProgressBar,{value:h/100,ranges:{good:[.9,Infinity],average:[.5,.9],bad:[-Infinity,.5]}})}),(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:"Relative EER",children:(0,o.createComponentVNode)(2,l.ProgressBar,{value:C,minValue:0,maxValue:5e3,ranges:{good:[-Infinity,5e3],average:[5e3,7e3],bad:[7e3,Infinity]},children:(0,a.toFixed)(C)+" MeV/cm3"})}),(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:"Temperature",children:(0,o.createComponentVNode)(2,l.ProgressBar,{value:s(g),minValue:0,maxValue:s(1e4),ranges:{teal:[-Infinity,s(80)],good:[s(80),s(373)],average:[s(373),s(1e3)],bad:[s(1e3),Infinity]},children:(0,a.toFixed)(g)+" K"})}),(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:"Pressure",children:(0,o.createComponentVNode)(2,l.ProgressBar,{value:s(b),minValue:0,maxValue:s(5e4),ranges:{good:[s(1),s(300)],average:[-Infinity,s(1e3)],bad:[s(1e3),+Infinity]},children:(0,a.toFixed)(b)+" kPa"})})]})})}),(0,o.createComponentVNode)(2,l.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,l.Section,{title:"Gases",buttons:(0,o.createComponentVNode)(2,l.Button,{icon:"arrow-left",content:"Back",onClick:function(){return u("PRG_clear")}}),children:(0,o.createComponentVNode)(2,l.LabeledList,{children:N.map((function(e){return(0,o.createComponentVNode)(2,l.LabeledList.Item,{label:(0,d.getGasLabel)(e.name),children:(0,o.createComponentVNode)(2,l.ProgressBar,{color:(0,d.getGasColor)(e.name),value:e.amount,minValue:0,maxValue:v,children:(0,a.toFixed)(e.amount,2)+"%"})},e.name)}))})})})]})};t.NtosSupermatterMonitorContent=p;var m=function(e,t){var n=(0,c.useBackend)(t),r=n.act,i=n.data.supermatters,a=void 0===i?[]:i;return(0,o.createComponentVNode)(2,l.Section,{title:"Detected Supermatters",buttons:(0,o.createComponentVNode)(2,l.Button,{icon:"sync",content:"Refresh",onClick:function(){return r("PRG_refresh")}}),children:(0,o.createComponentVNode)(2,l.Table,{children:a.map((function(e){return(0,o.createComponentVNode)(2,l.Table.Row,{children:[(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.uid+". "+e.area_name}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,color:"label",children:"Integrity:"}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,width:"120px",children:(0,o.createComponentVNode)(2,l.ProgressBar,{value:e.integrity/100,ranges:{good:[.9,Infinity],average:[.5,.9],bad:[-Infinity,.5]}})}),(0,o.createComponentVNode)(2,l.Table.Cell,{collapsing:!0,children:(0,o.createComponentVNode)(2,l.Button,{content:"Details",onClick:function(){return r("PRG_set",{target:e.uid})}})})]},e.uid)}))})})}},function(e,t,n){"use strict";t.__esModule=!0,t.NuclearBomb=void 0;var o=n(0),r=n(6),i=n(1),a=n(3),c=n(2),l=function(e,t){var n=(0,i.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Box,{width:"185px",children:(0,o.createComponentVNode)(2,a.Grid,{width:"1px",children:[["1","4","7","C"],["2","5","8","0"],["3","6","9","E"]].map((function(e){return(0,o.createComponentVNode)(2,a.Grid.Column,{children:e.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,mb:"6px",content:e,textAlign:"center",fontSize:"40px",lineHeight:1.25,width:"55px",className:(0,r.classes)(["NuclearBomb__Button","NuclearBomb__Button--keypad","NuclearBomb__Button--"+e]),onClick:function(){return n("keypad",{digit:e})}},e)}))},e[0])}))})})};t.NuclearBomb=function(e,t){var n=(0,i.useBackend)(t),r=n.act,d=n.data,u=(d.anchored,d.disk_present,d.status1),s=d.status2;return(0,o.createComponentVNode)(2,c.Window,{width:350,height:442,theme:"retro",children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Box,{m:"6px",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"6px",className:"NuclearBomb__displayBox",children:u}),(0,o.createComponentVNode)(2,a.Flex,{mb:1.5,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Box,{className:"NuclearBomb__displayBox",children:s})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",fontSize:"24px",lineHeight:1,textAlign:"center",width:"43px",ml:"6px",mr:"3px",mt:"3px",className:"NuclearBomb__Button NuclearBomb__Button--keypad",onClick:function(){return r("eject_disk")}})})]}),(0,o.createComponentVNode)(2,a.Flex,{ml:"3px",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,l)}),(0,o.createComponentVNode)(2,a.Flex.Item,{ml:"6px",width:"129px",children:(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"ARM",textAlign:"center",fontSize:"28px",lineHeight:1.1,mb:"6px",className:"NuclearBomb__Button NuclearBomb__Button--C",onClick:function(){return r("arm")}}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"ANCHOR",textAlign:"center",fontSize:"28px",lineHeight:1.1,className:"NuclearBomb__Button NuclearBomb__Button--E",onClick:function(){return r("anchor")}}),(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",color:"#9C9987",fontSize:"80px",children:(0,o.createComponentVNode)(2,a.Icon,{name:"radiation"})}),(0,o.createComponentVNode)(2,a.Box,{height:"80px",className:"NuclearBomb__NTIcon"})]})})]})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.OperatingComputer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Respiratory",type:"oxyLoss"}];t.OperatingComputer=function(e,t){var n=(0,r.useSharedState)(t,"tab",1),c=n[0],u=n[1];return(0,o.createComponentVNode)(2,a.Window,{width:350,height:470,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Tabs,{children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:1===c,onClick:function(){return u(1)},children:"Patient State"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:2===c,onClick:function(){return u(2)},children:"Surgery Procedures"})]}),1===c&&(0,o.createComponentVNode)(2,l),2===c&&(0,o.createComponentVNode)(2,d)]})})};var l=function(e,t){var n=(0,r.useBackend)(t),a=(n.act,n.data),l=a.table,d=a.procedures,u=void 0===d?[]:d,s=a.patient,p=void 0===s?{}:s;return l?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Patient State",children:p&&(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"State",color:p.statstate,children:p.stat}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Blood Type",children:p.blood_type}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Health",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:p.health,minValue:p.minHealth,maxValue:p.maxHealth,color:p.health>=0?"good":"average",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:p.health})})}),c.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.label,children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:p[e.type]/p.maxHealth,color:"bad",children:(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:p[e.type]})})},e.type)}))]})||"No Patient Detected"}),0===u.length&&(0,o.createComponentVNode)(2,i.Section,{children:"No Active Procedures"}),u.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Next Step",children:[e.next_step,e.chems_needed&&(0,o.createFragment)([(0,o.createVNode)(1,"b",null,"Required Chemicals:",16),(0,o.createVNode)(1,"br"),e.chems_needed],0)]}),!!a.alternative_step&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Alternative Step",children:[e.alternative_step,e.alt_chems_needed&&(0,o.createFragment)([(0,o.createVNode)(1,"b",null,"Required Chemicals:",16),(0,o.createVNode)(1,"br"),e.alt_chems_needed],0)]})]})},e.name)}))],0):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No Table Detected"})},d=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data.surgeries,l=void 0===c?[]:c;return(0,o.createComponentVNode)(2,i.Section,{title:"Advanced Surgery Procedures",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"download",content:"Sync Research Database",onClick:function(){return a("sync")}}),l.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name,level:2,children:e.desc},e.name)}))]})}},function(e,t,n){"use strict";t.__esModule=!0,t.Orbit=void 0;var o=n(0),r=n(19),i=n(60),a=n(1),c=n(3),l=n(2);function d(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return u(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}var s=/ \[(?:ghost|dead)\]$/,p=/ \(([0-9]+)\)$/,m=function(e){return(0,r.createSearch)(e,(function(e){return e.name}))},f=function(e,t){return e<t?-1:e>t},h=function(e,t){var n=e.name,o=t.name,r=n.match(p),i=o.match(p);return r&&i&&n.replace(p,"")===o.replace(p,"")?parseInt(r[1],10)-parseInt(i[1],10):f(n,o)},C=function(e,t){var n=(0,a.useBackend)(t).act,r=e.searchText,i=e.source,l=e.title,d=i.filter(m(r));return d.sort(h),i.length>0&&(0,o.createComponentVNode)(2,c.Section,{title:l+" - ("+i.length+")",children:d.map((function(e){return(0,o.createComponentVNode)(2,c.Button,{content:e.name.replace(s,""),onClick:function(){return n("orbit",{ref:e.ref})}},e.name)}))})},g=function(e,t){var n=(0,a.useBackend)(t).act,r=e.color,l=e.thing;return(0,o.createComponentVNode)(2,c.Button,{color:r,onClick:function(){return n("orbit",{ref:l.ref})},children:[l.name,l.orbiters&&(0,o.createComponentVNode)(2,c.Box,{inline:!0,ml:1,children:["(",l.orbiters," ",(0,o.createComponentVNode)(2,c.Box,{as:"img",src:(0,i.resolveAsset)("ghost.png"),opacity:.7}),")"]})]})};t.Orbit=function(e,t){for(var n,r=(0,a.useBackend)(t),i=r.act,u=r.data,s=u.alive,p=u.antagonists,b=u.dead,N=u.ghosts,v=u.misc,V=u.npcs,y=(0,a.useLocalState)(t,"searchText",""),k=y[0],x=y[1],_={},w=d(p);!(n=w()).done;){var B=n.value;_[B.antag]===undefined&&(_[B.antag]=[]),_[B.antag].push(B)}var S=Object.entries(_);S.sort((function(e,t){return f(e[0],t[0])}));return(0,o.createComponentVNode)(2,l.Window,{title:"Orbit",width:350,height:700,children:(0,o.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,c.Section,{children:(0,o.createComponentVNode)(2,c.Flex,{children:[(0,o.createComponentVNode)(2,c.Flex.Item,{children:(0,o.createComponentVNode)(2,c.Icon,{name:"search",mr:1})}),(0,o.createComponentVNode)(2,c.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,c.Input,{placeholder:"Search...",autoFocus:!0,fluid:!0,value:k,onInput:function(e,t){return x(t)},onEnter:function(e,t){return function(e){for(var t=0,n=[S.map((function(e){return e[0],e[1]})),s,N,b,V,v];t<n.length;t++){var o=n[t].filter(m(e)).sort(h)[0];if(o!==undefined){i("orbit",{ref:o.ref});break}}}(t)}})})]})}),p.length>0&&(0,o.createComponentVNode)(2,c.Section,{title:"Ghost-Visible Antagonists",children:S.map((function(e){var t=e[0],n=e[1];return(0,o.createComponentVNode)(2,c.Section,{title:t,level:2,children:n.filter(m(k)).sort(h).map((function(e){return(0,o.createComponentVNode)(2,g,{color:"bad",thing:e},e.name)}))},t)}))}),(0,o.createComponentVNode)(2,c.Section,{title:"Alive",children:s.filter(m(k)).sort(h).map((function(e){return(0,o.createComponentVNode)(2,g,{color:"good",thing:e},e.name)}))}),(0,o.createComponentVNode)(2,C,{title:"Ghosts",source:N,searchText:k}),(0,o.createComponentVNode)(2,C,{title:"Dead",source:b,searchText:k}),(0,o.createComponentVNode)(2,C,{title:"NPCs",source:V,searchText:k}),(0,o.createComponentVNode)(2,C,{title:"Misc",source:v,searchText:k})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.OreBox=void 0;var o=n(0),r=n(19),i=n(3),a=n(1),c=n(2);t.OreBox=function(e,t){var n=(0,a.useBackend)(t),l=n.act,d=n.data.materials;return(0,o.createComponentVNode)(2,c.Window,{width:335,height:415,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Ores",buttons:(0,o.createComponentVNode)(2,i.Button,{content:"Empty",onClick:function(){return l("removeall")}}),children:(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:"Ore"}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,textAlign:"right",children:"Amount"})]}),d.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,r.toTitleCase)(e.name)}),(0,o.createComponentVNode)(2,i.Table.Cell,{collapsing:!0,textAlign:"right",children:(0,o.createComponentVNode)(2,i.Box,{color:"label",inline:!0,children:e.amount})})]},e.type)}))]})}),(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Box,{children:["All ores will be placed in here when you are wearing a mining stachel on your belt or in a pocket while dragging the ore box.",(0,o.createVNode)(1,"br"),"Gibtonite is not accepted."]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.OreRedemptionMachine=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(2);t.OreRedemptionMachine=function(e,t){var n=(0,i.useBackend)(t),r=n.act,d=n.data,u=d.unclaimedPoints,s=d.materials,p=d.alloys,m=d.diskDesigns,f=d.hasDisk;return(0,o.createComponentVNode)(2,c.Window,{title:"Ore Redemption Machine",width:440,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.BlockQuote,{mb:1,children:["This machine only accepts ore.",(0,o.createVNode)(1,"br"),"Gibtonite and Slag are not accepted."]}),(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"label",mr:1,children:"Unclaimed points:"}),u,(0,o.createComponentVNode)(2,a.Button,{ml:2,content:"Claim",disabled:0===u,onClick:function(){return r("Claim")}})]})]}),(0,o.createComponentVNode)(2,a.Section,{children:f&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{mb:1,children:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",content:"Eject design disk",onClick:function(){return r("diskEject")}})}),(0,o.createComponentVNode)(2,a.Table,{children:m.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:["File ",e.index,": ",e.name]}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,children:(0,o.createComponentVNode)(2,a.Button,{disabled:!e.canupload,content:"Upload",onClick:function(){return r("diskUpload",{design:e.index})}})})]},e.index)}))})],4)||(0,o.createComponentVNode)(2,a.Button,{icon:"save",content:"Insert design disk",onClick:function(){return r("diskInsert")}})}),(0,o.createComponentVNode)(2,a.Section,{title:"Materials",children:(0,o.createComponentVNode)(2,a.Table,{children:s.map((function(e){return(0,o.createComponentVNode)(2,l,{material:e,onRelease:function(t){return r("Release",{id:e.id,sheets:t})}},e.id)}))})}),(0,o.createComponentVNode)(2,a.Section,{title:"Alloys",children:(0,o.createComponentVNode)(2,a.Table,{children:p.map((function(e){return(0,o.createComponentVNode)(2,l,{material:e,onRelease:function(t){return r("Smelt",{id:e.id,sheets:t})}},e.id)}))})})]})})};var l=function(e,t){var n=e.material,c=e.onRelease,l=(0,i.useLocalState)(t,"amount"+n.name,1),d=l[0],u=l[1],s=Math.floor(n.amount);return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,r.toTitleCase)(n.name).replace("Alloy","")}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:(0,o.createComponentVNode)(2,a.Box,{mr:2,color:"label",inline:!0,children:n.value&&n.value+" cr"})}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:(0,o.createComponentVNode)(2,a.Box,{mr:2,color:"label",inline:!0,children:[s," sheets"]})}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,children:[(0,o.createComponentVNode)(2,a.NumberInput,{width:"32px",step:1,stepPixelSize:5,minValue:1,maxValue:50,value:d,onChange:function(e,t){return u(t)}}),(0,o.createComponentVNode)(2,a.Button,{disabled:s<1,content:"Release",onClick:function(){return c(d)}})]})]})}},function(e,t,n){"use strict";t.__esModule=!0,t.Pandemic=t.PandemicAntibodyDisplay=t.PandemicSymptomDisplay=t.PandemicDiseaseDisplay=t.PandemicBeakerDisplay=void 0;var o=n(0),r=n(15),i=n(1),a=n(3),c=n(2),l=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data,l=c.has_beaker,d=c.beaker_empty,u=c.has_blood,s=c.blood,p=!l||d;return(0,o.createComponentVNode)(2,a.Section,{title:"Beaker",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"times",content:"Empty and Eject",color:"bad",disabled:p,onClick:function(){return r("empty_eject_beaker")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"trash",content:"Empty",disabled:p,onClick:function(){return r("empty_beaker")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"eject",content:"Eject",disabled:!l,onClick:function(){return r("eject_beaker")}})],4),children:l?d?(0,o.createComponentVNode)(2,a.Box,{color:"bad",children:"Beaker is empty"}):u?(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Blood DNA",children:s&&s.dna||"Unknown"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Blood Type",children:s&&s.type||"Unknown"})]}):(0,o.createComponentVNode)(2,a.Box,{color:"bad",children:"No blood detected"}):(0,o.createComponentVNode)(2,a.NoticeBox,{children:"No beaker loaded"})})};t.PandemicBeakerDisplay=l;var d=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data,l=c.is_ready;return(c.viruses||[]).map((function(e){var t=e.symptoms||[];return(0,o.createComponentVNode)(2,a.Section,{title:e.can_rename?(0,o.createComponentVNode)(2,a.Input,{value:e.name,onChange:function(t,n){return r("rename_disease",{index:e.index,name:n})}}):e.name,buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"flask",content:"Create culture bottle",disabled:!l,onClick:function(){return r("create_culture_bottle",{index:e.index})}}),children:[(0,o.createComponentVNode)(2,a.Grid,{children:[(0,o.createComponentVNode)(2,a.Grid.Column,{children:e.description}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Agent",children:e.agent}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Spread",children:e.spread}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Possible Cure",children:e.cure})]})})]}),!!e.is_adv&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Statistics",level:2,children:(0,o.createComponentVNode)(2,a.Grid,{children:[(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Resistance",children:e.resistance}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Stealth",children:e.stealth})]})}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Stage speed",children:e.stage_speed}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Transmissibility",children:e.transmission})]})})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Symptoms",level:2,children:t.map((function(e){return(0,o.createComponentVNode)(2,a.Collapsible,{title:e.name,children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,u,{symptom:e})})},e.name)}))})],4)]},e.name)}))};t.PandemicDiseaseDisplay=d;var u=function(e,t){var n=e.symptom,i=n.name,c=n.desc,l=n.stealth,d=n.resistance,u=n.stage_speed,s=n.transmission,p=n.level,m=n.neutered,f=(0,r.map)((function(e,t){return{desc:e,label:t}}))(n.threshold_desc||{});return(0,o.createComponentVNode)(2,a.Section,{title:i,level:2,buttons:!!m&&(0,o.createComponentVNode)(2,a.Box,{bold:!0,color:"bad",children:"Neutered"}),children:[(0,o.createComponentVNode)(2,a.Grid,{children:[(0,o.createComponentVNode)(2,a.Grid.Column,{size:2,children:c}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Level",children:p}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Resistance",children:d}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Stealth",children:l}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Stage Speed",children:u}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Transmission",children:s})]})})]}),f.length>0&&(0,o.createComponentVNode)(2,a.Section,{title:"Thresholds",level:3,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:f.map((function(e){return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:e.label,children:e.desc},e.label)}))})})]})};t.PandemicSymptomDisplay=u;var s=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data,l=c.resistances||[];return(0,o.createComponentVNode)(2,a.Section,{title:"Antibodies",children:l.length>0?(0,o.createComponentVNode)(2,a.LabeledList,{children:l.map((function(e){return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:e.name,children:(0,o.createComponentVNode)(2,a.Button,{icon:"eye-dropper",content:"Create vaccine bottle",disabled:!c.is_ready,onClick:function(){return r("create_vaccine_bottle",{index:e.id})}})},e.name)}))}):(0,o.createComponentVNode)(2,a.Box,{bold:!0,color:"bad",mt:1,children:"No antibodies detected."})})};t.PandemicAntibodyDisplay=s;t.Pandemic=function(e,t){var n=(0,i.useBackend)(t).data;return(0,o.createComponentVNode)(2,c.Window,{width:520,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,l),!!n.has_blood&&(0,o.createFragment)([(0,o.createComponentVNode)(2,d),(0,o.createComponentVNode)(2,s)],4)]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.PaperSheet=void 0;var o=n(0),r=n(6),i=n(120),a=s(n(565)),c=s(n(566)),l=n(1),d=n(3),u=n(2);function s(e){return e&&e.__esModule?e:{"default":e}}function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function m(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}function f(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return h(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return h(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}function C(e,t){C=function(e,t){return new i(e,undefined,t)};var n=b(RegExp),o=RegExp.prototype,r=new WeakMap;function i(e,t,o){var i=n.call(this,e,t);return r.set(i,o||r.get(e)),i}function a(e,t){var n=r.get(t);return Object.keys(n).reduce((function(t,o){return t[o]=e[n[o]],t}),Object.create(null))}return g(i,n),i.prototype.exec=function(e){var t=o.exec.call(this,e);return t&&(t.groups=a(t,this)),t},i.prototype[Symbol.replace]=function(e,t){if("string"==typeof t){var n=r.get(this);return o[Symbol.replace].call(this,e,t.replace(/\$<([^>]+)>/g,(function(e,t){return"$"+n[t]})))}if("function"==typeof t){var i=this;return o[Symbol.replace].call(this,e,(function(){var e=[];return e.push.apply(e,arguments),"object"!=typeof e[e.length-1]&&e.push(a(e,i)),t.apply(this,e)}))}return o[Symbol.replace].call(this,e,t)},C.apply(this,arguments)}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&V(e,t)}function b(e){var t="function"==typeof Map?new Map:undefined;return(b=function(e){if(null===e||(n=e,-1===Function.toString.call(n).indexOf("[native code]")))return e;var n;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,o)}function o(){return N(e,arguments,y(this).constructor)}return o.prototype=Object.create(e.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),V(o,e)})(e)}function N(e,t,n){return(N=v()?Reflect.construct:function(e,t,n){var o=[null];o.push.apply(o,t);var r=new(Function.bind.apply(e,o));return n&&V(r,n.prototype),r}).apply(null,arguments)}function v(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}function V(e,t){return(V=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function y(e){return(y=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var k=function(e,t,n,o){return void 0===o&&(o=!1),"<span style=\"color:'"+n+"';font-family:'"+t+"';"+(o?"font-weight: bold;":"")+'">'+e+"</span>"},x=/\[(_+)\]/g,_=C(/\[<input[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+(.*?)id="(paperfield_[0-9]+)"(.*?)\/>\]/gm,{id:2}),w=/%s(?:ign)?(?=\\s|$)/gim,B=function(e,t,n,o,r){var i=e.replace(x,(function(e,i,a,c){var l=function(e,t,n){t=n+"x "+t;var o=document.createElement("canvas").getContext("2d");return o.font=t,o.measureText(e).width}(e,t,n)+"px";return function(e,t,n,o,r,i){return'[<input type="text" style="font:\''+o+"x "+n+"';color:'"+r+"';min-width:"+t+";max-width:"+t+';" id="'+i+'" maxlength='+e+" size="+e+" />]"}(i.length,l,t,n,o,"paperfield_"+r++)}));return{counter:r,text:i}},S=function(e){return e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.cancelBubble=!0,e.returnValue=!1,!1},L=function(e,t){var n=e.image,i=e.opacity,a=(m(e,["image","opacity"]),"rotate("+n.rotate+"deg) translate("+n.x+"px,"+n.y+"px)"),c={transform:a,"-ms-transform":a,"-webkit-transform":a,opacity:i||1,position:"absolute"};return(0,o.createVNode)(1,"div",(0,r.classes)(["paper121x54",n.sprite]),null,1,{style:c})},I=function(e,t){return t?e.replace(/<input\s[^d]/g,"<input disabled "):e.replace(/<input\sdisabled\s/g,"<input ")},T=function(e,t){var n=e.value,i=e.stamps,a=e.backgroundColor,c=e.readOnly,l=(m(e,["value","stamps","backgroundColor","readOnly"]),!(0,r.isFalsy)(c)),u=i||[],s={__html:'<span class="paper-text">'+I(n,l)+"</span>"};return(0,o.createComponentVNode)(2,d.Box,{position:"relative",backgroundColor:a,width:"100%",height:"100%",children:[(0,o.createComponentVNode)(2,d.Box,{fillPositionedParent:!0,width:"100%",height:"100%",dangerouslySetInnerHTML:s,p:"10px"}),u.map((function(e,t){return(0,o.createComponentVNode)(2,L,{image:{sprite:e[0],x:e[1],y:e[2],rotate:e[3]}},e[0]+t)}))]})},A=function(e){function t(t,n){var o;return(o=e.call(this,t,n)||this).state={x:0,y:0,rotate:0},o}p(t,e);var n=t.prototype;return n.findStampPosition=function(e){for(var t=event.pageX,n=event.pageY,o={left:e.target.offsetLeft,top:e.target.offsetTop},r=e.target.offsetParent;r;)o.left+=r.offsetLeft,o.top+=r.offsetTop,r=r.offsetParent;var a=[t-o.left,n-o.top],c=(0,i.vecScale)([121,51],.5);return(0,i.vecSubtract)(a,c)},n.componentDidMount=function(){document.onwheel=this.handleWheel.bind(this)},n.handleMouseMove=function(e){var t=this.findStampPosition(e);S(e),this.setState({x:t[0],y:t[1]})},n.handleMouseClick=function(e){var t=this.findStampPosition(e),n=(0,l.useBackend)(this.context),o=n.act;n.data,o("stamp",{x:t[0],y:t[1],r:this.state.rotate}),this.setState({x:t[0],y:t[1]})},n.handleWheel=function(e){var t=e.deltaY>0?15:-15;if(e.deltaY<0&&0===this.state.rotate)this.setState({rotate:360+t});else if(e.deltaY>0&&360===this.state.rotate)this.setState({rotate:t});else{var n={rotate:t+this.state.rotate};this.setState((function(){return n}))}S(e)},n.render=function(){var e=this.props,t=e.value,n=e.stamp_class,r=e.stamps,i=m(e,["value","stamp_class","stamps"]),a=r||[],c={sprite:n,x:this.state.x,y:this.state.y,rotate:this.state.rotate};return(0,o.normalizeProps)((0,o.createComponentVNode)(2,d.Box,Object.assign({onClick:this.handleMouseClick.bind(this),onMouseMove:this.handleMouseMove.bind(this),onwheel:this.handleWheel.bind(this)},i,{children:[(0,o.createComponentVNode)(2,T,{readOnly:1,value:t,stamps:a}),(0,o.createComponentVNode)(2,L,{opacity:.5,image:c})]})))},t}(o.Component),E=function(e){function t(t,n){var o;return(o=e.call(this,t,n)||this).state={previewSelected:"Preview",old_text:t.value||"",textarea_text:"",combined_text:t.value||""},o}p(t,e);var n=t.prototype;return n.createPreview=function(e,t){void 0===t&&(t=!1);var n,o,r=(0,l.useBackend)(this.context).data,i=r.text,d=r.pen_color,u=r.pen_font,s=r.is_crayon,p=r.field_counter,m=r.edit_usr,h={text:i};if((e=e.trim()).length>0){var C=function(e){return a["default"].sanitize(e,{FORBID_ATTR:["class","style"],ALLOWED_TAGS:["br","code","li","p","pre","span","table","td","tr","th","ul","ol","menu","font","b","center","table","tr","th"]})}(e+="\n"===e[e.length]?" \n":"\n \n"),g=(n=d,o=m,C.replace(w,(function(){return k(o,"Times New Roman",n,!0)}))),b=B(g,u,12,d,p),N=function(e){return(0,c["default"])(e,{breaks:!0,smartypants:!0,smartLists:!0,walkTokens:function(e){switch(e.type){case"url":case"autolink":case"reflink":case"link":case"image":e.type="text",e.href=""}},baseUrl:"thisshouldbreakhttp"})}(b.text),v=k(N,u,d,s);h.text+=v,h.field_counter=b.counter}if(t){var V=function(e,t,n,o,r){var i;void 0===r&&(r=!1);for(var c={},l=[];null!==(i=_.exec(e));){var d=i[0],u=i.groups.id;if(u){var s=document.getElementById(u);if(0===(s&&s.value?s.value:"").length)continue;var p=a["default"].sanitize(s.value.trim(),{ALLOWED_TAGS:[]});if(0===p.length)continue;var m=s.cloneNode(!0);p.match(w)?(m.style.fontFamily="Times New Roman",r=!0,m.defaultValue=o):(m.style.fontFamily=t,m.defaultValue=p),r&&(m.style.fontWeight="bold"),m.style.color=n,m.disabled=!0;var h=document.createElement("div");h.appendChild(m),c[u]=p,l.push({value:"["+h.innerHTML+"]",raw_text:d})}}if(l.length>0)for(var C,g=f(l);!(C=g()).done;){var b=C.value;e=e.replace(b.raw_text,b.value)}return{text:e,fields:c}}(h.text,u,d,m,s);h.text=V.text,h.form_fields=V.fields}return h},n.onInputHandler=function(e,t){var n=this;if(t!==this.state.textarea_text){var o=this.state.old_text.length+this.state.textarea_text.length;if(o>5e3&&(t=o-5e3>=t.length?"":t.substr(0,t.length-(o-5e3)))===this.state.textarea_text)return;this.setState((function(){return{textarea_text:t,combined_text:n.createPreview(t)}}))}},n.finalUpdate=function(e){var t=(0,l.useBackend)(this.context).act,n=this.createPreview(e,!0);t("save",n),this.setState((function(){return{textarea_text:"",previewSelected:"save",combined_text:n.text}}))},n.render=function(){var e=this,t=this.props,n=(t.value,t.textColor),r=t.fontFamily,i=t.stamps,a=t.backgroundColor;return m(t,["value","textColor","fontFamily","stamps","backgroundColor"]),(0,o.createComponentVNode)(2,d.Flex,{direction:"column",fillPositionedParent:!0,children:[(0,o.createComponentVNode)(2,d.Flex.Item,{children:(0,o.createComponentVNode)(2,d.Tabs,{children:[(0,o.createComponentVNode)(2,d.Tabs.Tab,{textColor:"black",backgroundColor:"Edit"===this.state.previewSelected?"grey":"white",selected:"Edit"===this.state.previewSelected,onClick:function(){return e.setState({previewSelected:"Edit"})},children:"Edit"},"marked_edit"),(0,o.createComponentVNode)(2,d.Tabs.Tab,{textColor:"black",backgroundColor:"Preview"===this.state.previewSelected?"grey":"white",selected:"Preview"===this.state.previewSelected,onClick:function(){return e.setState((function(){return{previewSelected:"Preview",textarea_text:e.state.textarea_text,combined_text:e.createPreview(e.state.textarea_text).text}}))},children:"Preview"},"marked_preview"),(0,o.createComponentVNode)(2,d.Tabs.Tab,{textColor:"black",backgroundColor:"confirm"===this.state.previewSelected?"red":"save"===this.state.previewSelected?"grey":"white",selected:"confirm"===this.state.previewSelected||"save"===this.state.previewSelected,onClick:function(){"confirm"===e.state.previewSelected?e.finalUpdate(e.state.textarea_text):"Edit"===e.state.previewSelected?e.setState((function(){return{previewSelected:"confirm",textarea_text:e.state.textarea_text,combined_text:e.createPreview(e.state.textarea_text).text}})):e.setState({previewSelected:"confirm"})},children:"confirm"===this.state.previewSelected?"confirm":"save"},"marked_done")]})}),(0,o.createComponentVNode)(2,d.Flex.Item,{grow:1,basis:1,children:"Edit"===this.state.previewSelected&&(0,o.createComponentVNode)(2,d.TextArea,{value:this.state.textarea_text,textColor:n,fontFamily:r,height:window.innerHeight-80+"px",backgroundColor:a,onInput:this.onInputHandler.bind(this)})||(0,o.createComponentVNode)(2,T,{value:this.state.combined_text,stamps:i,fontFamily:r,textColor:n})})]})},t}(o.Component);t.PaperSheet=function(e,t){var n=(0,l.useBackend)(t).data,r=n.edit_mode,i=n.text,a=n.paper_color,c=n.pen_color,s=void 0===c?"black":c,p=n.pen_font,m=void 0===p?"Verdana":p,f=n.stamps,h=n.stamp_class,C=(n.stamped,a&&"white"!==a?a:"#FFFFFF"),g=f&&null!==f?f:[];return(0,o.createComponentVNode)(2,u.Window,{theme:"paper",width:400,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,u.Window.Content,{children:(0,o.createComponentVNode)(2,d.Box,{fillPositionedParent:!0,backgroundColor:C,children:function(e){switch(e){case 0:return(0,o.createComponentVNode)(2,T,{value:i,stamps:g,readOnly:1});case 1:return(0,o.createComponentVNode)(2,E,{value:i,textColor:s,fontFamily:m,stamps:g,backgroundColor:C});case 2:return(0,o.createComponentVNode)(2,A,{value:i,stamps:g,stamp_class:h});default:return"ERROR ERROR WE CANNOT BE HERE!!"}}(r)})})})}},function(e,t,n){"use strict";e.exports=function(){var e=Object.hasOwnProperty,t=Object.setPrototypeOf,n=Object.isFrozen,o=Object.keys,r=Object.freeze,i=Object.seal,a="undefined"!=typeof Reflect&&Reflect,c=a.apply,l=a.construct;c||(c=function(e,t,n){return e.apply(t,n)}),r||(r=function(e){return e}),i||(i=function(e){return e}),l||(l=function(e,t){return new(Function.prototype.bind.apply(e,[null].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}(t))))});var d=k(Array.prototype.forEach),u=k(Array.prototype.indexOf),s=k(Array.prototype.join),p=k(Array.prototype.pop),m=k(Array.prototype.push),f=k(Array.prototype.slice),h=k(String.prototype.toLowerCase),C=k(String.prototype.match),g=k(String.prototype.replace),b=k(String.prototype.indexOf),N=k(String.prototype.trim),v=k(RegExp.prototype.test),V=x(RegExp),y=x(TypeError);function k(e){return function(t){for(var n=arguments.length,o=Array(n>1?n-1:0),r=1;r<n;r++)o[r-1]=arguments[r];return c(e,t,o)}}function x(e){return function(){for(var t=arguments.length,n=Array(t),o=0;o<t;o++)n[o]=arguments[o];return l(e,n)}}function _(e,o){t&&t(e,null);for(var r=o.length;r--;){var i=o[r];if("string"==typeof i){var a=h(i);a!==i&&(n(o)||(o[r]=a),i=a)}e[i]=!0}return e}function w(t){var n={},o=void 0;for(o in t)c(e,t,[o])&&(n[o]=t[o]);return n}var B=r(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),S=r(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","audio","canvas","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","video","view","vkern"]),L=r(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),I=r(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),T=r(["#text"]),A=r(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns"]),E=r(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","tabindex","targetx","targety","transform","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),M=r(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),P=r(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),R=i(/\{\{[\s\S]*|[\s\S]*\}\}/gm),O=i(/<%[\s\S]*|[\s\S]*%>/gm),F=i(/^data-[\-\w.\u00B7-\uFFFF]/),j=i(/^aria-[\-\w]+$/),D=i(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),z=i(/^(?:\w+script|data):/i),W=i(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g),H="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function U(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var G=function(){return"undefined"==typeof window?null:window},K=function(e,t){if("object"!==(void 0===e?"undefined":H(e))||"function"!=typeof e.createPolicy)return null;var n=null;t.currentScript&&t.currentScript.hasAttribute("data-tt-policy-suffix")&&(n=t.currentScript.getAttribute("data-tt-policy-suffix"));var o="dompurify"+(n?"#"+n:"");try{return e.createPolicy(o,{createHTML:function(e){return e}})}catch(r){return null}};return function q(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:G(),t=function(e){return q(e)};if(t.version="2.0.12",t.removed=[],!e||!e.document||9!==e.document.nodeType)return t.isSupported=!1,t;var n=e.document,i=!1,a=e.document,c=e.DocumentFragment,l=e.HTMLTemplateElement,k=e.Node,x=e.NodeFilter,Y=e.NamedNodeMap,$=Y===undefined?e.NamedNodeMap||e.MozNamedAttrMap:Y,X=e.Text,Q=e.Comment,J=e.DOMParser,Z=e.trustedTypes;if("function"==typeof l){var ee=a.createElement("template");ee.content&&ee.content.ownerDocument&&(a=ee.content.ownerDocument)}var te=K(Z,n),ne=te&&Me?te.createHTML(""):"",oe=a,re=oe.implementation,ie=oe.createNodeIterator,ae=oe.getElementsByTagName,ce=oe.createDocumentFragment,le=n.importNode,de={};t.isSupported=re&&"undefined"!=typeof re.createHTMLDocument&&9!==a.documentMode;var ue=R,se=O,pe=F,me=j,fe=z,he=W,Ce=D,ge=null,be=_({},[].concat(U(B),U(S),U(L),U(I),U(T))),Ne=null,ve=_({},[].concat(U(A),U(E),U(M),U(P))),Ve=null,ye=null,ke=!0,xe=!0,_e=!1,we=!1,Be=!1,Se=!1,Le=!1,Ie=!1,Te=!1,Ae=!1,Ee=!1,Me=!1,Pe=!0,Re=!0,Oe=!1,Fe={},je=_({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","plaintext","script","style","svg","template","thead","title","video","xmp"]),De=null,ze=_({},["audio","video","img","source","image","track"]),We=null,He=_({},["alt","class","for","id","label","name","pattern","placeholder","summary","title","value","style","xmlns"]),Ue=null,Ge=a.createElement("form"),Ke=function(e){Ue&&Ue===e||(e&&"object"===(void 0===e?"undefined":H(e))||(e={}),ge="ALLOWED_TAGS"in e?_({},e.ALLOWED_TAGS):be,Ne="ALLOWED_ATTR"in e?_({},e.ALLOWED_ATTR):ve,We="ADD_URI_SAFE_ATTR"in e?_(w(He),e.ADD_URI_SAFE_ATTR):He,De="ADD_DATA_URI_TAGS"in e?_(w(ze),e.ADD_DATA_URI_TAGS):ze,Ve="FORBID_TAGS"in e?_({},e.FORBID_TAGS):{},ye="FORBID_ATTR"in e?_({},e.FORBID_ATTR):{},Fe="USE_PROFILES"in e&&e.USE_PROFILES,ke=!1!==e.ALLOW_ARIA_ATTR,xe=!1!==e.ALLOW_DATA_ATTR,_e=e.ALLOW_UNKNOWN_PROTOCOLS||!1,we=e.SAFE_FOR_JQUERY||!1,Be=e.SAFE_FOR_TEMPLATES||!1,Se=e.WHOLE_DOCUMENT||!1,Te=e.RETURN_DOM||!1,Ae=e.RETURN_DOM_FRAGMENT||!1,Ee=e.RETURN_DOM_IMPORT||!1,Me=e.RETURN_TRUSTED_TYPE||!1,Ie=e.FORCE_BODY||!1,Pe=!1!==e.SANITIZE_DOM,Re=!1!==e.KEEP_CONTENT,Oe=e.IN_PLACE||!1,Ce=e.ALLOWED_URI_REGEXP||Ce,Be&&(xe=!1),Ae&&(Te=!0),Fe&&(ge=_({},[].concat(U(T))),Ne=[],!0===Fe.html&&(_(ge,B),_(Ne,A)),!0===Fe.svg&&(_(ge,S),_(Ne,E),_(Ne,P)),!0===Fe.svgFilters&&(_(ge,L),_(Ne,E),_(Ne,P)),!0===Fe.mathMl&&(_(ge,I),_(Ne,M),_(Ne,P))),e.ADD_TAGS&&(ge===be&&(ge=w(ge)),_(ge,e.ADD_TAGS)),e.ADD_ATTR&&(Ne===ve&&(Ne=w(Ne)),_(Ne,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&_(We,e.ADD_URI_SAFE_ATTR),Re&&(ge["#text"]=!0),Se&&_(ge,["html","head","body"]),ge.table&&(_(ge,["tbody"]),delete Ve.tbody),r&&r(e),Ue=e)},qe=function(e){m(t.removed,{element:e});try{e.parentNode.removeChild(e)}catch(n){e.outerHTML=ne}},Ye=function(e,n){try{m(t.removed,{attribute:n.getAttributeNode(e),from:n})}catch(o){m(t.removed,{attribute:null,from:n})}n.removeAttribute(e)},$e=function(e){var t=void 0,n=void 0;if(Ie)e="<remove></remove>"+e;else{var o=C(e,/^[\r\n\t ]+/);n=o&&o[0]}var r=te?te.createHTML(e):e;try{t=(new J).parseFromString(r,"text/html")}catch(l){}if(i&&_(Ve,["title"]),!t||!t.documentElement){var c=(t=re.createHTMLDocument("")).body;c.parentNode.removeChild(c.parentNode.firstElementChild),c.outerHTML=r}return e&&n&&t.body.insertBefore(a.createTextNode(n),t.body.childNodes[0]||null),ae.call(t,Se?"html":"body")[0]};t.isSupported&&function(){try{var e=$e("<x/><title></title><img>");v(/<\/title/,e.querySelector("title").innerHTML)&&(i=!0)}catch(t){}}();var Xe=function(e){return ie.call(e.ownerDocument||e,e,x.SHOW_ELEMENT|x.SHOW_COMMENT|x.SHOW_TEXT,(function(){return x.FILTER_ACCEPT}),!1)},Qe=function(e){return!(e instanceof X||e instanceof Q||"string"==typeof e.nodeName&&"string"==typeof e.textContent&&"function"==typeof e.removeChild&&e.attributes instanceof $&&"function"==typeof e.removeAttribute&&"function"==typeof e.setAttribute&&"string"==typeof e.namespaceURI)},Je=function(e){return"object"===(void 0===k?"undefined":H(k))?e instanceof k:e&&"object"===(void 0===e?"undefined":H(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},Ze=function(e,n,o){de[e]&&d(de[e],(function(e){e.call(t,n,o,Ue)}))},et=function(e){var n=void 0;if(Ze("beforeSanitizeElements",e,null),Qe(e))return qe(e),!0;var o=h(e.nodeName);if(Ze("uponSanitizeElement",e,{tagName:o,allowedTags:ge}),("svg"===o||"math"===o)&&0!==e.querySelectorAll("p, br").length)return qe(e),!0;if(!ge[o]||Ve[o]){if(Re&&!je[o]&&"function"==typeof e.insertAdjacentHTML)try{var r=e.innerHTML;e.insertAdjacentHTML("AfterEnd",te?te.createHTML(r):r)}catch(i){}return qe(e),!0}return"noscript"===o&&v(/<\/noscript/i,e.innerHTML)||"noembed"===o&&v(/<\/noembed/i,e.innerHTML)?(qe(e),!0):(!we||e.firstElementChild||e.content&&e.content.firstElementChild||!v(/</g,e.textContent)||(m(t.removed,{element:e.cloneNode()}),e.innerHTML?e.innerHTML=g(e.innerHTML,/</g,"<"):e.innerHTML=g(e.textContent,/</g,"<")),Be&&3===e.nodeType&&(n=e.textContent,n=g(n,ue," "),n=g(n,se," "),e.textContent!==n&&(m(t.removed,{element:e.cloneNode()}),e.textContent=n)),Ze("afterSanitizeElements",e,null),!1)},tt=function(e,t,n){if(Pe&&("id"===t||"name"===t)&&(n in a||n in Ge))return!1;if(xe&&v(pe,t));else if(ke&&v(me,t));else{if(!Ne[t]||ye[t])return!1;if(We[t]);else if(v(Ce,g(n,he,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==b(n,"data:")||!De[e])if(_e&&!v(fe,g(n,he,"")));else if(n)return!1}return!0},nt=function(e){var n=void 0,r=void 0,i=void 0,a=void 0,c=void 0;Ze("beforeSanitizeAttributes",e,null);var l=e.attributes;if(l){var d={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Ne};for(c=l.length;c--;){var m=n=l[c],C=m.name,b=m.namespaceURI;if(r=N(n.value),i=h(C),d.attrName=i,d.attrValue=r,d.keepAttr=!0,d.forceKeepAttr=undefined,Ze("uponSanitizeAttribute",e,d),r=d.attrValue,!d.forceKeepAttr){if("name"===i&&"IMG"===e.nodeName&&l.id)a=l.id,l=f(l,[]),Ye("id",e),Ye(C,e),u(l,a)>c&&e.setAttribute("id",a.value);else{if("INPUT"===e.nodeName&&"type"===i&&"file"===r&&d.keepAttr&&(Ne[i]||!ye[i]))continue;"id"===C&&e.setAttribute(C,""),Ye(C,e)}if(d.keepAttr)if(we&&v(/\/>/i,r))Ye(C,e);else if(v(/svg|math/i,e.namespaceURI)&&v(V("</("+s(o(je),"|")+")","i"),r))Ye(C,e);else{Be&&(r=g(r,ue," "),r=g(r,se," "));var y=e.nodeName.toLowerCase();if(tt(y,i,r))try{b?e.setAttributeNS(b,C,r):e.setAttribute(C,r),p(t.removed)}catch(k){}}}}Ze("afterSanitizeAttributes",e,null)}},ot=function rt(e){var t=void 0,n=Xe(e);for(Ze("beforeSanitizeShadowDOM",e,null);t=n.nextNode();)Ze("uponSanitizeShadowNode",t,null),et(t)||(t.content instanceof c&&rt(t.content),nt(t));Ze("afterSanitizeShadowDOM",e,null)};return t.sanitize=function(o,r){var i=void 0,a=void 0,l=void 0,d=void 0,u=void 0;if(o||(o="\x3c!--\x3e"),"string"!=typeof o&&!Je(o)){if("function"!=typeof o.toString)throw y("toString is not a function");if("string"!=typeof(o=o.toString()))throw y("dirty is not a string, aborting")}if(!t.isSupported){if("object"===H(e.toStaticHTML)||"function"==typeof e.toStaticHTML){if("string"==typeof o)return e.toStaticHTML(o);if(Je(o))return e.toStaticHTML(o.outerHTML)}return o}if(Le||Ke(r),t.removed=[],"string"==typeof o&&(Oe=!1),Oe);else if(o instanceof k)1===(a=(i=$e("\x3c!--\x3e")).ownerDocument.importNode(o,!0)).nodeType&&"BODY"===a.nodeName||"HTML"===a.nodeName?i=a:i.appendChild(a);else{if(!Te&&!Be&&!Se&&-1===o.indexOf("<"))return te&&Me?te.createHTML(o):o;if(!(i=$e(o)))return Te?null:ne}i&&Ie&&qe(i.firstChild);for(var s=Xe(Oe?o:i);l=s.nextNode();)3===l.nodeType&&l===d||et(l)||(l.content instanceof c&&ot(l.content),nt(l),d=l);if(d=null,Oe)return o;if(Te){if(Ae)for(u=ce.call(i.ownerDocument);i.firstChild;)u.appendChild(i.firstChild);else u=i;return Ee&&(u=le.call(n,u,!0)),u}var p=Se?i.outerHTML:i.innerHTML;return Be&&(p=g(p,ue," "),p=g(p,se," ")),te&&Me?te.createHTML(p):p},t.setConfig=function(e){Ke(e),Le=!0},t.clearConfig=function(){Ue=null,Le=!1},t.isValidAttribute=function(e,t,n){Ue||Ke({});var o=h(e),r=h(t);return tt(o,r,n)},t.addHook=function(e,t){"function"==typeof t&&(de[e]=de[e]||[],m(de[e],t))},t.removeHook=function(e){de[e]&&p(de[e])},t.removeHooks=function(e){de[e]&&(de[e]=[])},t.removeAllHooks=function(){de={}},t}()}()},function(e,t,n){"use strict";e.exports=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}function t(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}function n(e,n){var o;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(o=function(e,n){if(e){if("string"==typeof e)return t(e,n);var o=Object.prototype.toString.call(e).slice(8,-1);return"Object"===o&&e.constructor&&(o=e.constructor.name),"Map"===o||"Set"===o?Array.from(e):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?t(e,n):void 0}}(e))||n&&e&&"number"==typeof e.length){o&&(e=o);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(o=e[Symbol.iterator]()).next.bind(o)}var o=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e){function t(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}e.exports={defaults:{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1},getDefaults:t,changeDefaults:function(t){e.exports.defaults=t}}})),r=(o.defaults,o.getDefaults,o.changeDefaults,/[&<>"']/),i=/[&<>"']/g,a=/[<>"']|&(?!#?\w+;)/,c=/[<>"']|&(?!#?\w+;)/g,l={"&":"&","<":"<",">":">",'"':""","'":"'"},d=function(e){return l[e]},u=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function s(e){return e.replace(u,(function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""}))}var p=/(^|[^\[])\^/g,m=/[^\w:]/g,f=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i,h={},C=/^[^:]+:\/*[^/]*$/,g=/^([^:]+:)[\s\S]*$/,b=/^([^:]+:\/*[^/]*)[\s\S]*$/;function N(e,t){h[" "+e]||(C.test(e)?h[" "+e]=e+"/":h[" "+e]=v(e,"/",!0));var n=-1===(e=h[" "+e]).indexOf(":");return"//"===t.substring(0,2)?n?t:e.replace(g,"$1")+t:"/"===t.charAt(0)?n?t:e.replace(b,"$1")+t:e+t}function v(e,t,n){var o=e.length;if(0===o)return"";for(var r=0;r<o;){var i=e.charAt(o-r-1);if(i!==t||n){if(i===t||!n)break;r++}else r++}return e.substr(0,o-r)}var V={escape:function(e,t){if(t){if(r.test(e))return e.replace(i,d)}else if(a.test(e))return e.replace(c,d);return e},unescape:s,edit:function(e,t){e=e.source||e,t=t||"";var n={replace:function(t,o){return o=(o=o.source||o).replace(p,"$1"),e=e.replace(t,o),n},getRegex:function(){return new RegExp(e,t)}};return n},cleanUrl:function(e,t,n){if(e){var o;try{o=decodeURIComponent(s(n)).replace(m,"").toLowerCase()}catch(r){return null}if(0===o.indexOf("javascript:")||0===o.indexOf("vbscript:")||0===o.indexOf("data:"))return null}t&&!f.test(n)&&(n=N(t,n));try{n=encodeURI(n).replace(/%25/g,"%")}catch(r){return null}return n},resolveUrl:N,noopTest:{exec:function(){}},merge:function(e){for(var t,n,o=1;o<arguments.length;o++)for(n in t=arguments[o])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},splitCells:function(e,t){var n=e.replace(/\|/g,(function(e,t,n){for(var o=!1,r=t;--r>=0&&"\\"===n[r];)o=!o;return o?"|":" |"})).split(/ \|/),o=0;if(n.length>t)n.splice(t);else for(;n.length<t;)n.push("");for(;o<n.length;o++)n[o]=n[o].trim().replace(/\\\|/g,"|");return n},rtrim:v,findClosingBracket:function(e,t){if(-1===e.indexOf(t[1]))return-1;for(var n=e.length,o=0,r=0;r<n;r++)if("\\"===e[r])r++;else if(e[r]===t[0])o++;else if(e[r]===t[1]&&--o<0)return r;return-1},checkSanitizeDeprecation:function(e){e&&e.sanitize&&e.silent}},y=o.defaults,k=V.rtrim,x=V.splitCells,_=V.escape,w=V.findClosingBracket;function B(e,t,n){var o=t.href,r=t.title?_(t.title):null,i=e[1].replace(/\\([\[\]])/g,"$1");return"!"!==e[0].charAt(0)?{type:"link",raw:n,href:o,title:r,text:i}:{type:"image",raw:n,href:o,title:r,text:_(i)}}var S=function(){function e(e){this.options=e||y}var t=e.prototype;return t.space=function(e){var t=this.rules.block.newline.exec(e);if(t)return t[0].length>1?{type:"space",raw:t[0]}:{raw:"\n"}},t.code=function(e,t){var n=this.rules.block.code.exec(e);if(n){var o=t[t.length-1];if(o&&"paragraph"===o.type)return{raw:n[0],text:n[0].trimRight()};var r=n[0].replace(/^ {4}/gm,"");return{type:"code",raw:n[0],codeBlockStyle:"indented",text:this.options.pedantic?r:k(r,"\n")}}},t.fences=function(e){var t=this.rules.block.fences.exec(e);if(t){var n=t[0],o=function(e,t){var n=e.match(/^(\s+)(?:```)/);if(null===n)return t;var o=n[1];return t.split("\n").map((function(e){var t=e.match(/^\s+/);return null===t?e:t[0].length>=o.length?e.slice(o.length):e})).join("\n")}(n,t[3]||"");return{type:"code",raw:n,lang:t[2]?t[2].trim():t[2],text:o}}},t.heading=function(e){var t=this.rules.block.heading.exec(e);if(t)return{type:"heading",raw:t[0],depth:t[1].length,text:t[2]}},t.nptable=function(e){var t=this.rules.block.nptable.exec(e);if(t){var n={type:"table",header:x(t[1].replace(/^ *| *\| *$/g,"")),align:t[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:t[3]?t[3].replace(/\n$/,"").split("\n"):[],raw:t[0]};if(n.header.length===n.align.length){var o,r=n.align.length;for(o=0;o<r;o++)/^ *-+: *$/.test(n.align[o])?n.align[o]="right":/^ *:-+: *$/.test(n.align[o])?n.align[o]="center":/^ *:-+ *$/.test(n.align[o])?n.align[o]="left":n.align[o]=null;for(r=n.cells.length,o=0;o<r;o++)n.cells[o]=x(n.cells[o],n.header.length);return n}}},t.hr=function(e){var t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}},t.blockquote=function(e){var t=this.rules.block.blockquote.exec(e);if(t){var n=t[0].replace(/^ *> ?/gm,"");return{type:"blockquote",raw:t[0],text:n}}},t.list=function(e){var t=this.rules.block.list.exec(e);if(t){for(var n,o,r,i,a,c,l,d=t[0],u=t[2],s=u.length>1,p=")"===u[u.length-1],m={type:"list",raw:d,ordered:s,start:s?+u.slice(0,-1):"",loose:!1,items:[]},f=t[0].match(this.rules.block.item),h=!1,C=f.length,g=0;g<C;g++)d=n=f[g],o=n.length,~(n=n.replace(/^ *([*+-]|\d+[.)]) */,"")).indexOf("\n ")&&(o-=n.length,n=this.options.pedantic?n.replace(/^ {1,4}/gm,""):n.replace(new RegExp("^ {1,"+o+"}","gm"),"")),g!==C-1&&(r=this.rules.block.bullet.exec(f[g+1])[0],(s?1===r.length||!p&&")"===r[r.length-1]:r.length>1||this.options.smartLists&&r!==u)&&(i=f.slice(g+1).join("\n"),m.raw=m.raw.substring(0,m.raw.length-i.length),g=C-1)),a=h||/\n\n(?!\s*$)/.test(n),g!==C-1&&(h="\n"===n.charAt(n.length-1),a||(a=h)),a&&(m.loose=!0),c=/^\[[ xX]\] /.test(n),l=undefined,c&&(l=" "!==n[1],n=n.replace(/^\[[ xX]\] +/,"")),m.items.push({type:"list_item",raw:d,task:c,checked:l,loose:a,text:n});return m}},t.html=function(e){var t=this.rules.block.html.exec(e);if(t)return{type:this.options.sanitize?"paragraph":"html",raw:t[0],pre:!this.options.sanitizer&&("pre"===t[1]||"script"===t[1]||"style"===t[1]),text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(t[0]):_(t[0]):t[0]}},t.def=function(e){var t=this.rules.block.def.exec(e);if(t)return t[3]&&(t[3]=t[3].substring(1,t[3].length-1)),{tag:t[1].toLowerCase().replace(/\s+/g," "),raw:t[0],href:t[2],title:t[3]}},t.table=function(e){var t=this.rules.block.table.exec(e);if(t){var n={type:"table",header:x(t[1].replace(/^ *| *\| *$/g,"")),align:t[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:t[3]?t[3].replace(/\n$/,"").split("\n"):[]};if(n.header.length===n.align.length){n.raw=t[0];var o,r=n.align.length;for(o=0;o<r;o++)/^ *-+: *$/.test(n.align[o])?n.align[o]="right":/^ *:-+: *$/.test(n.align[o])?n.align[o]="center":/^ *:-+ *$/.test(n.align[o])?n.align[o]="left":n.align[o]=null;for(r=n.cells.length,o=0;o<r;o++)n.cells[o]=x(n.cells[o].replace(/^ *\| *| *\| *$/g,""),n.header.length);return n}}},t.lheading=function(e){var t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:"="===t[2].charAt(0)?1:2,text:t[1]}},t.paragraph=function(e){var t=this.rules.block.paragraph.exec(e);if(t)return{type:"paragraph",raw:t[0],text:"\n"===t[1].charAt(t[1].length-1)?t[1].slice(0,-1):t[1]}},t.text=function(e,t){var n=this.rules.block.text.exec(e);if(n){var o=t[t.length-1];return o&&"text"===o.type?{raw:n[0],text:n[0]}:{type:"text",raw:n[0],text:n[0]}}},t.escape=function(e){var t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:_(t[1])}},t.tag=function(e,t,n){var o=this.rules.inline.tag.exec(e);if(o)return!t&&/^<a /i.test(o[0])?t=!0:t&&/^<\/a>/i.test(o[0])&&(t=!1),!n&&/^<(pre|code|kbd|script)(\s|>)/i.test(o[0])?n=!0:n&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(o[0])&&(n=!1),{type:this.options.sanitize?"text":"html",raw:o[0],inLink:t,inRawBlock:n,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(o[0]):_(o[0]):o[0]}},t.link=function(e){var t=this.rules.inline.link.exec(e);if(t){var n=w(t[2],"()");if(n>-1){var o=(0===t[0].indexOf("!")?5:4)+t[1].length+n;t[2]=t[2].substring(0,n),t[0]=t[0].substring(0,o).trim(),t[3]=""}var r=t[2],i="";if(this.options.pedantic){var a=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(r);a?(r=a[1],i=a[3]):i=""}else i=t[3]?t[3].slice(1,-1):"";return B(t,{href:(r=r.trim().replace(/^<([\s\S]*)>$/,"$1"))?r.replace(this.rules.inline._escapes,"$1"):r,title:i?i.replace(this.rules.inline._escapes,"$1"):i},t[0])}},t.reflink=function(e,t){var n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){var o=(n[2]||n[1]).replace(/\s+/g," ");if(!(o=t[o.toLowerCase()])||!o.href){var r=n[0].charAt(0);return{type:"text",raw:r,text:r}}return B(n,o,n[0])}},t.strong=function(e,t,n){void 0===n&&(n="");var o=this.rules.inline.strong.start.exec(e);if(o&&(!o[1]||o[1]&&(""===n||this.rules.inline.punctuation.exec(n)))){t=t.slice(-1*e.length);var r,i="**"===o[0]?this.rules.inline.strong.endAst:this.rules.inline.strong.endUnd;for(i.lastIndex=0;null!=(o=i.exec(t));)if(r=this.rules.inline.strong.middle.exec(t.slice(0,o.index+3)))return{type:"strong",raw:e.slice(0,r[0].length),text:e.slice(2,r[0].length-2)}}},t.em=function(e,t,n){void 0===n&&(n="");var o=this.rules.inline.em.start.exec(e);if(o&&(!o[1]||o[1]&&(""===n||this.rules.inline.punctuation.exec(n)))){t=t.slice(-1*e.length);var r,i="*"===o[0]?this.rules.inline.em.endAst:this.rules.inline.em.endUnd;for(i.lastIndex=0;null!=(o=i.exec(t));)if(r=this.rules.inline.em.middle.exec(t.slice(0,o.index+2)))return{type:"em",raw:e.slice(0,r[0].length),text:e.slice(1,r[0].length-1)}}},t.codespan=function(e){var t=this.rules.inline.code.exec(e);if(t){var n=t[2].replace(/\n/g," "),o=/[^ ]/.test(n),r=n.startsWith(" ")&&n.endsWith(" ");return o&&r&&(n=n.substring(1,n.length-1)),n=_(n,!0),{type:"codespan",raw:t[0],text:n}}},t.br=function(e){var t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}},t.del=function(e){var t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[1]}},t.autolink=function(e,t){var n,o,r=this.rules.inline.autolink.exec(e);if(r)return o="@"===r[2]?"mailto:"+(n=_(this.options.mangle?t(r[1]):r[1])):n=_(r[1]),{type:"link",raw:r[0],text:n,href:o,tokens:[{type:"text",raw:n,text:n}]}},t.url=function(e,t){var n;if(n=this.rules.inline.url.exec(e)){var o,r;if("@"===n[2])r="mailto:"+(o=_(this.options.mangle?t(n[0]):n[0]));else{var i;do{i=n[0],n[0]=this.rules.inline._backpedal.exec(n[0])[0]}while(i!==n[0]);o=_(n[0]),r="www."===n[1]?"http://"+o:o}return{type:"link",raw:n[0],text:o,href:r,tokens:[{type:"text",raw:o,text:o}]}}},t.inlineText=function(e,t,n){var o,r=this.rules.inline.text.exec(e);if(r)return o=t?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(r[0]):_(r[0]):r[0]:_(this.options.smartypants?n(r[0]):r[0]),{type:"text",raw:r[0],text:o}},e}(),L=V.noopTest,I=V.edit,T=V.merge,A={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6}) +([^\n]*?)(?: +#+)? *(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|<![A-Z][\\s\\S]*?>\\n*|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:L,table:L,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};A.def=I(A.def).replace("label",A._label).replace("title",A._title).getRegex(),A.bullet=/(?:[*+-]|\d{1,9}[.)])/,A.item=/^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/,A.item=I(A.item,"gm").replace(/bull/g,A.bullet).getRegex(),A.list=I(A.list).replace(/bull/g,A.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+A.def.source+")").getRegex(),A._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",A._comment=/<!--(?!-?>)[\s\S]*?-->/,A.html=I(A.html,"i").replace("comment",A._comment).replace("tag",A._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),A.paragraph=I(A._paragraph).replace("hr",A.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",A._tag).getRegex(),A.blockquote=I(A.blockquote).replace("paragraph",A.paragraph).getRegex(),A.normal=T({},A),A.gfm=T({},A.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n *([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n *\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),A.gfm.nptable=I(A.gfm.nptable).replace("hr",A.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",A._tag).getRegex(),A.gfm.table=I(A.gfm.table).replace("hr",A.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",A._tag).getRegex(),A.pedantic=T({},A.normal,{html:I("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",A._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,fences:L,paragraph:I(A.normal._paragraph).replace("hr",A.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",A.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var E={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:L,tag:"^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",strong:{start:/^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/,middle:/^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,endAst:/[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation\s]|$))/,endUnd:/[^\s]__(?!_)(?:(?=[punctuation\s])|$)/},em:{start:/^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/,middle:/^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,endAst:/[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation\s]|$))/,endUnd:/[^\s]_(?!_)(?:(?=[punctuation\s])|$)/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:L,text:/^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n))|(?= {2,}\n))/,punctuation:/^([\s*punctuation])/,_punctuation:"!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~"};E.punctuation=I(E.punctuation).replace(/punctuation/g,E._punctuation).getRegex(),E._blockSkip="\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>",E._overlapSkip="__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*",E.em.start=I(E.em.start).replace(/punctuation/g,E._punctuation).getRegex(),E.em.middle=I(E.em.middle).replace(/punctuation/g,E._punctuation).replace(/overlapSkip/g,E._overlapSkip).getRegex(),E.em.endAst=I(E.em.endAst,"g").replace(/punctuation/g,E._punctuation).getRegex(),E.em.endUnd=I(E.em.endUnd,"g").replace(/punctuation/g,E._punctuation).getRegex(),E.strong.start=I(E.strong.start).replace(/punctuation/g,E._punctuation).getRegex(),E.strong.middle=I(E.strong.middle).replace(/punctuation/g,E._punctuation).replace(/blockSkip/g,E._blockSkip).getRegex(),E.strong.endAst=I(E.strong.endAst,"g").replace(/punctuation/g,E._punctuation).getRegex(),E.strong.endUnd=I(E.strong.endUnd,"g").replace(/punctuation/g,E._punctuation).getRegex(),E.blockSkip=I(E._blockSkip,"g").getRegex(),E.overlapSkip=I(E._overlapSkip,"g").getRegex(),E._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,E._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,E._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,E.autolink=I(E.autolink).replace("scheme",E._scheme).replace("email",E._email).getRegex(),E._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,E.tag=I(E.tag).replace("comment",A._comment).replace("attribute",E._attribute).getRegex(),E._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,E._href=/<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*/,E._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,E.link=I(E.link).replace("label",E._label).replace("href",E._href).replace("title",E._title).getRegex(),E.reflink=I(E.reflink).replace("label",E._label).getRegex(),E.reflinkSearch=I(E.reflinkSearch,"g").replace("reflink",E.reflink).replace("nolink",E.nolink).getRegex(),E.normal=T({},E),E.pedantic=T({},E.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:I(/^!?\[(label)\]\((.*?)\)/).replace("label",E._label).getRegex(),reflink:I(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",E._label).getRegex()}),E.gfm=T({},E.normal,{escape:I(E.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~+(?=\S)([\s\S]*?\S)~+/,text:/^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?= {2,}\n|[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/}),E.gfm.url=I(E.gfm.url,"i").replace("email",E.gfm._extended_email).getRegex(),E.breaks=T({},E.gfm,{br:I(E.br).replace("{2,}","*").getRegex(),text:I(E.gfm.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()});var M={block:A,inline:E},P=o.defaults,R=M.block,O=M.inline;function F(e){return e.replace(/---/g,"\u2014").replace(/--/g,"\u2013").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1\u2018").replace(/'/g,"\u2019").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1\u201c").replace(/"/g,"\u201d").replace(/\.{3}/g,"\u2026")}function j(e){var t,n,o="",r=e.length;for(t=0;t<r;t++)n=e.charCodeAt(t),Math.random()>.5&&(n="x"+n.toString(16)),o+="&#"+n+";";return o}var D=function(){function t(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||P,this.options.tokenizer=this.options.tokenizer||new S,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options;var t={block:R.normal,inline:O.normal};this.options.pedantic?(t.block=R.pedantic,t.inline=O.pedantic):this.options.gfm&&(t.block=R.gfm,this.options.breaks?t.inline=O.breaks:t.inline=O.gfm),this.tokenizer.rules=t}t.lex=function(e,n){return new t(n).lex(e)};var n,o,r,i=t.prototype;return i.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," "),this.blockTokens(e,this.tokens,!0),this.inline(this.tokens),this.tokens},i.blockTokens=function(e,t,n){var o,r,i,a;for(void 0===t&&(t=[]),void 0===n&&(n=!0),e=e.replace(/^ +$/gm,"");e;)if(o=this.tokenizer.space(e))e=e.substring(o.raw.length),o.type&&t.push(o);else if(o=this.tokenizer.code(e,t))e=e.substring(o.raw.length),o.type?t.push(o):((a=t[t.length-1]).raw+="\n"+o.raw,a.text+="\n"+o.text);else if(o=this.tokenizer.fences(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.heading(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.nptable(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.hr(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.blockquote(e))e=e.substring(o.raw.length),o.tokens=this.blockTokens(o.text,[],n),t.push(o);else if(o=this.tokenizer.list(e)){for(e=e.substring(o.raw.length),i=o.items.length,r=0;r<i;r++)o.items[r].tokens=this.blockTokens(o.items[r].text,[],!1);t.push(o)}else if(o=this.tokenizer.html(e))e=e.substring(o.raw.length),t.push(o);else if(n&&(o=this.tokenizer.def(e)))e=e.substring(o.raw.length),this.tokens.links[o.tag]||(this.tokens.links[o.tag]={href:o.href,title:o.title});else if(o=this.tokenizer.table(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.lheading(e))e=e.substring(o.raw.length),t.push(o);else if(n&&(o=this.tokenizer.paragraph(e)))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.text(e,t))e=e.substring(o.raw.length),o.type?t.push(o):((a=t[t.length-1]).raw+="\n"+o.raw,a.text+="\n"+o.text);else if(e){var c="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent)break;throw new Error(c)}return t},i.inline=function(e){var t,n,o,r,i,a,c=e.length;for(t=0;t<c;t++)switch((a=e[t]).type){case"paragraph":case"text":case"heading":a.tokens=[],this.inlineTokens(a.text,a.tokens);break;case"table":for(a.tokens={header:[],cells:[]},r=a.header.length,n=0;n<r;n++)a.tokens.header[n]=[],this.inlineTokens(a.header[n],a.tokens.header[n]);for(r=a.cells.length,n=0;n<r;n++)for(i=a.cells[n],a.tokens.cells[n]=[],o=0;o<i.length;o++)a.tokens.cells[n][o]=[],this.inlineTokens(i[o],a.tokens.cells[n][o]);break;case"blockquote":this.inline(a.tokens);break;case"list":for(r=a.items.length,n=0;n<r;n++)this.inline(a.items[n].tokens)}return e},i.inlineTokens=function(e,t,n,o,r){var i;void 0===t&&(t=[]),void 0===n&&(n=!1),void 0===o&&(o=!1),void 0===r&&(r="");var a,c=e;if(this.tokens.links){var l=Object.keys(this.tokens.links);if(l.length>0)for(;null!=(a=this.tokenizer.rules.inline.reflinkSearch.exec(c));)l.includes(a[0].slice(a[0].lastIndexOf("[")+1,-1))&&(c=c.slice(0,a.index)+"["+"a".repeat(a[0].length-2)+"]"+c.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(a=this.tokenizer.rules.inline.blockSkip.exec(c));)c=c.slice(0,a.index)+"["+"a".repeat(a[0].length-2)+"]"+c.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;e;)if(i=this.tokenizer.escape(e))e=e.substring(i.raw.length),t.push(i);else if(i=this.tokenizer.tag(e,n,o))e=e.substring(i.raw.length),n=i.inLink,o=i.inRawBlock,t.push(i);else if(i=this.tokenizer.link(e))e=e.substring(i.raw.length),"link"===i.type&&(i.tokens=this.inlineTokens(i.text,[],!0,o)),t.push(i);else if(i=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(i.raw.length),"link"===i.type&&(i.tokens=this.inlineTokens(i.text,[],!0,o)),t.push(i);else if(i=this.tokenizer.strong(e,c,r))e=e.substring(i.raw.length),i.tokens=this.inlineTokens(i.text,[],n,o),t.push(i);else if(i=this.tokenizer.em(e,c,r))e=e.substring(i.raw.length),i.tokens=this.inlineTokens(i.text,[],n,o),t.push(i);else if(i=this.tokenizer.codespan(e))e=e.substring(i.raw.length),t.push(i);else if(i=this.tokenizer.br(e))e=e.substring(i.raw.length),t.push(i);else if(i=this.tokenizer.del(e))e=e.substring(i.raw.length),i.tokens=this.inlineTokens(i.text,[],n,o),t.push(i);else if(i=this.tokenizer.autolink(e,j))e=e.substring(i.raw.length),t.push(i);else if(n||!(i=this.tokenizer.url(e,j))){if(i=this.tokenizer.inlineText(e,o,F))e=e.substring(i.raw.length),r=i.raw.slice(-1),t.push(i);else if(e){var d="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent)break;throw new Error(d)}}else e=e.substring(i.raw.length),t.push(i);return t},n=t,r=[{key:"rules",get:function(){return{block:R,inline:O}}}],(o=null)&&e(n.prototype,o),r&&e(n,r),t}(),z=o.defaults,W=V.cleanUrl,H=V.escape,U=function(){function e(e){this.options=e||z}var t=e.prototype;return t.code=function(e,t,n){var o=(t||"").match(/\S*/)[0];if(this.options.highlight){var r=this.options.highlight(e,o);null!=r&&r!==e&&(n=!0,e=r)}return o?'<pre><code class="'+this.options.langPrefix+H(o,!0)+'">'+(n?e:H(e,!0))+"</code></pre>\n":"<pre><code>"+(n?e:H(e,!0))+"</code></pre>\n"},t.blockquote=function(e){return"<blockquote>\n"+e+"</blockquote>\n"},t.html=function(e){return e},t.heading=function(e,t,n,o){return this.options.headerIds?"<h"+t+' id="'+this.options.headerPrefix+o.slug(n)+'">'+e+"</h"+t+">\n":"<h"+t+">"+e+"</h"+t+">\n"},t.hr=function(){return this.options.xhtml?"<hr/>\n":"<hr>\n"},t.list=function(e,t,n){var o=t?"ol":"ul";return"<"+o+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"</"+o+">\n"},t.listitem=function(e){return"<li>"+e+"</li>\n"},t.checkbox=function(e){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"'+(this.options.xhtml?" /":"")+"> "},t.paragraph=function(e){return"<p>"+e+"</p>\n"},t.table=function(e,t){return t&&(t="<tbody>"+t+"</tbody>"),"<table>\n<thead>\n"+e+"</thead>\n"+t+"</table>\n"},t.tablerow=function(e){return"<tr>\n"+e+"</tr>\n"},t.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+"</"+n+">\n"},t.strong=function(e){return"<strong>"+e+"</strong>"},t.em=function(e){return"<em>"+e+"</em>"},t.codespan=function(e){return"<code>"+e+"</code>"},t.br=function(){return this.options.xhtml?"<br/>":"<br>"},t.del=function(e){return"<del>"+e+"</del>"},t.link=function(e,t,n){if(null===(e=W(this.options.sanitize,this.options.baseUrl,e)))return n;var o='<a href="'+H(e)+'"';return t&&(o+=' title="'+t+'"'),o+=">"+n+"</a>"},t.image=function(e,t,n){if(null===(e=W(this.options.sanitize,this.options.baseUrl,e)))return n;var o='<img src="'+e+'" alt="'+n+'"';return t&&(o+=' title="'+t+'"'),o+=this.options.xhtml?"/>":">"},t.text=function(e){return e},e}(),G=function(){function e(){}var t=e.prototype;return t.strong=function(e){return e},t.em=function(e){return e},t.codespan=function(e){return e},t.del=function(e){return e},t.html=function(e){return e},t.text=function(e){return e},t.link=function(e,t,n){return""+n},t.image=function(e,t,n){return""+n},t.br=function(){return""},e}(),K=function(){function e(){this.seen={}}return e.prototype.slug=function(e){var t=e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-");if(this.seen.hasOwnProperty(t)){var n=t;do{this.seen[n]++,t=n+"-"+this.seen[n]}while(this.seen.hasOwnProperty(t))}return this.seen[t]=0,t},e}(),q=o.defaults,Y=V.unescape,$=function(){function e(e){this.options=e||q,this.options.renderer=this.options.renderer||new U,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new G,this.slugger=new K}e.parse=function(t,n){return new e(n).parse(t)};var t=e.prototype;return t.parse=function(e,t){void 0===t&&(t=!0);var n,o,r,i,a,c,l,d,u,s,p,m,f,h,C,g,b,N,v="",V=e.length;for(n=0;n<V;n++)switch((s=e[n]).type){case"space":continue;case"hr":v+=this.renderer.hr();continue;case"heading":v+=this.renderer.heading(this.parseInline(s.tokens),s.depth,Y(this.parseInline(s.tokens,this.textRenderer)),this.slugger);continue;case"code":v+=this.renderer.code(s.text,s.lang,s.escaped);continue;case"table":for(d="",l="",i=s.header.length,o=0;o<i;o++)l+=this.renderer.tablecell(this.parseInline(s.tokens.header[o]),{header:!0,align:s.align[o]});for(d+=this.renderer.tablerow(l),u="",i=s.cells.length,o=0;o<i;o++){for(l="",a=(c=s.tokens.cells[o]).length,r=0;r<a;r++)l+=this.renderer.tablecell(this.parseInline(c[r]),{header:!1,align:s.align[r]});u+=this.renderer.tablerow(l)}v+=this.renderer.table(d,u);continue;case"blockquote":u=this.parse(s.tokens),v+=this.renderer.blockquote(u);continue;case"list":for(p=s.ordered,m=s.start,f=s.loose,i=s.items.length,u="",o=0;o<i;o++)g=(C=s.items[o]).checked,b=C.task,h="",C.task&&(N=this.renderer.checkbox(g),f?C.tokens.length>0&&"text"===C.tokens[0].type?(C.tokens[0].text=N+" "+C.tokens[0].text,C.tokens[0].tokens&&C.tokens[0].tokens.length>0&&"text"===C.tokens[0].tokens[0].type&&(C.tokens[0].tokens[0].text=N+" "+C.tokens[0].tokens[0].text)):C.tokens.unshift({type:"text",text:N}):h+=N),h+=this.parse(C.tokens,f),u+=this.renderer.listitem(h,b,g);v+=this.renderer.list(u,p,m);continue;case"html":v+=this.renderer.html(s.text);continue;case"paragraph":v+=this.renderer.paragraph(this.parseInline(s.tokens));continue;case"text":for(u=s.tokens?this.parseInline(s.tokens):s.text;n+1<V&&"text"===e[n+1].type;)u+="\n"+((s=e[++n]).tokens?this.parseInline(s.tokens):s.text);v+=t?this.renderer.paragraph(u):u;continue;default:var y='Token with "'+s.type+'" type was not found.';if(this.options.silent)return;throw new Error(y)}return v},t.parseInline=function(e,t){t=t||this.renderer;var n,o,r="",i=e.length;for(n=0;n<i;n++)switch((o=e[n]).type){case"escape":r+=t.text(o.text);break;case"html":r+=t.html(o.text);break;case"link":r+=t.link(o.href,o.title,this.parseInline(o.tokens,t));break;case"image":r+=t.image(o.href,o.title,o.text);break;case"strong":r+=t.strong(this.parseInline(o.tokens,t));break;case"em":r+=t.em(this.parseInline(o.tokens,t));break;case"codespan":r+=t.codespan(o.text);break;case"br":r+=t.br();break;case"del":r+=t.del(this.parseInline(o.tokens,t));break;case"text":r+=t.text(o.text);break;default:var a='Token with "'+o.type+'" type was not found.';if(this.options.silent)return;throw new Error(a)}return r},e}(),X=V.merge,Q=V.checkSanitizeDeprecation,J=V.escape,Z=o.getDefaults,ee=o.changeDefaults,te=o.defaults;function ne(e,t,n){if(null==e)throw new Error("marked(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");if("function"==typeof t&&(n=t,t=null),t=X({},ne.defaults,t||{}),Q(t),n){var o,r=t.highlight;try{o=D.lex(e,t)}catch(l){return n(l)}var i=function(e){var i;if(!e)try{i=$.parse(o,t)}catch(l){e=l}return t.highlight=r,e?n(e):n(null,i)};if(!r||r.length<3)return i();if(delete t.highlight,!o.length)return i();var a=0;return ne.walkTokens(o,(function(e){"code"===e.type&&(a++,setTimeout((function(){r(e.text,e.lang,(function(t,n){if(t)return i(t);null!=n&&n!==e.text&&(e.text=n,e.escaped=!0),0==--a&&i()}))}),0))})),void(0===a&&i())}try{var c=D.lex(e,t);return t.walkTokens&&ne.walkTokens(c,t.walkTokens),$.parse(c,t)}catch(l){if(l.message+="\nPlease report this to https://github.com/markedjs/marked.",t.silent)return"<p>An error occurred:</p><pre>"+J(l.message+"",!0)+"</pre>";throw l}}return ne.options=ne.setOptions=function(e){return X(ne.defaults,e),ee(ne.defaults),ne},ne.getDefaults=Z,ne.defaults=te,ne.use=function(e){var t=X({},e);if(e.renderer&&function(){var n=ne.defaults.renderer||new U,o=function(t){var o=n[t];n[t]=function(){for(var r=arguments.length,i=new Array(r),a=0;a<r;a++)i[a]=arguments[a];var c=e.renderer[t].apply(n,i);return!1===c&&(c=o.apply(n,i)),c}};for(var r in e.renderer)o(r);t.renderer=n}(),e.tokenizer&&function(){var n=ne.defaults.tokenizer||new S,o=function(t){var o=n[t];n[t]=function(){for(var r=arguments.length,i=new Array(r),a=0;a<r;a++)i[a]=arguments[a];var c=e.tokenizer[t].apply(n,i);return!1===c&&(c=o.apply(n,i)),c}};for(var r in e.tokenizer)o(r);t.tokenizer=n}(),e.walkTokens){var n=ne.defaults.walkTokens;t.walkTokens=function(t){e.walkTokens(t),n&&n(t)}}ne.setOptions(t)},ne.walkTokens=function(e,t){for(var o,r=n(e);!(o=r()).done;){var i=o.value;switch(t(i),i.type){case"table":for(var a,c=n(i.tokens.header);!(a=c()).done;){var l=a.value;ne.walkTokens(l,t)}for(var d,u=n(i.tokens.cells);!(d=u()).done;)for(var s,p=n(d.value);!(s=p()).done;){var m=s.value;ne.walkTokens(m,t)}break;case"list":ne.walkTokens(i.items,t);break;default:i.tokens&&ne.walkTokens(i.tokens,t)}}},ne.Parser=$,ne.parser=$.parse,ne.Renderer=U,ne.TextRenderer=G,ne.Lexer=D,ne.lexer=D.lex,ne.Tokenizer=S,ne.Slugger=K,ne.parse=ne,ne}()},function(e,t,n){"use strict";t.__esModule=!0,t.ParticleAccelerator=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ParticleAccelerator=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.assembled,u=l.power,s=l.strength;return(0,o.createComponentVNode)(2,a.Window,{width:350,height:185,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Run Scan",onClick:function(){return c("scan")}}),children:(0,o.createComponentVNode)(2,i.Box,{color:d?"good":"bad",children:d?"Ready - All parts in place":"Unable to detect all parts"})})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Particle Accelerator Controls",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,i.Button,{icon:u?"power-off":"times",content:u?"On":"Off",selected:u,disabled:!d,onClick:function(){return c("power")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Particle Strength",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"backward",disabled:!d,onClick:function(){return c("remove_strength")}})," ",String(s).padStart(1,"0")," ",(0,o.createComponentVNode)(2,i.Button,{icon:"forward",disabled:!d,onClick:function(){return c("add_strength")}})]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.PersonalCrafting=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return l(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return l(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}t.PersonalCrafting=function(e,t){for(var n,l=(0,r.useBackend)(t),u=l.act,s=l.data,p=s.busy,m=s.display_craftable_only,f=s.display_compact,h=s.crafting_recipes||{},C=[],g=[],b=0,N=Object.keys(h);b<N.length;b++){var v=N[b],V=h[v];if("has_subcats"in V)for(var y=0,k=Object.keys(V);y<k.length;y++){var x=k[y];if("has_subcats"!==x){C.push({name:x,category:v,subcategory:x});for(var _,w=c(V[x]);!(_=w()).done;){var B=_.value;g.push(Object.assign({},B,{category:x}))}}}else{C.push({name:v,category:v});for(var S,L=c(h[v]);!(S=L()).done;){var I=S.value;g.push(Object.assign({},I,{category:v}))}}}var T=(0,r.useLocalState)(t,"tab",null==(n=C[0])?void 0:n.name),A=T[0],E=T[1],M=g.filter((function(e){return e.category===A}));return(0,o.createComponentVNode)(2,a.Window,{title:"Crafting Menu",width:700,height:800,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[!!p&&(0,o.createComponentVNode)(2,i.Dimmer,{fontSize:"32px",children:[(0,o.createComponentVNode)(2,i.Icon,{name:"cog",spin:1})," Crafting..."]}),(0,o.createComponentVNode)(2,i.Section,{title:"Personal Crafting",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button.Checkbox,{content:"Compact",checked:f,onClick:function(){return u("toggle_compact")}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{content:"Craftable Only",checked:m,onClick:function(){return u("toggle_recipes")}})],4),children:(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Tabs,{vertical:!0,children:C.map((function(e){return(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:e.name===A,onClick:function(){E(e.name),u("set_category",{category:e.category,subcategory:e.subcategory})},children:e.name},e.name)}))})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,d,{craftables:M})})]})})]})})};var d=function(e,t){var n=e.craftables,a=void 0===n?[]:n,c=(0,r.useBackend)(t),l=c.act,d=c.data,u=d.craftability,s=void 0===u?{}:u,p=d.display_compact,m=d.display_craftable_only;return a.map((function(e){return m&&!s[e.ref]?null:p?(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,className:"candystripe",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"cog",content:"Craft",disabled:!s[e.ref],tooltip:e.tool_text&&"Tools needed: "+e.tool_text,tooltipPosition:"left",onClick:function(){return l("make",{recipe:e.ref})}}),children:e.req_text},e.name):(0,o.createComponentVNode)(2,i.Section,{title:e.name,level:2,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"cog",content:"Craft",disabled:!s[e.ref],onClick:function(){return l("make",{recipe:e.ref})}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[!!e.req_text&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Required",children:e.req_text}),!!e.catalyst_text&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Catalyst",children:e.catalyst_text}),!!e.tool_text&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Tools",children:e.tool_text})]})},e.name)}))}},function(e,t,n){"use strict";t.__esModule=!0,t.PortableChemMixer=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(2),l=n(15);t.PortableChemMixer=function(e,t){var n=(0,i.useBackend)(t),d=n.act,u=n.data,s=!!u.recordingRecipe,p=u.beakerTransferAmounts||[],m=s&&Object.keys(u.recordingRecipe).map((function(e){return{id:e,name:(0,r.toTitleCase)(e.replace(/_/," ")),volume:u.recordingRecipe[e]}}))||u.beakerContents||[],f=(0,l.sortBy)((function(e){return e.title}))(u.chemicals);return(0,o.createComponentVNode)(2,c.Window,{width:645,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{title:"Dispense",buttons:p.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{icon:"plus",selected:e===u.amount,content:e,onClick:function(){return d("amount",{target:e})}},e)})),children:(0,o.createComponentVNode)(2,a.Box,{mr:-1,children:f.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{icon:"tint",width:"150px",lineHeight:"21px",content:"("+e.volume+") "+e.title,onClick:function(){return d("dispense",{reagent:e.id})}},e.id)}))})}),(0,o.createComponentVNode)(2,a.Section,{title:"Disposal controls",buttons:p.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{icon:"minus",disabled:s,content:e,onClick:function(){return d("remove",{amount:e})}},e)})),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Beaker",buttons:!!u.isBeakerLoaded&&(0,o.createComponentVNode)(2,a.Button,{icon:"eject",content:"Eject",disabled:!u.isBeakerLoaded,onClick:function(){return d("eject")}}),children:(s?"Virtual beaker":u.isBeakerLoaded&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.AnimatedNumber,{initial:0,value:u.beakerCurrentVolume}),(0,o.createTextVNode)("/"),u.beakerMaxVolume,(0,o.createTextVNode)(" units")],0))||"No beaker"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Contents",children:[(0,o.createComponentVNode)(2,a.Box,{color:"label",children:u.isBeakerLoaded||s?0===m.length&&"Nothing":"N/A"}),m.map((function(e){return(0,o.createComponentVNode)(2,a.Box,{color:"label",children:[(0,o.createComponentVNode)(2,a.AnimatedNumber,{initial:0,value:e.volume})," ","units of ",e.name]},e.name)}))]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.PortableGenerator=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.PortableGenerator=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.stack_percent,u=(d>50?"good":d>15&&"average")||"bad";return(0,o.createComponentVNode)(2,a.Window,{width:450,height:340,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[!l.anchored&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Generator not anchored."}),(0,o.createComponentVNode)(2,i.Section,{title:"Status",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power switch",children:(0,o.createComponentVNode)(2,i.Button,{icon:l.active?"power-off":"times",onClick:function(){return c("toggle_power")},disabled:!l.ready_to_boot,children:l.active?"On":"Off"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:l.sheet_name+" sheets",children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:u,children:l.sheets}),l.sheets>=1&&(0,o.createComponentVNode)(2,i.Button,{ml:1,icon:"eject",disabled:l.active,onClick:function(){return c("eject")},children:"Eject"})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current sheet level",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:l.stack_percent/100,ranges:{good:[.1,Infinity],average:[.01,.1],bad:[-Infinity,.01]}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Heat level",children:l.current_heat<100?(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"good",children:"Nominal"}):l.current_heat<200?(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"average",children:"Caution"}):(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"bad",children:"DANGER"})})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Output",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current output",children:l.power_output}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Adjust output",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"minus",onClick:function(){return c("lower_power")},children:l.power_generated}),(0,o.createComponentVNode)(2,i.Button,{icon:"plus",onClick:function(){return c("higher_power")},children:l.power_generated})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power available",children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:!l.connected&&"bad",children:l.connected?l.power_available:"Unconnected"})})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.PortablePump=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(186);t.PortablePump=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.direction,s=(d.holding,d.target_pressure),p=d.default_pressure,m=d.min_pressure,f=d.max_pressure;return(0,o.createComponentVNode)(2,a.Window,{width:300,height:315,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,c.PortableBasicInfo),(0,o.createComponentVNode)(2,i.Section,{title:"Pump",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u?"sign-in-alt":"sign-out-alt",content:u?"In":"Out",selected:u,onClick:function(){return l("direction")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Output",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:s,unit:"kPa",width:"75px",minValue:m,maxValue:f,step:10,onChange:function(e,t){return l("pressure",{pressure:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Presets",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"minus",disabled:s===m,onClick:function(){return l("pressure",{pressure:"min"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"sync",disabled:s===p,onClick:function(){return l("pressure",{pressure:"reset"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"plus",disabled:s===f,onClick:function(){return l("pressure",{pressure:"max"})}})]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.PortableScrubber=void 0;var o=n(0),r=n(1),i=n(3),a=n(34),c=n(2),l=n(186);t.PortableScrubber=function(e,t){var n=(0,r.useBackend)(t),d=n.act,u=n.data.filter_types||[];return(0,o.createComponentVNode)(2,c.Window,{width:320,height:350,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,l.PortableBasicInfo),(0,o.createComponentVNode)(2,i.Section,{title:"Filters",children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{icon:e.enabled?"check-square-o":"square-o",content:(0,a.getGasLabel)(e.gas_id,e.gas_name),selected:e.enabled,onClick:function(){return d("toggle_filter",{val:e.gas_id})}},e.id)}))})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.PortableTurret=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.PortableTurret=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.silicon_user,u=l.locked,s=l.on,p=l.check_weapons,m=l.neutralize_criminals,f=l.neutralize_all,h=l.neutralize_unidentified,C=l.neutralize_nonmindshielded,g=l.neutralize_cyborgs,b=l.ignore_heads,N=l.manual_control,v=l.allow_manual_control,V=l.lasertag_turret;return(0,o.createComponentVNode)(2,a.Window,{width:305,height:V?110:300,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.NoticeBox,{children:["Swipe an ID card to ",u?"unlock":"lock"," this interface."]}),(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",buttons:!V&&(!!v||!!N&&!!d)&&(0,o.createComponentVNode)(2,i.Button,{icon:N?"wifi":"terminal",content:N?"Remotely Controlled":"Manual Control",disabled:N,color:"bad",onClick:function(){return c("manual")}}),children:(0,o.createComponentVNode)(2,i.Button,{icon:s?"power-off":"times",content:s?"On":"Off",selected:s,disabled:u,onClick:function(){return c("power")}})})})}),!V&&(0,o.createComponentVNode)(2,i.Section,{title:"Target Settings",buttons:(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:b,content:"Ignore Heads",disabled:u,onClick:function(){return c("shootheads")}}),children:[(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,checked:f,content:"Non-Security and Non-Command",disabled:u,onClick:function(){return c("shootall")}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,checked:p,content:"Unauthorized Weapons",disabled:u,onClick:function(){return c("authweapon")}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,checked:h,content:"Unidentified Life Signs",disabled:u,onClick:function(){return c("checkxenos")}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,checked:C,content:"Non-Mindshielded",disabled:u,onClick:function(){return c("checkloyal")}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,checked:m,content:"Wanted Criminals",disabled:u,onClick:function(){return c("shootcriminals")}}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,checked:g,content:"Cyborgs",disabled:u,onClick:function(){return c("shootborgs")}})]})],0)]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ProbingConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ProbingConsole=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.open,u=l.feedback,s=l.occupant,p=l.occupant_name,m=l.occupant_status;return(0,o.createComponentVNode)(2,a.Window,{width:330,height:207,theme:"abductor",children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Machine Report",children:u})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Scanner",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:d?"sign-out-alt":"sign-in-alt",content:d?"Close":"Open",onClick:function(){return c("door")}}),children:s&&(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",children:p}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",color:3===m?"bad":2===m?"average":"good",children:3===m?"Deceased":2===m?"Unconcious":"Concious"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Experiments",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"thermometer",content:"Probe",onClick:function(){return c("experiment",{experiment_type:1})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"brain",content:"Dissect",onClick:function(){return c("experiment",{experiment_type:2})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"search",content:"Analyze",onClick:function(){return c("experiment",{experiment_type:3})}})]})]})||(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No Subject"})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ProximitySensor=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.ProximitySensor=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.minutes,u=l.seconds,s=l.timing,p=l.scanning,m=l.sensitivity;return(0,o.createComponentVNode)(2,a.Window,{width:250,height:185,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:(0,o.createComponentVNode)(2,i.Button,{icon:p?"lock":"unlock",content:p?"Armed":"Not Armed",selected:p,onClick:function(){return c("scanning")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Detection Range",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"backward",disabled:p,onClick:function(){return c("sense",{range:-1})}})," ",String(m).padStart(1,"1")," ",(0,o.createComponentVNode)(2,i.Button,{icon:"forward",disabled:p,onClick:function(){return c("sense",{range:1})}})]})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Auto Arm",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"clock-o",content:s?"Stop":"Start",selected:s,disabled:p,onClick:function(){return c("time")}}),children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",disabled:p||s,onClick:function(){return c("input",{adjust:-30})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"backward",disabled:p||s,onClick:function(){return c("input",{adjust:-1})}})," ",String(d).padStart(2,"0"),":",String(u).padStart(2,"0")," ",(0,o.createComponentVNode)(2,i.Button,{icon:"forward",disabled:p||s,onClick:function(){return c("input",{adjust:1})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",disabled:p||s,onClick:function(){return c("input",{adjust:30})}})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Radio=void 0;var o=n(0),r=n(15),i=n(16),a=n(1),c=n(3),l=n(34),d=n(2);t.Radio=function(e,t){var n=(0,a.useBackend)(t),u=n.act,s=n.data,p=s.freqlock,m=s.frequency,f=s.minFrequency,h=s.maxFrequency,C=s.listening,g=s.broadcasting,b=s.command,N=s.useCommand,v=s.subspace,V=s.subspaceSwitchable,y=l.RADIO_CHANNELS.find((function(e){return e.freq===m})),k=(0,r.map)((function(e,t){return{name:t,status:!!e}}))(s.channels),x=106;return v&&(k.length>0?x+=21*k.length+6:x+=24),(0,o.createComponentVNode)(2,d.Window,{width:360,height:x,children:(0,o.createComponentVNode)(2,d.Window.Content,{children:(0,o.createComponentVNode)(2,c.Section,{children:(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Frequency",children:[p&&(0,o.createComponentVNode)(2,c.Box,{inline:!0,color:"light-gray",children:(0,i.toFixed)(m/10,1)+" kHz"})||(0,o.createComponentVNode)(2,c.NumberInput,{animate:!0,unit:"kHz",step:.2,stepPixelSize:10,minValue:f/10,maxValue:h/10,value:m/10,format:function(e){return(0,i.toFixed)(e,1)},onDrag:function(e,t){return u("frequency",{adjust:t-m/10})}}),y&&(0,o.createComponentVNode)(2,c.Box,{inline:!0,color:y.color,ml:2,children:["[",y.name,"]"]})]}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Audio",children:[(0,o.createComponentVNode)(2,c.Button,{textAlign:"center",width:"37px",icon:C?"volume-up":"volume-mute",selected:C,onClick:function(){return u("listen")}}),(0,o.createComponentVNode)(2,c.Button,{textAlign:"center",width:"37px",icon:g?"microphone":"microphone-slash",selected:g,onClick:function(){return u("broadcast")}}),!!b&&(0,o.createComponentVNode)(2,c.Button,{ml:1,icon:"bullhorn",selected:N,content:"High volume "+(N?"ON":"OFF"),onClick:function(){return u("command")}}),!!V&&(0,o.createComponentVNode)(2,c.Button,{ml:1,icon:"bullhorn",selected:v,content:"Subspace Tx "+(v?"ON":"OFF"),onClick:function(){return u("subspace")}})]}),!!v&&(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Channels",children:[0===k.length&&(0,o.createComponentVNode)(2,c.Box,{inline:!0,color:"bad",children:"No encryption keys installed."}),k.map((function(e){return(0,o.createComponentVNode)(2,c.Box,{children:(0,o.createComponentVNode)(2,c.Button,{icon:e.status?"check-square-o":"square-o",selected:e.status,content:e.name,onClick:function(){return u("channel",{channel:e.name})}})},e.name)}))]})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.RadioactiveMicrolaser=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.RadioactiveMicrolaser=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.irradiate,u=l.stealth,s=l.scanmode,p=l.intensity,m=l.wavelength,f=l.on_cooldown,h=l.cooldown;return(0,o.createComponentVNode)(2,a.Window,{title:"Radioactive Microlaser",width:320,height:335,theme:"syndicate",children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Laser Status",children:(0,o.createComponentVNode)(2,i.Box,{color:f?"average":"good",children:f?"Recharging":"Ready"})})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Scanner Controls",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Irradiation",children:(0,o.createComponentVNode)(2,i.Button,{icon:d?"power-off":"times",content:d?"On":"Off",selected:d,onClick:function(){return c("irradiate")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Stealth Mode",children:(0,o.createComponentVNode)(2,i.Button,{icon:u?"eye-slash":"eye",content:u?"On":"Off",disabled:!d,selected:u,onClick:function(){return c("stealth")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Scan Mode",children:(0,o.createComponentVNode)(2,i.Button,{icon:s?"mortar-pestle":"heartbeat",content:s?"Scan Reagents":"Scan Health",disabled:d&&u,onClick:function(){return c("scanmode")}})})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Laser Settings",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Radiation Intensity",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",onClick:function(){return c("radintensity",{adjust:-5})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"backward",onClick:function(){return c("radintensity",{adjust:-1})}})," ",(0,o.createComponentVNode)(2,i.NumberInput,{value:Math.round(p),width:"40px",minValue:1,maxValue:20,onChange:function(e,t){return c("radintensity",{target:t})}})," ",(0,o.createComponentVNode)(2,i.Button,{icon:"forward",onClick:function(){return c("radintensity",{adjust:1})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",onClick:function(){return c("radintensity",{adjust:5})}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Radiation Wavelength",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",onClick:function(){return c("radwavelength",{adjust:-5})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"backward",onClick:function(){return c("radwavelength",{adjust:-1})}})," ",(0,o.createComponentVNode)(2,i.NumberInput,{value:Math.round(m),width:"40px",minValue:0,maxValue:120,onChange:function(e,t){return c("radwavelength",{target:t})}})," ",(0,o.createComponentVNode)(2,i.Button,{icon:"forward",onClick:function(){return c("radwavelength",{adjust:1})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",onClick:function(){return c("radwavelength",{adjust:5})}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Laser Cooldown",children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,children:h})})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.RapidPipeDispenser=void 0;var o=n(0),r=n(6),i=n(1),a=n(3),c=n(2),l=["Atmospherics","Disposals","Transit Tubes"],d={Atmospherics:"wrench",Disposals:"trash-alt","Transit Tubes":"bus",Pipes:"grip-lines","Disposal Pipes":"grip-lines",Devices:"microchip","Heat Exchange":"thermometer-half","Station Equipment":"microchip"},u={grey:"#bbbbbb",amethyst:"#a365ff",blue:"#4466ff",brown:"#b26438",cyan:"#48eae8",dark:"#808080",green:"#1edd00",orange:"#ffa030",purple:"#b535ea",red:"#ff3333",violet:"#6e00f6",yellow:"#ffce26"},s=[{name:"Dispense",bitmask:1},{name:"Connect",bitmask:2},{name:"Destroy",bitmask:4},{name:"Paint",bitmask:8}];t.RapidPipeDispenser=function(e,t){var n=(0,i.useBackend)(t),p=n.act,m=n.data,f=m.category,h=m.categories,C=void 0===h?[]:h,g=m.selected_color,b=m.piping_layer,N=m.mode,v=m.preview_rows.flatMap((function(e){return e.previews})),V=(0,i.useLocalState)(t,"categoryName"),y=V[0],k=V[1],x=C.find((function(e){return e.cat_name===y}))||C[0];return(0,o.createComponentVNode)(2,c.Window,{width:425,height:515,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Category",children:l.map((function(e,t){return(0,o.createComponentVNode)(2,a.Button,{selected:f===t,icon:d[e],color:"transparent",content:e,onClick:function(){return p("category",{category:t})}},e)}))}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Modes",children:s.map((function(e){return(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:N&e.bitmask,content:e.name,onClick:function(){return p("mode",{mode:e.bitmask})}},e.bitmask)}))}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Color",children:[(0,o.createComponentVNode)(2,a.Box,{inline:!0,width:"64px",color:u[g],children:g}),Object.keys(u).map((function(e){return(0,o.createComponentVNode)(2,a.ColorBox,{ml:1,color:u[e],onClick:function(){return p("color",{paint_color:e})}},e)}))]})]})}),(0,o.createComponentVNode)(2,a.Flex,{m:-.5,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{m:.5,children:(0,o.createComponentVNode)(2,a.Section,{children:[0===f&&(0,o.createComponentVNode)(2,a.Box,{mb:1,children:[1,2,3].map((function(e){return(0,o.createComponentVNode)(2,a.Button.Checkbox,{fluid:!0,checked:e===b,content:"Layer "+e,onClick:function(){return p("piping_layer",{piping_layer:e})}},e)}))}),(0,o.createComponentVNode)(2,a.Box,{width:"108px",children:v.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{title:e.dir_name,selected:e.selected,style:{width:"48px",height:"48px",padding:0},onClick:function(){return p("setdir",{dir:e.dir,flipped:e.flipped})},children:(0,o.createComponentVNode)(2,a.Box,{className:(0,r.classes)(["pipes32x32",e.dir+"-"+e.icon_state]),style:{transform:"scale(1.5) translate(17%, 17%)"}})},e.dir)}))})]})}),(0,o.createComponentVNode)(2,a.Flex.Item,{m:.5,grow:1,children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Tabs,{children:C.map((function(e,t){return(0,o.createComponentVNode)(2,a.Tabs.Tab,{fluid:!0,icon:d[e.cat_name],selected:e.cat_name===x.cat_name,onClick:function(){return k(e.cat_name)},children:e.cat_name},e.cat_name)}))}),null==x?void 0:x.recipes.map((function(e){return(0,o.createComponentVNode)(2,a.Button.Checkbox,{fluid:!0,ellipsis:!0,checked:e.selected,content:e.pipe_name,title:e.pipe_name,onClick:function(){return p("pipe_type",{pipe_type:e.pipe_index,category:x.cat_name})}},e.pipe_index)}))]})})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.RemoteRobotControlContent=t.RemoteRobotControl=void 0;var o=n(0),r=n(19),i=n(1),a=n(3),c=n(2);t.RemoteRobotControl=function(e,t){return(0,o.createComponentVNode)(2,c.Window,{title:"Remote Robot Control",width:500,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,l)})})};var l=function(e,t){var n=(0,i.useBackend)(t),c=n.act,l=n.data.robots,d=void 0===l?[]:l;return d.length?d.map((function(e){return(0,o.createComponentVNode)(2,a.Section,{title:e.name+" ("+e.model+")",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"tools",content:"Interface",onClick:function(){return c("interface",{ref:e.ref})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"phone-alt",content:"Call",onClick:function(){return c("callbot",{ref:e.ref})}})],4),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Status",children:[(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"Inactive"===(0,r.decodeHtmlEntities)(e.mode)?"bad":"Idle"===(0,r.decodeHtmlEntities)(e.mode)?"average":"good",children:(0,r.decodeHtmlEntities)(e.mode)})," ",e.hacked&&(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"bad",children:"(HACKED)"})||""]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Location",children:e.location})]})},e.ref)})):(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.NoticeBox,{textAlign:"center",children:"No robots detected"})})};t.RemoteRobotControlContent=l},function(e,t,n){"use strict";t.__esModule=!0,t.RoboticsControlConsole=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.RoboticsControlConsole=function(e,t){var n=(0,r.useBackend)(t),d=(n.act,n.data),u=(0,r.useSharedState)(t,"tab",1),s=u[0],p=u[1],m=d.can_hack,f=d.cyborgs,h=void 0===f?[]:f,C=d.drones,g=void 0===C?[]:C;return(0,o.createComponentVNode)(2,a.Window,{width:500,height:460,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,i.Tabs,{children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{icon:"list",lineHeight:"23px",selected:1===s,onClick:function(){return p(1)},children:["Cyborgs (",h.length,")"]}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{icon:"list",lineHeight:"23px",selected:2===s,onClick:function(){return p(2)},children:["Drones (",g.length,")"]})]}),1===s&&(0,o.createComponentVNode)(2,c,{cyborgs:h,can_hack:m}),2===s&&(0,o.createComponentVNode)(2,l,{drones:g})]})})};var c=function(e,t){var n=e.cyborgs,a=e.can_hack,c=(0,r.useBackend)(t),l=c.act;c.data;return n.length?n.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name,buttons:(0,o.createFragment)([!!a&&!e.emagged&&(0,o.createComponentVNode)(2,i.Button,{icon:"terminal",content:"Hack",color:"bad",onClick:function(){return l("magbot",{ref:e.ref})}}),(0,o.createComponentVNode)(2,i.Button.Confirm,{icon:e.locked_down?"unlock":"lock",color:e.locked_down?"good":"default",content:e.locked_down?"Release":"Lockdown",onClick:function(){return l("stopbot",{ref:e.ref})}}),(0,o.createComponentVNode)(2,i.Button.Confirm,{icon:"bomb",content:"Detonate",color:"bad",onClick:function(){return l("killbot",{ref:e.ref})}})],0),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:(0,o.createComponentVNode)(2,i.Box,{color:e.status?"bad":e.locked_down?"average":"good",children:e.status?"Not Responding":e.locked_down?"Locked Down":"Nominal"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Charge",children:(0,o.createComponentVNode)(2,i.Box,{color:e.charge<=30?"bad":e.charge<=70?"average":"good",children:"number"==typeof e.charge?e.charge+"%":"Not Found"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Module",children:e.module}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Master AI",children:(0,o.createComponentVNode)(2,i.Box,{color:e.synchronization?"default":"average",children:e.synchronization||"None"})})]})},e.ref)})):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No cyborg units detected within access parameters"})},l=function(e,t){var n=e.drones,a=(0,r.useBackend)(t).act;return n.length?n.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name,buttons:(0,o.createComponentVNode)(2,i.Button.Confirm,{icon:"bomb",content:"Detonate",color:"bad",onClick:function(){return a("killdrone",{ref:e.ref})}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:(0,o.createComponentVNode)(2,i.Box,{color:e.status?"bad":"good",children:e.status?"Not Responding":"Nominal"})})})},e.ref)})):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No drone units detected within access parameters"})}},function(e,t,n){"use strict";t.__esModule=!0,t.Roulette=t.RouletteBetTable=t.RouletteBoard=t.RouletteNumberButton=void 0;var o=n(0),r=n(6),i=n(1),a=n(3),c=n(2),l=function(e){if(0===e)return"green";for(var t=[[1,10],[19,28]],n=!0,o=0;o<t.length;o++){var r=t[o];if(e>=r[0]&&e<=r[1]){n=!1;break}}var i=e%2==0;return(n?i:!i)?"red":"black"},d=function(e,t){var n=e.number,r=(0,i.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Button,{bold:!0,content:n,color:l(n),width:"40px",height:"28px",fontSize:"20px",textAlign:"center",mb:0,className:"Roulette__board-extrabutton",onClick:function(){return r("ChangeBetType",{type:n})}})};t.RouletteNumberButton=d;var u=function(e,t){var n=(0,i.useBackend)(t).act;return(0,o.createVNode)(1,"table","Table",[(0,o.createVNode)(1,"tr","Roulette__board-row",[(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{content:"0",color:"transparent",height:"88px",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:0})}}),2,{rowSpan:"3"}),[3,6,9,12,15,18,21,24,27,30,33,36].map((function(e){return(0,o.createVNode)(1,"td","Roulette__board-cell Table__cell-collapsing",(0,o.createComponentVNode)(2,d,{number:e}),2,null,e)})),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"2 to 1",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s3rd col"})}}),2)],0),(0,o.createVNode)(1,"tr",null,[[2,5,8,11,14,17,20,23,26,29,32,35].map((function(e){return(0,o.createVNode)(1,"td","Roulette__board-cell Table__cell-collapsing",(0,o.createComponentVNode)(2,d,{number:e}),2,null,e)})),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"2 to 1",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s2nd col"})}}),2)],0),(0,o.createVNode)(1,"tr",null,[[1,4,7,10,13,16,19,22,25,28,31,34].map((function(e){return(0,o.createVNode)(1,"td","Roulette__board-cell Table__cell-collapsing",(0,o.createComponentVNode)(2,d,{number:e}),2,null,e)})),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"2 to 1",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s1st col"})}}),2)],0),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td"),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"1st 12",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s1-12"})}}),2,{colSpan:"4"}),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"2nd 12",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s13-24"})}}),2,{colSpan:"4"}),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"3rd 12",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s25-36"})}}),2,{colSpan:"4"})],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td"),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"1-18",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s1-18"})}}),2,{colSpan:"2"}),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"Even",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"even"})}}),2,{colSpan:"2"}),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"Black",color:"black",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"black"})}}),2,{colSpan:"2"}),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"Red",color:"red",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"red"})}}),2,{colSpan:"2"}),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"Odd",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"odd"})}}),2,{colSpan:"2"}),(0,o.createVNode)(1,"td","Roulette__board-cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,bold:!0,content:"19-36",color:"transparent",className:"Roulette__board-extrabutton",onClick:function(){return n("ChangeBetType",{type:"s19-36"})}}),2,{colSpan:"2"})],4)],4,{style:{width:"1px"}})};t.RouletteBoard=u;var s=function(e,t){var n=(0,i.useBackend)(t),c=n.act,d=n.data,u=(0,i.useLocalState)(t,"customBet",500),s=u[0],p=u[1],m=d.BetType;return m.startsWith("s")&&(m=m.substring(1,m.length)),(0,o.createVNode)(1,"table","Roulette__lowertable",[(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"th",(0,r.classes)(["Roulette","Roulette__lowertable--cell","Roulette__lowertable--header"]),"Last Spun:",16),(0,o.createVNode)(1,"th",(0,r.classes)(["Roulette","Roulette__lowertable--cell","Roulette__lowertable--header"]),"Current Bet:",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",(0,r.classes)(["Roulette","Roulette__lowertable--cell","Roulette__lowertable--spinresult","Roulette__lowertable--spinresult-"+l(d.LastSpin)]),d.LastSpin,0),(0,o.createVNode)(1,"td",(0,r.classes)(["Roulette","Roulette__lowertable--cell","Roulette__lowertable--betscell"]),[(0,o.createComponentVNode)(2,a.Box,{bold:!0,mt:1,mb:1,fontSize:"25px",textAlign:"center",children:[d.BetAmount," cr on ",m]}),(0,o.createComponentVNode)(2,a.Box,{ml:1,mr:1,children:[(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:"Bet 10 cr",onClick:function(){return c("ChangeBetAmount",{amount:10})}}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:"Bet 50 cr",onClick:function(){return c("ChangeBetAmount",{amount:50})}}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:"Bet 100 cr",onClick:function(){return c("ChangeBetAmount",{amount:100})}}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:"Bet 500 cr",onClick:function(){return c("ChangeBetAmount",{amount:500})}}),(0,o.createComponentVNode)(2,a.Grid,{children:[(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:"Bet custom amount...",onClick:function(){return c("ChangeBetAmount",{amount:s})}})}),(0,o.createComponentVNode)(2,a.Grid.Column,{size:.1,children:(0,o.createComponentVNode)(2,a.NumberInput,{value:s,minValue:0,maxValue:1e3,step:10,stepPixelSize:4,width:"40px",onChange:function(e,t){return p(t)}})})]})]})],4)],4),(0,o.createVNode)(1,"tr",null,(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,a.Box,{bold:!0,m:1,fontSize:"14px",textAlign:"center",children:"Swipe an ID card with a connected account to spin!"}),2,{colSpan:"2"}),2),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td","Roulette__lowertable--cell",[(0,o.createComponentVNode)(2,a.Box,{inline:!0,bold:!0,mr:1,children:"House Balance:"}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:d.HouseBalance?d.HouseBalance+" cr":"None"})],4),(0,o.createVNode)(1,"td","Roulette__lowertable--cell",(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:d.IsAnchored?"Bolted":"Unbolted",m:1,color:"transparent",textAlign:"center",onClick:function(){return c("anchor")}}),2)],4)],4)};t.RouletteBetTable=s;t.Roulette=function(e,t){return(0,o.createComponentVNode)(2,c.Window,{width:603,height:475,theme:"cardtable",children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,u),(0,o.createComponentVNode)(2,s)]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SatelliteControl=void 0;var o=n(0),r=n(1),i=n(3),a=n(175),c=n(2);t.SatelliteControl=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.satellites||[];return(0,o.createComponentVNode)(2,c.Window,{width:400,height:305,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[d.meteor_shield&&(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledListItem,{label:"Coverage",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:d.meteor_shield_coverage/d.meteor_shield_coverage_max,content:100*d.meteor_shield_coverage/d.meteor_shield_coverage_max+"%",ranges:{good:[1,Infinity],average:[.3,1],bad:[-Infinity,.3]}})})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Satellite Controls",children:(0,o.createComponentVNode)(2,i.Box,{mr:-1,children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:e.active,content:"#"+e.id+" "+e.mode,onClick:function(){return l("toggle",{id:e.id})}},e.id)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ScannerGate=void 0;var o=n(0),r=n(1),i=n(3),a=n(61),c=n(2),l=["Positive","Harmless","Minor","Medium","Harmful","Dangerous","BIOHAZARD"],d=[{name:"Human",value:"human"},{name:"Lizardperson",value:"lizard"},{name:"Flyperson",value:"fly"},{name:"Felinid",value:"felinid"},{name:"Plasmaman",value:"plasma"},{name:"Mothperson",value:"moth"},{name:"Jellyperson",value:"jelly"},{name:"Podperson",value:"pod"},{name:"Golem",value:"golem"},{name:"Zombie",value:"zombie"}],u=[{name:"Starving",value:150},{name:"Obese",value:600}];t.ScannerGate=function(e,t){var n=(0,r.useBackend)(t),i=n.act,l=n.data;return(0,o.createComponentVNode)(2,c.Window,{width:400,height:300,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.InterfaceLockNoticeBox,{onLockedStatusChange:function(){return i("toggle_lock")}}),!l.locked&&(0,o.createComponentVNode)(2,p)]})})};var s={Off:{title:"Scanner Mode: Off",component:function(){return m}},Wanted:{title:"Scanner Mode: Wanted",component:function(){return f}},Guns:{title:"Scanner Mode: Guns",component:function(){return h}},Mindshield:{title:"Scanner Mode: Mindshield",component:function(){return C}},Disease:{title:"Scanner Mode: Disease",component:function(){return g}},Species:{title:"Scanner Mode: Species",component:function(){return b}},Nutrition:{title:"Scanner Mode: Nutrition",component:function(){return N}},Nanites:{title:"Scanner Mode: Nanites",component:function(){return v}}},p=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data.scan_mode,l=s[c]||s.off,d=l.component();return(0,o.createComponentVNode)(2,i.Section,{title:l.title,buttons:"Off"!==c&&(0,o.createComponentVNode)(2,i.Button,{icon:"arrow-left",content:"back",onClick:function(){return a("set_mode",{new_mode:"Off"})}}),children:(0,o.createComponentVNode)(2,d)})},m=function(e,t){var n=(0,r.useBackend)(t).act;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:"Select a scanning mode below."}),(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.Button,{content:"Wanted",onClick:function(){return n("set_mode",{new_mode:"Wanted"})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Guns",onClick:function(){return n("set_mode",{new_mode:"Guns"})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Mindshield",onClick:function(){return n("set_mode",{new_mode:"Mindshield"})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Disease",onClick:function(){return n("set_mode",{new_mode:"Disease"})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Species",onClick:function(){return n("set_mode",{new_mode:"Species"})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Nutrition",onClick:function(){return n("set_mode",{new_mode:"Nutrition"})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Nanites",onClick:function(){return n("set_mode",{new_mode:"Nanites"})}})]})],4)},f=function(e,t){var n=(0,r.useBackend)(t).data.reverse;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:["Trigger if the person scanned ",n?"does not have":"has"," ","any warrants for their arrest."]}),(0,o.createComponentVNode)(2,V)],4)},h=function(e,t){var n=(0,r.useBackend)(t).data.reverse;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:["Trigger if the person scanned ",n?"does not have":"has"," ","any guns."]}),(0,o.createComponentVNode)(2,V)],4)},C=function(e,t){var n=(0,r.useBackend)(t).data.reverse;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:["Trigger if the person scanned ",n?"does not have":"has"," ","a mindshield."]}),(0,o.createComponentVNode)(2,V)],4)},g=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,d=c.reverse,u=c.disease_threshold;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:["Trigger if the person scanned ",d?"does not have":"has"," ","a disease equal or worse than ",u,"."]}),(0,o.createComponentVNode)(2,i.Box,{mb:2,children:l.map((function(e){return(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:e===u,content:e,onClick:function(){return a("set_disease_threshold",{new_threshold:e})}},e)}))}),(0,o.createComponentVNode)(2,V)],4)},b=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.reverse,u=c.target_species,s=d.find((function(e){return e.value===u}));return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:["Trigger if the person scanned is ",l?"not":""," ","of the ",s.name," species.","zombie"===u&&" All zombie types will be detected, including dormant zombies."]}),(0,o.createComponentVNode)(2,i.Box,{mb:2,children:d.map((function(e){return(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:e.value===u,content:e.name,onClick:function(){return a("set_target_species",{new_species:e.value})}},e.value)}))}),(0,o.createComponentVNode)(2,V)],4)},N=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.reverse,d=c.target_nutrition,s=u.find((function(e){return e.value===d}));return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:["Trigger if the person scanned ",l?"does not have":"has"," ","the ",s.name," nutrition level."]}),(0,o.createComponentVNode)(2,i.Box,{mb:2,children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:e.value===d,content:e.name,onClick:function(){return a("set_target_nutrition",{new_nutrition:e.name})}},e.name)}))}),(0,o.createComponentVNode)(2,V)],4)},v=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.reverse,d=c.nanite_cloud;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{mb:2,children:["Trigger if the person scanned ",l?"does not have":"has"," ","nanite cloud ",d,"."]}),(0,o.createComponentVNode)(2,i.Box,{mb:2,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cloud ID",children:(0,o.createComponentVNode)(2,i.NumberInput,{value:d,width:"65px",minValue:1,maxValue:100,stepPixelSize:2,onChange:function(e,t){return a("set_nanite_cloud",{new_cloud:t})}})})})}),(0,o.createComponentVNode)(2,V)],4)},V=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data.reverse;return(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Scanning Mode",children:(0,o.createComponentVNode)(2,i.Button,{content:c?"Inverted":"Default",icon:c?"random":"long-arrow-alt-right",onClick:function(){return a("toggle_reverse")},color:c?"bad":"good"})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SeedExtractor=void 0;var o=n(0),r=n(15),i=n(30),a=n(19),c=n(1),l=n(3),d=n(2);t.SeedExtractor=function(e,t){var n,u,s=(0,c.useBackend)(t),p=s.act,m=s.data,f=(n=m.seeds,u=Object.keys(n).map((function(e){var t=function(e){var t,n=/([^;=]+)=([^;]+)/g,o={};do{(t=n.exec(e))&&(o[t[1]]=t[2]+"")}while(t);return o}(e);return t.amount=n[e],t.key=e,t.name=(0,a.toTitleCase)(t.name.replace("pack of ","")),t})),(0,i.flow)([(0,r.sortBy)((function(e){return e.name}))])(u));return(0,o.createComponentVNode)(2,d.Window,{width:1e3,height:400,resizable:!0,children:(0,o.createComponentVNode)(2,d.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,l.Section,{title:"Stored seeds:",children:(0,o.createComponentVNode)(2,l.Table,{cellpadding:"3",textAlign:"center",children:[(0,o.createComponentVNode)(2,l.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Name"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Lifespan"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Endurance"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Maturation"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Production"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Yield"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Potency"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Instability"}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:"Stock"})]}),f.map((function(e){return(0,o.createComponentVNode)(2,l.Table.Row,{children:[(0,o.createComponentVNode)(2,l.Table.Cell,{bold:!0,children:e.name}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.lifespan}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.endurance}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.maturation}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.production}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.yield}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.potency}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:e.instability}),(0,o.createComponentVNode)(2,l.Table.Cell,{children:[(0,o.createComponentVNode)(2,l.Button,{content:"Vend",onClick:function(){return p("select",{item:e.key})}}),"(",e.amount," left)"]})]},e.key)}))]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ShuttleManipulatorModification=t.ShuttleManipulatorTemplates=t.ShuttleManipulatorStatus=t.ShuttleManipulator=void 0;var o=n(0),r=n(15),i=n(1),a=n(3),c=n(2);t.ShuttleManipulator=function(e,t){var n=(0,i.useLocalState)(t,"tab",1),r=n[0],s=n[1];return(0,o.createComponentVNode)(2,c.Window,{title:"Shuttle Manipulator",width:800,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:1===r,onClick:function(){return s(1)},children:"Status"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:2===r,onClick:function(){return s(2)},children:"Templates"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:3===r,onClick:function(){return s(3)},children:"Modification"})]}),1===r&&(0,o.createComponentVNode)(2,l),2===r&&(0,o.createComponentVNode)(2,d),3===r&&(0,o.createComponentVNode)(2,u)]})})};var l=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data.shuttles||[];return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Table,{children:c.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,a.Button,{content:"JMP",onClick:function(){return r("jump_to",{type:"mobile",id:e.id})}},e.id)}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,a.Button,{content:"Fly",disabled:!e.can_fly,onClick:function(){return r("fly",{id:e.id})}},e.id)}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.name}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.id}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.status}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:[e.mode,!!e.timer&&(0,o.createFragment)([(0,o.createTextVNode)("("),e.timeleft,(0,o.createTextVNode)(")"),(0,o.createComponentVNode)(2,a.Button,{content:"Fast Travel",disabled:!e.can_fast_travel,onClick:function(){return r("fast_travel",{id:e.id})}},e.id)],0)]})]},e.id)}))})})};t.ShuttleManipulatorStatus=l;var d=function(e,t){var n,c=(0,i.useBackend)(t),l=c.act,d=c.data,u=d.templates||{},s=d.selected||{},p=(0,i.useLocalState)(t,"templateId",Object.keys(u)[0]),m=p[0],f=p[1],h=null==(n=u[m])?void 0:n.templates;return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Tabs,{vertical:!0,children:(0,r.map)((function(e,t){return(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:m===t,onClick:function(){return f(t)},children:e.port_id},t)}))(u)})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,basis:0,children:h.map((function(e){var t=e.shuttle_id===s.shuttle_id;return(0,o.createComponentVNode)(2,a.Section,{title:e.name,level:2,buttons:(0,o.createComponentVNode)(2,a.Button,{content:t?"Selected":"Select",selected:t,onClick:function(){return l("select_template",{shuttle_id:e.shuttle_id})}}),children:(!!e.description||!!e.admin_notes)&&(0,o.createComponentVNode)(2,a.LabeledList,{children:[!!e.description&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Description",children:e.description}),!!e.admin_notes&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Admin Notes",children:e.admin_notes})]})},e.shuttle_id)}))})]})})};t.ShuttleManipulatorTemplates=d;var u=function(e,t){var n=(0,i.useBackend)(t),r=n.act,c=n.data,l=c.selected||{},d=c.existing_shuttle||{};return(0,o.createComponentVNode)(2,a.Section,{children:l?(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{level:2,title:l.name,children:(!!l.description||!!l.admin_notes)&&(0,o.createComponentVNode)(2,a.LabeledList,{children:[!!l.description&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Description",children:l.description}),!!l.admin_notes&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Admin Notes",children:l.admin_notes})]})}),d?(0,o.createComponentVNode)(2,a.Section,{level:2,title:"Existing Shuttle: "+d.name,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Status",buttons:(0,o.createComponentVNode)(2,a.Button,{content:"Jump To",onClick:function(){return r("jump_to",{type:"mobile",id:d.id})}}),children:[d.status,!!d.timer&&(0,o.createFragment)([(0,o.createTextVNode)("("),d.timeleft,(0,o.createTextVNode)(")")],0)]})})}):(0,o.createComponentVNode)(2,a.Section,{level:2,title:"Existing Shuttle: None"}),(0,o.createComponentVNode)(2,a.Section,{level:2,title:"Status",children:[(0,o.createComponentVNode)(2,a.Button,{content:"Preview",onClick:function(){return r("preview",{shuttle_id:l.shuttle_id})}}),(0,o.createComponentVNode)(2,a.Button,{content:"Load",color:"bad",onClick:function(){return r("load",{shuttle_id:l.shuttle_id})}})]})],0):"No shuttle selected"})};t.ShuttleManipulatorModification=u},function(e,t,n){"use strict";t.__esModule=!0,t.Signaler=void 0;var o=n(0),r=n(16),i=n(1),a=n(3),c=n(2);t.Signaler=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data,u=d.code,s=d.frequency,p=d.minFrequency,m=d.maxFrequency;return(0,o.createComponentVNode)(2,c.Window,{width:280,height:132,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Grid,{children:[(0,o.createComponentVNode)(2,a.Grid.Column,{size:1.4,color:"label",children:"Frequency:"}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.NumberInput,{animate:!0,unit:"kHz",step:.2,stepPixelSize:6,minValue:p/10,maxValue:m/10,value:s/10,format:function(e){return(0,r.toFixed)(e,1)},width:"80px",onDrag:function(e,t){return l("freq",{freq:t})}})}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.Button,{ml:1.3,icon:"sync",content:"Reset",onClick:function(){return l("reset",{reset:"freq"})}})})]}),(0,o.createComponentVNode)(2,a.Grid,{mt:.6,children:[(0,o.createComponentVNode)(2,a.Grid.Column,{size:1.4,color:"label",children:"Code:"}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.NumberInput,{animate:!0,step:1,stepPixelSize:6,minValue:1,maxValue:100,value:u,width:"80px",onDrag:function(e,t){return l("code",{code:t})}})}),(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.Button,{ml:1.3,icon:"sync",content:"Reset",onClick:function(){return l("reset",{reset:"code"})}})})]}),(0,o.createComponentVNode)(2,a.Grid,{mt:.8,children:(0,o.createComponentVNode)(2,a.Grid.Column,{children:(0,o.createComponentVNode)(2,a.Button,{mb:-.1,fluid:!0,icon:"arrow-up",content:"Send Signal",textAlign:"center",onClick:function(){return l("signal")}})})})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SkillPanel=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c={color:"lightgreen",fontWeight:"bold"},l={color:"#FFDB58",fontWeight:"bold"};t.SkillPanel=function(e,t){var n=(0,r.useBackend)(t),u=n.act,s=n.data.skills||[];return(0,o.createComponentVNode)(2,a.Window,{title:"Manage Skills",width:600,height:500,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:s.playername,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:s.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,children:[(0,o.createVNode)(1,"span",null,e.desc,0,{style:l}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,d,{skill_lvl_num:e.lvlnum,skill_lvl:e.lvl}),(0,o.createVNode)(1,"br"),"Total Experience: [",e.exp," XP]",(0,o.createVNode)(1,"br"),"XP To Next Level:\xa0",0!==e.exp_req?(0,o.createVNode)(1,"span",null,[(0,o.createTextVNode)("["),e.exp_prog,(0,o.createTextVNode)(" / "),e.exp_req,(0,o.createTextVNode)("]")],0):(0,o.createVNode)(1,"span",null,"[MAXXED]",16,{style:c}),(0,o.createVNode)(1,"br"),"Overall Skill Progress: [",e.exp," / ",e.max_exp,"]",(0,o.createComponentVNode)(2,i.ProgressBar,{value:e.exp_percent,color:"good"}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Button,{content:"Adjust Exp",onClick:function(){return u("adj_exp",{skill:e.path})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Set Exp",onClick:function(){return u("set_exp",{skill:e.path})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Set Level",onClick:function(){return u("set_lvl",{skill:e.path})}}),(0,o.createVNode)(1,"br"),(0,o.createVNode)(1,"br")]},e.name)}))})})})})};var d=function(e){var t=e.skill_lvl_num,n=e.skill_lvl;return(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:["Level: [",(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,textColor:"hsl("+50*t+", 50%, 50%)",children:n}),"]"]})}},function(e,t,n){"use strict";t.__esModule=!0,t.SkillStation=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(127);t.SkillStation=function(e,t){var n,l=(0,r.useBackend)(t),d=l.act,u=l.data,s=u.working,p=u.timeleft,m=u.error,f=u.current,h=void 0===f?[]:f,C=u.slots_used,g=u.slots_max,b=u.skillchip_ready,N=u.implantable,v=u.implantable_reason,V=u.skill_name,y=u.skill_desc,k=u.skill_icon,x=u.skill_cost;return n=b?(0,o.createComponentVNode)(2,i.Flex,{spacing:1,children:[(0,o.createComponentVNode)(2,c.FlexItem,{children:(0,o.createComponentVNode)(2,i.Icon,{mt:2,mr:1,size:3,name:k})}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createComponentVNode)(2,i.Box,{bold:!0,mb:1,children:V}),(0,o.createComponentVNode)(2,i.Box,{italic:!0,mb:1,children:y}),(0,o.createComponentVNode)(2,i.Box,{children:["Complexity: ",x]}),!!v&&(0,o.createComponentVNode)(2,i.Box,{color:N?"good":"bad",children:v})]}),(0,o.createComponentVNode)(2,i.Flex.Item,{align:"center",children:[(0,o.createComponentVNode)(2,i.Button,{disabled:!N,onClick:function(){return d("implant")},children:"Implant"}),(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return d("eject")},children:"Eject"})]})]}):"Insert a skillchip to continue.",(0,o.createComponentVNode)(2,a.Window,{title:"Skillsoft Station",width:500,height:300,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[!!m&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:m}),!!s&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:[(0,o.createComponentVNode)(2,i.Box,{children:"Operation in progress. Please do not leave the chamber."}),(0,o.createComponentVNode)(2,i.Box,{children:["Time Left : ",(0,o.createComponentVNode)(2,i.TimeDisplay,{auto:"down",value:p})]})]}),!s&&(0,o.createComponentVNode)(2,i.Section,{children:n}),(0,o.createComponentVNode)(2,i.Section,{title:"Current skillchips",buttons:(0,o.createFragment)([C,(0,o.createTextVNode)("/"),g],0),children:[!h.length&&"No skillchips detected.",!!h.length&&(0,o.createComponentVNode)(2,i.Table,{children:[(0,o.createComponentVNode)(2,i.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:"Chip"}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:"Complexity"}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:"Status"}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:"Actions"})]}),h.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:[(0,o.createComponentVNode)(2,i.Icon,{mr:1,name:e.icon}),e.name]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:e.cost}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[!e.active&&(0,o.createComponentVNode)(2,i.Icon,{name:"exclamation-triangle",color:"bad"}),!!e.active&&(0,o.createComponentVNode)(2,i.Icon,{name:"check",color:"good"})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:!s&&(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return d("remove",{ref:e.ref})},icon:"trash",content:"Extract"})})]},e)}))]})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Sleeper=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Oxygen",type:"oxyLoss"}];t.Sleeper=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.open,s=d.occupant,p=void 0===s?{}:s,m=d.occupied,f=(d.chems||[]).sort((function(e,t){var n=e.name.toLowerCase(),o=t.name.toLowerCase();return n<o?-1:n>o?1:0}));return(0,o.createComponentVNode)(2,a.Window,{width:310,height:465,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:p.name?p.name:"No Occupant",minHeight:"210px",buttons:!!p.stat&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,color:p.statstate,children:p.stat}),children:!!m&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.ProgressBar,{value:p.health,minValue:p.minHealth,maxValue:p.maxHealth,ranges:{good:[50,Infinity],average:[0,50],bad:[-Infinity,0]}}),(0,o.createComponentVNode)(2,i.Box,{mt:1}),(0,o.createComponentVNode)(2,i.LabeledList,{children:[c.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.label,children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:p[e.type],minValue:0,maxValue:p.maxHealth,color:"bad"})},e.type)})),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cells",color:p.cloneLoss?"bad":"good",children:p.cloneLoss?"Damaged":"Healthy"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Brain",color:p.brainLoss?"bad":"good",children:p.brainLoss?"Abnormal":"Healthy"})]})],4)}),(0,o.createComponentVNode)(2,i.Section,{title:"Medicines",minHeight:"205px",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:u?"door-open":"door-closed",content:u?"Open":"Closed",onClick:function(){return l("door")}}),children:f.map((function(e){return(0,o.createComponentVNode)(2,i.Button,{icon:"flask",content:e.name,disabled:!m||!e.allowed,width:"140px",onClick:function(){return l("inject",{chem:e.id})}},e.name)}))})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SlimeBodySwapper=t.BodyEntry=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c={Dead:"bad",Unconscious:"average",Conscious:"good"},l={owner:"You Are Here",stranger:"Occupied",available:"Swap"},d=function(e,t){var n=e.body,r=e.swapFunc;return(0,o.createComponentVNode)(2,i.Section,{title:(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:n.htmlcolor,children:n.name}),level:2,buttons:(0,o.createComponentVNode)(2,i.Button,{content:l[n.occupied],selected:"owner"===n.occupied,color:"stranger"===n.occupied&&"bad",onClick:function(){return r()}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",bold:!0,color:c[n.status],children:n.status}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Jelly",children:n.exoticblood}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Location",children:n.area})]})})};t.BodyEntry=d;t.SlimeBodySwapper=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data.bodies,u=void 0===l?[]:l;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:400,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{children:u.map((function(e){return(0,o.createComponentVNode)(2,d,{body:e,swapFunc:function(){return c("swap",{ref:e.ref})}},e.name)}))})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SmartVend=void 0;var o=n(0),r=n(15),i=n(1),a=n(3),c=n(2);t.SmartVend=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data;return(0,o.createComponentVNode)(2,c.Window,{width:440,height:550,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:"Storage",buttons:!!d.isdryer&&(0,o.createComponentVNode)(2,a.Button,{icon:d.drying?"stop":"tint",onClick:function(){return l("Dry")},children:d.drying?"Stop drying":"Dry"}),children:0===d.contents.length&&(0,o.createComponentVNode)(2,a.NoticeBox,{children:["Unfortunately, this ",d.name," is empty."]})||(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:"Item"}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"center",children:d.verb?d.verb:"Dispense"})]}),(0,r.map)((function(e,t){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.name}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"right",children:e.amount}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,children:[(0,o.createComponentVNode)(2,a.Button,{content:"One",disabled:e.amount<1,onClick:function(){return l("Release",{name:e.name,amount:1})}}),(0,o.createComponentVNode)(2,a.Button,{content:"Many",disabled:e.amount<=1,onClick:function(){return l("Release",{name:e.name})}})]})]},t)}))(d.contents)]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Smes=void 0;var o=n(0),r=n(1),i=n(3),a=n(40),c=n(2);t.Smes=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.capacityPercent,s=(d.capacity,d.charge),p=d.inputAttempt,m=d.inputting,f=d.inputLevel,h=d.inputLevelMax,C=d.inputAvailable,g=d.outputAttempt,b=d.outputting,N=d.outputLevel,v=d.outputLevelMax,V=d.outputUsed,y=(u>=100?"good":m&&"average")||"bad",k=(b?"good":s>0&&"average")||"bad";return(0,o.createComponentVNode)(2,c.Window,{width:340,height:350,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Stored Energy",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:.01*u,ranges:{good:[.5,Infinity],average:[.15,.5],bad:[-Infinity,.15]}})}),(0,o.createComponentVNode)(2,i.Section,{title:"Input",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Charge Mode",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:p?"sync-alt":"times",selected:p,onClick:function(){return l("tryinput")},children:p?"Auto":"Off"}),children:(0,o.createComponentVNode)(2,i.Box,{color:y,children:(u>=100?"Fully Charged":m&&"Charging")||"Not Charging"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Target Input",children:(0,o.createComponentVNode)(2,i.Flex,{inline:!0,width:"100%",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",disabled:0===f,onClick:function(){return l("input",{target:"min"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"backward",disabled:0===f,onClick:function(){return l("input",{adjust:-1e4})}})]}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,mx:1,children:(0,o.createComponentVNode)(2,i.Slider,{value:f/1e3,fillValue:C/1e3,minValue:0,maxValue:h/1e3,step:5,stepPixelSize:4,format:function(e){return(0,a.formatPower)(1e3*e,1)},onDrag:function(e,t){return l("input",{target:1e3*t})}})}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"forward",disabled:f===h,onClick:function(){return l("input",{adjust:1e4})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",disabled:f===h,onClick:function(){return l("input",{target:"max"})}})]})]})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Available",children:(0,a.formatPower)(C)})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Output",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Output Mode",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:g?"power-off":"times",selected:g,onClick:function(){return l("tryoutput")},children:g?"On":"Off"}),children:(0,o.createComponentVNode)(2,i.Box,{color:k,children:b?"Sending":s>0?"Not Sending":"No Charge"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Target Output",children:(0,o.createComponentVNode)(2,i.Flex,{inline:!0,width:"100%",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",disabled:0===N,onClick:function(){return l("output",{target:"min"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"backward",disabled:0===N,onClick:function(){return l("output",{adjust:-1e4})}})]}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,mx:1,children:(0,o.createComponentVNode)(2,i.Slider,{value:N/1e3,minValue:0,maxValue:v/1e3,step:5,stepPixelSize:4,format:function(e){return(0,a.formatPower)(1e3*e,1)},onDrag:function(e,t){return l("output",{target:1e3*t})}})}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"forward",disabled:N===v,onClick:function(){return l("output",{adjust:1e4})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",disabled:N===v,onClick:function(){return l("output",{target:"max"})}})]})]})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Outputting",children:(0,a.formatPower)(V)})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SmokeMachine=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.SmokeMachine=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.TankContents,u=(l.isTankLoaded,l.TankCurrentVolume),s=l.TankMaxVolume,p=l.active,m=l.setting,f=(l.screen,l.maxSetting),h=void 0===f?[]:f;return(0,o.createComponentVNode)(2,a.Window,{width:350,height:350,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Dispersal Tank",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:p?"power-off":"times",selected:p,content:p?"On":"Off",onClick:function(){return c("power")}}),children:[(0,o.createComponentVNode)(2,i.ProgressBar,{value:u/s,ranges:{bad:[-Infinity,.3]},children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{initial:0,value:u||0})," / "+s]}),(0,o.createComponentVNode)(2,i.Box,{mt:1,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Range",children:[1,2,3,4,5].map((function(e){return(0,o.createComponentVNode)(2,i.Button,{selected:m===e,icon:"plus",content:3*e,disabled:h<e,onClick:function(){return c("setting",{amount:e})}},e)}))})})})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Contents",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"trash",content:"Purge",onClick:function(){return c("purge")}}),children:d.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{color:"label",children:[(0,o.createComponentVNode)(2,i.AnimatedNumber,{initial:0,value:e.volume})," ","units of ",e.name]},e.name)}))})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SolarControl=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.SolarControl=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.generated,u=l.generated_ratio,s=l.azimuth_current,p=l.azimuth_rate,m=l.max_rotation_rate,f=l.tracking_state,h=l.connected_panels,C=l.connected_tracker;return(0,o.createComponentVNode)(2,a.Window,{width:380,height:230,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Status",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Scan for new hardware",onClick:function(){return c("refresh")}}),children:(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Solar tracker",color:C?"good":"bad",children:C?"OK":"N/A"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Solar panels",color:h>0?"good":"bad",children:h})]})}),(0,o.createComponentVNode)(2,i.Grid.Column,{size:1.5,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power output",children:(0,o.createComponentVNode)(2,i.ProgressBar,{ranges:{good:[.66,Infinity],average:[.33,.66],bad:[-Infinity,.33]},minValue:0,maxValue:1,value:u,children:d+" W"})})})})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Controls",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Tracking",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"times",content:"Off",selected:0===f,onClick:function(){return c("tracking",{mode:0})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"clock-o",content:"Timed",selected:1===f,onClick:function(){return c("tracking",{mode:1})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Auto",selected:2===f,disabled:!C,onClick:function(){return c("tracking",{mode:2})}})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Azimuth",children:[(0===f||1===f)&&(0,o.createComponentVNode)(2,i.NumberInput,{width:"52px",unit:"\xb0",step:1,stepPixelSize:2,minValue:-360,maxValue:720,value:s,onDrag:function(e,t){return c("azimuth",{value:t})}}),1===f&&(0,o.createComponentVNode)(2,i.NumberInput,{width:"80px",unit:"\xb0/m",step:.01,stepPixelSize:1,minValue:-m-.01,maxValue:m+.01,value:p,format:function(e){return(Math.sign(e)>0?"+":"-")+Math.abs(e)},onDrag:function(e,t){return c("azimuth_rate",{value:t})}}),2===f&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"label",mt:"3px",children:[s+" \xb0"," (auto)"]})]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SpaceHeater=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.SpaceHeater=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:305,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Power",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject Cell",disabled:!l.hasPowercell||!l.open,onClick:function(){return c("eject")}}),(0,o.createComponentVNode)(2,i.Button,{icon:l.on?"power-off":"times",content:l.on?"On":"Off",selected:l.on,disabled:!l.hasPowercell,onClick:function(){return c("power")}})],4),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Cell",color:!l.hasPowercell&&"bad",children:l.hasPowercell&&(0,o.createComponentVNode)(2,i.ProgressBar,{value:l.powerLevel/100,ranges:{good:[.6,Infinity],average:[.3,.6],bad:[-Infinity,.3]},children:l.powerLevel+"%"})||"None"})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Thermostat",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Temperature",children:(0,o.createComponentVNode)(2,i.Box,{fontSize:"18px",color:Math.abs(l.targetTemp-l.currentTemp)>50?"bad":Math.abs(l.targetTemp-l.currentTemp)>20?"average":"good",children:[l.currentTemp,"\xb0C"]})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Target Temperature",children:l.open&&(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:parseFloat(l.targetTemp),width:"65px",unit:"\xb0C",minValue:l.minTemp,maxValue:l.maxTemp,onChange:function(e,t){return c("target",{target:t})}})||l.targetTemp+"\xb0C"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Mode",children:l.open?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"thermometer-half",content:"Auto",selected:"auto"===l.mode,onClick:function(){return c("mode",{mode:"auto"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fire-alt",content:"Heat",selected:"heat"===l.mode,onClick:function(){return c("mode",{mode:"heat"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fan",content:"Cool",selected:"cool"===l.mode,onClick:function(){return c("mode",{mode:"cool"})}})],4):"Auto"}),(0,o.createComponentVNode)(2,i.LabeledList.Divider)]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SpawnersMenu=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.SpawnersMenu=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data.spawners||[];return(0,o.createComponentVNode)(2,a.Window,{title:"Spawners Menu",width:700,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{children:l.map((function(e){return(0,o.createComponentVNode)(2,i.Section,{title:e.name+" ("+e.amount_left+" left)",level:2,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{content:"Jump",onClick:function(){return c("jump",{name:e.name})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Spawn",onClick:function(){return c("spawn",{name:e.name})}})],4),children:[(0,o.createComponentVNode)(2,i.Box,{bold:!0,mb:1,fontSize:"20px",children:e.short_desc}),(0,o.createComponentVNode)(2,i.Box,{children:e.flavor_text}),!!e.important_info&&(0,o.createComponentVNode)(2,i.Box,{mt:1,bold:!0,color:"bad",fontSize:"26px",children:e.important_info})]},e.name)}))})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SuitStorageUnit=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.SuitStorageUnit=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.locked,u=l.open,s=l.safeties,p=l.uv_active,m=l.occupied,f=l.suit,h=l.helmet,C=l.mask,g=l.storage;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:305,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[!(!m||!s)&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Biological entity detected in suit chamber. Please remove before continuing with operation."}),p&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Contents are currently being decontaminated. Please wait."})||(0,o.createComponentVNode)(2,i.Section,{title:"Storage",minHeight:"260px",buttons:(0,o.createFragment)([!u&&(0,o.createComponentVNode)(2,i.Button,{icon:d?"unlock":"lock",content:d?"Unlock":"Lock",onClick:function(){return c("lock")}}),!d&&(0,o.createComponentVNode)(2,i.Button,{icon:u?"sign-out-alt":"sign-in-alt",content:u?"Close":"Open",onClick:function(){return c("door")}})],0),children:d&&(0,o.createComponentVNode)(2,i.Box,{mt:6,bold:!0,textAlign:"center",fontSize:"40px",children:[(0,o.createComponentVNode)(2,i.Box,{children:"Unit Locked"}),(0,o.createComponentVNode)(2,i.Icon,{name:"lock"})]})||u&&(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Helmet",children:(0,o.createComponentVNode)(2,i.Button,{icon:h?"square":"square-o",content:h||"Empty",disabled:!h,onClick:function(){return c("dispense",{item:"helmet"})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Suit",children:(0,o.createComponentVNode)(2,i.Button,{icon:f?"square":"square-o",content:f||"Empty",disabled:!f,onClick:function(){return c("dispense",{item:"suit"})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Mask",children:(0,o.createComponentVNode)(2,i.Button,{icon:C?"square":"square-o",content:C||"Empty",disabled:!C,onClick:function(){return c("dispense",{item:"mask"})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Storage",children:(0,o.createComponentVNode)(2,i.Button,{icon:g?"square":"square-o",content:g||"Empty",disabled:!g,onClick:function(){return c("dispense",{item:"storage"})}})})]})||(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"recycle",content:"Decontaminate",disabled:m&&s,textAlign:"center",onClick:function(){return c("uv")}})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.SyndPane=t.StatusPane=t.SyndContractorContent=t.SyndContractor=t.FakeTerminal=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);var c=function(e){var t,n;function r(t){var n;return(n=e.call(this,t)||this).timer=null,n.state={currentIndex:0,currentDisplay:[]},n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var a=r.prototype;return a.tick=function(){var e=this.props,t=this.state;t.currentIndex<=e.allMessages.length?(this.setState((function(e){return{currentIndex:e.currentIndex+1}})),t.currentDisplay.push(e.allMessages[t.currentIndex])):(clearTimeout(this.timer),setTimeout(e.onFinished,e.finishedTimeout))},a.componentDidMount=function(){var e=this,t=this.props.linesPerSecond,n=void 0===t?2.5:t;this.timer=setInterval((function(){return e.tick()}),1e3/n)},a.componentWillUnmount=function(){clearTimeout(this.timer)},a.render=function(){return(0,o.createComponentVNode)(2,i.Box,{m:1,children:this.state.currentDisplay.map((function(e){return(0,o.createFragment)([e,(0,o.createVNode)(1,"br")],0,e)}))})},r}(o.Component);t.FakeTerminal=c;t.SyndContractor=function(e,t){return(0,o.createComponentVNode)(2,a.NtosWindow,{width:500,height:600,theme:"syndicate",resizable:!0,children:(0,o.createComponentVNode)(2,a.NtosWindow.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,l)})})};var l=function(e,t){var n=(0,r.useBackend)(t),a=n.data,l=n.act,d=["Recording biometric data...","Analyzing embedded syndicate info...","STATUS CONFIRMED","Contacting syndicate database...","Awaiting response...","Awaiting response...","Awaiting response...","Awaiting response...","Awaiting response...","Awaiting response...","Response received, ack 4851234...","CONFIRM ACC "+Math.round(2e4*Math.random()),"Setting up private accounts...","CONTRACTOR ACCOUNT CREATED","Searching for available contracts...","Searching for available contracts...","Searching for available contracts...","Searching for available contracts...","CONTRACTS FOUND","WELCOME, AGENT"],s=!!a.error&&(0,o.createComponentVNode)(2,i.Modal,{backgroundColor:"red",children:(0,o.createComponentVNode)(2,i.Flex,{align:"center",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{mr:2,children:(0,o.createComponentVNode)(2,i.Icon,{size:4,name:"exclamation-triangle"})}),(0,o.createComponentVNode)(2,i.Flex.Item,{mr:2,grow:1,textAlign:"center",children:[(0,o.createComponentVNode)(2,i.Box,{width:"260px",textAlign:"left",minHeight:"80px",children:a.error}),(0,o.createComponentVNode)(2,i.Button,{content:"Dismiss",onClick:function(){return l("PRG_clear_error")}})]})]})});return a.logged_in?a.logged_in&&a.first_load?(0,o.createComponentVNode)(2,i.Box,{backgroundColor:"rgba(0, 0, 0, 0.8)",minHeight:"525px",children:(0,o.createComponentVNode)(2,c,{allMessages:d,finishedTimeout:3e3,onFinished:function(){return l("PRG_set_first_load_finished")}})}):a.info_screen?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{backgroundColor:"rgba(0, 0, 0, 0.8)",minHeight:"500px",children:(0,o.createComponentVNode)(2,c,{allMessages:["SyndTract v2.0","","We've identified potentional high-value targets that are","currently assigned to your mission area. They are believed","to hold valuable information which could be of immediate","importance to our organisation.","","Listed below are all of the contracts available to you. You","are to bring the specified target to the designated","drop-off, and contact us via this uplink. We will send","a specialised extraction unit to put the body into.","","We want targets alive - but we will sometimes pay slight","amounts if they're not, you just won't recieve the shown","bonus. You can redeem your payment through this uplink in","the form of raw telecrystals, which can be put into your","regular Syndicate uplink to purchase whatever you may need.","We provide you with these crystals the moment you send the","target up to us, which can be collected at anytime through","this system.","","Targets extracted will be ransomed back to the station once","their use to us is fulfilled, with us providing you a small","percentage cut. You may want to be mindful of them","identifying you when they come back. We provide you with","a standard contractor loadout, which will help cover your","identity."],linesPerSecond:10})}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,content:"CONTINUE",color:"transparent",textAlign:"center",onClick:function(){return l("PRG_toggle_info")}})],4):(0,o.createFragment)([s,(0,o.createComponentVNode)(2,u)],0):(0,o.createComponentVNode)(2,i.Section,{minHeight:"525px",children:[(0,o.createComponentVNode)(2,i.Box,{width:"100%",textAlign:"center",children:(0,o.createComponentVNode)(2,i.Button,{content:"REGISTER USER",color:"transparent",onClick:function(){return l("PRG_login")}})}),!!a.error&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:a.error})]})};t.SyndContractorContent=l;var d=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data;return(0,o.createComponentVNode)(2,i.Section,{title:(0,o.createFragment)([(0,o.createTextVNode)("Contractor Status"),(0,o.createComponentVNode)(2,i.Button,{content:"View Information Again",color:"transparent",mb:0,ml:1,onClick:function(){return a("PRG_toggle_info")}})],4),buttons:(0,o.createComponentVNode)(2,i.Box,{bold:!0,mr:1,children:[c.contract_rep," Rep"]}),children:(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{size:.85,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"TC Availible",buttons:(0,o.createComponentVNode)(2,i.Button,{content:"Claim",disabled:c.redeemable_tc<=0,onClick:function(){return a("PRG_redeem_TC")}}),children:c.redeemable_tc}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"TC Earned",children:c.earned_tc})]})}),(0,o.createComponentVNode)(2,i.Grid.Column,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Contracts Completed",children:c.contracts_completed}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Status",children:"ACTIVE"})]})})]})})};t.StatusPane=d;var u=function(e,t){var n=(0,r.useLocalState)(t,"tab",1),a=n[0],c=n[1];return(0,o.createFragment)([(0,o.createComponentVNode)(2,d,{state:e.state}),(0,o.createComponentVNode)(2,i.Tabs,{children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:1===a,onClick:function(){return c(1)},children:"Contracts"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:2===a,onClick:function(){return c(2)},children:"Hub"})]}),1===a&&(0,o.createComponentVNode)(2,s),2===a&&(0,o.createComponentVNode)(2,p)],0)};t.SyndPane=u;var s=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.contracts||[];return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Availible Contracts",buttons:(0,o.createComponentVNode)(2,i.Button,{content:"Call Extraction",disabled:!c.ongoing_contract||c.extraction_enroute,onClick:function(){return a("PRG_call_extraction")}}),children:l.map((function(e){if(!c.ongoing_contract||2===e.status){var t=e.status>1;if(!(e.status>=5))return(0,o.createComponentVNode)(2,i.Section,{title:e.target?e.target+" ("+e.target_rank+")":"Invalid Target",level:t?1:2,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,mr:1,children:[e.payout," (+",e.payout_bonus,") TC"]}),(0,o.createComponentVNode)(2,i.Button,{content:t?"Abort":"Accept",disabled:e.extraction_enroute,color:t&&"bad",onClick:function(){return a("PRG_contract"+(t?"_abort":"-accept"),{contract_id:e.id})}})],4),children:(0,o.createComponentVNode)(2,i.Grid,{children:[(0,o.createComponentVNode)(2,i.Grid.Column,{children:e.message}),(0,o.createComponentVNode)(2,i.Grid.Column,{size:.5,children:[(0,o.createComponentVNode)(2,i.Box,{bold:!0,mb:1,children:"Dropoff Location:"}),(0,o.createComponentVNode)(2,i.Box,{children:e.dropoff})]})]})},e.target)}}))}),(0,o.createComponentVNode)(2,i.Section,{title:"Dropoff Locator",textAlign:"center",opacity:c.ongoing_contract?100:0,children:(0,o.createComponentVNode)(2,i.Box,{bold:!0,children:c.dropoff_direction})})],4)},p=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.contractor_hub_items||[];return(0,o.createComponentVNode)(2,i.Section,{children:l.map((function(e){var t=e.cost?e.cost+" Rep":"FREE",n=-1!==e.limited;return(0,o.createComponentVNode)(2,i.Section,{title:e.name+" - "+t,level:2,buttons:(0,o.createFragment)([n&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,mr:1,children:[e.limited," remaining"]}),(0,o.createComponentVNode)(2,i.Button,{content:"Purchase",disabled:c.contract_rep<e.cost||n&&e.limited<=0,onClick:function(){return a("buy_hub",{item:e.name,cost:e.cost})}})],0),children:(0,o.createComponentVNode)(2,i.Table,{children:(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Icon,{fontSize:"60px",name:e.item_icon})}),(0,o.createComponentVNode)(2,i.Table.Cell,{verticalAlign:"top",children:e.desc})]})})},e.name)}))})}},function(e,t,n){"use strict";t.__esModule=!0,t.TachyonArrayContent=t.TachyonArray=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.TachyonArray=function(e,t){var n=(0,r.useBackend)(t),l=(n.act,n.data.records),d=void 0===l?[]:l;return(0,o.createComponentVNode)(2,a.Window,{width:500,height:225,resizable:!0,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:d.length?(0,o.createComponentVNode)(2,c):(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No Records"})})})};var c=function(e,t){var n,a=(0,r.useBackend)(t),c=a.act,l=a.data.records,d=void 0===l?[]:l,u=(0,r.useSharedState)(t,"record",null==(n=d[0])?void 0:n.name),s=u[0],p=u[1],m=d.find((function(e){return e.name===s}));return(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Tabs,{vertical:!0,children:d.map((function(e){return(0,o.createComponentVNode)(2,i.Tabs.Tab,{icon:"file",selected:e.name===s,onClick:function(){return p(e.name)},children:e.name},e.name)}))})}),m?(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Section,{level:"2",title:m.name,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button.Confirm,{icon:"trash",content:"Delete",color:"bad",onClick:function(){return c("delete_record",{ref:m.ref})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"print",content:"Print",onClick:function(){return c("print_record",{ref:m.ref})}})],4),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Timestamp",children:m.timestamp}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Coordinates",children:m.coordinates}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Displacement",children:[m.displacement," seconds"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Epicenter Radius",children:[m.factual_epicenter_radius,m.theory_epicenter_radius&&" (Theoretical: "+m.theory_epicenter_radius+")"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Outer Radius",children:[m.factual_outer_radius,m.theory_outer_radius&&" (Theoretical: "+m.theory_outer_radius+")"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Shockwave Radius",children:[m.factual_shockwave_radius,m.theory_shockwave_radius&&" (Theoretical: "+m.theory_shockwave_radius+")"]})]})})}):(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,i.NoticeBox,{children:"No Record Selected"})})]})})};t.TachyonArrayContent=c},function(e,t,n){"use strict";t.__esModule=!0,t.Tank=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Tank=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:400,height:120,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Pressure",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:l.tankPressure/1013,ranges:{good:[.35,Infinity],average:[.15,.35],bad:[-Infinity,.15]},children:l.tankPressure+" kPa"})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Pressure Regulator",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",disabled:l.ReleasePressure===l.minReleasePressure,onClick:function(){return c("pressure",{pressure:"min"})}}),(0,o.createComponentVNode)(2,i.NumberInput,{animated:!0,value:parseFloat(l.releasePressure),width:"65px",unit:"kPa",minValue:l.minReleasePressure,maxValue:l.maxReleasePressure,onChange:function(e,t){return c("pressure",{pressure:t})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",disabled:l.ReleasePressure===l.maxReleasePressure,onClick:function(){return c("pressure",{pressure:"max"})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"undo",content:"",disabled:l.ReleasePressure===l.defaultReleasePressure,onClick:function(){return c("pressure",{pressure:"reset"})}})]})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.TankDispenser=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.TankDispenser=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Window,{width:275,height:103,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Plasma",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:l.plasma?"square":"square-o",content:"Dispense",disabled:!l.plasma,onClick:function(){return c("plasma")}}),children:l.plasma}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Oxygen",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:l.oxygen?"square":"square-o",content:"Dispense",disabled:!l.oxygen,onClick:function(){return c("oxygen")}}),children:l.oxygen})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Telecomms=void 0;var o=n(0),r=(n(15),n(30),n(1)),i=n(3),a=n(34),c=n(2);t.Telecomms=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.type,s=d.minfreq,p=d.maxfreq,m=d.frequency,f=d.multitool,h=d.multibuff,C=d.toggled,g=d.id,b=d.network,N=d.prefab,v=d.changefrequency,V=(d.currfrequency,d.broadcasting),y=d.receiving,k=d.linked||[],x=d.frequencies||[];return(0,o.createComponentVNode)(2,c.Window,{resizable:!0,title:g,width:400,height:600,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[!f&&(0,o.createComponentVNode)(2,i.NoticeBox,{children:"Use a multitool to make changes."}),(0,o.createComponentVNode)(2,i.Section,{title:"Settings",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:C?"power-off":"times",content:C?"On":"Off",color:C?"good":"bad",disabled:!f,onClick:function(){return l("toggle")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Identification String",buttons:(0,o.createComponentVNode)(2,i.Input,{width:13,value:g,onChange:function(e,t){return l("id",{value:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Network",buttons:(0,o.createComponentVNode)(2,i.Input,{width:10,value:b,defaultValue:"tcommsat",onChange:function(e,t){return l("network",{value:t})}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Prefabrication",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:N?"check":"times",content:N?"True":"False",disabled:"True"})})]})}),!(!C||!f)&&(0,o.createComponentVNode)(2,i.Box,{children:["bus"===u&&(0,o.createComponentVNode)(2,i.Section,{title:"Bus",children:(0,o.createComponentVNode)(2,i.Table,{children:(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:"Change Frequency:"}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:a.RADIO_CHANNELS.find((function(e){return e.freq===v}))&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:a.RADIO_CHANNELS.find((function(e){return e.freq===v})).color,ml:2,children:["[",a.RADIO_CHANNELS.find((function(e){return e.freq===v})).name,"]"]})}),(0,o.createComponentVNode)(2,i.NumberInput,{animate:!0,unit:"GHz",step:.2,stepPixelSize:10,minValue:s/10,maxValue:p/10,value:v/10,onChange:function(e,t){return l("change_freq",{value:t})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"times",disabled:0===v,onClick:function(){return l("change_freq",{value:10001})}})]})})}),"relay"===u&&(0,o.createComponentVNode)(2,i.Section,{title:"Relay",children:[(0,o.createComponentVNode)(2,i.Button,{content:"Receiving",icon:y?"volume-up":"volume-mute",color:y?"":"bad",onClick:function(){return l("receive")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Broadcasting",icon:V?"microphone":"microphone-slash",color:V?"":"bad",onClick:function(){return l("broadcast")}})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Linked Network Entities",children:(0,o.createComponentVNode)(2,i.Table,{children:k.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,children:[e.index,". ",e.id," (",e.name,")"]}),!!f&&(0,o.createComponentVNode)(2,i.Button,{icon:"times",disabled:!f,onClick:function(){return l("unlink",{value:e.index})}})]},e.id)}))})}),(0,o.createComponentVNode)(2,i.Section,{title:"Filtered Frequencies",children:(0,o.createComponentVNode)(2,i.Table,{children:[x.map((function(e){return(0,o.createComponentVNode)(2,i.Table.Row,{className:"candystripe",children:[(0,o.createComponentVNode)(2,i.Table.Cell,{bold:!0,children:[e/10," GHz"]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:a.RADIO_CHANNELS.find((function(t){return t.freq===e}))&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:a.RADIO_CHANNELS.find((function(t){return t.freq===e})).color,ml:2,children:["[",a.RADIO_CHANNELS.find((function(t){return t.freq===e})).name," ]"]})}),(0,o.createComponentVNode)(2,i.Table.Cell),!!f&&(0,o.createComponentVNode)(2,i.Button,{icon:"times",disabled:!f,onClick:function(){return l("delete",{value:e})}})]},x.i)})),!!f&&(0,o.createComponentVNode)(2,i.Table.Row,{className:"candystripe",collapsing:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:"Add Frequency"}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:a.RADIO_CHANNELS.find((function(e){return e.freq===m}))&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:a.RADIO_CHANNELS.find((function(e){return e.freq===m})).color,ml:2,children:["[",a.RADIO_CHANNELS.find((function(e){return e.freq===m})).name,"]"]})}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.NumberInput,{animate:!0,unit:"GHz",step:.2,stepPixelSize:10,minValue:s/10,maxValue:p/10,value:m/10,onChange:function(e,t){return l("tempfreq",{value:t})}})}),(0,o.createComponentVNode)(2,i.Button,{icon:"plus",disabled:!f,onClick:function(){return l("freq")}})]})]})}),!!f&&(0,o.createComponentVNode)(2,i.Section,{title:"Multitool",children:[!!h&&(0,o.createComponentVNode)(2,i.Box,{bold:!0,m:1,children:["Current Buffer: ",h]}),(0,o.createComponentVNode)(2,i.LabeledControls,{m:1,children:[(0,o.createComponentVNode)(2,i.Button,{icon:"plus",content:"Add Machine",disabled:!f,onClick:function(){return l("buffer")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"link",content:"Link",disabled:!h,onClick:function(){return l("link")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"times",content:"Flush",disabled:!h,onClick:function(){return l("flush")}})]})]})]})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Teleporter=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Teleporter=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.calibrated,u=l.calibrating,s=l.power_station,p=l.regime_set,m=l.teleporter_hub,f=l.target;return(0,o.createComponentVNode)(2,a.Window,{width:470,height:140,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{children:!s&&(0,o.createComponentVNode)(2,i.Box,{color:"bad",textAlign:"center",children:"No power station linked."})||!m&&(0,o.createComponentVNode)(2,i.Box,{color:"bad",textAlign:"center",children:"No hub linked."})||(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Regime",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"tools",content:"Change Regime",onClick:function(){return c("regimeset")}}),children:p}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Target",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"tools",content:"Set Target",onClick:function(){return c("settarget")}}),children:f}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Calibration",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"tools",content:"Calibrate Hub",onClick:function(){return c("calibrate")}}),children:u&&(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"In Progress"})||d&&(0,o.createComponentVNode)(2,i.Box,{color:"good",children:"Optimal"})||(0,o.createComponentVNode)(2,i.Box,{color:"bad",children:"Sub-Optimal"})})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.ThermoMachine=void 0;var o=n(0),r=n(16),i=n(1),a=n(3),c=n(2);t.ThermoMachine=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data;return(0,o.createComponentVNode)(2,c.Window,{width:300,height:230,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Status",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Temperature",children:[(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:d.temperature,format:function(e){return(0,r.toFixed)(e,2)}})," K"]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pressure",children:[(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:d.pressure,format:function(e){return(0,r.toFixed)(e,2)}})," kPa"]})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Controls",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:d.on?"power-off":"times",content:d.on?"On":"Off",selected:d.on,onClick:function(){return l("power")}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Target Temperature",children:(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,value:Math.round(d.target),unit:"K",width:"62px",minValue:Math.round(d.min),maxValue:Math.round(d.max),step:5,stepPixelSize:3,onDrag:function(e,t){return l("target",{target:t})}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Presets",children:[(0,o.createComponentVNode)(2,a.Button,{icon:"fast-backward",disabled:d.target===d.min,title:"Minimum temperature",onClick:function(){return l("target",{target:d.min})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"sync",disabled:d.target===d.initial,title:"Room Temperature",onClick:function(){return l("target",{target:d.initial})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"fast-forward",disabled:d.target===d.max,title:"Maximum Temperature",onClick:function(){return l("target",{target:d.max})}})]})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Timer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Timer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.minutes,u=l.seconds,s=l.timing,p=l.loop;return(0,o.createComponentVNode)(2,a.Window,{width:275,height:115,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Timing Unit",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:p?"Repeating":"Repeat",selected:p,onClick:function(){return c("repeat")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"clock-o",content:s?"Stop":"Start",selected:s,onClick:function(){return c("time")}})],4),children:[(0,o.createComponentVNode)(2,i.Button,{icon:"fast-backward",disabled:s,onClick:function(){return c("input",{adjust:-30})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"backward",disabled:s,onClick:function(){return c("input",{adjust:-1})}})," ",String(d).padStart(2,"0"),":",String(u).padStart(2,"0")," ",(0,o.createComponentVNode)(2,i.Button,{icon:"forward",disabled:s,onClick:function(){return c("input",{adjust:1})}}),(0,o.createComponentVNode)(2,i.Button,{icon:"fast-forward",disabled:s,onClick:function(){return c("input",{adjust:30})}})]})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.TransferValve=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.TransferValve=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.tank_one,u=l.tank_two,s=l.attached_device,p=l.valve;return(0,o.createComponentVNode)(2,a.Window,{width:310,height:320,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Valve Status",children:(0,o.createComponentVNode)(2,i.Button,{icon:p?"unlock":"lock",content:p?"Open":"Closed",disabled:!d||!u,onClick:function(){return c("toggle")}})})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Valve Attachment",buttons:(0,o.createComponentVNode)(2,i.Button,{textAlign:"center",width:"30px",icon:"cog",disabled:!s,onClick:function(){return c("device")}}),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:s?(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Attachment",children:(0,o.createComponentVNode)(2,i.Button,{icon:"wrench",content:s,disabled:!s,onClick:function(){return c("remove_device")}})}):(0,o.createComponentVNode)(2,i.NoticeBox,{textAlign:"center",children:"Insert Assembly"})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Attachment One",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:d?(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Attachment",children:(0,o.createComponentVNode)(2,i.Button,{icon:"wrench",content:d,disabled:!d,onClick:function(){return c("tankone")}})}):(0,o.createComponentVNode)(2,i.NoticeBox,{textAlign:"center",children:"Insert Tank"})})}),(0,o.createComponentVNode)(2,i.Section,{title:"Attachment Two",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:u?(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Attachment",children:(0,o.createComponentVNode)(2,i.Button,{icon:"wrench",content:u,disabled:!u,onClick:function(){return c("tanktwo")}})}):(0,o.createComponentVNode)(2,i.NoticeBox,{textAlign:"center",children:"Insert Tank"})})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.TurbineComputer=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.TurbineComputer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=Boolean(l.compressor&&!l.compressor_broke&&l.turbine&&!l.turbine_broke);return(0,o.createComponentVNode)(2,a.Window,{width:310,height:150,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{title:"Status",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{icon:l.online?"power-off":"times",content:l.online?"Online":"Offline",selected:l.online,disabled:!d,onClick:function(){return c("toggle_power")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"sync",content:"Reconnect",onClick:function(){return c("reconnect")}})],4),children:!d&&(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Compressor Status",color:!l.compressor||l.compressor_broke?"bad":"good",children:l.compressor_broke?l.compressor?"Offline":"Missing":"Online"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Turbine Status",color:!l.turbine||l.turbine_broke?"bad":"good",children:l.turbine_broke?l.turbine?"Offline":"Missing":"Online"})]})||(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Turbine Speed",children:[l.rpm," RPM"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Internal Temp",children:[l.temp," K"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Generated Power",children:l.power})]})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.TurretControl=void 0;var o=n(0),r=n(1),i=n(3),a=n(2),c=n(61);t.TurretControl=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.locked&&!d.siliconUser,s=d.enabled,p=d.lethal,m=d.shootCyborgs;return(0,o.createComponentVNode)(2,a.Window,{width:305,height:168,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,c.InterfaceLockNoticeBox),(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Turret Status",children:(0,o.createComponentVNode)(2,i.Button,{icon:s?"power-off":"times",content:s?"Enabled":"Disabled",selected:s,disabled:u,onClick:function(){return l("power")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Turret Mode",children:(0,o.createComponentVNode)(2,i.Button,{icon:p?"exclamation-triangle":"minus-circle",content:p?"Lethal":"Stun",color:p?"bad":"average",disabled:u,onClick:function(){return l("mode")}})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Target Cyborgs",children:(0,o.createComponentVNode)(2,i.Button,{icon:m?"check":"times",content:m?"Yes":"No",selected:m,disabled:u,onClick:function(){return l("shoot_silicons")}})})]})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.VaultController=void 0;var o=n(0),r=n(16),i=n(1),a=n(3),c=n(2);t.VaultController=function(e,t){var n=(0,i.useBackend)(t),l=n.act,d=n.data;return(0,o.createComponentVNode)(2,c.Window,{width:300,height:120,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Lock Status: ",buttons:(0,o.createComponentVNode)(2,a.Button,{content:d.doorstatus?"Locked":"Unlocked",icon:d.doorstatus?"lock":"unlock",disabled:d.stored<d.max,onClick:function(){return l("togglelock")}}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Charge",children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:d.stored/d.max,ranges:{good:[1,Infinity],average:[.3,1],bad:[-Infinity,.3]},children:(0,r.toFixed)(d.stored/1e3)+" / "+(0,r.toFixed)(d.max/1e3)+" kW"})})})})})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Vendatray=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Vendatray=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,u=d.product_name,s=d.product_cost,p=d.tray_open,m=d.registered,f=d.owner_name;return(0,o.createComponentVNode)(2,a.Window,{width:300,height:270,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Flex,{mb:1,children:[(0,o.createComponentVNode)(2,i.Flex.Item,{mr:1,children:!!u&&(0,o.createComponentVNode)(2,c)}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,children:[(0,o.createComponentVNode)(2,i.Section,{fontSize:"18px",align:"center",children:[(0,o.createVNode)(1,"b",null,u||"Empty",0),(0,o.createComponentVNode)(2,i.Box,{fontSize:"16px",children:[(0,o.createVNode)(1,"i",null,[u?s:"N/A",(0,o.createTextVNode)(" cr ")],0),(0,o.createComponentVNode)(2,i.Button,{icon:"pen",onClick:function(){return l("Adjust")}})]})]}),(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"window-restore",content:p?"Open":"Closed",selected:p,onClick:function(){return l("Open")}}),(0,o.createComponentVNode)(2,i.Button.Confirm,{fluid:!0,icon:"money-bill-wave",content:"Purchase Item",disabled:!u,onClick:function(){return l("Buy")}})],4)]})]}),m?(0,o.createComponentVNode)(2,i.Section,{italics:!0,children:["Pays to the account of ",f,"."]}):(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{children:"Tray is unregistered."}),(0,o.createComponentVNode)(2,i.Button,{fluid:!0,icon:"cash-register",content:"Register Tray",disabled:m,onClick:function(){return l("Register")}})],4)]})})};var c=function(e,t){var n=(0,r.useBackend)(t).data.product_icon;return(0,o.createComponentVNode)(2,i.Section,{height:"100%",children:(0,o.createComponentVNode)(2,i.Box,{as:"img",m:1,src:"data:image/jpeg;base64,"+n,height:"96px",width:"96px",style:{"-ms-interpolation-mode":"nearest-neighbor","vertical-align":"middle"}})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Vending=void 0;var o=n(0),r=n(6),i=n(1),a=n(3),c=n(2),l=function(e,t){var n=(0,i.useBackend)(t),c=n.act,l=n.data,d=e.product,u=e.productStock,s=e.custom,p=l.onstation,m=l.department,f=l.user,h=!p||0===d.price||!d.premium&&m&&f&&m===f.department;return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,children:d.base64&&(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/jpeg;base64,"+d.img,style:{"vertical-align":"middle","horizontal-align":"middle"}})||(0,o.createVNode)(1,"span",(0,r.classes)(["vending32x32",d.path]),null,1,{style:{"vertical-align":"middle","horizontal-align":"middle"}})}),(0,o.createComponentVNode)(2,a.Table.Cell,{bold:!0,children:d.name}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"center",children:(0,o.createComponentVNode)(2,a.Box,{color:(s?"good":u<=0&&"bad")||u<=d.max_amount/2&&"average"||"good",children:[u," in stock"]})}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0,textAlign:"center",children:s&&(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:l.access?"FREE":d.price+" cr",onClick:function(){return c("dispense",{item:d.name})}})||(0,o.createComponentVNode)(2,a.Button,{fluid:!0,disabled:0===u||!h&&(!l.user||d.price>l.user.cash),content:h?"FREE":d.price+" cr",onClick:function(){return c("vend",{ref:d.ref})}})})]})};t.Vending=function(e,t){var n,r=(0,i.useBackend)(t),d=(r.act,r.data),u=d.user,s=d.onstation,p=d.product_records,m=void 0===p?[]:p,f=d.coin_records,h=void 0===f?[]:f,C=d.hidden_records,g=void 0===C?[]:C,b=d.stock,N=!1;return d.vending_machine_input?(n=d.vending_machine_input||[],N=!0):(n=[].concat(m,h),d.extended_inventory&&(n=[].concat(n,g))),n=n.filter((function(e){return!!e})),(0,o.createComponentVNode)(2,c.Window,{title:"Vending Machine",width:450,height:600,resizable:!0,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[!!s&&(0,o.createComponentVNode)(2,a.Section,{title:"User",children:u&&(0,o.createComponentVNode)(2,a.Box,{children:["Welcome, ",(0,o.createVNode)(1,"b",null,u.name,0),","," ",(0,o.createVNode)(1,"b",null,u.job||"Unemployed",0),"!",(0,o.createVNode)(1,"br"),"Your balance is ",(0,o.createVNode)(1,"b",null,[u.cash,(0,o.createTextVNode)(" credits")],0),"."]})||(0,o.createComponentVNode)(2,a.Box,{color:"light-grey",children:["No registered ID card!",(0,o.createVNode)(1,"br"),"Please contact your local HoP!"]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Products",children:(0,o.createComponentVNode)(2,a.Table,{children:n.map((function(e){return(0,o.createComponentVNode)(2,l,{custom:N,product:e,productStock:b[e.name]},e.name)}))})})]})})}},function(e,t,n){"use strict";t.__esModule=!0,t.Wires=void 0;var o=n(0),r=n(1),i=n(3),a=n(2);t.Wires=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.wires||[],u=l.status||[];return(0,o.createComponentVNode)(2,a.Window,{width:350,height:150+30*d.length,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:d.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{className:"candystripe",label:e.color,labelColor:e.color,color:e.color,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{content:e.cut?"Mend":"Cut",onClick:function(){return c("cut",{wire:e.color})}}),(0,o.createComponentVNode)(2,i.Button,{content:"Pulse",onClick:function(){return c("pulse",{wire:e.color})}}),(0,o.createComponentVNode)(2,i.Button,{content:e.attached?"Detach":"Attach",onClick:function(){return c("attach",{wire:e.color})}})],4),children:!!e.wire&&(0,o.createVNode)(1,"i",null,[(0,o.createTextVNode)("("),e.wire,(0,o.createTextVNode)(")")],0)},e.color)}))})}),!!u.length&&(0,o.createComponentVNode)(2,i.Section,{children:u.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:e},e)}))})]})})}}]); \ No newline at end of file diff --git a/tgui/packages/tgui/public/tgui.html b/tgui/packages/tgui/public/tgui.html index 72762950928..0707c6c2445 100644 --- a/tgui/packages/tgui/public/tgui.html +++ b/tgui/packages/tgui/public/tgui.html @@ -218,14 +218,10 @@ Byond.topic({ </script> <!-- Styles --> -<link rel="stylesheet" type="text/css" href="tgui.bundle.css"> - -<!-- This is processed in byond, so interfaces can override the - html head if needed, for custom sheets of style etc. --> -<!--customheadhtml--> +<!-- tgui:styles --> <!-- Scripts --> -<script type="text/javascript" defer src="tgui.bundle.js"></script> +<!-- tgui:scripts --> </head> <body> diff --git a/tgui/packages/tgui/store.js b/tgui/packages/tgui/store.js index 496e5a84bd0..27419e85e1d 100644 --- a/tgui/packages/tgui/store.js +++ b/tgui/packages/tgui/store.js @@ -11,6 +11,7 @@ import { backendMiddleware, backendReducer } from './backend'; import { debugReducer } from './debug'; import { hotKeyMiddleware } from './hotkeys'; import { createLogger } from './logging'; +import { assetMiddleware } from './assets'; const logger = createLogger('store'); @@ -24,13 +25,13 @@ export const createStore = () => { }), ]); const middleware = [ + process.env.NODE_ENV !== 'production' && loggingMiddleware, + assetMiddleware, hotKeyMiddleware, backendMiddleware, ]; - if (process.env.NODE_ENV !== 'production') { - middleware.push(loggingMiddleware); - } - return createReduxStore(reducer, applyMiddleware(...middleware)); + return createReduxStore(reducer, + applyMiddleware(...middleware.filter(Boolean))); }; const loggingMiddleware = store => next => action => { diff --git a/tools/MapAtmosFixer/MapAtmosFixer.exe b/tools/MapAtmosFixer/MapAtmosFixer.exe deleted file mode 100644 index bce9ecbc0b1..00000000000 Binary files a/tools/MapAtmosFixer/MapAtmosFixer.exe and /dev/null differ diff --git a/tools/MapAtmosFixer/MapAtmosFixer.pdb b/tools/MapAtmosFixer/MapAtmosFixer.pdb deleted file mode 100644 index 6a348c518f0..00000000000 Binary files a/tools/MapAtmosFixer/MapAtmosFixer.pdb and /dev/null differ diff --git a/tools/MapAtmosFixer/MapAtmosFixer.sln b/tools/MapAtmosFixer/MapAtmosFixer.sln deleted file mode 100644 index 4c5fd5dc323..00000000000 --- a/tools/MapAtmosFixer/MapAtmosFixer.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MapAtmosFixer", "MapAtmosFixer\MapAtmosFixer.csproj", "{7A901E97-C798-4B17-A9A9-5548C6DCDB56}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7A901E97-C798-4B17-A9A9-5548C6DCDB56}.Debug|x86.ActiveCfg = Debug|x86 - {7A901E97-C798-4B17-A9A9-5548C6DCDB56}.Debug|x86.Build.0 = Debug|x86 - {7A901E97-C798-4B17-A9A9-5548C6DCDB56}.Release|x86.ActiveCfg = Release|x86 - {7A901E97-C798-4B17-A9A9-5548C6DCDB56}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tools/MapAtmosFixer/MapAtmosFixer.suo b/tools/MapAtmosFixer/MapAtmosFixer.suo deleted file mode 100644 index e3eac516cc9..00000000000 Binary files a/tools/MapAtmosFixer/MapAtmosFixer.suo and /dev/null differ diff --git a/tools/MapAtmosFixer/MapAtmosFixer/MapAtmosFixer.csproj b/tools/MapAtmosFixer/MapAtmosFixer/MapAtmosFixer.csproj deleted file mode 100644 index 85724742f85..00000000000 --- a/tools/MapAtmosFixer/MapAtmosFixer/MapAtmosFixer.csproj +++ /dev/null @@ -1,58 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <PropertyGroup> - <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> - <Platform Condition=" '$(Platform)' == '' ">x86</Platform> - <ProductVersion>8.0.30703</ProductVersion> - <SchemaVersion>2.0</SchemaVersion> - <ProjectGuid>{7A901E97-C798-4B17-A9A9-5548C6DCDB56}</ProjectGuid> - <OutputType>Exe</OutputType> - <AppDesignerFolder>Properties</AppDesignerFolder> - <RootNamespace>MapAtmosFixer</RootNamespace> - <AssemblyName>MapAtmosFixer</AssemblyName> - <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> - <TargetFrameworkProfile>Client</TargetFrameworkProfile> - <FileAlignment>512</FileAlignment> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> - <PlatformTarget>x86</PlatformTarget> - <DebugSymbols>true</DebugSymbols> - <DebugType>full</DebugType> - <Optimize>false</Optimize> - <OutputPath>bin\Debug\</OutputPath> - <DefineConstants>DEBUG;TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> - <PlatformTarget>x86</PlatformTarget> - <DebugType>pdbonly</DebugType> - <Optimize>true</Optimize> - <OutputPath>bin\Release\</OutputPath> - <DefineConstants>TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - </PropertyGroup> - <ItemGroup> - <Reference Include="System" /> - <Reference Include="System.Core" /> - <Reference Include="System.Xml.Linq" /> - <Reference Include="System.Data.DataSetExtensions" /> - <Reference Include="Microsoft.CSharp" /> - <Reference Include="System.Data" /> - <Reference Include="System.Xml" /> - </ItemGroup> - <ItemGroup> - <Compile Include="Mapatmosfixer.cs" /> - <Compile Include="Program.cs" /> - <Compile Include="Properties\AssemblyInfo.cs" /> - </ItemGroup> - <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> - <!-- To modify your build process, add your task inside one of the targets below and uncomment it. - Other similar extension points exist, see Microsoft.Common.targets. - <Target Name="BeforeBuild"> - </Target> - <Target Name="AfterBuild"> - </Target> - --> -</Project> \ No newline at end of file diff --git a/tools/MapAtmosFixer/MapAtmosFixer/Mapatmosfixer.cs b/tools/MapAtmosFixer/MapAtmosFixer/Mapatmosfixer.cs deleted file mode 100644 index ce8e66231fe..00000000000 --- a/tools/MapAtmosFixer/MapAtmosFixer/Mapatmosfixer.cs +++ /dev/null @@ -1,371 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Text.RegularExpressions; - -namespace MapAtmosFixer -{ - internal enum Objtype - { - Null, - Manifold, - Pump, - Pipe, - Scrubber, - Vent, - Mixer, - Filter, - Injector, - Temp - } - - internal static class Mapatmosfixer - { - /// <summary> - /// Used to make displayed lines shorter. - /// </summary> - /// <param name="path">The long path</param> - /// <param name="masterpath">The path to short with</param> - /// <returns>Shorted path</returns> - public static string ShortenPath(string path, ref string masterpath) - { - return path.Substring(masterpath.Length, path.Length - masterpath.Length); - } - - /// <summary> - /// Returns true if 'str' starts with 'start' - /// </summary> - /// <param name="str">String to test</param> - /// <param name="start"></param> - /// <returns></returns> - public static bool StartsWith(string str, string start) - { - if (start.Length > str.Length) - return false; - - return str.Substring(0, start.Length) == start; - } - - /// <summary> - /// Method to perform a simple regex match. - /// </summary> - /// <param name="pattern">Regex pattern</param> - /// <param name="txt">String to match</param> - /// <returns>Collection of matches</returns> - public static GroupCollection Regex(string pattern, string txt) - { - var rgx = new Regex(pattern, RegexOptions.IgnoreCase); - MatchCollection matches = rgx.Matches(txt); - - if (matches.Count == 0) - return null; - - GroupCollection groups = matches[0].Groups; - if (groups.Count <= 1) - return null; - - return groups; - } - - /// <summary> - /// Gets the type of the object in the path - /// </summary> - /// <param name="path">String path</param> - /// <returns></returns> - public static Objtype GetType(string path) - { - if (StartsWith(path, "/obj/machinery/atmospherics/pipe/manifold")) - return Objtype.Manifold; - - if (StartsWith(path, "/obj/machinery/atmospherics/pipe/simple")) - return Objtype.Pipe; - - switch (path) - { - case "/obj/machinery/atmospherics/binary/pump": - return Objtype.Pump; - case "/obj/machinery/atmospherics/unary/vent_scrubber": - return Objtype.Scrubber; - case "/obj/machinery/atmospherics/unary/vent_pump": - return Objtype.Vent; - case "/obj/machinery/atmospherics/trinary/filter": - return Objtype.Filter; - case "/obj/machinery/atmospherics/trinary/mixer": - return Objtype.Mixer; - case "/obj/machinery/atmospherics/unary/heat_reservoir/heater": - return Objtype.Temp; - case "/obj/machinery/atmospherics/unary/cold_sink/freezer": - return Objtype.Temp; - case "/obj/machinery/atmospherics/unary/outlet_injector": - return Objtype.Injector; - default: - return Objtype.Null; - } - } - - /// <summary> - /// Updates an objects path with its corresponding icon_state - /// </summary> - /// <param name="path">Object path to change</param> - /// <param name="iconstate">Iconstate it has</param> - /// <param name="objtype">Type of the object</param> - public static void ProcessIconstate(ref string path, string iconstate, Objtype objtype) - { - switch (objtype) - { - case Objtype.Pipe: - switch (iconstate) - { - case "intact": - path = "/obj/machinery/atmospherics/pipe/simple/general/visible"; - return; - case "intact-f": - path = "/obj/machinery/atmospherics/pipe/simple/general/hidden"; - return; - case "intact-b": - path = "/obj/machinery/atmospherics/pipe/simple/supply/visible"; - return; - case "intact-b-f": - path = "/obj/machinery/atmospherics/pipe/simple/supply/hidden"; - return; - case "intact-r": - path = "/obj/machinery/atmospherics/pipe/simple/scrubbers/visible"; - return; - case "intact-r-f": - path = "/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden"; - return; - case "intact-y": - path = "/obj/machinery/atmospherics/pipe/simple/yellow/visible"; - return; - case "intact-y-f": - path = "/obj/machinery/atmospherics/pipe/simple/yellow/hidden"; - return; - case "intact-g": - path = "/obj/machinery/atmospherics/pipe/simple/green/visible"; - return; - case "intact-g-f": - path = "/obj/machinery/atmospherics/pipe/simple/green/hidden"; - return; - case "intact-c": - path = "/obj/machinery/atmospherics/pipe/simple/cyan/visible"; - return; - case "intact-c-f": - path = "/obj/machinery/atmospherics/pipe/simple/cyan/hidden"; - return; - case "intact-p": - path = "/obj/machinery/atmospherics/pipe/simple/supplymain/visible"; - return; - case "intact-p-f": - path = "/obj/machinery/atmospherics/pipe/simple/supplymain/hidden"; - return; - } - return; - case Objtype.Manifold: - switch (iconstate) - { - case "manifold": - path = "/obj/machinery/atmospherics/pipe/manifold/general/visible"; - return; - case "manifold-f": - path = "/obj/machinery/atmospherics/pipe/manifold/general/hidden"; - return; - case "manifold-b": - path = "/obj/machinery/atmospherics/pipe/manifold/supply/visible"; - return; - case "manifold-b-f": - path = "/obj/machinery/atmospherics/pipe/manifold/supply/hidden"; - return; - case "manifold-r": - path = "/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible"; - return; - case "manifold-r-f": - path = "/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden"; - return; - case "manifold-c": - path = "/obj/machinery/atmospherics/pipe/manifold/cyan/visible"; - return; - case "manifold-c-f": - path = "/obj/machinery/atmospherics/pipe/manifold/cyan/hidden"; - return; - case "manifold-y": - path = "/obj/machinery/atmospherics/pipe/manifold/yellow/visible"; - return; - case "manifold-y-f": - path = "/obj/machinery/atmospherics/pipe/manifold/yellow/hidden"; - return; - case "manifold-g": - path = "/obj/machinery/atmospherics/pipe/manifold/green/visible"; - return; - case "manifold-g-f": - path = "/obj/machinery/atmospherics/pipe/manifold/green/hidden"; - return; - case "manifold-p": - path = "/obj/machinery/atmospherics/pipe/manifold/supplymain/visible"; - return; - case "manifold-p-f": - path = "/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden"; - return; - } - return; - } - } - - /// <summary> - /// Processes one object and its parameters - /// </summary> - /// <param name="line"></param> - public static void ProcessObject(ref string line) - { - GroupCollection g = Regex(@"^(.+)\{(.+)\}", line); - if (g == null) - return; - - string path = g[1].Value; - string stringtags = g[2].Value; - - Objtype objtype = GetType(path); - if (objtype == Objtype.Null) - return; - - var tags = new List<string>(stringtags.Split(new[] {"; "}, StringSplitOptions.None)); - for (int i = 0; i < tags.Count; i++) - { - string tag = tags[i]; - - GroupCollection g2 = Regex(@"^(.+)[ ]=[ ](.+)", tag); - if (g2 == null) - continue; - - string name = g2[1].Value; - string value = g2[2].Value.Trim(new[] {'"'}); - - //Removes icon_state from heaters/freezers - if (objtype == Objtype.Temp) - { - if (name == "icon_state") - { - tags.RemoveAt(i); - i--; - } - continue; - } - - //General removal of tags we shouldn't have - if (name == "pipe_color" || name == "color" || name == "level" || - (objtype != Objtype.Pump && name == "name") - || (objtype == Objtype.Pump && name == "icon_state")) - { - tags.RemoveAt(i); - i--; - continue; - } - - //Processes icon_state into correct path - if (name == "icon_state") - { - ProcessIconstate(ref path, value, objtype); - tags.RemoveAt(i); - i--; - continue; - } - - //Fixes up injector - if (objtype == Objtype.Injector && name == "on") - { - path = "/obj/machinery/atmospherics/unary/outlet_injector/on"; - tags.RemoveAt(i); - i--; - } - } - - stringtags = String.Join("; ", tags); - line = String.Format("{0}{{{1}}}", path, stringtags); - } - - /// <summary> - /// This fixes connectors to their proper path, if they ain't on plating, they should be visible. - /// </summary> - /// <param name="line"></param> - public static void FixConnector(ref string line) - { - //Dirty shit, don't read this - if (line.Contains("/obj/machinery/atmospherics/portables_connector") && - //!line.Contains("/turf/open/floor/plating") && // Most of the time connectors on plating want to be visible.. - !line.Contains("/obj/machinery/atmospherics/portables_connector/visible")) // Makes sure we don't update same line twice - { - line = line.Replace("/obj/machinery/atmospherics/portables_connector", - "/obj/machinery/atmospherics/portables_connector/visible"); - } - } - - /// <summary> - /// Processes a line of objects - /// </summary> - /// <param name="line"></param> - public static void ProcessObjectline(ref string line) - { - FixConnector(ref line); - - string[] objs = line.Split(','); - - for (int i = 0; i < objs.Length; i++) - { - try - { - ProcessObject(ref objs[i]); - } - catch (Exception e) - { - Console.WriteLine(e.ToString()); - } - } - - line = String.Join(",", objs); - } - - /// <summary> - /// Processes a whole .dmm - /// </summary> - /// <param name="file"></param> - public static void Process(string file) - { - string[] lines = File.ReadAllLines(file, Encoding.Default); - - for (int i = 0; i < lines.Length; i++) - { - string line = lines[i]; - - if (line.Length == 0) - continue; - - if (line[0] != '"') - continue; - - GroupCollection g = Regex(@"^""([\w]+)""[ ]\=[ ]\((.+)\)", line); - if (g == null) - continue; - - string letters = g[1].Value; - string types = g[2].Value; - ProcessObjectline(ref types); - - line = String.Format("\"{0}\" = ({1})", letters, types); - - lines[i] = line; - } - - File.WriteAllLines(file, lines, Encoding.Default); - } - - internal static void Init(string file) - { - //string exepath = "C:\\Users\\Daniel\\Documents\\GitHub\\-tg-station"; - //string file = "C:\\Users\\Daniel\\Documents\\GitHub\\-tg-station\\_maps\\map_files\\tgstation.2.1.3.dmm"; - - Process(file); - Console.WriteLine("Done"); - Console.Read(); - } - } -} \ No newline at end of file diff --git a/tools/MapAtmosFixer/MapAtmosFixer/Program.cs b/tools/MapAtmosFixer/MapAtmosFixer/Program.cs deleted file mode 100644 index 96213ee7880..00000000000 --- a/tools/MapAtmosFixer/MapAtmosFixer/Program.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; - -namespace MapAtmosFixer -{ - class Program - { - static void Main(string[] args) - { - if (args.Length < 1) - { - Console.WriteLine("Please drag-drop file onto the .exe"); - Console.Read(); - return; - } - - string file = args[0]; - if (Path.GetExtension(file) != ".dmm") - { - Console.WriteLine("File not a map."); - Console.Read(); - return; - } - - Mapatmosfixer.Init(file); - } - } -} diff --git a/tools/MapAtmosFixer/MapAtmosFixer/Properties/AssemblyInfo.cs b/tools/MapAtmosFixer/MapAtmosFixer/Properties/AssemblyInfo.cs deleted file mode 100644 index 1cc64b87ac9..00000000000 --- a/tools/MapAtmosFixer/MapAtmosFixer/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("MapAtmosFixer")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MapAtmosFixer")] -[assembly: AssemblyCopyright("Copyright © 2014")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("87bc6d96-c3ae-4644-ac20-033d8ec401e5")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tools/MapAtmosFixer/Readme.txt b/tools/MapAtmosFixer/Readme.txt deleted file mode 100644 index 10f10355a75..00000000000 --- a/tools/MapAtmosFixer/Readme.txt +++ /dev/null @@ -1,9 +0,0 @@ -A handy tool used to clean up all shit mappers leave behind when doing atmosia code. - -Basically it removes most edited variables and instead let the code and object do the work, less hacky shit and everything can be edited in-code without having to edit the map. - -How to use: -Drag-n-drop an .dmm onto the compiled .exe -The program will run and then overwrite the same .dmm - -Mapmerge tool is not necessary to be run with this. \ No newline at end of file diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM.sln b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM.sln deleted file mode 100644 index 22ed586bbbf..00000000000 --- a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnstandardnessTestForDM", "UnstandardnessTestForDM\UnstandardnessTestForDM.csproj", "{A0EEBFC9-41D4-474D-853D-126AFDFB82DE}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A0EEBFC9-41D4-474D-853D-126AFDFB82DE}.Debug|x86.ActiveCfg = Debug|x86 - {A0EEBFC9-41D4-474D-853D-126AFDFB82DE}.Debug|x86.Build.0 = Debug|x86 - {A0EEBFC9-41D4-474D-853D-126AFDFB82DE}.Release|x86.ActiveCfg = Release|x86 - {A0EEBFC9-41D4-474D-853D-126AFDFB82DE}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM.suo b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM.suo deleted file mode 100644 index e62a5089375..00000000000 Binary files a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM.suo and /dev/null differ diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.Designer.cs b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.Designer.cs deleted file mode 100644 index 5ea6e86aa7a..00000000000 --- a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.Designer.cs +++ /dev/null @@ -1,160 +0,0 @@ -namespace UnstandardnessTestForDM -{ - partial class Form1 - { - /// <summary> - /// Required designer variable. - /// </summary> - private System.ComponentModel.IContainer components = null; - - /// <summary> - /// Clean up any resources being used. - /// </summary> - /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// <summary> - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// </summary> - private void InitializeComponent() - { - this.button1 = new System.Windows.Forms.Button(); - this.listBox1 = new System.Windows.Forms.ListBox(); - this.panel1 = new System.Windows.Forms.Panel(); - this.listBox2 = new System.Windows.Forms.ListBox(); - this.label4 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.panel1.SuspendLayout(); - this.SuspendLayout(); - // - // button1 - // - this.button1.Location = new System.Drawing.Point(12, 12); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(222, 23); - this.button1.TabIndex = 0; - this.button1.Text = "Locate all #defines"; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.button1_Click); - // - // listBox1 - // - this.listBox1.FormattingEnabled = true; - this.listBox1.Location = new System.Drawing.Point(12, 82); - this.listBox1.Name = "listBox1"; - this.listBox1.Size = new System.Drawing.Size(696, 160); - this.listBox1.TabIndex = 1; - this.listBox1.SelectedIndexChanged += new System.EventHandler(this.listBox1_SelectedIndexChanged); - // - // panel1 - // - this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panel1.Controls.Add(this.listBox2); - this.panel1.Controls.Add(this.label4); - this.panel1.Controls.Add(this.label3); - this.panel1.Controls.Add(this.label2); - this.panel1.Controls.Add(this.label1); - this.panel1.Location = new System.Drawing.Point(12, 297); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(696, 244); - this.panel1.TabIndex = 2; - // - // listBox2 - // - this.listBox2.FormattingEnabled = true; - this.listBox2.Location = new System.Drawing.Point(8, 71); - this.listBox2.Name = "listBox2"; - this.listBox2.Size = new System.Drawing.Size(683, 160); - this.listBox2.TabIndex = 4; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(5, 55); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(69, 13); - this.label4.TabIndex = 3; - this.label4.Text = "Referenced: "; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(5, 42); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(40, 13); - this.label3.TabIndex = 2; - this.label3.Text = "Value: "; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(5, 29); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(61, 13); - this.label2.TabIndex = 1; - this.label2.Text = "Defined in: "; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.label1.Location = new System.Drawing.Point(3, 0); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(79, 29); - this.label1.TabIndex = 0; - this.label1.Text = "label1"; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(9, 38); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(81, 13); - this.label5.TabIndex = 3; - this.label5.Text = "Files searched: "; - // - // Form1 - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(720, 553); - this.Controls.Add(this.label5); - this.Controls.Add(this.panel1); - this.Controls.Add(this.listBox1); - this.Controls.Add(this.button1); - this.Name = "Form1"; - this.Text = "Unstandardness Test For DM"; - this.panel1.ResumeLayout(false); - this.panel1.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button button1; - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label1; - public System.Windows.Forms.ListBox listBox2; - public System.Windows.Forms.Label label5; - public System.Windows.Forms.ListBox listBox1; - } -} - diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.cs b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.cs deleted file mode 100644 index 4966c3f0c18..00000000000 --- a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.cs +++ /dev/null @@ -1,484 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using System.Collections; -using System.IO; - -namespace UnstandardnessTestForDM -{ - public partial class Form1 : Form - { - DMSource source; - - public Form1() - { - InitializeComponent(); - source = new DMSource(); - source.mainform = this; - } - - private void button1_Click(object sender, EventArgs e) - { - source.find_all_defines(); - generate_define_report(); - } - - public void generate_define_report() - { - - TextWriter tw = new StreamWriter("DEFINES REPORT.txt"); - - tw.WriteLine("Unstandardness Test For DM report for DEFINES"); - tw.WriteLine("Generated on " + DateTime.Now); - tw.WriteLine("Total number of defines " + source.defines.Count()); - tw.WriteLine("Total number of Files " + source.filessearched); - tw.WriteLine("Total number of references " + source.totalreferences); - tw.WriteLine("Total number of errorous defines " + source.errordefines); - tw.WriteLine("------------------------------------------------"); - - foreach (Define d in source.defines) - { - tw.WriteLine(d.name); - tw.WriteLine("\tValue: " + d.value); - tw.WriteLine("\tComment: " + d.comment); - tw.WriteLine("\tDefined in: " + d.location + " : " + d.line); - tw.WriteLine("\tNumber of references: " + d.references.Count()); - foreach (String s in d.references) - { - tw.WriteLine("\t\t" + s); - } - } - - tw.WriteLine("------------------------------------------------"); - tw.WriteLine("SUCCESS"); - - tw.Close(); - - } - - private void listBox1_SelectedIndexChanged(object sender, EventArgs e) - { - try - { - Define d = (Define)listBox1.Items[listBox1.SelectedIndex]; - label1.Text = d.name; - label2.Text = "Defined in: " + d.location + " : " + d.line; - label3.Text = "Value: " + d.value; - label4.Text = "References: " + d.references.Count(); - listBox2.Items.Clear(); - foreach (String s in d.references) - { - listBox2.Items.Add(s); - } - - } - catch (Exception ex) { Console.WriteLine("ERROR HERE: " + ex.Message); } - } - - - } - - public class DMSource - { - public List<Define> defines; - public const int FLAG_DEFINE = 1; - public Form1 mainform; - - public int filessearched = 0; - public int totalreferences = 0; - public int errordefines = 0; - - public List<String> filenames; - - public DMSource() - { - defines = new List<Define>(); - filenames = new List<String>(); - } - - public void find_all_defines() - { - find_all_files(); - foreach(String filename in filenames){ - searchFileForDefines(filename); - } - - } - - public void find_all_files() - { - filenames = new List<String>(); - String dmefilename = ""; - - foreach (string f in Directory.GetFiles(".")) - { - if (f.ToLower().EndsWith(".dme")) - { - dmefilename = f; - break; - } - } - - if (dmefilename.Equals("")) - { - MessageBox.Show("dme file not found"); - return; - } - - using (var reader = File.OpenText(dmefilename)) - { - String s; - while (true) - { - s = reader.ReadLine(); - - if (!(s is String)) - break; - - if (s.StartsWith("#include")) - { - int start = s.IndexOf("\"")+1; - s = s.Substring(start, s.Length - 11); - - if (s.EndsWith(".dm")) - { - filenames.Add(s); - } - } - - s = s.Trim(' '); - if (s == "") { continue; } - } - reader.Close(); - } - } - - - public void DirSearch(string sDir, int flag) - { - try - { - foreach (string d in Directory.GetDirectories(sDir)) - { - foreach (string f in Directory.GetFiles(d)) - { - if (f.ToLower().EndsWith(".dm")) - { - if ((flag & FLAG_DEFINE) > 0) - { - searchFileForDefines(f); - } - } - } - DirSearch(d, flag); - } - } - catch (System.Exception excpt) - { - Console.WriteLine("ERROR IN DIRSEARCH"); - Console.WriteLine(excpt.Message); - Console.WriteLine(excpt.Data); - Console.WriteLine(excpt.ToString()); - Console.WriteLine(excpt.StackTrace); - Console.WriteLine("END OF ERROR IN DIRSEARCH"); - } - } - - //DEFINES - public void searchFileForDefines(String fileName) - { - filessearched++; - FileInfo f = new FileInfo(fileName); - List<String> lines = new List<String>(); - List<String> lines_without_comments = new List<String>(); - - mainform.label5.Text = "Files searched: " + filessearched + "; Defines found: " + defines.Count() + "; References found: " + totalreferences + "; Errorous defines: " + errordefines; - mainform.label5.Refresh(); - - //This code segment reads the file and stores it into the lines variable. - using (var reader = File.OpenText(fileName)) - { - try - { - String s; - while (true) - { - s = reader.ReadLine(); - lines.Add(s); - s = s.Trim(' '); - if (s == "") { continue; } - } - } - catch { } - reader.Close(); - } - - mainform.listBox1.Items.Add("ATTEMPTING: " + fileName); - lines_without_comments = remove_comments(lines); - - /*TextWriter tw = new StreamWriter(fileName); - foreach (String s in lines_without_comments) - { - tw.WriteLine(s); - } - tw.Close(); - mainform.listBox1.Items.Add("REWRITE: "+fileName);*/ - - try - { - for (int i = 0; i < lines_without_comments.Count; i++) - { - String line = lines_without_comments[i]; - - if (!(line is string)) - continue; - - //Console.WriteLine("LINE: " + line); - - foreach (Define define in defines) - { - - if (line.IndexOf(define.name) >= 0) - { - define.references.Add(fileName + " : " + i); - totalreferences++; - } - } - - if( line.ToLower().IndexOf("#define") >= 0 ) - { - line = line.Trim(); - line = line.Replace('\t', ' '); - //Console.WriteLine("LINE = "+line); - String[] slist = line.Split(' '); - if(slist.Length >= 3){ - //slist[0] has the value of "#define" - String name = slist[1]; - String value = slist[2]; - - for (int j = 3; j < slist.Length; j++) - { - value += " " + slist[j]; - //Console.WriteLine("LISTITEM["+j+"] = "+slist[j]); - } - - value = value.Trim(); - - String comment = ""; - - if (value.IndexOf("//") >= 0) - { - comment = value.Substring(value.IndexOf("//")); - value = value.Substring(0, value.IndexOf("//")); - } - - comment = comment.Trim(); - value = value.Trim(); - - Define d = new Define(fileName,i,name,value,comment); - defines.Add(d); - mainform.listBox1.Items.Add(d); - mainform.listBox1.Refresh(); - }else{ - Define d = new Define(fileName, i, "ERROR ERROR", "Something went wrong here", line); - errordefines++; - defines.Add(d); - mainform.listBox1.Items.Add(d); - mainform.listBox1.Refresh(); - } - } - } - } - catch (Exception e) { - Console.WriteLine(e.Message); - Console.WriteLine(e.StackTrace); - MessageBox.Show("Exception: " + e.Message + " | " + e.ToString()); - } - } - - bool iscomment = false; - int ismultilinecomment = 0; - bool isstring = false; - bool ismultilinestring = false; - int escapesequence = 0; - int stringvar = 0; - - public List<String> remove_comments(List<String> lines) - { - List<String> r = new List<String>(); - - iscomment = false; - ismultilinecomment = 0; - isstring = false; - ismultilinestring = false; - - bool skiponechar = false; //Used so the / in */ doesn't get written; - - for (int i = 0; i < lines.Count(); i++) - { - - String line = lines[i]; - - if (!(line is String)) - continue; - - iscomment = false; - isstring = false; - char ca = ' '; - escapesequence = 0; - - String newline = ""; - - int k = line.Length; - - for (int j = 0; j < k; j++) - { - - char c = line.ToCharArray()[j]; - - if (escapesequence == 0) - if (normalstatus()) - { - if (ca == '/' && c == '/') - { - c = ' '; - iscomment = true; - - newline = newline.Remove(newline.Length - 1); - k = line.Length; - } - if (ca == '/' && c == '*') - { - c = ' '; - ismultilinecomment = 1; - newline = newline.Remove(newline.Length - 1); - k = line.Length; - } - if (c == '"') - { - isstring = true; - } - if (ca == '{' && c == '"') - { - ismultilinestring = true; - } - } - else if (isstring) - { - - if (c == '\\') - { - escapesequence = 2; - } - else if (stringvar > 0) - { - if (c == ']') - { - stringvar--; - } - else if (c == '[') - { - stringvar++; - } - } - else if (c == '"') - { - isstring = false; - } - else if (c == '[') - { - stringvar++; - } - } - else if (ismultilinestring) - { - if (ca == '"' && c == '}') - { - ismultilinestring = false; - } - } - else if (ismultilinecomment > 0) - { - if (ca == '/' && c == '*') - { - c = ' '; //These things are here to prevent /*/ from bieng interpreted as the start and end of a comment. - skiponechar = true; - ismultilinecomment++; - } - if (ca == '*' && c == '/') - { - c = ' '; //These things are here to prevent /*/ from bieng interpreted as the start and end of a comment. - skiponechar = true; - ismultilinecomment--; - } - } - - if (!iscomment && (ismultilinecomment==0) && !skiponechar) - { - newline += c; - } - - if (skiponechar) - { - skiponechar = false; - } - if (escapesequence > 0) - { - escapesequence--; - } - else - { - ca = c; - } - } - - r.Add(newline.TrimEnd()); - - } - - return r; - } - - private bool normalstatus() - { - return !isstring && !ismultilinestring && (ismultilinecomment==0) && !iscomment && (escapesequence == 0); - } - - - } - - public class Define - { - public String location; - public int line; - public String name; - public String value; - public String comment; - public List<String> references; - - public Define(String location, int line, String name, String value, String comment) - { - this.location = location; - this.line = line; - this.name = name; - this.value = value; - this.comment = comment; - this.references = new List<String>(); - } - - public override String ToString() - { - return "DEFINE: \""+name+"\" is defined as \""+value+"\" AT "+location+" : "+line; - } - - } - - - - -} diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.resx b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.resx deleted file mode 100644 index 1af7de150c9..00000000000 --- a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.resx +++ /dev/null @@ -1,120 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<root> - <!-- - Microsoft ResX Schema - - Version 2.0 - - The primary goals of this format is to allow a simple XML format - that is mostly human readable. The generation and parsing of the - various data types are done through the TypeConverter classes - associated with the data types. - - Example: - - ... ado.net/XML headers & schema ... - <resheader name="resmimetype">text/microsoft-resx</resheader> - <resheader name="version">2.0</resheader> - <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> - <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> - <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> - <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> - <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> - <value>[base64 mime encoded serialized .NET Framework object]</value> - </data> - <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> - <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> - <comment>This is a comment</comment> - </data> - - There are any number of "resheader" rows that contain simple - name/value pairs. - - Each data row contains a name, and value. The row also contains a - type or mimetype. Type corresponds to a .NET class that support - text/value conversion through the TypeConverter architecture. - Classes that don't support this are serialized and stored with the - mimetype set. - - The mimetype is used for serialized objects, and tells the - ResXResourceReader how to depersist the object. This is currently not - extensible. For a given mimetype the value must be set accordingly: - - Note - application/x-microsoft.net.object.binary.base64 is the format - that the ResXResourceWriter will generate, however the reader can - read any of the formats listed below. - - mimetype: application/x-microsoft.net.object.binary.base64 - value : The object must be serialized with - : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter - : and then encoded with base64 encoding. - - mimetype: application/x-microsoft.net.object.soap.base64 - value : The object must be serialized with - : System.Runtime.Serialization.Formatters.Soap.SoapFormatter - : and then encoded with base64 encoding. - - mimetype: application/x-microsoft.net.object.bytearray.base64 - value : The object must be serialized into a byte array - : using a System.ComponentModel.TypeConverter - : and then encoded with base64 encoding. - --> - <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> - <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> - <xsd:element name="root" msdata:IsDataSet="true"> - <xsd:complexType> - <xsd:choice maxOccurs="unbounded"> - <xsd:element name="metadata"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="value" type="xsd:string" minOccurs="0" /> - </xsd:sequence> - <xsd:attribute name="name" use="required" type="xsd:string" /> - <xsd:attribute name="type" type="xsd:string" /> - <xsd:attribute name="mimetype" type="xsd:string" /> - <xsd:attribute ref="xml:space" /> - </xsd:complexType> - </xsd:element> - <xsd:element name="assembly"> - <xsd:complexType> - <xsd:attribute name="alias" type="xsd:string" /> - <xsd:attribute name="name" type="xsd:string" /> - </xsd:complexType> - </xsd:element> - <xsd:element name="data"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> - <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> - </xsd:sequence> - <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> - <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> - <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> - <xsd:attribute ref="xml:space" /> - </xsd:complexType> - </xsd:element> - <xsd:element name="resheader"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> - </xsd:sequence> - <xsd:attribute name="name" type="xsd:string" use="required" /> - </xsd:complexType> - </xsd:element> - </xsd:choice> - </xsd:complexType> - </xsd:element> - </xsd:schema> - <resheader name="resmimetype"> - <value>text/microsoft-resx</value> - </resheader> - <resheader name="version"> - <value>2.0</value> - </resheader> - <resheader name="reader"> - <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> - </resheader> - <resheader name="writer"> - <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> - </resheader> -</root> \ No newline at end of file diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Program.cs b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Program.cs deleted file mode 100644 index 1e8ac829d9e..00000000000 --- a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Program.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Forms; - -namespace UnstandardnessTestForDM -{ - static class Program - { - /// <summary> - /// The main entry point for the application. - /// </summary> - [STAThread] - static void Main() - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1()); - } - } -} diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/AssemblyInfo.cs b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/AssemblyInfo.cs deleted file mode 100644 index 99c88721b31..00000000000 --- a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("UnstandardnessTestForDM")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("UnstandardnessTestForDM")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("c0e09000-1840-4416-8bb2-d86a8227adf1")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Resources.Designer.cs b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Resources.Designer.cs deleted file mode 100644 index 92534f43fed..00000000000 --- a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Resources.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -// <auto-generated> -// This code was generated by a tool. -// Runtime Version:4.0.30319.239 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// </auto-generated> -//------------------------------------------------------------------------------ - -namespace UnstandardnessTestForDM.Properties -{ - - - /// <summary> - /// A strongly-typed resource class, for looking up localized strings, etc. - /// </summary> - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { - } - - /// <summary> - /// Returns the cached ResourceManager instance used by this class. - /// </summary> - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("UnstandardnessTestForDM.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// <summary> - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// </summary> - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - } -} diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Resources.resx b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Resources.resx deleted file mode 100644 index af7dbebbace..00000000000 --- a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<root> - <!-- - Microsoft ResX Schema - - Version 2.0 - - The primary goals of this format is to allow a simple XML format - that is mostly human readable. The generation and parsing of the - various data types are done through the TypeConverter classes - associated with the data types. - - Example: - - ... ado.net/XML headers & schema ... - <resheader name="resmimetype">text/microsoft-resx</resheader> - <resheader name="version">2.0</resheader> - <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> - <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> - <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> - <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> - <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> - <value>[base64 mime encoded serialized .NET Framework object]</value> - </data> - <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> - <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> - <comment>This is a comment</comment> - </data> - - There are any number of "resheader" rows that contain simple - name/value pairs. - - Each data row contains a name, and value. The row also contains a - type or mimetype. Type corresponds to a .NET class that support - text/value conversion through the TypeConverter architecture. - Classes that don't support this are serialized and stored with the - mimetype set. - - The mimetype is used for serialized objects, and tells the - ResXResourceReader how to depersist the object. This is currently not - extensible. For a given mimetype the value must be set accordingly: - - Note - application/x-microsoft.net.object.binary.base64 is the format - that the ResXResourceWriter will generate, however the reader can - read any of the formats listed below. - - mimetype: application/x-microsoft.net.object.binary.base64 - value : The object must be serialized with - : System.Serialization.Formatters.Binary.BinaryFormatter - : and then encoded with base64 encoding. - - mimetype: application/x-microsoft.net.object.soap.base64 - value : The object must be serialized with - : System.Runtime.Serialization.Formatters.Soap.SoapFormatter - : and then encoded with base64 encoding. - - mimetype: application/x-microsoft.net.object.bytearray.base64 - value : The object must be serialized into a byte array - : using a System.ComponentModel.TypeConverter - : and then encoded with base64 encoding. - --> - <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> - <xsd:element name="root" msdata:IsDataSet="true"> - <xsd:complexType> - <xsd:choice maxOccurs="unbounded"> - <xsd:element name="metadata"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="value" type="xsd:string" minOccurs="0" /> - </xsd:sequence> - <xsd:attribute name="name" type="xsd:string" /> - <xsd:attribute name="type" type="xsd:string" /> - <xsd:attribute name="mimetype" type="xsd:string" /> - </xsd:complexType> - </xsd:element> - <xsd:element name="assembly"> - <xsd:complexType> - <xsd:attribute name="alias" type="xsd:string" /> - <xsd:attribute name="name" type="xsd:string" /> - </xsd:complexType> - </xsd:element> - <xsd:element name="data"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> - <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> - </xsd:sequence> - <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> - <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> - <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> - </xsd:complexType> - </xsd:element> - <xsd:element name="resheader"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> - </xsd:sequence> - <xsd:attribute name="name" type="xsd:string" use="required" /> - </xsd:complexType> - </xsd:element> - </xsd:choice> - </xsd:complexType> - </xsd:element> - </xsd:schema> - <resheader name="resmimetype"> - <value>text/microsoft-resx</value> - </resheader> - <resheader name="version"> - <value>2.0</value> - </resheader> - <resheader name="reader"> - <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> - </resheader> - <resheader name="writer"> - <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> - </resheader> -</root> \ No newline at end of file diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Settings.Designer.cs b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Settings.Designer.cs deleted file mode 100644 index ab81379593f..00000000000 --- a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// <auto-generated> -// This code was generated by a tool. -// Runtime Version:4.0.30319.239 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// </auto-generated> -//------------------------------------------------------------------------------ - -namespace UnstandardnessTestForDM.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Settings.settings b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Settings.settings deleted file mode 100644 index 39645652af6..00000000000 --- a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version='1.0' encoding='utf-8'?> -<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)"> - <Profiles> - <Profile Name="(Default)" /> - </Profiles> - <Settings /> -</SettingsFile> diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/UnstandardnessTestForDM.csproj b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/UnstandardnessTestForDM.csproj deleted file mode 100644 index 7cafd94f656..00000000000 --- a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/UnstandardnessTestForDM.csproj +++ /dev/null @@ -1,87 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <PropertyGroup> - <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> - <Platform Condition=" '$(Platform)' == '' ">x86</Platform> - <ProductVersion>8.0.30703</ProductVersion> - <SchemaVersion>2.0</SchemaVersion> - <ProjectGuid>{A0EEBFC9-41D4-474D-853D-126AFDFB82DE}</ProjectGuid> - <OutputType>WinExe</OutputType> - <AppDesignerFolder>Properties</AppDesignerFolder> - <RootNamespace>UnstandardnessTestForDM</RootNamespace> - <AssemblyName>UnstandardnessTestForDM</AssemblyName> - <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> - <TargetFrameworkProfile>Client</TargetFrameworkProfile> - <FileAlignment>512</FileAlignment> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> - <PlatformTarget>x86</PlatformTarget> - <DebugSymbols>true</DebugSymbols> - <DebugType>full</DebugType> - <Optimize>false</Optimize> - <OutputPath>bin\Debug\</OutputPath> - <DefineConstants>DEBUG;TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> - <PlatformTarget>x86</PlatformTarget> - <DebugType>pdbonly</DebugType> - <Optimize>true</Optimize> - <OutputPath>bin\Release\</OutputPath> - <DefineConstants>TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - </PropertyGroup> - <ItemGroup> - <Reference Include="System" /> - <Reference Include="System.Core" /> - <Reference Include="System.Xml.Linq" /> - <Reference Include="System.Data.DataSetExtensions" /> - <Reference Include="Microsoft.CSharp" /> - <Reference Include="System.Data" /> - <Reference Include="System.Deployment" /> - <Reference Include="System.Drawing" /> - <Reference Include="System.Windows.Forms" /> - <Reference Include="System.Xml" /> - </ItemGroup> - <ItemGroup> - <Compile Include="Form1.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Form1.Designer.cs"> - <DependentUpon>Form1.cs</DependentUpon> - </Compile> - <Compile Include="Program.cs" /> - <Compile Include="Properties\AssemblyInfo.cs" /> - <EmbeddedResource Include="Form1.resx"> - <DependentUpon>Form1.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Properties\Resources.resx"> - <Generator>ResXFileCodeGenerator</Generator> - <LastGenOutput>Resources.Designer.cs</LastGenOutput> - <SubType>Designer</SubType> - </EmbeddedResource> - <Compile Include="Properties\Resources.Designer.cs"> - <AutoGen>True</AutoGen> - <DependentUpon>Resources.resx</DependentUpon> - </Compile> - <None Include="Properties\Settings.settings"> - <Generator>SettingsSingleFileGenerator</Generator> - <LastGenOutput>Settings.Designer.cs</LastGenOutput> - </None> - <Compile Include="Properties\Settings.Designer.cs"> - <AutoGen>True</AutoGen> - <DependentUpon>Settings.settings</DependentUpon> - <DesignTimeSharedInput>True</DesignTimeSharedInput> - </Compile> - </ItemGroup> - <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> - <!-- To modify your build process, add your task inside one of the targets below and uncomment it. - Other similar extension points exist, see Microsoft.Common.targets. - <Target Name="BeforeBuild"> - </Target> - <Target Name="AfterBuild"> - </Target> - --> -</Project> \ No newline at end of file diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug/UnstandardnessTestForDM.exe b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug/UnstandardnessTestForDM.exe deleted file mode 100644 index bb55cad8fd7..00000000000 Binary files a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug/UnstandardnessTestForDM.exe and /dev/null differ diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug/UnstandardnessTestForDM.pdb b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug/UnstandardnessTestForDM.pdb deleted file mode 100644 index b89e4d53eb7..00000000000 Binary files a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug/UnstandardnessTestForDM.pdb and /dev/null differ diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug/UnstandardnessTestForDM.vshost.exe b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug/UnstandardnessTestForDM.vshost.exe deleted file mode 100644 index bb84a51ac4f..00000000000 Binary files a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug/UnstandardnessTestForDM.vshost.exe and /dev/null differ diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug/UnstandardnessTestForDM.vshost.exe.manifest b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug/UnstandardnessTestForDM.vshost.exe.manifest deleted file mode 100644 index 061c9ca950d..00000000000 --- a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug/UnstandardnessTestForDM.vshost.exe.manifest +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> - <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> - <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> - <security> - <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> - <requestedExecutionLevel level="asInvoker" uiAccess="false"/> - </requestedPrivileges> - </security> - </trustInfo> -</assembly> diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache deleted file mode 100644 index f4263115dfb..00000000000 Binary files a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache and /dev/null differ diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/GenerateResource.read.1.tlog b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/GenerateResource.read.1.tlog deleted file mode 100644 index 247c250f975..00000000000 Binary files a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/GenerateResource.read.1.tlog and /dev/null differ diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/GenerateResource.write.1.tlog b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/GenerateResource.write.1.tlog deleted file mode 100644 index d100f54085b..00000000000 Binary files a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/GenerateResource.write.1.tlog and /dev/null differ diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.Form1.resources b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.Form1.resources deleted file mode 100644 index 6c05a9776bd..00000000000 Binary files a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.Form1.resources and /dev/null differ diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.Properties.Resources.resources b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.Properties.Resources.resources deleted file mode 100644 index 6c05a9776bd..00000000000 Binary files a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.Properties.Resources.resources and /dev/null differ diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.csproj.FileListAbsolute.txt b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.csproj.FileListAbsolute.txt deleted file mode 100644 index 1d36d1cd556..00000000000 --- a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,18 +0,0 @@ -c:\users\baloh\documents\visual studio 2010\Projects\UnstandardnessTestForDM\UnstandardnessTestForDM\bin\Debug\UnstandardnessTestForDM.exe -c:\users\baloh\documents\visual studio 2010\Projects\UnstandardnessTestForDM\UnstandardnessTestForDM\bin\Debug\UnstandardnessTestForDM.pdb -c:\users\baloh\documents\visual studio 2010\Projects\UnstandardnessTestForDM\UnstandardnessTestForDM\obj\x86\Debug\ResolveAssemblyReference.cache -c:\users\baloh\documents\visual studio 2010\Projects\UnstandardnessTestForDM\UnstandardnessTestForDM\obj\x86\Debug\UnstandardnessTestForDM.Form1.resources -c:\users\baloh\documents\visual studio 2010\Projects\UnstandardnessTestForDM\UnstandardnessTestForDM\obj\x86\Debug\UnstandardnessTestForDM.Properties.Resources.resources -c:\users\baloh\documents\visual studio 2010\Projects\UnstandardnessTestForDM\UnstandardnessTestForDM\obj\x86\Debug\GenerateResource.read.1.tlog -c:\users\baloh\documents\visual studio 2010\Projects\UnstandardnessTestForDM\UnstandardnessTestForDM\obj\x86\Debug\GenerateResource.write.1.tlog -c:\users\baloh\documents\visual studio 2010\Projects\UnstandardnessTestForDM\UnstandardnessTestForDM\obj\x86\Debug\UnstandardnessTestForDM.exe -c:\users\baloh\documents\visual studio 2010\Projects\UnstandardnessTestForDM\UnstandardnessTestForDM\obj\x86\Debug\UnstandardnessTestForDM.pdb -C:\Users\Baloh\Desktop\tgs13\tools\UnstandardnessTestForDM\UnstandardnessTestForDM\bin\Debug\UnstandardnessTestForDM.exe -C:\Users\Baloh\Desktop\tgs13\tools\UnstandardnessTestForDM\UnstandardnessTestForDM\bin\Debug\UnstandardnessTestForDM.pdb -C:\Users\Baloh\Desktop\tgs13\tools\UnstandardnessTestForDM\UnstandardnessTestForDM\obj\x86\Debug\ResolveAssemblyReference.cache -C:\Users\Baloh\Desktop\tgs13\tools\UnstandardnessTestForDM\UnstandardnessTestForDM\obj\x86\Debug\UnstandardnessTestForDM.Form1.resources -C:\Users\Baloh\Desktop\tgs13\tools\UnstandardnessTestForDM\UnstandardnessTestForDM\obj\x86\Debug\UnstandardnessTestForDM.Properties.Resources.resources -C:\Users\Baloh\Desktop\tgs13\tools\UnstandardnessTestForDM\UnstandardnessTestForDM\obj\x86\Debug\GenerateResource.read.1.tlog -C:\Users\Baloh\Desktop\tgs13\tools\UnstandardnessTestForDM\UnstandardnessTestForDM\obj\x86\Debug\GenerateResource.write.1.tlog -C:\Users\Baloh\Desktop\tgs13\tools\UnstandardnessTestForDM\UnstandardnessTestForDM\obj\x86\Debug\UnstandardnessTestForDM.exe -C:\Users\Baloh\Desktop\tgs13\tools\UnstandardnessTestForDM\UnstandardnessTestForDM\obj\x86\Debug\UnstandardnessTestForDM.pdb diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.exe b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.exe deleted file mode 100644 index bb55cad8fd7..00000000000 Binary files a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.exe and /dev/null differ diff --git a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.pdb b/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.pdb deleted file mode 100644 index b89e4d53eb7..00000000000 Binary files a/tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.pdb and /dev/null differ diff --git a/tools/UnstandardnessTestForDM/readme.txt b/tools/UnstandardnessTestForDM/readme.txt deleted file mode 100644 index 8d3c5168dc5..00000000000 --- a/tools/UnstandardnessTestForDM/readme.txt +++ /dev/null @@ -1,4 +0,0 @@ -the compiled exe file for the Unstandardness text for DM program is in: -UnstandardnessTestForDM\bin\Debug\UnstandardnessTestForDM.exe - -You have to move it to the root folder (where the dme file is) and run it from there for it to work. diff --git a/tools/WebhookProcessor/secret.php b/tools/WebhookProcessor/secret.php index 39aa413659b..02dad3d6271 100644 --- a/tools/WebhookProcessor/secret.php +++ b/tools/WebhookProcessor/secret.php @@ -1,6 +1,6 @@ <?php //This file contains things that should not be touched by the automatic live tracker - + //Github lets you have it sign the message with a secret that you can validate. This prevents people from faking events. //This var should match the secret you configured for this webhook on github. //This is required as otherwise somebody could trick the script into leaking the api key. @@ -67,7 +67,7 @@ announce_secret - Announce secret/security prs that have a [s] in front of the t $servers[$configitem]['announce_secret'] = false; $servers[$configitem]['announce_secret'] = 'only'; -announce_unvalidated - Announce prs by unvalidated users (see the validation setting above)? Defaults to no. +announce_unvalidated - Announce prs by unvalidated users (see the validation setting above)? Defaults to no. Can also be set to 'only' to only announce prs by unvalidated users. $servers[$configitem]['announce_unvalidated'] = false; @@ -104,7 +104,7 @@ $configitem = -1;//ignore me $discordWebHooks[++$configitem] = array(); // Webhook Url (you can get this from discord via the webhook setting menu of the server or a channel.) -$discordWebHooks[$configitem]['url'] = 'https://discordapp.com/api/webhooks/538933489920245771/xaoYtVuype-P1rb_uthQLkh_C4iVL3sjtIvFEp7rsfhbBs8tDsSJgE0a9MNWJaoSPBPK'; +$discordWebHooks[$configitem]['url'] = 'https://discord.com/api/webhooks/538933489920245771/xaoYtVuype-P1rb_uthQLkh_C4iVL3sjtIvFEp7rsfhbBs8tDsSJgE0a9MNWJaoSPBPK'; // show an embed with more info? $discordWebHooks[$configitem]['embed'] = true; @@ -118,7 +118,7 @@ $discordWebHooks[$configitem]['no_text'] = false; $discordWebHooks[++$configitem] = array(); // Webhook Url (you can get this from discord via the webhook setting menu of the server or a channel.) -$discordWebHooks[$configitem]['url'] = 'https://discordapp.com/api/webhooks/538933686956064769/q0uDel7S6eutvRIyEwsuZo_ppzAoxqUNeU2PRChYVsYoJmmn2f2YYSDoMjy9FhhXKqpI'; +$discordWebHooks[$configitem]['url'] = 'https://discord.com/api/webhooks/538933686956064769/q0uDel7S6eutvRIyEwsuZo_ppzAoxqUNeU2PRChYVsYoJmmn2f2YYSDoMjy9FhhXKqpI'; // show an embed with more info? $discordWebHooks[$configitem]['embed'] = true; diff --git a/tools/discordRoleScript/Script.py b/tools/discordRoleScript/Script.py index 0b5501588b2..d710aca26ee 100644 --- a/tools/discordRoleScript/Script.py +++ b/tools/discordRoleScript/Script.py @@ -48,7 +48,7 @@ for user in usersToProcess: count += 1 # Why the fuck does python not have ++ # user[0] = ckey, user[1] = discord ID print("Processing "+str(user[0])+" (Discord ID: " + str(user[1]) + ") | User "+str(count)+"/"+str(total)) - url = "https://discordapp.com/api/guilds/"+str(guildID)+"/members/"+str(user[1])+"/roles/"+str(roleID) + url = "https://discord.com/api/guilds/"+str(guildID)+"/members/"+str(user[1])+"/roles/"+str(roleID) response = requests.put(url, headers={"Authorization": "Bot "+str(botToken)}) # Adding a role returns a code 204, not a code 200. Dont ask if response.status_code != 204: diff --git a/tools/mapmerge2/requirements.txt b/tools/mapmerge2/requirements.txt index 41ddc96c174..3f5c9ca0bcb 100644 --- a/tools/mapmerge2/requirements.txt +++ b/tools/mapmerge2/requirements.txt @@ -1,3 +1,3 @@ pygit2==1.0.1 bidict==0.13.1 -Pillow==7.0.0 +Pillow==7.1.0